diff --git a/DEPS b/DEPS
index c74cc96..fa0a5b88 100644
--- a/DEPS
+++ b/DEPS
@@ -135,6 +135,9 @@
   # Checkout SODA (Speech On-Device API go/chrome-live-caption)
   'checkout_soda': False,
 
+  # Controls whether third_party/ml is fetched.
+  'checkout_third_party_ml': False,
+
   # Fetch the additional packages and files needed to run all of the
   # telemetry tests. This is false by default as some stuff is only
   # privately accessible.
@@ -290,7 +293,7 @@
   'sysroots_json_path': 'build/linux/sysroot_scripts/sysroots.json',
 
   # siso CIPD package version.
-  'siso_version': 'git_revision:23257e255f1d58d9f66923a1a40e746ac3a4b9d8',
+  'siso_version': 'git_revision:c689f99bb4b9908073bd2f3fbd68f289d9e45a75',
 
   # download libaom test data
   'download_libaom_testdata': False,
@@ -310,15 +313,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': 'a5014cf1296cc48d048dc5d99a0d57f0b194538c',
+  'src_internal_revision': 'b37dac90c174d29f67069741bb087a6047481e65',
   # 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': 'f45ac4569300c567cf285051a62b9c7aa1657cd0',
+  'skia_revision': 'f4f3c909993df833b8e56a4cf9735e8d85f236f9',
   # 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': 'f5bfe4277fa97d5632eb54b3a6bce32f8869d233',
+  'v8_revision': '3591441627c5a100ab574cdc1ffa94910e7a9507',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
@@ -445,11 +448,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'cef64adb5d612633e7f02d538651f0e317e4da55',
+  'dawn_revision': '335656a25637d3d616edb560c6a2e766a96e2bcf',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'quiche_revision': '2099de51b06228550510fb7656205fdcc10d8e4c',
+  'quiche_revision': '9ac03b9396507cc1275d2605f5a92ad4b196f64e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ios_webkit
   # and whatever else without interference from each other.
@@ -845,7 +848,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    'fd4d51c6e2648885dcd16d6135d09277c04ecc8f',
+    'f3c11d5a9082c1bf8659c48dc8d6cba286d8a300',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1051,7 +1054,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 's8VNlRsmChI1Ss2qzgFkIJ2B-5zvPGWBkY7OPnUyUjUC',
+          'version': 'zUlqegt7mTpkaIkH0An0OHhHMxUEu2Ocnd8D_a9WcmYC',
       },
     ],
     'condition': 'checkout_android',
@@ -2087,7 +2090,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/eche_app/app',
-        'version': '3RhJat9IFHc_qay1lsYGmGAp6sNEkdUdZvP-rSGdjtIC',
+        'version': 'uJodg47UBcyipWyScTEGcLHLYojoWCoUziZl8q14sNIC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3964,7 +3967,7 @@
 
   'src/chrome/browser/resources/chromeos/quickoffice': {
       'url': Var('chrome_git') + '/quickoffice/crx.git' + '@' +
-        '23bde3495989fbc0112213613d2498030be51417',
+        '79e797d69d4675a2f0ef916dbb65457fe9485fc9',
       'condition': '(checkout_chromeos or checkout_linux) and checkout_src_internal',
   },
 
@@ -4137,7 +4140,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        'c87527527121f2dc3dd815a4299cda43dc926b29',
+        '72a45e87af568c2e2ed006aca80c54dc795e99da',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
@@ -4217,7 +4220,7 @@
 
   'src/third_party/ml': {
       'url': Var('chrome_git') + '/chrome/third_party/ml.git' + '@' + 'bfd95492122f567f2d3163bb0fb2b56f450618de',
-      'condition': 'checkout_src_internal and (checkout_win or checkout_mac or checkout_linux)',
+      'condition': 'checkout_third_party_ml',
   },
 
   'src/third_party/soda': {
diff --git a/android_webview/browser/aw_feature_map.cc b/android_webview/browser/aw_feature_map.cc
index dd3bd4c..415009b 100644
--- a/android_webview/browser/aw_feature_map.cc
+++ b/android_webview/browser/aw_feature_map.cc
@@ -37,6 +37,7 @@
     &features::kWebViewZoomKeyboardShortcuts,
     &features::kWebViewClearFunctorInBackground,
     &safe_browsing::kHashPrefixRealTimeLookups,
+    &safe_browsing::kSafeBrowsingSkipSubresources,
     &features::kWebViewSupervisedUserSiteDetection,
     &features::kWebViewSupervisedUserSiteBlock,
     &base::features::kCollectAndroidFrameTimelineMetrics,
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
index f8a6b5b5..0551083 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/SafeBrowsingTest.java
@@ -22,6 +22,7 @@
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 
 import org.chromium.android_webview.AwBrowserContext;
@@ -52,7 +53,9 @@
 import org.chromium.base.test.util.CriteriaHelper;
 import org.chromium.base.test.util.CriteriaNotSatisfiedException;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Features;
 import org.chromium.components.safe_browsing.SafeBrowsingApiBridge;
+import org.chromium.components.safe_browsing.SafeBrowsingFeatures;
 import org.chromium.components.safe_browsing.SafetyNetApiHandler;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 import org.chromium.content_public.common.ContentUrlConstants;
@@ -82,6 +85,8 @@
         }
     };
 
+    @Rule public TestRule mProcessor = new Features.InstrumentationProcessor();
+
     private SafeBrowsingContentsClient mContentsClient;
     private AwTestContainerView mContainerView;
     private MockAwContents mAwContents;
@@ -614,6 +619,8 @@
     @Test
     @SmallTest
     @Feature({"AndroidWebView"})
+    @Features.DisableFeatures({SafeBrowsingFeatures.SAFE_BROWSING_SKIP_SUBRESOURCES})
+    // TODO(crbug.com/1487858): Remove this test after SAFE_BROWSING_SKIP_SUBRESOURCES is launched.
     public void testSafeBrowsingShowsInterstitialForSubresource() throws Throwable {
         loadGreenPage();
         loadPathAndWaitForInterstitial(IFRAME_HTML_PATH, /* waitForVisualStateCallback = */ true);
@@ -641,6 +648,8 @@
     @Test
     @SmallTest
     @Feature({"AndroidWebView"})
+    @Features.DisableFeatures({SafeBrowsingFeatures.SAFE_BROWSING_SKIP_SUBRESOURCES})
+    // TODO(crbug.com/1487858): Remove this test after SAFE_BROWSING_SKIP_SUBRESOURCES is launched.
     public void testSafeBrowsingProceedThroughInterstitialForSubresource() throws Throwable {
         int pageFinishedCount = mContentsClient.getOnPageFinishedHelper().getCallCount();
         loadPathAndWaitForInterstitial(IFRAME_HTML_PATH, /* waitForVisualStateCallback = */ false);
@@ -690,6 +699,8 @@
     @Test
     @SmallTest
     @Feature({"AndroidWebView"})
+    @Features.DisableFeatures({SafeBrowsingFeatures.SAFE_BROWSING_SKIP_SUBRESOURCES})
+    // TODO(crbug.com/1487858): Remove this test after SAFE_BROWSING_SKIP_SUBRESOURCES is launched.
     public void testSafeBrowsingDontProceedNavigatesBackForSubResource() throws Throwable {
         loadGreenPage();
         loadPathAndWaitForInterstitial(IFRAME_HTML_PATH, /* waitForVisualStateCallback = */ false);
@@ -889,6 +900,8 @@
     @Test
     @SmallTest
     @Feature({"AndroidWebView"})
+    @Features.DisableFeatures({SafeBrowsingFeatures.SAFE_BROWSING_SKIP_SUBRESOURCES})
+    // TODO(crbug.com/1487858): Remove this test after SAFE_BROWSING_SKIP_SUBRESOURCES is launched.
     public void testSafeBrowsingOnSafeBrowsingHitForSubresourceNoPreviousPage() throws Throwable {
         mContentsClient.setSafeBrowsingAction(SafeBrowsingAction.BACK_TO_SAFETY);
         final String responseUrl = mTestServer.getURL(IFRAME_HTML_PATH);
@@ -914,6 +927,8 @@
     @Test
     @SmallTest
     @Feature({"AndroidWebView"})
+    @Features.DisableFeatures({SafeBrowsingFeatures.SAFE_BROWSING_SKIP_SUBRESOURCES})
+    // TODO(crbug.com/1487858): Remove this test after SAFE_BROWSING_SKIP_SUBRESOURCES is launched.
     public void testSafeBrowsingOnSafeBrowsingHitForSubresource() throws Throwable {
         mContentsClient.setSafeBrowsingAction(SafeBrowsingAction.BACK_TO_SAFETY);
         loadGreenPage();
diff --git a/ash/app_list/views/app_list_item_view.cc b/ash/app_list/views/app_list_item_view.cc
index 8302c4e..e253e00 100644
--- a/ash/app_list/views/app_list_item_view.cc
+++ b/ash/app_list/views/app_list_item_view.cc
@@ -1844,7 +1844,7 @@
         ProgressIndicator::CreateDefaultInstance(base::BindRepeating(
             [](AppListItemView* view) -> absl::optional<float> {
               if (view->item()->app_status() == AppStatus::kPending) {
-                return absl::nullopt;
+                return 0.0f;
               }
               // If download is in-progress, return the progress as a decimal.
               // Otherwise, the progress indicator shouldn't be painted.
@@ -1861,7 +1861,7 @@
           return view->GetColorProvider()->GetColor(color_id);
         },
         base::Unretained(this))));
-    progress_indicator_->SetColorId(cros_tokens::kCrosSysOnPrimaryContainer);
+    progress_indicator_->SetColorId(cros_tokens::kCrosRefPrimary70);
   }
 
   UpdateProgressRingBounds();
diff --git a/ash/app_list/views/app_list_item_view_unittest.cc b/ash/app_list/views/app_list_item_view_unittest.cc
index e174b6db..5473a8fb 100644
--- a/ash/app_list/views/app_list_item_view_unittest.cc
+++ b/ash/app_list/views/app_list_item_view_unittest.cc
@@ -477,7 +477,7 @@
   ProgressIndicator* progress_indicator = view->GetProgressIndicatorForTest();
 
   EXPECT_EQ(view->item()->progress(), -1.0f);
-  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, absl::nullopt);
+  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, 0.0f);
 
   // Change app status to installing and send a progress update. Verify that the
   // progress indicator correctly reflects the progress.
@@ -488,16 +488,16 @@
 
   // Change app status back to pending state. Verify that even if the item had
   // progress previously associated to it, the progress indicator reflects as
-  // indeterminate progress since it is pending.
+  // 0 progress since it is pending.
   item->UpdateAppStatusForTesting(AppStatus::kPending);
   EXPECT_EQ(view->item()->progress(), 0.3f);
-  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, absl::nullopt);
+  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, 0.0f);
 
   // Send another progress update. Since the app status is still pending, the
-  // progress indicator still be indeterminate
+  // progress indicator still be 0
   item->SetProgress(0.8f);
   EXPECT_EQ(view->item()->progress(), 0.8f);
-  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, absl::nullopt);
+  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, 0.0f);
 
   // Set the last status update to kInstallSuccess as if the app had finished
   // installing.
diff --git a/ash/clipboard/clipboard_history_unittest.cc b/ash/clipboard/clipboard_history_unittest.cc
index 1cd88e3..1187a76 100644
--- a/ash/clipboard/clipboard_history_unittest.cc
+++ b/ash/clipboard/clipboard_history_unittest.cc
@@ -14,6 +14,7 @@
 #include "ash/clipboard/scoped_clipboard_history_pause_impl.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
+#include "base/containers/span.h"
 #include "base/memory/raw_ptr.h"
 #include "base/pickle.h"
 #include "base/strings/utf_string_conversions.h"
@@ -146,10 +147,9 @@
       return;
     }
 
-    std::unordered_map<std::u16string, std::u16string> actual_data;
-    ui::ReadCustomDataIntoMap(items.front().data().custom_data_data().c_str(),
-                              items.front().data().custom_data_data().size(),
-                              &actual_data);
+    absl::optional<std::unordered_map<std::u16string, std::u16string>>
+        actual_data = ui::ReadCustomDataIntoMap(base::as_bytes(
+            base::span(items.front().data().custom_data_data())));
 
     EXPECT_EQ(expected_data, actual_data);
   }
diff --git a/ash/clipboard/clipboard_history_util.cc b/ash/clipboard/clipboard_history_util.cc
index 64c385f..036a81f 100644
--- a/ash/clipboard/clipboard_history_util.cc
+++ b/ash/clipboard/clipboard_history_util.cc
@@ -177,12 +177,14 @@
     return std::u16string();
 
   // Attempt to read file system sources in the custom data.
-  std::u16string sources;
-  ui::ReadCustomDataForType(data.custom_data_data().c_str(),
-                            data.custom_data_data().size(),
-                            kFileSystemSourcesType, &sources);
+  if (absl::optional<std::u16string> maybe_sources = ui::ReadCustomDataForType(
+          base::as_bytes(base::span(data.custom_data_data())),
+          kFileSystemSourcesType);
+      maybe_sources) {
+    return std::move(*maybe_sources);
+  }
 
-  return sources;
+  return std::u16string();
 }
 
 const gfx::VectorIcon& GetShortcutKeyIcon() {
diff --git a/ash/components/arc/metrics/arc_wm_metrics.cc b/ash/components/arc/metrics/arc_wm_metrics.cc
index 116a1c2..d01ad8ac 100644
--- a/ash/components/arc/metrics/arc_wm_metrics.cc
+++ b/ash/components/arc/metrics/arc_wm_metrics.cc
@@ -13,7 +13,10 @@
 #include "base/strings/strcat.h"
 #include "base/timer/elapsed_timer.h"
 #include "chromeos/ui/base/window_state_type.h"
+#include "components/exo/shell_surface_base.h"
+#include "components/exo/shell_surface_util.h"
 #include "ui/aura/client/aura_constants.h"
+#include "ui/aura/window_observer.h"
 #include "ui/base/ui_base_types.h"
 
 namespace arc {
@@ -26,6 +29,9 @@
 // Histogram of the delay for window minimizing operation.
 constexpr char kWindowMinimizedTimeHistogramPrefix[] =
     "Arc.WM.WindowMinimizedDelayTime.";
+// Histogram of the delay for window closing operation.
+constexpr char kWindowClosedTimeHistogramPrefix[] =
+    "Arc.WM.WindowClosedDelayTime.";
 
 constexpr char kArcHistogramName[] = "ArcApp";
 constexpr char kBrowserHistogramName[] = "Browser";
@@ -117,6 +123,43 @@
   base::OnceClosure window_operation_completed_callback_;
 };
 
+// A window observer that records the delay of window closing operation for ARC
+// windows.
+class ArcWmMetrics::WindowCloseObserver : public aura::WindowObserver {
+ public:
+  WindowCloseObserver(aura::Window* window, base::OnceClosure callback)
+      : window_close_completed_callback_(std::move(callback)) {
+    window_observation_.Observe(window);
+  }
+
+  WindowCloseObserver(const WindowCloseObserver&) = delete;
+  WindowCloseObserver& operator=(const WindowCloseObserver) = delete;
+  ~WindowCloseObserver() override = default;
+
+  // aura::WindowObserver:
+  void OnWindowDestroyed(aura::Window* window) override {
+    RecordWindowCloseDelay();
+    std::move(window_close_completed_callback_).Run();
+  }
+
+ private:
+  void RecordWindowCloseDelay() {
+    base::UmaHistogramCustomTimes(
+        ArcWmMetrics::GetArcWindowClosedTimeHistogramName(),
+        window_close_elapsed_timer_.Elapsed(),
+        /*minimum=*/base::Milliseconds(1),
+        /*maximum=*/base::Seconds(2), 100);
+  }
+
+  // Tracks the elapsed time from the window closing operation happens until the
+  // the window is destroyed.
+  base::ElapsedTimer window_close_elapsed_timer_;
+  base::ScopedObservation<aura::Window, aura::WindowObserver>
+      window_observation_{this};
+
+  base::OnceClosure window_close_completed_callback_;
+};
+
 ArcWmMetrics::ArcWmMetrics() {
   if (aura::Env::HasInstance()) {
     env_observation_.Observe(aura::Env::GetInstance());
@@ -139,9 +182,16 @@
   return base::StrCat({kWindowMinimizedTimeHistogramPrefix, app_type_str});
 }
 
+// static
+std::string ArcWmMetrics::GetArcWindowClosedTimeHistogramName() {
+  const std::string arc_app_type_str = GetAppTypeName(ash::AppType::ARC_APP);
+  return base::StrCat({kWindowClosedTimeHistogramPrefix, arc_app_type_str});
+}
+
 void ArcWmMetrics::OnWindowInitialized(aura::Window* new_window) {
-  if (static_cast<ash::AppType>(new_window->GetProperty(
-          aura::client::kAppType)) == ash::AppType::NON_APP) {
+  ash::AppType app_type = static_cast<ash::AppType>(
+      new_window->GetProperty(aura::client::kAppType));
+  if (app_type == ash::AppType::NON_APP) {
     return;
   }
 
@@ -150,6 +200,17 @@
   }
 
   window_observations_.AddObservation(new_window);
+
+  if (app_type == ash::AppType::ARC_APP) {
+    auto* shell_surface_base = exo::GetShellSurfaceBaseForWindow(new_window);
+
+    // |shell_surface_base| can be null in unit tests.
+    if (shell_surface_base) {
+      shell_surface_base->set_pre_close_callback(
+          base::BindRepeating(&ArcWmMetrics::OnWindowCloseRequested,
+                              weak_ptr_factory_.GetWeakPtr(), new_window));
+    }
+  }
 }
 
 void ArcWmMetrics::OnWindowPropertyChanged(aura::Window* window,
@@ -203,4 +264,15 @@
   state_change_observing_windows_.erase(window);
 }
 
+void ArcWmMetrics::OnWindowCloseRequested(aura::Window* window) {
+  close_observing_windows_.emplace(
+      window, std::make_unique<WindowCloseObserver>(
+                  window, base::BindOnce(&ArcWmMetrics::OnWindowCloseCompleted,
+                                         base::Unretained(this), window)));
+}
+
+void ArcWmMetrics::OnWindowCloseCompleted(aura::Window* window) {
+  close_observing_windows_.erase(window);
+}
+
 }  // namespace arc
diff --git a/ash/components/arc/metrics/arc_wm_metrics.h b/ash/components/arc/metrics/arc_wm_metrics.h
index 86a4abf..ccf46d74 100644
--- a/ash/components/arc/metrics/arc_wm_metrics.h
+++ b/ash/components/arc/metrics/arc_wm_metrics.h
@@ -29,6 +29,8 @@
 
   static std::string GetWindowMinimizedTimeHistogramName(ash::AppType app_type);
 
+  static std::string GetArcWindowClosedTimeHistogramName();
+
   // aura::EnvObserver
   void OnWindowInitialized(aura::Window* new_window) override;
 
@@ -39,19 +41,33 @@
   void OnWindowDestroying(aura::Window* window) override;
 
  private:
+  friend class ArcWmMetricsTest;
+
   class WindowStateChangeObserver;
 
+  class WindowCloseObserver;
+
   void OnOperationCompleted(aura::Window* window);
 
+  void OnWindowCloseRequested(aura::Window* window);
+  void OnWindowCloseCompleted(aura::Window* window);
+
   // The map of windows that being observed by WindowStateChangeObserver and
   // their corresponding observers.
   base::flat_map<aura::Window*, std::unique_ptr<WindowStateChangeObserver>>
       state_change_observing_windows_;
 
+  // The map of windows that being observed by WindowCloseObserver and
+  // their corresponding observers.
+  base::flat_map<aura::Window*, std::unique_ptr<WindowCloseObserver>>
+      close_observing_windows_;
+
   base::ScopedObservation<aura::Env, aura::EnvObserver> env_observation_{this};
 
   base::ScopedMultiSourceObservation<aura::Window, aura::WindowObserver>
       window_observations_{this};
+
+  base::WeakPtrFactory<ArcWmMetrics> weak_ptr_factory_{this};
 };
 
 }  // namespace arc
diff --git a/ash/components/arc/metrics/arc_wm_metrics_unittest.cc b/ash/components/arc/metrics/arc_wm_metrics_unittest.cc
index e48c6025..58854eb4 100644
--- a/ash/components/arc/metrics/arc_wm_metrics_unittest.cc
+++ b/ash/components/arc/metrics/arc_wm_metrics_unittest.cc
@@ -28,6 +28,10 @@
     arc_wm_metrics_ = std::make_unique<ArcWmMetrics>();
   }
 
+  void OnWindowCloseRequested(aura::Window* window) {
+    arc_wm_metrics_->OnWindowCloseRequested(window);
+  }
+
  private:
   std::unique_ptr<ArcWmMetrics> arc_wm_metrics_;
 };
@@ -68,4 +72,21 @@
   histogram_tester.ExpectTotalCount(histogram_name, 1);
 }
 
+TEST_F(ArcWmMetricsTest, TestWindowCloseDelayMetrics) {
+  auto window =
+      CreateAppWindow(gfx::Rect(0, 0, 100, 100), ash::AppType::ARC_APP);
+  window->Show();
+
+  base::HistogramTester histogram_tester;
+  const auto histogram_name =
+      ArcWmMetrics::GetArcWindowClosedTimeHistogramName();
+  histogram_tester.ExpectTotalCount(histogram_name, 0);
+
+  OnWindowCloseRequested(window.get());
+  histogram_tester.ExpectTotalCount(histogram_name, 0);
+
+  window.reset();
+  histogram_tester.ExpectTotalCount(histogram_name, 1);
+}
+
 }  // namespace arc
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index d269f45..c3c148e 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -528,7 +528,7 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Enables or disables support for third party VMs.
-BASE_FEATURE(kBruschetta, "Bruschetta", base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kBruschetta, "Bruschetta", base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enables or disables always using device-activity-status data to filter
 // eligible host phones.
diff --git a/ash/display/cursor_window_controller.cc b/ash/display/cursor_window_controller.cc
index 1647fb9..8b6adc0 100644
--- a/ash/display/cursor_window_controller.cc
+++ b/ash/display/cursor_window_controller.cc
@@ -95,6 +95,40 @@
   return recolored;
 }
 
+std::vector<gfx::ImageSkia> GetCursorImages(ui::CursorSize cursor_size,
+                                            ui::mojom::CursorType type,
+                                            float scale_factor,
+                                            gfx::Point& out_hotspot) {
+  std::vector<gfx::ImageSkia> images;
+  int resource_id;
+  if (!wm::GetCursorDataFor(cursor_size, type, scale_factor, &resource_id,
+                            &out_hotspot)) {
+    return images;
+  }
+  gfx::ImageSkia* image =
+      ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id);
+  const int frame_height = image->height();
+  // Assume frame width equals to frame height.
+  const int frame_width = frame_height;
+  const int total_width = image->width();
+  const int frame_count = total_width / frame_width;
+
+  if (frame_count == 1) {
+    images.push_back(*image);
+  } else if (frame_count > 1) {
+    // For animated cursor, the input image is a sesquence of frames which
+    // needs to be cut into a list of images.
+    images.resize(frame_count);
+    for (int frame = 0; frame < frame_count; ++frame) {
+      const int x_offset = frame_width * frame;
+      gfx::ImageSkia cropped = gfx::ImageSkiaOperations::CreateTiledImage(
+          *image, x_offset, 0, frame_width, frame_height);
+      images[frame] = std::move(cropped);
+    }
+  }
+  return images;
+}
+
 // The ImageSkiaSource that translate the color of the cursor.
 class CursorImageSource : public gfx::ImageSkiaSource {
  public:
@@ -150,7 +184,7 @@
   void OnPaint(const ui::PaintContext& context) override {
     // No need to cache the output here, the CursorWindow is not invalidated.
     ui::PaintRecorder recorder(context, size_);
-    recorder.canvas()->DrawImageInt(cursor_image_, 0, 0);
+    recorder.canvas()->DrawImageInt(cursor_images_[paint_image_index_], 0, 0);
   }
   void OnDeviceScaleFactorChanged(float old_device_scale_factor,
                                   float new_device_scale_factor) override {}
@@ -160,17 +194,55 @@
   bool HasHitTestMask() const override { return false; }
   void GetHitTestMask(SkPath* mask) const override {}
 
+  // Updates cursor animation. If cursor_images_ has more than 1 image,
+  // start the timer to schedule frame painting.
+  void UpdateAnimation() {
+    paint_image_index_ = 0;
+    if (!cursor_window_) {
+      if (animated_cursor_timer_.IsRunning()) {
+        animated_cursor_timer_.Stop();
+      }
+      return;
+    }
+    if (cursor_images_.size() == 1) {
+      animated_cursor_timer_.Stop();
+    } else if (cursor_images_.size() > 1) {
+      animated_cursor_timer_.Start(
+          FROM_HERE, base::Milliseconds(16),
+          base::BindRepeating(&CursorWindowDelegate::AdvanceFrame,
+                              base::Unretained(this)));
+    }
+  }
+
+  // Schedules to paint the next frame.
+  void AdvanceFrame() {
+    paint_image_index_ = (paint_image_index_ + 1) % cursor_images_.size();
+    cursor_window_->SchedulePaintInRect(gfx::Rect(size_));
+  }
+
   // Sets the cursor image for the |display|'s scale factor.
-  void SetCursorImage(const gfx::Size& size, const gfx::ImageSkia& image) {
+  void SetCursorImage(const gfx::Size& size,
+                      const std::vector<gfx::ImageSkia>& images) {
     size_ = size;
-    cursor_image_ = image;
+    cursor_images_ = images;
+    UpdateAnimation();
+  }
+
+  void SetCursorWindow(aura::Window* window) {
+    cursor_window_ = window;
+    UpdateAnimation();
   }
 
   const gfx::Size& size() const { return size_; }
-  const gfx::ImageSkia& cursor_image() const { return cursor_image_; }
+  const std::vector<gfx::ImageSkia>& cursor_images() const {
+    return cursor_images_;
+  }
 
  private:
-  gfx::ImageSkia cursor_image_;
+  std::vector<gfx::ImageSkia> cursor_images_;
+  int paint_image_index_ = 0;
+  raw_ptr<aura::Window> cursor_window_;
+  base::RepeatingTimer animated_cursor_timer_;
   gfx::Size size_;
 };
 
@@ -435,6 +507,7 @@
 
   container_ = container;
   if (!container) {
+    delegate_->SetCursorWindow(nullptr);
     cursor_window_.reset();
     cursor_view_widget_.reset();
     return;
@@ -448,6 +521,7 @@
   if (CanEnableMotionBlur()) {
     UpdateCursorView();
   } else {
+    delegate_->SetCursorWindow(nullptr);
     // Reusing the window does not work when the display is disconnected.
     // Just creates a new one instead. crbug.com/384218.
     cursor_window_ = std::make_unique<aura::Window>(delegate_.get());
@@ -455,6 +529,7 @@
     cursor_window_->Init(ui::LAYER_TEXTURED);
     cursor_window_->SetEventTargetingPolicy(aura::EventTargetingPolicy::kNone);
     cursor_window_->set_owned_by_parent(false);
+    delegate_->SetCursorWindow(cursor_window_.get());
     // Call UpdateCursorImage() to figure out |cursor_window_|'s desired size.
     UpdateCursorImage();
     container->AddChild(cursor_window_.get());
@@ -483,7 +558,7 @@
   }
 
   float cursor_scale;
-  gfx::ImageSkia image;
+  std::vector<gfx::ImageSkia> images;
   gfx::Point hot_point_in_physical_pixels;
   if (cursor_.type() == ui::mojom::CursorType::kCustom) {
     const SkBitmap& bitmap = cursor_.custom_bitmap();
@@ -491,55 +566,58 @@
       return;
     }
     cursor_scale = cursor_.image_scale_factor();
-    image = gfx::ImageSkia::CreateFromBitmap(bitmap, cursor_scale);
+    images.push_back(gfx::ImageSkia::CreateFromBitmap(bitmap, cursor_scale));
     hot_point_in_physical_pixels = cursor_.custom_hotspot();
   } else {
     // Do not use the device scale factor, as the cursor will be scaled
     // by compositor. HW cursor will not be scaled by display zoom, so the
     // physical size will be inconsistent.
-    int resource_id;
     cursor_scale = ui::GetScaleForResourceScaleFactor(
         ui::GetSupportedResourceScaleFactorForRescale(
             display_.device_scale_factor()));
-    if (!wm::GetCursorDataFor(cursor_size_, cursor_.type(), cursor_scale,
-                              &resource_id, &hot_point_in_physical_pixels)) {
+
+    images = GetCursorImages(cursor_size_, cursor_.type(), cursor_scale,
+                             hot_point_in_physical_pixels);
+    if (images.empty()) {
       return;
     }
-    image =
-        *ui::ResourceBundle::GetSharedInstance().GetImageSkiaNamed(resource_id);
   }
   // Use `gfx::ToFlooredPoint` as `ImageSkiaRep::GetWidth` is implemented as
   // `return static_cast<int>(pixel_width() / scale());`.
   hot_point_ = gfx::ToFlooredPoint(
       gfx::ConvertPointToDips(hot_point_in_physical_pixels, cursor_scale));
 
-  gfx::ImageSkia resized = image;
-
   // Rescale cursor size. This is used with the combination of accessibility
   // large cursor. We don't need to care about the case where cursor
   // compositing is disabled as we always use cursor compositing if
   // accessibility large cursor is enabled.
   if (cursor_size_ == ui::CursorSize::kLarge &&
-      large_cursor_size_in_dip_ != image.size().width()) {
-    float rescale = static_cast<float>(large_cursor_size_in_dip_) /
-                    static_cast<float>(image.size().width());
-    resized = gfx::ImageSkiaOperations::CreateResizedImage(
-        image, skia::ImageOperations::ResizeMethod::RESIZE_BEST,
-        gfx::ScaleToCeiledSize(image.size(), rescale));
+      large_cursor_size_in_dip_ != images[0].size().width()) {
+    const float rescale = static_cast<float>(large_cursor_size_in_dip_) /
+                          static_cast<float>(images[0].size().width());
     hot_point_ = gfx::ScaleToCeiledPoint(hot_point_, rescale);
+    for (size_t i = 0; i < images.size(); ++i) {
+      images[i] = gfx::ImageSkiaOperations::CreateResizedImage(
+          images[i], skia::ImageOperations::ResizeMethod::RESIZE_BEST,
+          gfx::ScaleToCeiledSize(images[i].size(), rescale));
+    }
   }
 
   if (cursor_color_ != kDefaultCursorColor) {
-    resized = gfx::ImageSkia(
-        std::make_unique<CursorImageSource>(resized, cursor_color_),
-        resized.size());
+    for (size_t i = 0; i < images.size(); ++i) {
+      images[i] = gfx::ImageSkia(
+          std::make_unique<CursorImageSource>(images[i], cursor_color_),
+          images[i].size());
+    }
   }
 
-  delegate_->SetCursorImage(resized.size(), resized);
+  delegate_->SetCursorImage(images[0].size(), images);
 
   if (cursor_view_widget_) {
+    // TODO(b/303325856): cursor view doesn't support animated cursor
+    // images.
     static_cast<CursorView*>(cursor_view_widget_->GetContentsView())
-        ->SetCursorImage(delegate_->cursor_image(), delegate_->size(),
+        ->SetCursorImage(delegate_->cursor_images()[0], delegate_->size(),
                          hot_point_);
   }
   if (cursor_window_) {
@@ -578,7 +656,7 @@
 }
 
 const gfx::ImageSkia& CursorWindowController::GetCursorImageForTest() const {
-  return delegate_->cursor_image();
+  return delegate_->cursor_images()[0];
 }
 
 bool CursorWindowController::CanEnableMotionBlur() const {
diff --git a/ash/public/cpp/holding_space/holding_space_util.cc b/ash/public/cpp/holding_space/holding_space_util.cc
index 013e9b22..aceee8c 100644
--- a/ash/public/cpp/holding_space/holding_space_util.cc
+++ b/ash/public/cpp/holding_space/holding_space_util.cc
@@ -54,9 +54,9 @@
     return paths;
   }
 
-  std::u16string sources;
-  ui::ReadCustomDataForType(p.data(), p.size(), u"fs/sources", &sources);
-  if (sources.empty()) {
+  absl::optional<std::u16string> maybe_sources =
+      ui::ReadCustomDataForType(p, u"fs/sources");
+  if (!maybe_sources.has_value()) {
     return paths;
   }
 
@@ -65,8 +65,9 @@
     return paths;
   }
 
-  for (const auto& source : base::SplitStringPiece(
-           sources, u"\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) {
+  for (const auto& source :
+       base::SplitStringPiece(*maybe_sources, u"\n", base::TRIM_WHITESPACE,
+                              base::SPLIT_WANT_NONEMPTY)) {
     if (auto path = client->CrackFileSystemUrl(GURL(source)); !path.empty()) {
       paths.emplace_back(std::move(path));
     }
diff --git a/ash/shelf/shelf_app_button.cc b/ash/shelf/shelf_app_button.cc
index 411cd08c..ab7481b 100644
--- a/ash/shelf/shelf_app_button.cc
+++ b/ash/shelf/shelf_app_button.cc
@@ -1134,7 +1134,7 @@
         ProgressIndicator::CreateDefaultInstance(base::BindRepeating(
             [](ShelfAppButton* view) -> absl::optional<float> {
               if (view->app_status() == AppStatus::kPending) {
-                return absl::nullopt;
+                return 0.0f;
               }
               // If download is in-progress, return the progress as a decimal.
               // Otherwise, the progress indicator shouldn't be painted.
@@ -1151,7 +1151,7 @@
           return view->GetColorProvider()->GetColor(color_id);
         },
         base::Unretained(this))));
-    progress_indicator_->SetColorId(cros_tokens::kCrosSysOnPrimaryContainer);
+    progress_indicator_->SetColorId(cros_tokens::kCrosRefPrimary70);
   }
 
   const gfx::Rect button_bounds(GetContentsBounds());
diff --git a/ash/shelf/shelf_view_unittest.cc b/ash/shelf/shelf_view_unittest.cc
index 39c1d33..90bded5d6 100644
--- a/ash/shelf/shelf_view_unittest.cc
+++ b/ash/shelf/shelf_view_unittest.cc
@@ -4055,12 +4055,11 @@
 
   ProgressIndicator* progress_indicator = button->GetProgressIndicatorForTest();
   ASSERT_TRUE(progress_indicator);
-
   // Change app status to installing and send a progress update. Verify that the
   // progress indicator correctly reflects the progress.
   EXPECT_EQ(button->progress(), -1.0f);
   EXPECT_EQ(button->app_status(), AppStatus::kPending);
-  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, absl::nullopt);
+  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, 0.0f);
 
   // Start install progress bar.
   item.app_status = AppStatus::kInstalling;
@@ -4073,28 +4072,28 @@
 
   // Change app status back to pending state. Verify that even if the item had
   // progress previously associated to it, the progress indicator reflects as
-  // indeterminate progress since it is pending.
+  // 0 progress since it is pending.
   item.app_status = AppStatus::kPending;
   model_->Set(index, item);
   EXPECT_EQ(item.progress, 0.3f);
   EXPECT_EQ(button->progress(), 0.3f);
   EXPECT_EQ(button->app_status(), AppStatus::kPending);
-  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, absl::nullopt);
+  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, 0.0f);
 
   // Send another progress update. Since the app status is still pending, the
-  // progress indicator still be indeterminate
+  // progress indicator still be 0.
   item.progress = 0.7f;
   model_->Set(index, item);
   EXPECT_EQ(item.progress, 0.7f);
   EXPECT_EQ(button->progress(), 0.7f);
   EXPECT_EQ(button->app_status(), AppStatus::kPending);
-  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, absl::nullopt);
+  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, 0.0f);
 
   // Set the last status update to kReady as if the app had finished installing.
   item.app_status = AppStatus::kReady;
   model_->Set(index, item);
   EXPECT_EQ(button->app_status(), AppStatus::kReady);
-  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, absl::nullopt);
+  ProgressIndicatorWaiter().WaitForProgress(progress_indicator, 0.0f);
 }
 
 }  // namespace ash
diff --git a/ash/system/time/calendar_view_controller.cc b/ash/system/time/calendar_view_controller.cc
index 3d1b8e2..86b69b8 100644
--- a/ash/system/time/calendar_view_controller.cc
+++ b/ash/system/time/calendar_view_controller.cc
@@ -200,8 +200,6 @@
 }
 
 void CalendarViewController::CloseEventListView() {
-  selected_date_ = absl::nullopt;
-
   for (auto& observer : observers_)
     observer.CloseEventList();
 }
@@ -212,6 +210,7 @@
 
 void CalendarViewController::OnEventListClosed() {
   is_event_list_showing_ = false;
+  selected_date_ = absl::nullopt;
 }
 
 void CalendarViewController::CalendarLoaded() {
diff --git a/ash/system/time/calendar_view_unittest.cc b/ash/system/time/calendar_view_unittest.cc
index 36fd594d..53aae21 100644
--- a/ash/system/time/calendar_view_unittest.cc
+++ b/ash/system/time/calendar_view_unittest.cc
@@ -1454,8 +1454,8 @@
     event_generator->ClickLeftButton();
   }
 
-  base::Time GetSelectedDate() {
-    return calendar_view_->calendar_view_controller()->selected_date_.value();
+  absl::optional<base::Time> GetSelectedDate() {
+    return calendar_view_->calendar_view_controller()->selected_date_;
   }
 
   void CloseEventList() { calendar_view_->CloseEventList(); }
@@ -1938,7 +1938,7 @@
   EXPECT_EQ(1.0f, header()->layer()->opacity());
   // Expect today's date in `selected_date_` after resetting to today.
   EXPECT_EQ(calendar_utils::GetMonthDayYear(base::Time::Now()),
-            calendar_utils::GetMonthDayYear(GetSelectedDate()));
+            calendar_utils::GetMonthDayYear(GetSelectedDate().value()));
 
   // Expect header visible after closing event list and resetting to today.
   CloseEventList();
@@ -2220,6 +2220,69 @@
   EXPECT_FALSE(event_list_view());
 }
 
+// Regression test for b/265203105
+// Tests open/close the `CalendarEventListView`. Also tests one corner case:
+// when closing the event list right after opening it, do nothing since the
+// animation is not finished.
+TEST_F(CalendarViewAnimationTest, OpenAndCloseEventList) {
+  ui::ScopedAnimationDurationScaleMode test_duration_mode(
+      ui::ScopedAnimationDurationScaleMode::NON_ZERO_DURATION);
+
+  CreateCalendarView();
+  ui::LayerAnimationStoppedWaiter animation_waiter;
+  animation_waiter.Wait(header()->layer());
+
+  // Opens the `CalendarEventListView`.
+  const std::u16string kDateNumber = u"10";
+  const auto* valid_date_cell =
+      GetDateCell(/*month=*/current_month(), /*day=*/kDateNumber);
+  ClickDateCell(valid_date_cell);
+
+  EXPECT_TRUE(IsAnimating());
+  EXPECT_TRUE(event_list_view());
+  EXPECT_TRUE(GetSelectedDate().has_value());
+  EXPECT_EQ(kDateNumber,
+            calendar_utils::GetDayIntOfMonth(GetSelectedDate().value()));
+
+  // Should not close the event list before showing up animation is finished.
+  CloseEventList();
+  EXPECT_TRUE(IsAnimating());
+  EXPECT_TRUE(event_list_view());
+  EXPECT_TRUE(GetSelectedDate().has_value());
+  EXPECT_EQ(kDateNumber,
+            calendar_utils::GetDayIntOfMonth(GetSelectedDate().value()));
+
+  // After the showing up animation is finished, the event list view should be
+  // up.
+  animation_waiter.Wait(event_list_view()->layer());
+  animation_waiter.Wait(calendar_sliding_surface_view()->layer());
+  animation_waiter.Wait(current_label()->layer());
+  EXPECT_FALSE(IsAnimating());
+  EXPECT_TRUE(event_list_view());
+  EXPECT_TRUE(GetSelectedDate().has_value());
+  EXPECT_EQ(kDateNumber,
+            calendar_utils::GetDayIntOfMonth(GetSelectedDate().value()));
+
+  // Should close the event list now.
+  CloseEventList();
+
+  // The event list the view is still showing and `selected_date_` value is
+  // still set during the animation.
+  EXPECT_TRUE(IsAnimating());
+  EXPECT_TRUE(event_list_view());
+  EXPECT_TRUE(GetSelectedDate().has_value());
+  EXPECT_EQ(kDateNumber,
+            calendar_utils::GetDayIntOfMonth(GetSelectedDate().value()));
+
+  // Resets the `selected_date_` after the fading out animation is done.
+  animation_waiter.Wait(event_list_view()->layer());
+  animation_waiter.Wait(calendar_sliding_surface_view()->layer());
+  animation_waiter.Wait(current_label()->layer());
+  EXPECT_FALSE(IsAnimating());
+  EXPECT_FALSE(event_list_view());
+  EXPECT_FALSE(GetSelectedDate().has_value());
+}
+
 // Test class for testing the `CalendarView` together with the message center
 // bubble.
 class CalendarViewWithMessageCenterTest : public AshTestBase {
diff --git a/ash/webui/common/resources/network/apn_detail_dialog.d.ts b/ash/webui/common/resources/network/apn_detail_dialog.d.ts
index 983fe59..8c1881f9 100644
--- a/ash/webui/common/resources/network/apn_detail_dialog.d.ts
+++ b/ash/webui/common/resources/network/apn_detail_dialog.d.ts
@@ -2,4 +2,26 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-export {};
+import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {ApnProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+
+import {ApnDetailDialogMode} from './cellular_utils.js';
+
+export class ApnDetailDialog extends I18nMixin
+(PolymerElement) {
+guid:
+  string;
+apnProperties:
+  ApnProperties|undefined;
+mode:
+  ApnDetailDialogMode;
+apnList:
+  ApnProperties[];
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'apn-detail-dialog': ApnDetailDialog;
+  }
+}
diff --git a/ash/webui/file_manager/resource_loader.cc b/ash/webui/file_manager/resource_loader.cc
index d21e45492..cbd4d41 100644
--- a/ash/webui/file_manager/resource_loader.cc
+++ b/ash/webui/file_manager/resource_loader.cc
@@ -5,9 +5,7 @@
 #include "ash/webui/file_manager/resource_loader.h"
 
 #include "base/containers/contains.h"
-#include "base/files/file_path.h"
 #include "base/strings/string_util.h"
-#include "chromeos/constants/chromeos_features.h"
 
 namespace ash {
 namespace file_manager {
@@ -15,16 +13,6 @@
 void AddFilesAppResources(content::WebUIDataSource* source,
                           const webui::ResourcePath* entries,
                           size_t size) {
-  // For Jelly we need to remap some resource dependencies.
-  std::map<std::string, int> resource_map;
-  if (chromeos::features::IsJellyEnabled()) {
-    for (size_t i = 0; i < size; ++i) {
-      const base::FilePath file_path(entries[i].path);
-      if (file_path.Extension() == ".css") {
-        resource_map[std::string(entries[i].path)] = entries[i].id;
-      }
-    }
-  }
   for (size_t i = 0; i < size; ++i) {
     std::string path(entries[i].path);
     // Only load resources for Files app.
@@ -33,22 +21,6 @@
       // Files app UI has all paths relative to //ui/file_manager/file_manager/
       // so we remove the leading file_manager/ to match the existing paths.
       base::ReplaceFirstSubstringAfterOffset(&path, 0, "file_manager/", "");
-      if (chromeos::features::IsJellyEnabled()) {
-        // Serve CSS files that have the suffix _gm3.css as if they were named
-        // without the suffix, serve the content of foo_gm3.css for requests
-        // for foo.css.
-        const base::FilePath file_path(entries[i].path);
-        if (file_path.Extension() == ".css") {
-          const std::string gm3_counterpart(
-              file_path.RemoveExtension().value() + "_gm3" +
-              file_path.Extension());
-          auto gm3_resource = resource_map.find(gm3_counterpart);
-          if (gm3_resource != resource_map.end()) {
-            source->AddResourcePath(path, gm3_resource->second);
-            continue;
-          }
-        }
-      }
       source->AddResourcePath(path, entries[i].id);
     }
   }
diff --git a/base/containers/span.h b/base/containers/span.h
index ab83b2238..8b94e87e 100644
--- a/base/containers/span.h
+++ b/base/containers/span.h
@@ -462,13 +462,28 @@
 
 template <typename It,
           typename T = std::remove_reference_t<iter_reference_t<It>>>
-span(It it, StrictNumeric<size_t> size) -> span<T>;
+span(It, StrictNumeric<size_t>) -> span<T>;
+
+template <typename It,
+          typename End,
+          typename = std::enable_if_t<!std::is_convertible_v<End, size_t>>,
+          typename T = std::remove_reference_t<iter_reference_t<It>>>
+span(It, End) -> span<T>;
+
+template <typename T, size_t N>
+span(T (&)[N]) -> span<T, N>;
+
+template <typename T, size_t N>
+span(std::array<T, N>&) -> span<T, N>;
+
+template <typename T, size_t N>
+span(const std::array<T, N>&) -> span<const T, N>;
 
 template <typename Container,
           typename T = std::remove_pointer_t<
               decltype(std::data(std::declval<Container>()))>,
           size_t X = internal::Extent<Container>::value>
-span(Container&& container) -> span<T, X>;
+span(Container&&) -> span<T, X>;
 
 // [span.objectrep], views of object representation
 template <typename T, size_t X>
diff --git a/base/containers/span_unittest.cc b/base/containers/span_unittest.cc
index f28d318..469530b 100644
--- a/base/containers/span_unittest.cc
+++ b/base/containers/span_unittest.cc
@@ -37,7 +37,8 @@
 //
 // Another alternative would be to use std::declval, but that would be fairly
 // verbose.
-[[maybe_unused]] void DeductionGuidesWithIteratorAndSize() {
+[[maybe_unused]] void TestDeductionGuides() {
+  // Tests for span(It, StrictNumeric<size_t>) deduction guide.
   {
     const std::vector<int> v;
     static_assert(
@@ -57,40 +58,98 @@
     static_assert(
         std::is_same_v<decltype(span(v.data(), v.size())), span<int>>);
   }
-}
 
-// Tests for span(Container&&) deduction guide.
-static_assert(std::is_same_v<decltype(span(std::declval<const std::string&>())),
-                             span<const char>>);
-static_assert(
-    std::is_same_v<decltype(span(std::declval<const std::string&&>())),
-                   span<const char>>);
-static_assert(
-    std::is_same_v<decltype(span(std::declval<std::string&>())), span<char>>);
-static_assert(std::is_same_v<decltype(span(std::declval<std::string&&>())),
-                             span<const char>>);
-static_assert(
-    std::is_same_v<decltype(span(std::declval<const std::u16string&>())),
-                   span<const char16_t>>);
-static_assert(
-    std::is_same_v<decltype(span(std::declval<const std::u16string&&>())),
-                   span<const char16_t>>);
-static_assert(std::is_same_v<decltype(span(std::declval<std::u16string&>())),
-                             span<char16_t>>);
-static_assert(std::is_same_v<decltype(span(std::declval<std::u16string&&>())),
-                             span<const char16_t>>);
-static_assert(
-    std::is_same_v<decltype(span(std::declval<const std::array<float, 9>&>())),
-                   span<const float, 9>>);
-static_assert(
-    std::is_same_v<decltype(span(std::declval<const std::array<float, 9>&&>())),
-                   span<const float, 9>>);
-static_assert(
-    std::is_same_v<decltype(span(std::declval<std::array<float, 9>&>())),
-                   span<float, 9>>);
-static_assert(
-    std::is_same_v<decltype(span(std::declval<std::array<float, 9>&&>())),
-                   span<const float, 9>>);
+  // Tests for span(It, End) deduction guide.
+  {
+    const std::vector<int> v;
+    static_assert(
+        std::is_same_v<decltype(span(v.cbegin(), v.cend())), span<const int>>);
+    static_assert(
+        std::is_same_v<decltype(span(v.begin(), v.end())), span<const int>>);
+  }
+
+  {
+    std::vector<int> v;
+    static_assert(
+        std::is_same_v<decltype(span(v.cbegin(), v.cend())), span<const int>>);
+    static_assert(
+        std::is_same_v<decltype(span(v.begin(), v.end())), span<int>>);
+  }
+
+  // Tests for span(T (&)[N]) deduction guide.
+  {
+    const int kArray[] = {1, 2, 3};
+    static_assert(std::is_same_v<decltype(span(kArray)), span<const int, 3>>);
+  }
+  {
+    int kArray[] = {1, 2, 3};
+    static_assert(std::is_same_v<decltype(span(kArray)), span<int, 3>>);
+  }
+
+  // Tests for span(std::array<T, N>&) deduction guide.
+  static_assert(
+      std::is_same_v<decltype(span(std::declval<std::array<const bool, 3>&>())),
+                     span<const bool, 3>>);
+  static_assert(
+      std::is_same_v<decltype(span(std::declval<std::array<bool, 3>&>())),
+                     span<bool, 3>>);
+
+  // Tests for span(const std::array<T, N>&) deduction guide.
+  static_assert(
+      std::is_same_v<decltype(span(
+                         std::declval<const std::array<const bool, 3>&>())),
+                     span<const bool, 3>>);
+  static_assert(
+      std::is_same_v<decltype(span(
+                         std::declval<const std::array<const bool, 3>&&>())),
+                     span<const bool, 3>>);
+  static_assert(std::is_same_v<
+                decltype(span(std::declval<std::array<const bool, 3>&&>())),
+                span<const bool, 3>>);
+  static_assert(
+      std::is_same_v<decltype(span(std::declval<const std::array<bool, 3>&>())),
+                     span<const bool, 3>>);
+  static_assert(std::is_same_v<
+                decltype(span(std::declval<const std::array<bool, 3>&&>())),
+                span<const bool, 3>>);
+  static_assert(
+      std::is_same_v<decltype(span(std::declval<std::array<bool, 3>&&>())),
+                     span<const bool, 3>>);
+
+  // Tests for span(Container&&) deduction guide.
+  static_assert(
+      std::is_same_v<decltype(span(std::declval<const std::string&>())),
+                     span<const char>>);
+  static_assert(
+      std::is_same_v<decltype(span(std::declval<const std::string&&>())),
+                     span<const char>>);
+  static_assert(
+      std::is_same_v<decltype(span(std::declval<std::string&>())), span<char>>);
+  static_assert(std::is_same_v<decltype(span(std::declval<std::string&&>())),
+                               span<const char>>);
+  static_assert(
+      std::is_same_v<decltype(span(std::declval<const std::u16string&>())),
+                     span<const char16_t>>);
+  static_assert(
+      std::is_same_v<decltype(span(std::declval<const std::u16string&&>())),
+                     span<const char16_t>>);
+  static_assert(std::is_same_v<decltype(span(std::declval<std::u16string&>())),
+                               span<char16_t>>);
+  static_assert(std::is_same_v<decltype(span(std::declval<std::u16string&&>())),
+                               span<const char16_t>>);
+  static_assert(std::is_same_v<
+                decltype(span(std::declval<const std::array<float, 9>&>())),
+                span<const float, 9>>);
+  static_assert(std::is_same_v<
+                decltype(span(std::declval<const std::array<float, 9>&&>())),
+                span<const float, 9>>);
+  static_assert(
+      std::is_same_v<decltype(span(std::declval<std::array<float, 9>&>())),
+                     span<float, 9>>);
+  static_assert(
+      std::is_same_v<decltype(span(std::declval<std::array<float, 9>&&>())),
+                     span<const float, 9>>);
+}
 
 }  // namespace
 
diff --git a/build/config/siso/PRESUBMIT.py b/build/config/siso/PRESUBMIT.py
index c6d009e..5a568694 100644
--- a/build/config/siso/PRESUBMIT.py
+++ b/build/config/siso/PRESUBMIT.py
@@ -17,6 +17,7 @@
       "\nPlease add the following fields to run Siso tryjobs.\n\n"
       "Cq-Include-Trybots: luci.chromium.try:android-arm64-siso-rel\n"
       "Cq-Include-Trybots: luci.chromium.try:chromeos-amd64-generic-siso-rel\n"
+      "Cq-Include-Trybots: luci.chromium.try:ios-simulator-siso\n"
       "Cq-Include-Trybots: luci.chromium.try:linux-siso-rel\n"
       "Cq-Include-Trybots: luci.chromium.try:linux-wayland-siso-rel\n"
       "Cq-Include-Trybots: luci.chromium.try:linux_chromium_asan_siso_rel_ng\n"
diff --git a/chrome/VERSION b/chrome/VERSION
index 0a1682c..6a68aa5c 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=120
 MINOR=0
-BUILD=6058
+BUILD=6059
 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
index 1141a46..9e97ea4d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediator.java
@@ -1426,7 +1426,7 @@
     }
 
     private void onClearSearchTextRunnable() {
-        setSearchTextAndUpdateButtonVisibility("");
+        onSearchTextChangeCallback("");
     }
 
     private void setSearchTextAndUpdateButtonVisibility(String searchText) {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
index 3f4efd3..6793efb 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
@@ -1546,6 +1546,9 @@
     @Test
     @EnableFeatures(ChromeFeatureList.ANDROID_IMPROVED_BOOKMARKS)
     public void testClearSearchTextRunnable() {
+        when(mBookmarkModel.searchBookmarks(anyString(), anyInt()))
+                .thenReturn(Collections.singletonList(mFolderId1));
+
         finishLoading();
         mMediator.openFolder(mFolderId1);
         assertEquals(ViewType.SEARCH_BOX, mModelList.get(0).type);
@@ -1563,11 +1566,16 @@
         assertEquals(searchText, propertyModel.get(BookmarkSearchBoxRowProperties.SEARCH_TEXT));
         assertTrue(propertyModel.get(
                 BookmarkSearchBoxRowProperties.CLEAR_SEARCH_TEXT_BUTTON_VISIBILITY));
+        verify(mBookmarkModel, times(1)).searchBookmarks(anyString(), anyInt());
+        verifyCurrentBookmarkIds(null, mFolderId1);
 
         clearSearchTextRunnable.run();
         assertEquals("", propertyModel.get(BookmarkSearchBoxRowProperties.SEARCH_TEXT));
         assertFalse(propertyModel.get(
                 BookmarkSearchBoxRowProperties.CLEAR_SEARCH_TEXT_BUTTON_VISIBILITY));
+        // It shouldn't search again.
+        verify(mBookmarkModel, times(1)).searchBookmarks(anyString(), anyInt());
+        assertEquals(1, mModelList.size());
     }
 
     @Test
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index b0c76c5..fbddbd93 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-120.0.6055.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-120.0.6056.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h
index 5a367e4..f78978b 100644
--- a/chrome/app/chrome_command_ids.h
+++ b/chrome/app/chrome_command_ids.h
@@ -409,6 +409,7 @@
 #define IDC_CONTENT_CONTEXT_OPEN_WITH_LAST IDC_CONTENT_CONTEXT_OPEN_WITH14
 // Context menu items that provide fast access to input methods.
 #define IDC_CONTENT_CONTEXT_EMOJI 50210
+#define IDC_CONTEXT_COMPOSE 50220
 // Context menu items in the bookmark bar
 #define IDC_BOOKMARK_BAR_OPEN_ALL 51000
 #define IDC_BOOKMARK_BAR_OPEN_ALL_NEW_WINDOW 51001
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc
index 4c150b5..bfe7b43d 100644
--- a/chrome/app/chrome_main_delegate.cc
+++ b/chrome/app/chrome_main_delegate.cc
@@ -1054,7 +1054,12 @@
   // sampler profiler because it can support java frames which is essential for
   // the main thread.
   base::RepeatingCallback tracing_factory =
+#if BUILDFLAG(IS_ANDROID)
+      base::BindRepeating(&CreateCoreUnwindersFactory,
+                          /*is_java_name_hashing_enabled=*/false);
+#else
       base::BindRepeating(&CreateCoreUnwindersFactory);
+#endif  // BUILDFLAG(IS_ANDROID)
   tracing::TracingSamplerProfiler::UnwinderType unwinder_type =
       tracing::TracingSamplerProfiler::UnwinderType::kCustomAndroid;
 #if BUILDFLAG(IS_ANDROID)
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index e3b4013d..96bdd09 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -2462,6 +2462,23 @@
         Delete from history
       </message>
 
+      <message name="IDS_DOWNLOAD_DANGEROUS_ICON_ACCESSIBLE_LABEL"
+               desc="On the downloads page, the accessible label for the icon for a blocked dangerous download.">
+        Dangerous download blocked
+      </message>
+      <message name="IDS_DOWNLOAD_SUSPICIOUS_ICON_ACCESSIBLE_LABEL"
+               desc="On the downloads page, the accessible label for the icon for a blocked suspicious download.">
+        Suspicious download blocked
+      </message>
+      <message name="IDS_DOWNLOAD_INSECURE_ICON_ACCESSIBLE_LABEL"
+               desc="On the downloads page, the accessible label for the icon for a blocked insecure download.">
+        Insecure download blocked
+      </message>
+      <message name="IDS_DOWNLOAD_UNVERIFIED_ICON_ACCESSIBLE_LABEL"
+               desc="On the downloads page, the accessible label for the icon for a blocked unverified download.">
+        Unverified download blocked
+      </message>
+
       <!-- Download Alerts for Accessibility -->
       <message name="IDS_DOWNLOAD_STATUS_IN_PROGRESS_ACCESSIBLE_ALERT"
                desc="The title of a download notification: the current download status is in progress. This message is for screen reader users.">
diff --git a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_DANGEROUS_ICON_ACCESSIBLE_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_DANGEROUS_ICON_ACCESSIBLE_LABEL.png.sha1
new file mode 100644
index 0000000..f06f2e47
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_DANGEROUS_ICON_ACCESSIBLE_LABEL.png.sha1
@@ -0,0 +1 @@
+fd3fc6a76b3d78134cb45590a15e3e0cec04d285
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_INSECURE_ICON_ACCESSIBLE_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_INSECURE_ICON_ACCESSIBLE_LABEL.png.sha1
new file mode 100644
index 0000000..f06f2e47
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_INSECURE_ICON_ACCESSIBLE_LABEL.png.sha1
@@ -0,0 +1 @@
+fd3fc6a76b3d78134cb45590a15e3e0cec04d285
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_SUSPICIOUS_ICON_ACCESSIBLE_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_SUSPICIOUS_ICON_ACCESSIBLE_LABEL.png.sha1
new file mode 100644
index 0000000..f06f2e47
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_SUSPICIOUS_ICON_ACCESSIBLE_LABEL.png.sha1
@@ -0,0 +1 @@
+fd3fc6a76b3d78134cb45590a15e3e0cec04d285
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_DOWNLOAD_UNVERIFIED_ICON_ACCESSIBLE_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_UNVERIFIED_ICON_ACCESSIBLE_LABEL.png.sha1
new file mode 100644
index 0000000..f06f2e47
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_DOWNLOAD_UNVERIFIED_ICON_ACCESSIBLE_LABEL.png.sha1
@@ -0,0 +1 @@
+fd3fc6a76b3d78134cb45590a15e3e0cec04d285
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings.grdp b/chrome/app/os_settings_strings.grdp
index 399edd2..1f8995f 100644
--- a/chrome/app/os_settings_strings.grdp
+++ b/chrome/app/os_settings_strings.grdp
@@ -1145,10 +1145,10 @@
     Loading...
   </message>
   <message name="IDS_SETTINGS_ONE_DRIVE_CONNECT" desc="Action to connect OneDrive in Settings: Files: OneDrive.">
-    Add
+    Connect
   </message>
   <message name="IDS_SETTINGS_ONE_DRIVE_DISCONNECT" desc="Action to disconnect from OneDrive in Settings: Files: OneDrive.">
-    Remove
+    Remove access
   </message>
   <message name="IDS_SETTINGS_OPEN_ONE_DRIVE_FOLDER" desc="Label for the Settings link in the OneDrive subpage to open the OneDrive folder">
     Open OneDrive folder
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ONE_DRIVE_CONNECT.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ONE_DRIVE_CONNECT.png.sha1
index 0290247..964de33 100644
--- a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ONE_DRIVE_CONNECT.png.sha1
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ONE_DRIVE_CONNECT.png.sha1
@@ -1 +1 @@
-68eb019bc6e9117d0cef7f67fd1efeb760407717
\ No newline at end of file
+499b488a261bf5504f517c84afd78fbf4cb270bc
\ No newline at end of file
diff --git a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ONE_DRIVE_DISCONNECT.png.sha1 b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ONE_DRIVE_DISCONNECT.png.sha1
index 0fa52a4..b5adf62 100644
--- a/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ONE_DRIVE_DISCONNECT.png.sha1
+++ b/chrome/app/os_settings_strings_grdp/IDS_SETTINGS_ONE_DRIVE_DISCONNECT.png.sha1
@@ -1 +1 @@
-125fd7b0bdd773bcaa66f676e4c517977523413e
\ No newline at end of file
+5c262e3ee17e52883f2aa6b72bd9afe50c258c07
\ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 5cb4c8aa..23e43a84 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -324,6 +324,8 @@
     "component_updater/masked_domain_list_component_installer.h",
     "component_updater/mei_preload_component_installer.cc",
     "component_updater/mei_preload_component_installer.h",
+    "component_updater/payload_test_component_installer.cc",
+    "component_updater/payload_test_component_installer.h",
     "component_updater/pki_metadata_component_installer.cc",
     "component_updater/pki_metadata_component_installer.h",
     "component_updater/pnacl_component_installer.cc",
@@ -2172,6 +2174,7 @@
     "//components/component_updater",
     "//components/component_updater/installer_policies",
     "//components/compose:buildflags",
+    "//components/compose/core/browser:features",
     "//components/consent_auditor",
     "//components/content_capture/browser",
     "//components/content_relationship_verification",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS
index ae7dbf80..f2b321d 100644
--- a/chrome/browser/DEPS
+++ b/chrome/browser/DEPS
@@ -605,6 +605,7 @@
     "+components/services/storage/shared_storage/shared_storage_manager.h",
   ],
   "render_view_context_menu_browsertest.cc" : [
+    "+components/compose/buildflags.h",
     "+third_party/libwebp/src/src/webp/decode.h",
   ],
   "webauth_interactive_uitest.cc": [
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 853c473..1ad9254 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -262,7 +262,6 @@
 #include "ash/constants/ash_switches.h"
 #include "ash/public/cpp/app_list/app_list_features.h"
 #include "ash/public/cpp/keyboard/keyboard_switches.h"
-#include "chrome/browser/ash/android_sms/android_sms_switches.h"
 #include "chrome/browser/ash/app_list/search/search_features.h"
 #include "chrome/browser/ash/bruschetta/bruschetta_util.h"
 #include "chrome/browser/ash/crosapi/browser_manager.h"
@@ -4420,13 +4419,6 @@
     {"qs-revamp", flag_descriptions::kQsRevampName,
      flag_descriptions::kQsRevampDescription, kOsCrOS,
      FEATURE_VALUE_TYPE(ash::features::kQsRevamp)},
-    {"use_messages_staging_url", flag_descriptions::kUseMessagesStagingUrlName,
-     flag_descriptions::kUseMessagesStagingUrlDescription, kOsCrOS,
-     FEATURE_VALUE_TYPE(ash::features::kUseMessagesStagingUrl)},
-    {"use-custom-messages-domain",
-     flag_descriptions::kUseCustomMessagesDomainName,
-     flag_descriptions::kUseCustomMessagesDomainDescription, kOsCrOS,
-     ORIGIN_LIST_VALUE_TYPE(switches::kCustomAndroidMessagesDomain, "")},
     {"disable-cancel-all-touches",
      flag_descriptions::kDisableCancelAllTouchesName,
      flag_descriptions::kDisableCancelAllTouchesDescription, kOsCrOS,
diff --git a/chrome/browser/apps/app_shim/web_app_shim_manager_delegate_mac.cc b/chrome/browser/apps/app_shim/web_app_shim_manager_delegate_mac.cc
index 16bd1dd..5851fef8 100644
--- a/chrome/browser/apps/app_shim/web_app_shim_manager_delegate_mac.cc
+++ b/chrome/browser/apps/app_shim/web_app_shim_manager_delegate_mac.cc
@@ -14,7 +14,7 @@
 #include "chrome/browser/apps/app_service/app_service_proxy_factory.h"
 #include "chrome/browser/apps/app_service/browser_app_launcher.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
 #include "chrome/browser/web_applications/os_integration/web_app_file_handler_manager.h"
 #include "chrome/browser/web_applications/os_integration/web_app_shortcut_mac.h"
@@ -329,7 +329,7 @@
     }
 
     if (!registrar.IsAllowedLaunchProtocol(app_id, protocol_url.scheme())) {
-      chrome::ShowWebAppProtocolLaunchDialog(
+      ShowWebAppProtocolLaunchDialog(
           std::move(protocol_url), profile, app_id,
           base::BindOnce(&UserChoiceDialogCompleted, std::move(params),
                          WebAppFileHandlerManager::LaunchInfos(), profile,
@@ -346,7 +346,7 @@
 
     if (web_app->file_handler_approval_state() ==
         ApiApprovalState::kRequiresPrompt) {
-      chrome::ShowWebAppFileLaunchDialog(
+      ShowWebAppFileLaunchDialog(
           launch_files, profile, app_id,
           base::BindOnce(&UserChoiceDialogCompleted, std::move(params),
                          file_launches, profile,
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn
index 233d249..a88bdfb 100644
--- a/chrome/browser/ash/BUILD.gn
+++ b/chrome/browser/ash/BUILD.gn
@@ -1015,8 +1015,6 @@
     "dbus/vm/plugin_vm_service_provider.h",
     "dbus/vm/vm_applications_service_provider.cc",
     "dbus/vm/vm_applications_service_provider.h",
-    "dbus/vm/vm_disk_management_service_provider.cc",
-    "dbus/vm/vm_disk_management_service_provider.h",
     "dbus/vm/vm_launch_service_provider.cc",
     "dbus/vm/vm_launch_service_provider.h",
     "dbus/vm/vm_permission_service_provider.cc",
@@ -3985,7 +3983,6 @@
     "//chromeos/ash/components/chaps_util",
     "//chromeos/ash/components/dbus",
     "//chromeos/ash/components/dbus:plugin_vm_service_proto",
-    "//chromeos/ash/components/dbus:vm_disk_management_proto",
     "//chromeos/ash/components/dbus:vm_permission_service_proto",
     "//chromeos/ash/components/dbus:vm_sk_forwarding_proto",
     "//chromeos/ash/components/dbus/arc",
@@ -4362,7 +4359,6 @@
     "dbus/org.chromium.VirtualFileRequestService.conf",
     "dbus/vm/org.chromium.PluginVmService.conf",
     "dbus/vm/org.chromium.VmApplicationsService.conf",
-    "dbus/vm/org.chromium.VmDiskManagementService.conf",
     "dbus/vm/org.chromium.VmLaunchService.conf",
     "dbus/vm/org.chromium.VmPermissionService.conf",
     "dbus/vm/org.chromium.VmSKForwardingService.conf",
diff --git a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
index 98365de..ec8ac19 100644
--- a/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
+++ b/chrome/browser/ash/arc/input_overlay/display_overlay_controller.cc
@@ -1124,9 +1124,6 @@
       /*accept_events=*/false, /*is_floating=*/false);
   input_mapping_widget_->SetContentsView(
       std::make_unique<InputMappingView>(this));
-  auto* window = input_mapping_widget_->GetNativeWindow();
-  window->parent()->StackChildAtBottom(window);
-
   UpdateInputMappingWidgetBounds();
 }
 
diff --git a/chrome/browser/ash/borealis/borealis_features_util.cc b/chrome/browser/ash/borealis/borealis_features_util.cc
index 4088999..a4dfe81 100644
--- a/chrome/browser/ash/borealis/borealis_features_util.cc
+++ b/chrome/browser/ash/borealis/borealis_features_util.cc
@@ -87,6 +87,17 @@
   return base::ToLowerASCII(hardware_class);
 }
 
+std::string RemoveNonBorealisSuffix(const std::string& board) {
+  if (board.ends_with("-borealis")) {
+    return board;
+  }
+  size_t last_hyphen_pos = board.rfind('-');
+  if (last_hyphen_pos == std::string::npos) {
+    return board;
+  }
+  return board.substr(0, last_hyphen_pos);
+}
+
 }  // namespace
 
 TokenHardwareChecker::Data::Data(std::string token_hash,
@@ -159,11 +170,11 @@
 }
 
 bool TokenHardwareChecker::IsBoard(const std::string& board) const {
-  return token_hardware_.board == board;
+  return RemoveNonBorealisSuffix(token_hardware_.board) == board;
 }
 
 bool TokenHardwareChecker::BoardIn(base::flat_set<std::string> boards) const {
-  return boards.contains(token_hardware_.board);
+  return boards.contains(RemoveNonBorealisSuffix(token_hardware_.board));
 }
 
 bool TokenHardwareChecker::IsModel(const std::string& model) const {
diff --git a/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc b/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc
index 839242d..c1cfa6d8 100644
--- a/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc
+++ b/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc
@@ -35,6 +35,9 @@
   EXPECT_EQ(check("volteer", "lindar",
                   "11th Gen Intel(R) Core(TM) i5-1145G7 @ 2.60GHz", 8, ""),
             AllowStatus::kAllowed);
+  EXPECT_EQ(check("volteer-foo", "lindar",
+                  "11th Gen Intel(R) Core(TM) i5-1145G7 @ 2.60GHz", 8, ""),
+            AllowStatus::kAllowed);
 
   // Insufficient ram/cpu
   EXPECT_EQ(check("volteer", "lindar",
@@ -57,6 +60,9 @@
   EXPECT_EQ(
       check("majolica", "", "AMD Ryzen 5 5625C with Radeon Graphics", 8, ""),
       AllowStatus::kAllowed);
+  EXPECT_EQ(check("guybrush-dash", "", "AMD Ryzen 5 5625C with Radeon Graphics",
+                  8, ""),
+            AllowStatus::kAllowed);
 
   EXPECT_EQ(
       check("majolica", "", "AMD Ryzen 5 5625C with Radeon Graphics", 1, ""),
diff --git a/chrome/browser/ash/bruschetta/bruschetta_service.cc b/chrome/browser/ash/bruschetta/bruschetta_service.cc
index 79f63974..bd77d54 100644
--- a/chrome/browser/ash/bruschetta/bruschetta_service.cc
+++ b/chrome/browser/ash/bruschetta/bruschetta_service.cc
@@ -49,9 +49,8 @@
     return;
   }
 
-  ash::ConciergeClient* concierge = ash::ConciergeClient::Get();
-  if (concierge != nullptr) {
-    vm_observer_.Observe(concierge);
+  if (auto* concierge = ash::ConciergeClient::Get(); concierge) {
+    concierge->AddVmObserver(this);
   }
 
   pref_observer_.Init(profile_->GetPrefs());
@@ -85,7 +84,13 @@
   OnPolicyChanged();
 }
 
-BruschettaService::~BruschettaService() = default;
+BruschettaService::~BruschettaService() {
+  // ConciergeClient may be destroyed prior to BruschettaService in tests.
+  // Therefore we do this instead of ScopedObservation.
+  if (auto* concierge = ash::ConciergeClient::Get(); concierge) {
+    concierge->RemoveVmObserver(this);
+  }
+}
 
 BruschettaService* BruschettaService::GetForProfile(Profile* profile) {
   return BruschettaServiceFactory::GetForProfile(profile);
diff --git a/chrome/browser/ash/bruschetta/bruschetta_service.h b/chrome/browser/ash/bruschetta/bruschetta_service.h
index f46ea14..a7de5bf 100644
--- a/chrome/browser/ash/bruschetta/bruschetta_service.h
+++ b/chrome/browser/ash/bruschetta/bruschetta_service.h
@@ -117,9 +117,6 @@
 
   PrefChangeRegistrar pref_observer_;
   base::CallbackListSubscription cros_settings_observer_;
-  base::ScopedObservation<ash::ConciergeClient,
-                          ash::ConciergeClient::VmObserver>
-      vm_observer_{this};
 
   const raw_ptr<Profile, ExperimentalAsh> profile_;
 
diff --git a/chrome/browser/ash/chrome_browser_main_parts_ash.cc b/chrome/browser/ash/chrome_browser_main_parts_ash.cc
index 21aa00d..f56c1cc 100644
--- a/chrome/browser/ash/chrome_browser_main_parts_ash.cc
+++ b/chrome/browser/ash/chrome_browser_main_parts_ash.cc
@@ -88,7 +88,6 @@
 #include "chrome/browser/ash/dbus/virtual_file_request_service_provider.h"
 #include "chrome/browser/ash/dbus/vm/plugin_vm_service_provider.h"
 #include "chrome/browser/ash/dbus/vm/vm_applications_service_provider.h"
-#include "chrome/browser/ash/dbus/vm/vm_disk_management_service_provider.h"
 #include "chrome/browser/ash/dbus/vm/vm_launch_service_provider.h"
 #include "chrome/browser/ash/dbus/vm/vm_permission_service_provider.h"
 #include "chrome/browser/ash/dbus/vm/vm_sk_forwarding_service_provider.h"
@@ -449,13 +448,6 @@
         CrosDBusService::CreateServiceProviderList(
             std::make_unique<VmApplicationsServiceProvider>()));
 
-    vm_disk_management_service_ = CrosDBusService::Create(
-        system_bus, vm_tools::disk_management::kVmDiskManagementServiceName,
-        dbus::ObjectPath(
-            vm_tools::disk_management::kVmDiskManagementServicePath),
-        CrosDBusService::CreateServiceProviderList(
-            std::make_unique<VmDiskManagementServiceProvider>()));
-
     vm_launch_service_ = CrosDBusService::Create(
         system_bus, vm_tools::launch::kVmLaunchServiceName,
         dbus::ObjectPath(vm_tools::launch::kVmLaunchServicePath),
@@ -592,7 +584,6 @@
     component_updater_service_.reset();
     chrome_features_service_.reset();
     vm_applications_service_.reset();
-    vm_disk_management_service_.reset();
     vm_launch_service_.reset();
     vm_sk_forwarding_service_.reset();
     vm_permission_service_.reset();
@@ -625,7 +616,6 @@
   std::unique_ptr<CrosDBusService> component_updater_service_;
   std::unique_ptr<CrosDBusService> chrome_features_service_;
   std::unique_ptr<CrosDBusService> vm_applications_service_;
-  std::unique_ptr<CrosDBusService> vm_disk_management_service_;
   std::unique_ptr<CrosDBusService> vm_launch_service_;
   std::unique_ptr<CrosDBusService> vm_sk_forwarding_service_;
   std::unique_ptr<CrosDBusService> vm_permission_service_;
diff --git a/chrome/browser/ash/crosapi/url_handler_ash.cc b/chrome/browser/ash/crosapi/url_handler_ash.cc
index 1a4dfa1..4af1a90 100644
--- a/chrome/browser/ash/crosapi/url_handler_ash.cc
+++ b/chrome/browser/ash/crosapi/url_handler_ash.cc
@@ -12,7 +12,9 @@
 #include "ash/webui/print_management/url_constants.h"
 #include "ash/webui/scanning/url_constants.h"
 #include "ash/webui/system_apps/public/system_web_app_type.h"
+#include "chrome/browser/ash/guest_os/guest_os_external_protocol_handler.h"
 #include "chrome/browser/ash/system_web_apps/system_web_app_manager.h"
+#include "chrome/browser/platform_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
 #include "chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h"
@@ -43,6 +45,27 @@
   OpenUrlInternal(url);
 }
 
+void UrlHandlerAsh::GetExternalHandler(const GURL& url,
+                                       GetExternalHandlerCallback callback) {
+  Profile* profile = Profile::FromBrowserContext(
+      ash::BrowserContextHelper::Get()->GetBrowserContextByUser(
+          user_manager::UserManager::Get()->GetPrimaryUser()));
+  absl::optional<std::string> name;
+  absl::optional<guest_os::GuestOsUrlHandler> registration =
+      guest_os::GuestOsUrlHandler::GetForUrl(profile, url);
+  if (registration) {
+    name = registration->name();
+  }
+  std::move(callback).Run(name);
+}
+
+void UrlHandlerAsh::OpenExternal(const GURL& url) {
+  Profile* profile = Profile::FromBrowserContext(
+      ash::BrowserContextHelper::Get()->GetBrowserContextByUser(
+          user_manager::UserManager::Get()->GetPrimaryUser()));
+  platform_util::OpenExternal(profile, url);
+}
+
 namespace {
 
 absl::optional<ash::SystemWebAppType> GetSystemAppForURL(Profile* profile,
diff --git a/chrome/browser/ash/crosapi/url_handler_ash.h b/chrome/browser/ash/crosapi/url_handler_ash.h
index 200f8e4..878a55c 100644
--- a/chrome/browser/ash/crosapi/url_handler_ash.h
+++ b/chrome/browser/ash/crosapi/url_handler_ash.h
@@ -23,6 +23,9 @@
 
   // crosapi::mojom::UrlHandler:
   void OpenUrl(const GURL& url) override;
+  void GetExternalHandler(const GURL& url,
+                          GetExternalHandlerCallback callback) override;
+  void OpenExternal(const GURL& url) override;
 
   // Returns |false| when the URL was invalid and will not get processed and
   // |true| when the URL will get processed (synchronous or asynchronously).
diff --git a/chrome/browser/ash/dbus/vm/org.chromium.VmDiskManagementService.conf b/chrome/browser/ash/dbus/vm/org.chromium.VmDiskManagementService.conf
deleted file mode 100644
index a703c100..0000000
--- a/chrome/browser/ash/dbus/vm/org.chromium.VmDiskManagementService.conf
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
-  "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<!--
-  Copyright 2021 The Chromium Authors
-  Use of this source code is governed by a BSD-style license that can be
-  found in the LICENSE file.
--->
-
-<busconfig>
-  <policy user="chronos">
-    <allow own="org.chromium.VmDiskManagementService"/>
-  </policy>
-
-  <policy user="vm_cicerone">
-    <allow send_destination="org.chromium.VmDiskManagementService"
-           send_interface="org.chromium.VmDiskManagementService"/>
-  </policy>
-</busconfig>
\ No newline at end of file
diff --git a/chrome/browser/ash/dbus/vm/vm_disk_management_service_provider.cc b/chrome/browser/ash/dbus/vm/vm_disk_management_service_provider.cc
deleted file mode 100644
index 4fa49a1..0000000
--- a/chrome/browser/ash/dbus/vm/vm_disk_management_service_provider.cc
+++ /dev/null
@@ -1,242 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "chrome/browser/ash/dbus/vm/vm_disk_management_service_provider.h"
-
-#include <string>
-
-#include "base/functional/bind.h"
-#include "base/logging.h"
-#include "chrome/browser/ash/borealis/borealis_disk_manager_dispatcher.h"
-#include "chrome/browser/ash/borealis/borealis_metrics.h"
-#include "chrome/browser/ash/borealis/borealis_service.h"
-#include "chrome/browser/profiles/profile_manager.h"
-#include "chromeos/ash/components/dbus/vm_disk_management/disk_management.pb.h"
-#include "dbus/bus.h"
-#include "dbus/message.h"
-#include "third_party/cros_system_api/dbus/service_constants.h"
-
-namespace ash {
-
-VmDiskManagementServiceProvider::VmDiskManagementServiceProvider() = default;
-
-VmDiskManagementServiceProvider::~VmDiskManagementServiceProvider() = default;
-
-void VmDiskManagementServiceProvider::Start(
-    scoped_refptr<dbus::ExportedObject> exported_object) {
-  exported_object->ExportMethod(
-      vm_tools::disk_management::kVmDiskManagementServiceInterface,
-      vm_tools::disk_management::kVmDiskManagementServiceGetDiskInfoMethod,
-      base::BindRepeating(&VmDiskManagementServiceProvider::GetDiskInfo,
-                          weak_ptr_factory_.GetWeakPtr()),
-      base::BindOnce(&VmDiskManagementServiceProvider::OnExported,
-                     weak_ptr_factory_.GetWeakPtr()));
-  exported_object->ExportMethod(
-      vm_tools::disk_management::kVmDiskManagementServiceInterface,
-      vm_tools::disk_management::kVmDiskManagementServiceRequestSpaceMethod,
-      base::BindRepeating(&VmDiskManagementServiceProvider::RequestSpace,
-                          weak_ptr_factory_.GetWeakPtr()),
-      base::BindOnce(&VmDiskManagementServiceProvider::OnExported,
-                     weak_ptr_factory_.GetWeakPtr()));
-  exported_object->ExportMethod(
-      vm_tools::disk_management::kVmDiskManagementServiceInterface,
-      vm_tools::disk_management::kVmDiskManagementServiceReleaseSpaceMethod,
-      base::BindRepeating(&VmDiskManagementServiceProvider::ReleaseSpace,
-                          weak_ptr_factory_.GetWeakPtr()),
-      base::BindOnce(&VmDiskManagementServiceProvider::OnExported,
-                     weak_ptr_factory_.GetWeakPtr()));
-}
-
-void VmDiskManagementServiceProvider::OnExported(
-    const std::string& interface_name,
-    const std::string& method_name,
-    bool success) {
-  LOG_IF(ERROR, !success) << "Failed to export " << interface_name << "."
-                          << method_name;
-}
-
-void VmDiskManagementServiceProvider::GetDiskInfo(
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender) {
-  dbus::MessageReader reader(method_call);
-
-  vm_tools::disk_management::GetDiskInfoRequest request;
-  if (!reader.PopArrayOfBytesAsProto(&request)) {
-    constexpr char error_message[] =
-        "Unable to parse GetDiskInfoRequest from message";
-    LOG(ERROR) << error_message;
-    std::move(response_sender)
-        .Run(dbus::ErrorResponse::FromMethodCall(
-            method_call, DBUS_ERROR_INVALID_ARGS, error_message));
-    return;
-  }
-
-  std::unique_ptr<dbus::Response> response =
-      dbus::Response::FromMethodCall(method_call);
-
-  if (request.origin().vm_name().empty() ||
-      request.origin().container_name().empty() ||
-      request.origin().owner_id().empty()) {
-    OnGetDiskInfo(std::move(response), std::move(response_sender),
-                  base::unexpected(
-                      borealis::Described<borealis::BorealisGetDiskInfoResult>(
-                          borealis::BorealisGetDiskInfoResult::kInvalidRequest,
-                          "GetDiskInfoRequest failed: request has missing or "
-                          "incomplete origin")));
-    return;
-  }
-
-  borealis::BorealisService::GetForProfile(
-      ProfileManager::GetPrimaryUserProfile())
-      ->DiskManagerDispatcher()
-      .GetDiskInfo(
-          request.origin().vm_name(), request.origin().container_name(),
-          base::BindOnce(&VmDiskManagementServiceProvider::OnGetDiskInfo,
-                         weak_ptr_factory_.GetWeakPtr(), std::move(response),
-                         std::move(response_sender)));
-}
-
-void VmDiskManagementServiceProvider::RequestSpace(
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender) {
-  dbus::MessageReader reader(method_call);
-
-  vm_tools::disk_management::RequestSpaceRequest request;
-  if (!reader.PopArrayOfBytesAsProto(&request)) {
-    constexpr char error_message[] =
-        "Unable to parse RequestSpaceRequest from message";
-    LOG(ERROR) << error_message;
-    std::move(response_sender)
-        .Run(dbus::ErrorResponse::FromMethodCall(
-            method_call, DBUS_ERROR_INVALID_ARGS, error_message));
-    return;
-  }
-
-  std::unique_ptr<dbus::Response> response =
-      dbus::Response::FromMethodCall(method_call);
-
-  if (request.origin().vm_name().empty() ||
-      request.origin().container_name().empty() ||
-      request.origin().owner_id().empty()) {
-    OnRequestSpace(
-        std::move(response), std::move(response_sender),
-        base::unexpected(
-            borealis::Described<borealis::BorealisResizeDiskResult>(
-                borealis::BorealisResizeDiskResult::kInvalidRequest,
-                "RequestSpaceRequest failed: request has missing or incomplete "
-                "origin")));
-    return;
-  }
-
-  borealis::BorealisService::GetForProfile(
-      ProfileManager::GetPrimaryUserProfile())
-      ->DiskManagerDispatcher()
-      .RequestSpace(
-          request.origin().vm_name(), request.origin().container_name(),
-          request.space_requested(),
-          base::BindOnce(&VmDiskManagementServiceProvider::OnRequestSpace,
-                         weak_ptr_factory_.GetWeakPtr(), std::move(response),
-                         std::move(response_sender)));
-}
-
-void VmDiskManagementServiceProvider::ReleaseSpace(
-    dbus::MethodCall* method_call,
-    dbus::ExportedObject::ResponseSender response_sender) {
-  dbus::MessageReader reader(method_call);
-
-  vm_tools::disk_management::ReleaseSpaceRequest request;
-  if (!reader.PopArrayOfBytesAsProto(&request)) {
-    constexpr char error_message[] =
-        "Unable to parse ReleaseSpaceRequest from message";
-    LOG(ERROR) << error_message;
-    std::move(response_sender)
-        .Run(dbus::ErrorResponse::FromMethodCall(
-            method_call, DBUS_ERROR_INVALID_ARGS, error_message));
-    return;
-  }
-
-  std::unique_ptr<dbus::Response> response =
-      dbus::Response::FromMethodCall(method_call);
-
-  if (request.origin().vm_name().empty() ||
-      request.origin().container_name().empty() ||
-      request.origin().owner_id().empty()) {
-    OnReleaseSpace(
-        std::move(response), std::move(response_sender),
-        base::unexpected(
-            borealis::Described<borealis::BorealisResizeDiskResult>(
-                borealis::BorealisResizeDiskResult::kInvalidRequest,
-                "ReleaseSpaceRequest failed: request has missing or incomplete "
-                "origin")));
-    return;
-  }
-
-  borealis::BorealisService::GetForProfile(
-      ProfileManager::GetPrimaryUserProfile())
-      ->DiskManagerDispatcher()
-      .ReleaseSpace(
-          request.origin().vm_name(), request.origin().container_name(),
-          request.space_to_release(),
-          base::BindOnce(&VmDiskManagementServiceProvider::OnReleaseSpace,
-                         weak_ptr_factory_.GetWeakPtr(), std::move(response),
-                         std::move(response_sender)));
-}
-
-void VmDiskManagementServiceProvider::OnGetDiskInfo(
-    std::unique_ptr<dbus::Response> response,
-    dbus::ExportedObject::ResponseSender response_sender,
-    ExpectedGetDiskInfoResponse response_or_error) {
-  vm_tools::disk_management::GetDiskInfoResponse payload;
-  if (!response_or_error.has_value()) {
-    LOG(ERROR) << "GetDiskInfoRequest failed: "
-               << response_or_error.error().description();
-    payload.set_error(int(response_or_error.error().error()));
-  } else {
-    payload.set_available_space(response_or_error.value().available_bytes);
-    payload.set_expandable_space(response_or_error.value().expandable_bytes);
-    payload.set_disk_size(response_or_error.value().disk_size);
-  }
-  // Reply to the original D-Bus method call.
-  dbus::MessageWriter writer(response.get());
-  writer.AppendProtoAsArrayOfBytes(payload);
-  std::move(response_sender).Run(std::move(response));
-}
-
-void VmDiskManagementServiceProvider::OnRequestSpace(
-    std::unique_ptr<dbus::Response> response,
-    dbus::ExportedObject::ResponseSender response_sender,
-    ExpectedRequestDeltaResponse response_or_error) {
-  vm_tools::disk_management::RequestSpaceResponse payload;
-  if (!response_or_error.has_value()) {
-    LOG(ERROR) << "RequestSpaceRequest failed: "
-               << response_or_error.error().description();
-    payload.set_error(int(response_or_error.error().error()));
-  } else {
-    payload.set_space_granted(response_or_error.value());
-  }
-  // Reply to the original D-Bus method call.
-  dbus::MessageWriter writer(response.get());
-  writer.AppendProtoAsArrayOfBytes(payload);
-  std::move(response_sender).Run(std::move(response));
-}
-
-void VmDiskManagementServiceProvider::OnReleaseSpace(
-    std::unique_ptr<dbus::Response> response,
-    dbus::ExportedObject::ResponseSender response_sender,
-    ExpectedRequestDeltaResponse response_or_error) {
-  vm_tools::disk_management::ReleaseSpaceResponse payload;
-  if (!response_or_error.has_value()) {
-    LOG(ERROR) << "ReleaseSpaceRequest failed: "
-               << response_or_error.error().description();
-    payload.set_error(int(response_or_error.error().error()));
-  } else {
-    payload.set_space_released(response_or_error.value());
-  }
-  // Reply to the original D-Bus method call.
-  dbus::MessageWriter writer(response.get());
-  writer.AppendProtoAsArrayOfBytes(payload);
-  std::move(response_sender).Run(std::move(response));
-}
-
-}  // namespace ash
diff --git a/chrome/browser/ash/dbus/vm/vm_disk_management_service_provider.h b/chrome/browser/ash/dbus/vm/vm_disk_management_service_provider.h
deleted file mode 100644
index 9009b67..0000000
--- a/chrome/browser/ash/dbus/vm/vm_disk_management_service_provider.h
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_BROWSER_ASH_DBUS_VM_VM_DISK_MANAGEMENT_SERVICE_PROVIDER_H_
-#define CHROME_BROWSER_ASH_DBUS_VM_VM_DISK_MANAGEMENT_SERVICE_PROVIDER_H_
-
-#include "base/memory/weak_ptr.h"
-#include "chrome/browser/ash/borealis/borealis_disk_manager.h"
-#include "chromeos/ash/components/dbus/services/cros_dbus_service.h"
-#include "dbus/exported_object.h"
-
-using ExpectedGetDiskInfoResponse =
-    base::expected<borealis::BorealisDiskManager::GetDiskInfoResponse,
-                   borealis::Described<borealis::BorealisGetDiskInfoResult>>;
-
-using ExpectedRequestDeltaResponse =
-    base::expected<uint64_t,
-                   borealis::Described<borealis::BorealisResizeDiskResult>>;
-
-namespace dbus {
-class MethodCall;
-}  // namespace dbus
-
-namespace ash {
-
-// This class exports D-Bus methods used by Crostini VMs (currently only
-// Borealis) for resizing their disks.
-class VmDiskManagementServiceProvider
-    : public CrosDBusService::ServiceProviderInterface {
- public:
-  VmDiskManagementServiceProvider();
-  VmDiskManagementServiceProvider(const VmDiskManagementServiceProvider&) =
-      delete;
-  VmDiskManagementServiceProvider& operator=(
-      const VmDiskManagementServiceProvider&) = delete;
-  ~VmDiskManagementServiceProvider() override;
-
-  // CrosDBusService::ServiceProviderInterface overrides:
-  void Start(scoped_refptr<dbus::ExportedObject> exported_object) override;
-
- private:
-  // Called from ExportedObject when UpdateApplicationList() is exported as a
-  // D-Bus method or failed to be exported.
-  void OnExported(const std::string& interface_name,
-                  const std::string& method_name,
-                  bool success);
-
-  // Called on UI thread in response to a D-Bus request.
-  void GetDiskInfo(dbus::MethodCall* method_call,
-                   dbus::ExportedObject::ResponseSender response_sender);
-  void RequestSpace(dbus::MethodCall* method_call,
-                    dbus::ExportedObject::ResponseSender response_sender);
-  void ReleaseSpace(dbus::MethodCall* method_call,
-                    dbus::ExportedObject::ResponseSender response_sender);
-
-  // Callbacks for responding to certain D-Bus requests.
-  void OnGetDiskInfo(std::unique_ptr<dbus::Response> response,
-                     dbus::ExportedObject::ResponseSender response_sender,
-                     ExpectedGetDiskInfoResponse response_or_error);
-  void OnRequestSpace(std::unique_ptr<dbus::Response> response,
-                      dbus::ExportedObject::ResponseSender response_sender,
-                      ExpectedRequestDeltaResponse response_or_error);
-  void OnReleaseSpace(std::unique_ptr<dbus::Response> response,
-                      dbus::ExportedObject::ResponseSender response_sender,
-                      ExpectedRequestDeltaResponse response_or_error);
-
-  base::WeakPtrFactory<VmDiskManagementServiceProvider> weak_ptr_factory_{this};
-};
-
-}  // namespace ash
-
-#endif  // CHROME_BROWSER_ASH_DBUS_VM_VM_DISK_MANAGEMENT_SERVICE_PROVIDER_H_
diff --git a/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc b/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc
index ad2638b2..6365eb26 100644
--- a/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc
+++ b/chrome/browser/ash/extensions/autotest_private/autotest_private_api.cc
@@ -145,7 +145,6 @@
 #include "chrome/browser/ui/aura/accessibility/automation_manager_aura.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_tabstrip.h"
 #include "chrome/browser/ui/browser_window.h"
@@ -153,6 +152,7 @@
 #include "chrome/browser/ui/views/bruschetta/bruschetta_installer_view.h"
 #include "chrome/browser/ui/views/crostini/crostini_uninstaller_view.h"
 #include "chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/ui/webui/ash/crostini_installer/crostini_installer_dialog.h"
 #include "chrome/browser/ui/webui/ash/crostini_installer/crostini_installer_ui.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
@@ -4904,7 +4904,7 @@
       base::BindOnce(
           &AutotestPrivateInstallPWAForCurrentURLFunction::PWAInstalled, this));
 
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(true);
   if (!chrome::ExecuteCommand(browser, IDC_INSTALL_PWA)) {
     return Respond(Error("Failed to execute INSTALL_PWA command"));
   }
@@ -4912,13 +4912,13 @@
 
 void AutotestPrivateInstallPWAForCurrentURLFunction::PWAInstalled(
     const webapps::AppId& app_id) {
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(false);
   Respond(WithArguments(app_id));
   timeout_timer_.AbandonAndStop();
 }
 
 void AutotestPrivateInstallPWAForCurrentURLFunction::PWATimeout() {
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(false);
   Respond(Error("Install PWA timed out"));
 }
 
diff --git a/chrome/browser/ash/file_manager/file_manager_browsertest.cc b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
index 041a9f9..792dec10 100644
--- a/chrome/browser/ash/file_manager/file_manager_browsertest.cc
+++ b/chrome/browser/ash/file_manager/file_manager_browsertest.cc
@@ -1349,6 +1349,11 @@
     Crostini, /* crostini.js */
     FilesAppBrowserTest,
     ::testing::Values(
+        TestCase("mountCrostini").FilesExperimental(),
+        TestCase("enableDisableCrostini").FilesExperimental(),
+        TestCase("sharePathWithCrostini")
+            .FilesExperimental()
+            .FeatureIds({"screenplay-122c00f8-9842-4666-8ca0-b6bf47454551"}),
         TestCase("mountCrostini"),
         TestCase("enableDisableCrostini"),
         TestCase("sharePathWithCrostini")
diff --git a/chrome/browser/ash/file_manager/file_tasks_browsertest.cc b/chrome/browser/ash/file_manager/file_tasks_browsertest.cc
index d527fec3..3acc977 100644
--- a/chrome/browser/ash/file_manager/file_tasks_browsertest.cc
+++ b/chrome/browser/ash/file_manager/file_tasks_browsertest.cc
@@ -1271,8 +1271,9 @@
   // Wait for file to open in web drive office.
   navigation_observer_office.Wait();
 
-  histogram_.ExpectUniqueSample(ash::cloud_upload::kDriveOpenSourceVolumeMetric,
-                                VolumeType::VOLUME_TYPE_GOOGLE_DRIVE, 1);
+  histogram_.ExpectUniqueSample(
+      ash::cloud_upload::kDriveOpenSourceVolumeMetric,
+      ash::cloud_upload::OfficeFilesSourceVolume::kGoogleDrive, 1);
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kDriveTransferRequiredMetric,
       ash::cloud_upload::OfficeFilesTransferRequired::kNotRequired, 1);
@@ -1309,8 +1310,9 @@
   // Wait for file to open in web drive office.
   navigation_observer_office.Wait();
 
-  histogram_.ExpectUniqueSample(ash::cloud_upload::kDriveOpenSourceVolumeMetric,
-                                VolumeType::VOLUME_TYPE_GOOGLE_DRIVE, 1);
+  histogram_.ExpectUniqueSample(
+      ash::cloud_upload::kDriveOpenSourceVolumeMetric,
+      ash::cloud_upload::OfficeFilesSourceVolume::kGoogleDrive, 1);
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kDriveTransferRequiredMetric,
       ash::cloud_upload::OfficeFilesTransferRequired::kNotRequired, 1);
@@ -1642,9 +1644,7 @@
 
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kOneDriveOpenSourceVolumeMetric,
-      static_cast<int>(
-          ash::cloud_upload::OfficeFilesSourceVolume::kMicrosoftOneDrive),
-      1);
+      ash::cloud_upload::OfficeFilesSourceVolume::kMicrosoftOneDrive, 1);
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kOneDriveTransferRequiredMetric,
       ash::cloud_upload::OfficeFilesTransferRequired::kNotRequired, 1);
@@ -1734,9 +1734,7 @@
 
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kOneDriveOpenSourceVolumeMetric,
-      static_cast<int>(
-          ash::cloud_upload::OfficeFilesSourceVolume::kMicrosoftOneDrive),
-      1);
+      ash::cloud_upload::OfficeFilesSourceVolume::kMicrosoftOneDrive, 1);
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kOneDriveTransferRequiredMetric,
       ash::cloud_upload::OfficeFilesTransferRequired::kNotRequired, 1);
@@ -1775,7 +1773,7 @@
 
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kOneDriveOpenSourceVolumeMetric,
-      VolumeType::VOLUME_TYPE_DOWNLOADS_DIRECTORY, 1);
+      ash::cloud_upload::OfficeFilesSourceVolume::kDownloadsDirectory, 1);
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kOneDriveTransferRequiredMetric,
       ash::cloud_upload::OfficeFilesTransferRequired::kMove, 1);
@@ -1811,9 +1809,7 @@
 
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kOneDriveOpenSourceVolumeMetric,
-      static_cast<int>(
-          ash::cloud_upload::OfficeFilesSourceVolume::kMicrosoftOneDrive),
-      1);
+      ash::cloud_upload::OfficeFilesSourceVolume::kMicrosoftOneDrive, 1);
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kOneDriveTransferRequiredMetric,
       ash::cloud_upload::OfficeFilesTransferRequired::kNotRequired, 1);
@@ -1859,9 +1855,7 @@
 
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kOneDriveOpenSourceVolumeMetric,
-      static_cast<int>(
-          ash::cloud_upload::OfficeFilesSourceVolume::kMicrosoftOneDrive),
-      1);
+      ash::cloud_upload::OfficeFilesSourceVolume::kMicrosoftOneDrive, 1);
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kOneDriveTransferRequiredMetric,
       ash::cloud_upload::OfficeFilesTransferRequired::kNotRequired, 1);
@@ -1914,9 +1908,7 @@
   // VOLUME_TYPE_DOCUMENTS_PROVIDER to be logged in the test.
   histogram_.ExpectBucketCount(
       ash::cloud_upload::kOneDriveOpenSourceVolumeMetric,
-      static_cast<int>(
-          ash::cloud_upload::OfficeFilesSourceVolume::kMicrosoftOneDrive),
-      0);
+      ash::cloud_upload::OfficeFilesSourceVolume::kMicrosoftOneDrive, 0);
   histogram_.ExpectUniqueSample(
       ash::cloud_upload::kOneDriveTransferRequiredMetric,
       ash::cloud_upload::OfficeFilesTransferRequired::kNotRequired, 1);
diff --git a/chrome/browser/ash/file_manager/path_util.cc b/chrome/browser/ash/file_manager/path_util.cc
index 48306d7..2cdf30b 100644
--- a/chrome/browser/ash/file_manager/path_util.cc
+++ b/chrome/browser/ash/file_manager/path_util.cc
@@ -1214,10 +1214,9 @@
     return file_info;
   }
 
-  std::u16string file_system_url_list;
-  ui::ReadCustomDataForType(pickle.data(), pickle.size(), kFilesAppMimeSources,
-                            &file_system_url_list);
-  if (file_system_url_list.empty()) {
+  absl::optional<std::u16string> maybe_file_system_url_list =
+      ui::ReadCustomDataForType(pickle, kFilesAppMimeSources);
+  if (!maybe_file_system_url_list || maybe_file_system_url_list->empty()) {
     return file_info;
   }
 
@@ -1225,8 +1224,8 @@
       storage::ExternalMountPoints::GetSystemInstance();
 
   for (const base::StringPiece16& line : base::SplitStringPiece(
-           file_system_url_list, kFilesAppSeparator16, base::TRIM_WHITESPACE,
-           base::SPLIT_WANT_NONEMPTY)) {
+           *maybe_file_system_url_list, kFilesAppSeparator16,
+           base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) {
     if (line.empty() || line[0] == '#') {
       continue;
     }
diff --git a/chrome/browser/ash/file_manager/volume.h b/chrome/browser/ash/file_manager/volume.h
index 6dcefdc..d4b52df 100644
--- a/chrome/browser/ash/file_manager/volume.h
+++ b/chrome/browser/ash/file_manager/volume.h
@@ -18,6 +18,7 @@
 
 namespace file_manager {
 
+// TODO(b/304383409): convert to enum class.
 // Identifiers for volume types managed by Chrome OS file manager.
 // The enum values must be kept in sync with FileManagerVolumeType and
 // OfficeFilesSourceVolume defined in tools/metrics/histograms/enums.xml.
diff --git a/chrome/browser/ash/guest_os/public/guest_os_wayland_server.cc b/chrome/browser/ash/guest_os/public/guest_os_wayland_server.cc
index 8ced6c35..2c56d458 100644
--- a/chrome/browser/ash/guest_os/public/guest_os_wayland_server.cc
+++ b/chrome/browser/ash/guest_os/public/guest_os_wayland_server.cc
@@ -62,16 +62,21 @@
 }
 
 GuestOsWaylandServer::GuestOsWaylandServer(Profile* profile)
-    : profile_(profile), concierge_observer_(this) {
-  auto* concierge_client = ash::ConciergeClient::Get();
+    : profile_(profile) {
   // Cleanup is best-effort, so don't bother if for some reason we
   // can't get a handle to the service (like tests).
-  if (concierge_client) {
-    concierge_observer_.Observe(concierge_client);
+  if (auto* concierge = ash::ConciergeClient::Get(); concierge) {
+    concierge->AddObserver(this);
   }
 }
 
-GuestOsWaylandServer::~GuestOsWaylandServer() = default;
+GuestOsWaylandServer::~GuestOsWaylandServer() {
+  // ConciergeClient may be destroyed prior to GuestOsWaylandServer in tests.
+  // Therefore we do this instead of ScopedObservation.
+  if (auto* concierge = ash::ConciergeClient::Get(); concierge) {
+    concierge->RemoveObserver(this);
+  }
+}
 
 // Returns a weak handle to the security delegate for the VM with the given
 // |name| and |type|, if one exists, and nullptr otherwise.
diff --git a/chrome/browser/ash/guest_os/public/guest_os_wayland_server.h b/chrome/browser/ash/guest_os/public/guest_os_wayland_server.h
index c339588..9bcf4e2 100644
--- a/chrome/browser/ash/guest_os/public/guest_os_wayland_server.h
+++ b/chrome/browser/ash/guest_os/public/guest_os_wayland_server.h
@@ -125,9 +125,6 @@
 
   ServersByType servers_;
 
-  base::ScopedObservation<ash::ConciergeClient, ash::ConciergeClient::Observer>
-      concierge_observer_;
-
   base::WeakPtrFactory<GuestOsWaylandServer> weak_factory_{this};
 };
 
diff --git a/chrome/browser/ash/printing/cups_printers_manager.cc b/chrome/browser/ash/printing/cups_printers_manager.cc
index 7412b16..cd8439f 100644
--- a/chrome/browser/ash/printing/cups_printers_manager.cc
+++ b/chrome/browser/ash/printing/cups_printers_manager.cc
@@ -9,6 +9,7 @@
 
 #include "ash/constants/ash_features.h"
 #include "ash/public/cpp/network_config_service.h"
+#include "base/containers/flat_set.h"
 #include "base/functional/bind.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
@@ -700,15 +701,17 @@
     for (const std::string& printer_id :
          auto_usb_printer_configurer_->ConfiguredPrintersIds()) {
       if (!printers_.IsPrinterInClass(PrinterClass::kAutomatic, printer_id)) {
-        printers_.Insert(PrinterClass::kAutomatic,
-                         auto_usb_printer_configurer_->Printer(printer_id));
+        AddPrinterToPrintersMap(
+            PrinterClass::kAutomatic,
+            auto_usb_printer_configurer_->Printer(printer_id));
       }
     }
     for (const std::string& printer_id :
          auto_usb_printer_configurer_->UnconfiguredPrintersIds()) {
       if (!printers_.IsPrinterInClass(PrinterClass::kDiscovered, printer_id)) {
-        printers_.Insert(PrinterClass::kDiscovered,
-                         auto_usb_printer_configurer_->Printer(printer_id));
+        AddPrinterToPrintersMap(
+            PrinterClass::kDiscovered,
+            auto_usb_printer_configurer_->Printer(printer_id));
       }
     }
   }
@@ -729,7 +732,7 @@
       // processing.
       auto printer = detected.printer;
       if (printer.IsIppEverywhere()) {
-        printers_.Insert(PrinterClass::kAutomatic, printer);
+        AddPrinterToPrintersMap(PrinterClass::kAutomatic, printer);
         continue;
       }
 
@@ -755,12 +758,29 @@
         // automatically.
         *printer.mutable_ppd_reference() =
             ppd_resolution_tracker_.GetPpdReference(detected_printer_id);
-        printers_.Insert(PrinterClass::kAutomatic, printer);
+        AddPrinterToPrintersMap(PrinterClass::kAutomatic, printer);
         continue;
       }
 
       // We are not able to set the printer up automatically.
-      printers_.Insert(PrinterClass::kDiscovered, printer);
+      AddPrinterToPrintersMap(PrinterClass::kDiscovered, printer);
+    }
+  }
+
+  void AddPrinterToPrintersMap(PrinterClass printer_class,
+                               const Printer& printer) {
+    printers_.Insert(printer_class, printer);
+
+    if (base::FeatureList::IsEnabled(::features::kLocalPrinterObserving)) {
+      // If we've seen this printer before, don't trigger a new detection event.
+      if (detected_printers_seen_.contains(printer.id())) {
+        return;
+      }
+
+      detected_printers_seen_.insert(printer.id());
+      for (auto& observer : local_printers_observer_list_) {
+        observer.OnLocalPrintersUpdated();
+      }
     }
   }
 
@@ -824,12 +844,14 @@
   void OnUsbPrinterSetupDone(std::string printer_id) {
     if (auto_usb_printer_configurer_->ConfiguredPrintersIds().contains(
             printer_id)) {
-      printers_.Insert(PrinterClass::kAutomatic,
-                       auto_usb_printer_configurer_->Printer(printer_id));
+      AddPrinterToPrintersMap(
+          PrinterClass::kAutomatic,
+          auto_usb_printer_configurer_->Printer(printer_id));
       NotifyObservers({PrinterClass::kAutomatic});
     } else {
-      printers_.Insert(PrinterClass::kDiscovered,
-                       auto_usb_printer_configurer_->Printer(printer_id));
+      AddPrinterToPrintersMap(
+          PrinterClass::kDiscovered,
+          auto_usb_printer_configurer_->Printer(printer_id));
       NotifyObservers({PrinterClass::kDiscovered});
     }
   }
@@ -979,6 +1001,12 @@
   // each time the mDNS reports printers.
   base::DelayTimer nearby_printers_metric_delay_timer_;
 
+  // Tracks the printers seen from mDNS or USB plug ins so the
+  // LocalPrinterObserver knows when to fire for a new printer.
+  // TODO(b/304269962): Remove detected printers from here when disconnected
+  // from the device.
+  base::flat_set<std::string> detected_printers_seen_;
+
   base::WeakPtrFactory<CupsPrintersManagerImpl> weak_ptr_factory_{this};
 };
 
diff --git a/chrome/browser/ash/printing/cups_printers_manager_unittest.cc b/chrome/browser/ash/printing/cups_printers_manager_unittest.cc
index 934c7488..dabc182 100644
--- a/chrome/browser/ash/printing/cups_printers_manager_unittest.cc
+++ b/chrome/browser/ash/printing/cups_printers_manager_unittest.cc
@@ -247,6 +247,10 @@
     on_printers_found_callback_.Run(detections_);
   }
 
+  void RunPrintersFoundCallback() {
+    on_printers_found_callback_.Run(detections_);
+  }
+
  private:
   std::vector<DetectedPrinter> detections_;
   OnPrintersFoundCallback on_printers_found_callback_;
@@ -1210,5 +1214,33 @@
   EXPECT_EQ(1u, observer1.num_observer_calls());
 }
 
+// Tests that when a new local printer is detected the observer is triggered.
+TEST_F(CupsPrintersManagerTest, LocalPrintersDetected) {
+  feature_list_.InitAndEnableFeature(::features::kLocalPrinterObserving);
+
+  // The observer should fire when first registered.
+  FakeLocalPrintersObserver observer1;
+  manager_->AddLocalPrintersObserver(&observer1);
+  EXPECT_EQ(1u, observer1.num_observer_calls());
+
+  // The observer should fire for a new zeroconf printer detection.
+  const auto detected_printer = MakeDiscoveredPrinter("DiscoveredPrinter");
+  zeroconf_detector_->AddDetections({detected_printer});
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(2u, observer1.num_observer_calls());
+
+  // The observer shouldn't fire when the same printer is sent for detection so
+  // the call count should remain the same.
+  zeroconf_detector_->RunPrintersFoundCallback();
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(2u, observer1.num_observer_calls());
+
+  // The observer should fire again for a new USB printer detection.
+  const auto usb_detected_printer = MakeUsbDiscoveredPrinter("UsbPrinter");
+  usb_detector_->AddDetections({usb_detected_printer});
+  task_environment_.RunUntilIdle();
+  EXPECT_EQ(3u, observer1.num_observer_calls());
+}
+
 }  // namespace
 }  // namespace ash
diff --git a/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc b/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc
index 440f697..21e057f 100644
--- a/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc
+++ b/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc
@@ -22,11 +22,11 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_command_controller.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/external_install_options.h"
 #include "chrome/browser/web_applications/externally_managed_app_manager.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
@@ -80,13 +80,13 @@
   }
 
   void SetUpOnMainThread() override {
-    chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
+    web_app::SetAutoAcceptPWAInstallConfirmationForTesting(true);
 
     AppBannerManagerBrowserTestBase::SetUpOnMainThread();
   }
 
   void TearDown() override {
-    chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
+    web_app::SetAutoAcceptPWAInstallConfirmationForTesting(false);
   }
 
   AppBannerManagerDesktopBrowserTest(
@@ -251,10 +251,10 @@
   }
 
   // Install the app via the menu instead of the banner.
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(true);
   browser()->command_controller()->ExecuteCommand(IDC_INSTALL_PWA);
   manager->AwaitAppInstall();
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(false);
 
   EXPECT_FALSE(manager->IsPromptAvailableForTesting());
 
@@ -282,11 +282,11 @@
   }
 
   // Install the app via the menu instead of the banner.
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(true);
   browser()->window()->ExecutePageActionIconForTesting(
       PageActionIconType::kPwaInstall);
   manager->AwaitAppInstall();
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(false);
 
   EXPECT_FALSE(manager->IsPromptAvailableForTesting());
 
@@ -387,10 +387,10 @@
   }
 
   // Install the app via the menu instead of the banner.
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(true);
   browser()->command_controller()->ExecuteCommand(IDC_INSTALL_PWA);
   manager->AwaitAppInstall();
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(false);
 
   EXPECT_FALSE(manager->IsPromptAvailableForTesting());
 
diff --git a/chrome/browser/browser_features.cc b/chrome/browser/browser_features.cc
index 91036aa..482eb2b 100644
--- a/chrome/browser/browser_features.cc
+++ b/chrome/browser/browser_features.cc
@@ -303,4 +303,10 @@
              "OmniboxTriggerForNoStatePrefetch",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+BASE_FEATURE(kPayloadTestComponent,
+             "PayloadTestComponent",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+#endif
+
 }  // namespace features
diff --git a/chrome/browser/browser_features.h b/chrome/browser/browser_features.h
index 961a52b8..63d6e8e 100644
--- a/chrome/browser/browser_features.h
+++ b/chrome/browser/browser_features.h
@@ -127,6 +127,10 @@
 
 BASE_DECLARE_FEATURE(kOmniboxTriggerForNoStatePrefetch);
 
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+BASE_DECLARE_FEATURE(kPayloadTestComponent);
+#endif
+
 }  // namespace features
 
 #endif  // CHROME_BROWSER_BROWSER_FEATURES_H_
diff --git a/chrome/browser/component_updater/payload_test_component_installer.cc b/chrome/browser/component_updater/payload_test_component_installer.cc
new file mode 100644
index 0000000..9dfb9e5
--- /dev/null
+++ b/chrome/browser/component_updater/payload_test_component_installer.cc
@@ -0,0 +1,98 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/component_updater/payload_test_component_installer.h"
+
+#include <cstdint>
+#include <iterator>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/functional/callback_helpers.h"
+#include "base/logging.h"
+#include "base/memory/scoped_refptr.h"
+#include "base/values.h"
+#include "base/version.h"
+#include "components/update_client/update_client.h"
+#include "components/update_client/update_client_errors.h"
+#include "content/public/browser/browser_thread.h"
+#include "crypto/sha2.h"
+
+namespace component_updater {
+
+namespace {
+constexpr char kManifestName[] = "Payload Test";
+constexpr base::FilePath::CharType kInstallationRelativePath[] =
+    FILE_PATH_LITERAL("PayloadTest");
+constexpr base::FilePath::CharType kPayloadRelativePath[] =
+    FILE_PATH_LITERAL("payload.bin");
+constexpr uint8_t kPublicKeySHA256[32] = {
+    0xac, 0xf2, 0xd5, 0x6a, 0x3c, 0x14, 0xcf, 0xff, 0x51, 0x00, 0x97,
+    0xb9, 0x8c, 0x57, 0x4a, 0x30, 0xe6, 0x25, 0x91, 0xca, 0xbe, 0x8d,
+    0x01, 0xb9, 0x60, 0x0d, 0x8c, 0x86, 0x83, 0xb5, 0x8a, 0xfe};
+static_assert(std::size(kPublicKeySHA256) == crypto::kSHA256Length);
+}  // namespace
+
+bool PayloadTestComponentInstallerPolicy::VerifyInstallation(
+    const base::Value::Dict& manifest,
+    const base::FilePath& install_dir) const {
+  return base::PathExists(install_dir.Append(kPayloadRelativePath));
+}
+
+bool PayloadTestComponentInstallerPolicy::
+    SupportsGroupPolicyEnabledComponentUpdates() const {
+  return true;
+}
+
+bool PayloadTestComponentInstallerPolicy::RequiresNetworkEncryption() const {
+  return true;
+}
+
+update_client::CrxInstaller::Result
+PayloadTestComponentInstallerPolicy::OnCustomInstall(
+    const base::Value::Dict& manifest,
+    const base::FilePath& install_dir) {
+  return update_client::CrxInstaller::Result(update_client::InstallError::NONE);
+}
+
+void PayloadTestComponentInstallerPolicy::OnCustomUninstall() {}
+
+void PayloadTestComponentInstallerPolicy::ComponentReady(
+    const base::Version& version,
+    const base::FilePath& install_dir,
+    base::Value::Dict manifest) {
+  VLOG(1) << "Component ready, version " << version.GetString() << " in "
+          << install_dir.value();
+}
+
+base::FilePath PayloadTestComponentInstallerPolicy::GetRelativeInstallDir()
+    const {
+  return base::FilePath(kInstallationRelativePath);
+}
+
+void PayloadTestComponentInstallerPolicy::GetHash(
+    std::vector<uint8_t>* hash) const {
+  hash->assign(std::begin(kPublicKeySHA256), std::end(kPublicKeySHA256));
+}
+
+std::string PayloadTestComponentInstallerPolicy::GetName() const {
+  return kManifestName;
+}
+
+update_client::InstallerAttributes
+PayloadTestComponentInstallerPolicy::GetInstallerAttributes() const {
+  return update_client::InstallerAttributes();
+}
+
+void RegisterPayloadTestComponent(ComponentUpdateService* cus) {
+  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
+  base::MakeRefCounted<ComponentInstaller>(
+      std::make_unique<PayloadTestComponentInstallerPolicy>())
+      ->Register(cus, base::DoNothing());
+}
+
+}  // namespace component_updater
diff --git a/chrome/browser/component_updater/payload_test_component_installer.h b/chrome/browser/component_updater/payload_test_component_installer.h
new file mode 100644
index 0000000..6eaf029
--- /dev/null
+++ b/chrome/browser/component_updater/payload_test_component_installer.h
@@ -0,0 +1,41 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_COMPONENT_UPDATER_PAYLOAD_TEST_COMPONENT_INSTALLER_H_
+#define CHROME_BROWSER_COMPONENT_UPDATER_PAYLOAD_TEST_COMPONENT_INSTALLER_H_
+
+#include "components/component_updater/component_installer.h"
+
+namespace component_updater {
+
+class ComponentUpdateService;
+
+class PayloadTestComponentInstallerPolicy : public ComponentInstallerPolicy {
+ public:
+  PayloadTestComponentInstallerPolicy() = default;
+  ~PayloadTestComponentInstallerPolicy() override = default;
+
+  // Overrides for ComponentInstallerPolicy.
+  bool VerifyInstallation(const base::Value::Dict& manifest,
+                          const base::FilePath& install_dir) const override;
+  bool SupportsGroupPolicyEnabledComponentUpdates() const override;
+  bool RequiresNetworkEncryption() const override;
+  update_client::CrxInstaller::Result OnCustomInstall(
+      const base::Value::Dict& manifest,
+      const base::FilePath& install_dir) override;
+  void OnCustomUninstall() override;
+  void ComponentReady(const base::Version& version,
+                      const base::FilePath& install_dir,
+                      base::Value::Dict manifest) override;
+  base::FilePath GetRelativeInstallDir() const override;
+  void GetHash(std::vector<uint8_t>* hash) const override;
+  std::string GetName() const override;
+  update_client::InstallerAttributes GetInstallerAttributes() const override;
+};
+
+void RegisterPayloadTestComponent(ComponentUpdateService* cus);
+
+}  // namespace component_updater
+
+#endif  // CHROME_BROWSER_COMPONENT_UPDATER_PAYLOAD_TEST_COMPONENT_INSTALLER_H_
diff --git a/chrome/browser/component_updater/registration.cc b/chrome/browser/component_updater/registration.cc
index daf8c652..c082f3d 100644
--- a/chrome/browser/component_updater/registration.cc
+++ b/chrome/browser/component_updater/registration.cc
@@ -15,6 +15,7 @@
 #include "build/branding_buildflags.h"
 #include "build/build_config.h"
 #include "build/chromeos_buildflags.h"
+#include "chrome/browser/browser_features.h"
 #include "chrome/browser/browser_process.h"
 #include "chrome/browser/buildflags.h"
 #include "chrome/browser/component_updater/app_provisioning_component_installer.h"
@@ -28,6 +29,7 @@
 #include "chrome/browser/component_updater/hyphenation_component_installer.h"
 #include "chrome/browser/component_updater/masked_domain_list_component_installer.h"
 #include "chrome/browser/component_updater/mei_preload_component_installer.h"
+#include "chrome/browser/component_updater/payload_test_component_installer.h"
 #include "chrome/browser/component_updater/pki_metadata_component_installer.h"
 #include "chrome/browser/component_updater/pnacl_component_installer.h"
 #include "chrome/browser/component_updater/privacy_sandbox_attestations_component_installer.h"
@@ -78,7 +80,6 @@
 #include "chrome/browser/component_updater/smart_dim_component_installer.h"
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
-
 #if BUILDFLAG(ENABLE_MEDIA_FOUNDATION_WIDEVINE_CDM)
 #include "chrome/browser/component_updater/media_foundation_widevine_cdm_component_installer.h"
 #endif
@@ -215,6 +216,14 @@
   RegisterCommerceHeuristicsComponent(cus);
 
   RegisterTpcdMetadataComponent(cus);
+
+#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+  // TODO(crbug.com/1490685): Remove this test component once the
+  // experiment has concluded.
+  if (base::FeatureList::IsEnabled(features::kPayloadTestComponent)) {
+    RegisterPayloadTestComponent(cus);
+  }
+#endif
 }
 
 }  // namespace component_updater
diff --git a/chrome/browser/extensions/api/management/management_apitest.cc b/chrome/browser/extensions/api/management/management_apitest.cc
index babcacaa..7e32a1ee 100644
--- a/chrome/browser/extensions/api/management/management_apitest.cc
+++ b/chrome/browser/extensions/api/management/management_apitest.cc
@@ -15,10 +15,10 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/extension_status_utils.h"
 #include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
 #include "chrome/browser/web_applications/test/fake_web_app_ui_manager.h"
@@ -248,7 +248,7 @@
              });
            });)";
 
-    chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
+    web_app::SetAutoAcceptPWAInstallConfirmationForTesting(true);
     const GURL start_url = https_test_server_.GetURL(web_app_start_url);
     webapps::AppId web_app_id =
         web_app::GenerateAppId(/*manifest_id_path=*/absl::nullopt, start_url);
@@ -270,7 +270,7 @@
     EXPECT_EQ(2, static_cast<int>(
                      provider->ui_manager().GetNumWindowsForApp(web_app_id)));
 
-    chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
+    web_app::SetAutoAcceptPWAInstallConfirmationForTesting(false);
   }
 
   net::EmbeddedTestServer https_test_server_;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 1b1295f..e4b4b9f 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2310,12 +2310,12 @@
   {
     "name": "enable-compression-dictionary-transport",
     "owners": [ "horo", "net-dev" ],
-    "expiry_milestone": 120
+    "expiry_milestone": 130
   },
   {
     "name": "enable-compression-dictionary-transport-backend",
     "owners": [ "horo", "net-dev" ],
-    "expiry_milestone": 120
+    "expiry_milestone": 130
   },
   {
     "name": "enable-cooperative-scheduling",
@@ -2861,7 +2861,7 @@
   {
     "name": "enable-friendlier-safe-browsing-settings-standard-protection",
     "owners": [ "awado", "jacastro", "chrome-counter-abuse-alerts@google.com" ],
-    "expiry_milestone": 120
+    "expiry_milestone": 121
   },
   {
     "name": "enable-future-v8-vm-features",
@@ -4598,7 +4598,7 @@
   {
     "name": "force-resync-drive",
     "owners": [ "cassycc", "petermarshall", "simmonsjosh@google.com" ],
-    "expiry_milestone": 120
+    "expiry_milestone": 122
   },
   {
     "name": "force-show-update-menu-badge",
@@ -6447,7 +6447,7 @@
   {
     "name": "orca-key",
     "owners": ["jopalmer", "e14s-eng@google.com"],
-    "expiry_milestone": 120
+    "expiry_milestone": 125
   },
   {
     "name": "organic-repeatable-queries",
diff --git a/chrome/browser/installable/ml_promotion_browsertest.cc b/chrome/browser/installable/ml_promotion_browsertest.cc
index d015468..9f0f37f 100644
--- a/chrome/browser/installable/ml_promotion_browsertest.cc
+++ b/chrome/browser/installable/ml_promotion_browsertest.cc
@@ -18,9 +18,9 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/web_app_command_manager.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
@@ -764,7 +764,7 @@
         InstallAppForCurrentWebContents(/*install_locally=*/true);
         break;
       case InstallDialogState::kCreateShortcutDialog:
-        chrome::SetAutoAcceptWebAppDialogForTesting(
+        web_app::SetAutoAcceptWebAppDialogForTesting(
             /*auto_accept=*/true, /*auto_open_in_window=*/false);
         chrome::ExecuteCommand(browser(), IDC_CREATE_SHORTCUT);
         break;
diff --git a/chrome/browser/installable/ml_promotion_browsertest_base.cc b/chrome/browser/installable/ml_promotion_browsertest_base.cc
index f88232b..1530a32 100644
--- a/chrome/browser/installable/ml_promotion_browsertest_base.cc
+++ b/chrome/browser/installable/ml_promotion_browsertest_base.cc
@@ -21,10 +21,10 @@
 #else  // BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/banners/test_app_banner_manager_desktop.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/browser/web_applications/test/web_app_test_utils.h"
@@ -35,7 +35,6 @@
 #include "components/webapps/browser/install_result_code.h"
 #include "components/webapps/browser/installable/installable_metrics.h"
 #include "components/webapps/common/web_app_id.h"
-#include "net/test/embedded_test_server/embedded_test_server.h"
 #include "ui/views/test/dialog_test.h"
 #include "ui/views/test/widget_test.h"
 #include "ui/views/widget/any_widget_observer.h"
@@ -120,7 +119,7 @@
       web_contents(),
       /*bypass_service_worker_check=*/true,
       webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON,
-      install_future.GetCallback(), chrome::PwaInProductHelpState::kNotShown);
+      install_future.GetCallback(), web_app::PwaInProductHelpState::kNotShown);
   views::Widget* widget = waiter.WaitIfNeededAndGet();
   views::test::WidgetDestroyedWaiter destroyed(widget);
   if (accept_install) {
diff --git a/chrome/browser/lacros/external_protocol_dialog.cc b/chrome/browser/lacros/external_protocol_dialog.cc
index de7e586..508bbd7c 100644
--- a/chrome/browser/lacros/external_protocol_dialog.cc
+++ b/chrome/browser/lacros/external_protocol_dialog.cc
@@ -9,6 +9,8 @@
 #include "chrome/browser/lacros/arc/arc_intent_helper_mojo_lacros.h"
 #include "chrome/browser/tab_contents/tab_util.h"
 #include "chrome/browser/ui/views/external_protocol_dialog.h"
+#include "chromeos/crosapi/mojom/url_handler.mojom.h"
+#include "chromeos/lacros/lacros_service.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/browser/render_view_host.h"
 #include "content/public/browser/weak_document_ptr.h"
@@ -20,14 +22,45 @@
 
 namespace {
 
-void OnArcHandled(bool handled) {
-  if (handled)
+void OnGetExternalHandler(const GURL& url,
+                          const absl::optional<url::Origin>& initiating_origin,
+                          content::WeakDocumentPtr initiator_document,
+                          base::WeakPtr<WebContents> web_contents,
+                          const absl::optional<std::string>& name) {
+  // If WebContents have been destroyed, do not show any dialog.
+  if (!web_contents) {
     return;
+  }
 
-  // TODO(crbug.com/1293604): Handle dialog more precisely when it is not
-  // successfully handled by ARC.
-  LOG(WARNING) << "Url is not successfully handled by ARC.";
-  return;
+  aura::Window* parent_window = web_contents->GetTopLevelNativeWindow();
+  // If WebContents has been detached from window tree, do not show any dialog.
+  if (!parent_window || !parent_window->GetRootWindow()) {
+    return;
+  }
+  if (name) {
+    new ExternalProtocolDialog(web_contents.get(), url,
+                               base::UTF8ToUTF16(*name), initiating_origin,
+                               initiator_document);
+  }
+}
+
+void OnArcHandled(const GURL& url,
+                  const absl::optional<url::Origin>& initiating_origin,
+                  content::WeakDocumentPtr initiator_document,
+                  base::WeakPtr<WebContents> web_contents,
+                  bool handled) {
+  if (handled) {
+    return;
+  }
+
+  chromeos::LacrosService* service = chromeos::LacrosService::Get();
+  if (service->GetInterfaceVersion<crosapi::mojom::UrlHandler>() >=
+      int{crosapi::mojom::UrlHandler::kGetExternalHandlerMinVersion}) {
+    service->GetRemote<crosapi::mojom::UrlHandler>()->GetExternalHandler(
+        url,
+        base::BindOnce(&OnGetExternalHandler, url, initiating_origin,
+                       std::move(initiator_document), std::move(web_contents)));
+  }
 }
 
 }  // namespace
@@ -51,5 +84,7 @@
       url, initiating_origin, web_contents->GetWeakPtr(), page_transition,
       has_user_gesture, is_in_fenced_frame_tree,
       std::make_unique<arc::ArcIntentHelperMojoLacros>(),
-      base::BindOnce(&OnArcHandled));
+      base::BindOnce(&OnArcHandled, url, initiating_origin,
+                     std::move(initiator_document),
+                     web_contents->GetWeakPtr()));
 }
diff --git a/chrome/browser/media/router/media_router_feature.cc b/chrome/browser/media/router/media_router_feature.cc
index b7327c8..764d924 100644
--- a/chrome/browser/media/router/media_router_feature.cc
+++ b/chrome/browser/media/router/media_router_feature.cc
@@ -35,6 +35,9 @@
 #include "chrome/browser/profiles/profile_types_ash.h"
 #endif
 
+// NOTE: Consider separating out UI-only features that are not consumed by the
+// Media Router itself into their own file in chrome/browser/ui/media_router.
+
 namespace media_router {
 
 #if !BUILDFLAG(IS_ANDROID)
@@ -48,33 +51,29 @@
 BASE_FEATURE(kDialMediaRouteProvider,
              "DialMediaRouteProvider",
              base::FEATURE_ENABLED_BY_DEFAULT);
-BASE_FEATURE(kStartCastSessionWithoutTerminating,
-             "StartCastSessionWithoutTerminating",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+
+// TODO(crbug.com/1486680): Remove once stopping mirroring routes in the global
+// media controls is implemented on ChromeOS.
 BASE_FEATURE(kFallbackToAudioTabMirroring,
              "FallbackToAudioTabMirroring",
-// TODO(crbug.com/1486680): Enable this once stopping mirroring routes in the
-// global media controls is implemented on Chrome OS.
 #if BUILDFLAG(IS_CHROMEOS)
              base::FEATURE_DISABLED_BY_DEFAULT);
 #else
              base::FEATURE_ENABLED_BY_DEFAULT);
 #endif  // BUILDFLAG(IS_CHROMEOS)
-BASE_FEATURE(kCastDialogStopButton,
-             "CastDialogStopButton",
-             base::FEATURE_ENABLED_BY_DEFAULT);
+
 BASE_FEATURE(kCastMirroringPlayoutDelay,
              "CastMirroringPlayoutDelay",
              base::FEATURE_DISABLED_BY_DEFAULT);
 const base::FeatureParam<int> kCastMirroringPlayoutDelayMs{
     &kCastMirroringPlayoutDelay, "cast_mirroring_playout_delay_ms", -1};
-#if BUILDFLAG(IS_CHROMEOS)
+
+// TODO(b/202294946): Remove when enabled by default on ChromeOS.
 BASE_FEATURE(kGlobalMediaControlsCastStartStop,
              "GlobalMediaControlsCastStartStop",
+#if BUILDFLAG(IS_CHROMEOS)
              base::FEATURE_DISABLED_BY_DEFAULT);
 #else
-BASE_FEATURE(kGlobalMediaControlsCastStartStop,
-             "GlobalMediaControlsCastStartStop",
              base::FEATURE_ENABLED_BY_DEFAULT);
 #endif  // BUILDFLAG(IS_CHROMEOS)
 #endif  // !BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/media/router/media_router_feature.h b/chrome/browser/media/router/media_router_feature.h
index f726e44c..66587baf 100644
--- a/chrome/browser/media/router/media_router_feature.h
+++ b/chrome/browser/media/router/media_router_feature.h
@@ -49,21 +49,14 @@
 // It sends a discovery SSDP message every 120 seconds.
 BASE_DECLARE_FEATURE(kDialMediaRouteProvider);
 
-// If enabled, the Cast Media Route Provider starts a session without
-// terminating any existing session on the same sink.
-BASE_DECLARE_FEATURE(kStartCastSessionWithoutTerminating);
-
 // If enabled, sinks that do not support presentation or remote playback, will
 // fall back to audio tab mirroring when casting from the Global Media Controls.
 BASE_DECLARE_FEATURE(kFallbackToAudioTabMirroring);
 
-// If enabled, a separate 'stop' button is shown for connected sinks in the Cast
-// dialog instead of the entire sink button being a stop button.
-BASE_DECLARE_FEATURE(kCastDialogStopButton);
-
 // If enabled, mirroring sessions use the playout delay specified by
 // `kCastMirroringPlayoutDelayMs`.
 BASE_DECLARE_FEATURE(kCastMirroringPlayoutDelay);
+
 extern const base::FeatureParam<int> kCastMirroringPlayoutDelayMs;
 
 // Registers |kMediaRouterCastAllowAllIPs| with local state pref |registry|.
diff --git a/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc b/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc
index aa26ac3..419e312 100644
--- a/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc
+++ b/chrome/browser/media/router/presentation/presentation_service_delegate_impl_unittest.cc
@@ -405,10 +405,13 @@
 TEST_F(PresentationServiceDelegateImplTest, NotifyMediaRoutesChanged) {
   const int render_process_id = 100;
   const int render_frame_id = 200;
+  const GURL presentation_url3{kPresentationUrl3};
+  MediaSource media_source = MediaSource::ForPresentationUrl(presentation_url3);
   content::PresentationRequest request(
       content::GlobalRenderFrameHostId(render_process_id, render_frame_id),
-      {presentation_url1_}, frame_origin_);
-  MediaRoute media_route("differentRouteId", source1_, "mediaSinkId", "", true);
+      {presentation_url3}, frame_origin_);
+  MediaRoute media_route("differentRouteId", media_source, "mediaSinkId", "",
+                         true);
   std::unique_ptr<RouteRequestResult> result =
       RouteRequestResult::FromSuccess(media_route, kPresentationId);
   StrictMock<MockWebContentsPresentationObserver> observer(GetWebContents());
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager.cc b/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
index 48f50c9..b21f5c3 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager.cc
@@ -169,29 +169,13 @@
                                std::move(callback));
 
   auto activity_it = FindActivityBySink(sink);
-  if (activity_it == activities_.end()) {
-    DoLaunchSession(std::move(params));
-  } else {
-    if (base::FeatureList::IsEnabled(kStartCastSessionWithoutTerminating)) {
-      // Here we assume that when OnSessionRemoved() is next called for
-      // `sink_id`, it will be for removing the pre-existing activity.
-      pending_activity_removal_ = {
-          activity_it->second->sink().id(),
-          activity_it->second->route().media_route_id()};
-      DoLaunchSession(std::move(params));
-    } else {
-      const MediaRoute::Id& existing_route_id =
-          activity_it->second->route().media_route_id();
-      // We cannot launch the new session in the TerminateSession() callback
-      // because if we create a session there, then it may get deleted when
-      // OnSessionRemoved() is called to notify that the previous session
-      // was removed on the receiver.
-      TerminateSession(existing_route_id, base::DoNothing());
-      // The new session will be launched when OnSessionRemoved() is called for
-      // the old session.
-      SetPendingLaunch(std::move(params));
-    }
+  if (activity_it != activities_.end()) {
+    // Here we assume that when OnSessionRemoved() is next called for
+    // `sink_id`, it will be for removing the pre-existing activity.
+    pending_activity_removal_ = {activity_it->second->sink().id(),
+                                 activity_it->second->route().media_route_id()};
   }
+  DoLaunchSession(std::move(params));
 }
 
 void CastActivityManager::DoLaunchSession(DoLaunchSessionParams params) {
@@ -242,15 +226,6 @@
                      weak_ptr_factory_.GetWeakPtr(), std::move(params)));
 }
 
-void CastActivityManager::SetPendingLaunch(DoLaunchSessionParams params) {
-  if (pending_launch_ && pending_launch_->callback) {
-    std::move(pending_launch_->callback)
-        .Run(absl::nullopt, nullptr, "Pending launch session params destroyed",
-             mojom::RouteRequestResultCode::CANCELLED);
-  }
-  pending_launch_ = std::move(params);
-}
-
 AppActivity* CastActivityManager::FindActivityForSessionJoin(
     const CastMediaSource& cast_source,
     const std::string& presentation_id) {
@@ -624,8 +599,7 @@
 
 void CastActivityManager::OnSessionRemoved(const MediaSinkInternal& sink) {
   auto activity_it = activities_.end();
-  if (base::FeatureList::IsEnabled(kStartCastSessionWithoutTerminating) &&
-      pending_activity_removal_ &&
+  if (pending_activity_removal_ &&
       pending_activity_removal_->first == sink.id()) {
     activity_it = activities_.find(pending_activity_removal_->second);
     pending_activity_removal_.reset();
@@ -641,11 +615,6 @@
     RemoveActivity(activity_it, PresentationConnectionState::TERMINATED,
                    PresentationConnectionCloseReason::CLOSED);
   }
-  if (!base::FeatureList::IsEnabled(kStartCastSessionWithoutTerminating) &&
-      pending_launch_ && pending_launch_->sink.id() == sink.id()) {
-    DoLaunchSession(std::move(*pending_launch_));
-    pending_launch_.reset();
-  }
 }
 
 void CastActivityManager::OnMediaStatusUpdated(
@@ -889,8 +858,10 @@
   std::string app_id = ChooseAppId(cast_source, params.sink);
   const auto channel_id = sink.cast_data().cast_channel_id;
   const auto destination_id = session->destination_id();
+  auto media_source = MediaSource(cast_source.source_id());
 
-  if (MediaSource(cast_source.source_id()).IsCastPresentationUrl()) {
+  if (media_source.IsCastPresentationUrl() ||
+      media_source.IsRemotePlaybackSource()) {
     presentation_connection = activity_it->second->AddClient(
         cast_source, params.origin, params.frame_tree_node_id);
     if (!client_id.empty()) {
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager.h b/chrome/browser/media/router/providers/cast/cast_activity_manager.h
index 35d1d4a..8281d75 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager.h
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager.h
@@ -216,7 +216,6 @@
   };
 
   void DoLaunchSession(DoLaunchSessionParams params);
-  void SetPendingLaunch(DoLaunchSessionParams params);
   void OnActivityStopped(const std::string& route_id);
 
   // Removes an activity, terminating any associated connections, then
@@ -333,13 +332,6 @@
   // low-end devices.
   base::flat_map<int, MediaRoute::Id> routes_by_frame_;
 
-  // Information for a session that will be launched once |this| is notified
-  // that the existing session on the receiver has been removed. We only store
-  // one pending launch at a time so that we don't accumulate orphaned pending
-  // launches over time. Used only when the feature
-  // `kStartCastSessionWithoutTerminating` is disabled.
-  absl::optional<DoLaunchSessionParams> pending_launch_;
-
   // Used only when the feature `kStartCastSessionWithoutTerminating` is
   // enabled.
   absl::optional<std::pair<MediaSink::Id, MediaRoute::Id>>
diff --git a/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc b/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc
index c641571..49e5aa5 100644
--- a/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc
+++ b/chrome/browser/media/router/providers/cast/cast_activity_manager_unittest.cc
@@ -909,83 +909,6 @@
   EXPECT_EQ(updated_route_->media_route_id(), route_->media_route_id());
 }
 
-class CastActivityManagerWithTerminatingTest : public CastActivityManagerTest {
- public:
-  void SetUp() override {
-    feature_list_.InitAndDisableFeature(kStartCastSessionWithoutTerminating);
-    CastActivityManagerTest::SetUp();
-  }
-
- protected:
-  base::test::ScopedFeatureList feature_list_;
-};
-
-TEST_F(CastActivityManagerWithTerminatingTest,
-       LaunchSessionTerminatesExistingSessionOnSink) {
-  LaunchAppSession();
-  ExpectAppActivityStoppedTimes(1);
-
-  {
-    testing::InSequence dummy;
-
-    // Existing route is terminated before new route is created.
-    // MediaRouter is notified of terminated route.
-    ExpectEmptyRouteUpdate();
-
-    // After existing route is terminated, new route is created.
-    // MediaRouter is notified of new route.
-    ExpectSingleRouteUpdate();
-  }
-
-  // Launch a new session on the same sink.
-  auto source = CastMediaSource::FromMediaSourceId(MakeSourceId(kAppId2));
-  // Use LaunchSessionParsed() instead of LaunchSession() here because
-  // LaunchSessionParsed() is called asynchronously and will fail the test.
-  manager_->LaunchSessionParsed(
-      // TODO(crbug.com/1291744): Verify that presentation ID is used correctly.
-      *source, sink_, kPresentationId2, origin_, kFrameTreeNodeId2,
-      base::BindOnce(&CastActivityManagerTest::ExpectLaunchSessionSuccess,
-                     base::Unretained(this)),
-      data_decoder::DataDecoder::ValueOrError());
-
-  // LaunchSession() should not be called until we notify |mananger_| that the
-  // previous session was removed.
-  EXPECT_CALL(message_handler_,
-              LaunchSession(kChannelId, "BBBBBBBB", kDefaultLaunchTimeout,
-                            testing::ElementsAre("WEB"),
-                            /* absl::optional<base::Value> appParams */
-                            testing::Eq(absl::nullopt), _))
-      .WillOnce(WithArg<5>([this](auto callback) {
-        launch_session_callback_ = std::move(callback);
-      }));
-
-  manager_->OnSessionRemoved(sink_);
-}
-
-TEST_F(CastActivityManagerWithTerminatingTest,
-       SecondPendingRequestCancelsTheFirst) {
-  auto source =
-      CastMediaSource::FromMediaSourceId(MakeSourceId(kAppId1, "", kClientId));
-  MockLaunchSessionCallback callback;
-  // Launch a session so that the next launch request gets queued.
-  LaunchAppSession();
-
-  // Ignore StopSession() so that pending requests don't get executed.
-  EXPECT_CALL(message_handler_, StopSession).WillRepeatedly([]() {});
-  // The first request gets queued, then cancelled when the second request
-  // replaces it.
-  EXPECT_CALL(callback, Run)
-      .WillOnce(WithArg<3>([](mojom::RouteRequestResultCode code) {
-        EXPECT_EQ(mojom::RouteRequestResultCode::CANCELLED, code);
-      }));
-  for (int i = 0; i < 2; i++) {
-    manager_->LaunchSession(*source, sink_, kPresentationId, origin_,
-                            kFrameTreeNodeId,
-                            base::BindOnce(&MockLaunchSessionCallback::Run,
-                                           base::Unretained(&callback)));
-  }
-}
-
 TEST_F(CastActivityManagerTest, FindMirroringActivityByRouteIdNonMirroring) {
   LaunchAppSession();
   EXPECT_FALSE(
diff --git a/chrome/browser/nearby_sharing/internal/codereview.settings b/chrome/browser/nearby_sharing/internal/codereview.settings
index 62d8d701..64a9387 100644
--- a/chrome/browser/nearby_sharing/internal/codereview.settings
+++ b/chrome/browser/nearby_sharing/internal/codereview.settings
@@ -1,4 +1,6 @@
 # This file is used by git-cl to get repository specific information.
+PROJECT: chrome/browser/nearby_sharing/internal
+CC_LIST: chromeos-cross-device-eng@google.com
 GERRIT_HOST: True
-GERRIT_PORT: True
-CODE_REVIEW_SERVER: https://chrome-internal-review.googlesource.com
\ No newline at end of file
+CODE_REVIEW_SERVER: https://chrome-internal-review.googlesource.com
+VIEW_VC: https://chrome-internal.googlesource.com/chrome/browser/nearby_sharing/internal/+/
\ No newline at end of file
diff --git a/chrome/browser/optimization_guide/android/optimization_guide_bridge_unittest.cc b/chrome/browser/optimization_guide/android/optimization_guide_bridge_unittest.cc
index f3d52949..5ad8170 100644
--- a/chrome/browser/optimization_guide/android/optimization_guide_bridge_unittest.cc
+++ b/chrome/browser/optimization_guide/android/optimization_guide_bridge_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/test/gmock_callback_support.h"
 #include "chrome/browser/optimization_guide/android/native_j_unittests_jni_headers/OptimizationGuideBridgeNativeUnitTest_jni.h"
 #include "chrome/browser/optimization_guide/chrome_hints_manager.h"
+#include "chrome/browser/optimization_guide/mock_optimization_guide_keyed_service.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
@@ -36,29 +37,6 @@
 namespace optimization_guide {
 namespace android {
 
-class MockOptimizationGuideKeyedService : public OptimizationGuideKeyedService {
- public:
-  explicit MockOptimizationGuideKeyedService(
-      content::BrowserContext* browser_context)
-      : OptimizationGuideKeyedService(browser_context) {}
-  ~MockOptimizationGuideKeyedService() override = default;
-
-  MOCK_METHOD1(
-      RegisterOptimizationTypes,
-      void(const std::vector<optimization_guide::proto::OptimizationType>&));
-  MOCK_METHOD3(CanApplyOptimization,
-               void(const GURL& gurl,
-                    optimization_guide::proto::OptimizationType,
-                    optimization_guide::OptimizationGuideDecisionCallback));
-  MOCK_METHOD4(
-      CanApplyOptimizationOnDemand,
-      void(const std::vector<GURL>&,
-           const base::flat_set<optimization_guide::proto::OptimizationType>&,
-           optimization_guide::proto::RequestContext,
-           optimization_guide::
-               OnDemandOptimizationGuideDecisionRepeatingCallback));
-};
-
 class OptimizationGuideBridgeTest : public testing::Test {
  public:
   OptimizationGuideBridgeTest()
diff --git a/chrome/browser/optimization_guide/mock_optimization_guide_keyed_service.h b/chrome/browser/optimization_guide/mock_optimization_guide_keyed_service.h
index 04143cd8..d6f64516 100644
--- a/chrome/browser/optimization_guide/mock_optimization_guide_keyed_service.h
+++ b/chrome/browser/optimization_guide/mock_optimization_guide_keyed_service.h
@@ -9,6 +9,12 @@
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
+// Mocks the opt guide service, to be used in unittests.
+//
+// Can be used with `ChromeRenderViewHostTestHarness` based tests.
+//
+// For non ChromeRenderViewHostTestHarness based tests set the local state using
+// `TestingBrowserProcess::GetGlobal()->SetLocalState()`.
 class MockOptimizationGuideKeyedService : public OptimizationGuideKeyedService {
  public:
   explicit MockOptimizationGuideKeyedService(
@@ -25,6 +31,22 @@
                optimization_guide::proto::OptimizationType,
                optimization_guide::OptimizationGuideDecisionCallback),
               (override));
+  MOCK_METHOD(
+      void,
+      CanApplyOptimizationOnDemand,
+      (const std::vector<GURL>& urls,
+       const base::flat_set<optimization_guide::proto::OptimizationType>&
+           optimization_types,
+       optimization_guide::proto::RequestContext request_context,
+       optimization_guide::OnDemandOptimizationGuideDecisionRepeatingCallback
+           callback),
+      (override));
+  MOCK_METHOD(
+      void,
+      ExecuteModel,
+      (optimization_guide::proto::ModelExecutionFeature,
+       const google::protobuf::MessageLite&,
+       optimization_guide::OptimizationGuideModelExecutionResultCallback));
 };
 
 #endif  // CHROME_BROWSER_OPTIMIZATION_GUIDE_MOCK_OPTIMIZATION_GUIDE_KEYED_SERVICE_H_
diff --git a/chrome/browser/optimization_guide/optimization_guide_keyed_service.h b/chrome/browser/optimization_guide/optimization_guide_keyed_service.h
index b54b4d9..6f82dc1 100644
--- a/chrome/browser/optimization_guide/optimization_guide_keyed_service.h
+++ b/chrome/browser/optimization_guide/optimization_guide_keyed_service.h
@@ -131,11 +131,6 @@
     return optimization_guide_logger_.get();
   }
 
- protected:
-  // Protected so that tests can stub out the implementation.
-  // TODO(b/303103198): Implement better testing support for model execution
-  // users and make that function private.
-  virtual bool ComponentUpdatesEnabledProvider() const;
 
  private:
   friend class ChromeBrowserMainExtraPartsOptimizationGuide;
@@ -194,6 +189,8 @@
 
   download::BackgroundDownloadService* BackgroundDownloadServiceProvider();
 
+  bool ComponentUpdatesEnabledProvider() const;
+
   raw_ptr<content::BrowserContext> browser_context_;
 
   // The store of hints.
diff --git a/chrome/browser/platform_util_lacros.cc b/chrome/browser/platform_util_lacros.cc
index 27601a4..c1ebfcf 100644
--- a/chrome/browser/platform_util_lacros.cc
+++ b/chrome/browser/platform_util_lacros.cc
@@ -9,6 +9,7 @@
 #include "base/notreached.h"
 #include "chrome/browser/platform_util_internal.h"
 #include "chromeos/crosapi/mojom/file_manager.mojom.h"
+#include "chromeos/crosapi/mojom/url_handler.mojom.h"
 #include "chromeos/lacros/lacros_service.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -72,9 +73,11 @@
 }
 
 void OpenExternal(const GURL& url) {
-  // TODO(https://crbug.com/1140585): Add crosapi for opening links with
-  // external protocol handlers.
-  NOTIMPLEMENTED();
+  chromeos::LacrosService* service = chromeos::LacrosService::Get();
+  if (service->GetInterfaceVersion<crosapi::mojom::UrlHandler>() >=
+      int{crosapi::mojom::UrlHandler::kOpenExternalMinVersion}) {
+    service->GetRemote<crosapi::mojom::UrlHandler>()->OpenExternal(url);
+  }
 }
 
 }  // namespace platform_util
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index a412153..e52f95417 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -129,6 +129,7 @@
 #include "components/autofill/core/browser/ui/popup_types.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/password_generation_util.h"
+#include "components/compose/core/browser/compose_features.h"
 #include "components/custom_handlers/protocol_handler.h"
 #include "components/download/public/common/download_url_parameters.h"
 #include "components/feed/feed_feature_list.h"
@@ -499,13 +500,14 @@
        // Removed: {IDC_CONTENT_CONTEXT_ORCA, 136},
        {IDC_CONTENT_CONTEXT_RUN_LAYOUT_EXTRACTION, 137},
        {IDC_CONTENT_PASTE_FROM_CLIPBOARD, 138},
+       {IDC_CONTEXT_COMPOSE, 139},
        // To add new items:
        //   - Add one more line above this comment block, using the UMA value
        //     from the line below this comment block.
        //   - Increment the UMA value in that latter line.
        //   - Add the new item to the RenderViewContextMenuItem enum in
        //     tools/metrics/histograms/enums.xml.
-       {0, 139}});
+       {0, 140}});
 
   // These UMA values are for the the ContextMenuOptionDesktop enum, used for
   // the ContextMenu.SelectedOptionDesktop histograms.
@@ -2246,18 +2248,28 @@
     AppendSearchProvider();
     menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
   }
+  bool render_separator = false;
   if (params_.misspelled_word.empty()) {
-    bool render_separator = false;
     if (DoesInputFieldTypeSupportEmoji(params_.input_field_type) &&
         ui::IsEmojiPanelSupported()) {
       render_separator = true;
       menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_EMOJI,
                                       IDS_CONTENT_CONTEXT_EMOJI);
     }
+  }
+  // TODO(b/301371110): Update enabling constraints.
+  if (base::FeatureList::IsEnabled(compose::features::kEnableCompose)) {
+    menu_model_.AddItemWithStringId(IDC_CONTEXT_COMPOSE,
+                                    IDS_COMPOSE_SUGGESTION_MAIN_TEXT);
+    // TODO(b/303646344): Remove new feature tag when no longer new.
+    menu_model_.SetIsNewFeatureAt(
+        menu_model_.GetItemCount() - 1,
+        !content_type_->SupportsGroup(ContextMenuContentType::ITEM_GROUP_LINK));
 
-    if (render_separator) {
-      menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
-    }
+    render_separator = true;
+  }
+  if (render_separator) {
+    menu_model_.AddSeparator(ui::NORMAL_SEPARATOR);
   }
 }
 
@@ -2783,6 +2795,8 @@
 
     case IDC_CONTENT_CONTEXT_EMOJI:
       return params_.is_editable;
+    case IDC_CONTEXT_COMPOSE:
+      return params_.is_editable;
 
     case IDC_CONTENT_CONTEXT_START_SMART_SELECTION_ACTION1:
     case IDC_CONTENT_CONTEXT_START_SMART_SELECTION_ACTION2:
@@ -3263,6 +3277,11 @@
       break;
     }
 
+    case IDC_CONTEXT_COMPOSE: {
+      // TODO(b/301371110): implement the click functionality.
+      break;
+    }
+
     case IDC_CONTENT_CLIPBOARD_HISTORY_MENU: {
 #if BUILDFLAG(IS_CHROMEOS)
       // If the clipboard history refresh feature is enabled, we add a submenu
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
index 866fca79..8d91c38 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_browsertest.cc
@@ -63,6 +63,7 @@
 #include "chrome/test/base/mixin_based_in_process_browser_test.h"
 #include "chrome/test/base/search_test_utils.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/compose/buildflags.h"
 #include "components/guest_view/browser/guest_view_manager_delegate.h"
 #include "components/guest_view/browser/test_guest_view_manager.h"
 #include "components/lens/buildflags.h"
@@ -134,6 +135,10 @@
 #include "ui/gfx/codec/jpeg_codec.h"
 #include "ui/gfx/codec/png_codec.h"
 
+#if BUILDFLAG(ENABLE_COMPOSE)
+#include "components/compose/core/browser/compose_features.h"
+#endif
+
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
 #include "chrome/browser/supervised_user/supervised_user_service_factory.h"
 #include "chrome/test/supervised_user/embedded_test_server_setup_mixin.h"
@@ -1148,6 +1153,41 @@
 }
 #endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
+#if BUILDFLAG(ENABLE_COMPOSE)
+class ContextMenuForComposeBrowserTest : public ContextMenuBrowserTest {
+ public:
+  ContextMenuForComposeBrowserTest() {
+    scoped_feature_list_.InitWithFeatures(
+        /*enabled_features=*/{compose::features::kEnableCompose},
+        /*disabled_features=*/{});
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(ContextMenuForComposeBrowserTest,
+                       ContextMenuForCompose_Editable) {
+  content::ContextMenuParams params;
+  params.is_editable = true;
+
+  auto menu = CreateContextMenuFromParams(params);
+
+  EXPECT_TRUE(menu->IsItemPresent(IDC_CONTEXT_COMPOSE));
+}
+
+IN_PROC_BROWSER_TEST_F(ContextMenuForComposeBrowserTest,
+                       ContextMenuForCompose_NonEditable) {
+  content::ContextMenuParams params;
+  params.is_editable = false;
+
+  auto menu = CreateContextMenuFromParams(params);
+
+  // Compose context menu item should never be present on a non-editable field.
+  EXPECT_FALSE(menu->IsItemPresent(IDC_CONTEXT_COMPOSE));
+}
+#endif  // BUILDFLAG(ENABLE_COMPOSE)
+
 IN_PROC_BROWSER_TEST_F(ContextMenuBrowserTest, CopyLinkTextMouse) {
   std::unique_ptr<TestRenderViewContextMenu> menu = CreateContextMenu(
       GURL("http://www.google.com/"), GURL("http://www.google.com/"), u"Google",
diff --git a/chrome/browser/resources/ash/settings/crostini_page/crostini_extra_containers.ts b/chrome/browser/resources/ash/settings/crostini_page/crostini_extra_containers.ts
index 03e46e7..548c55f3 100644
--- a/chrome/browser/resources/ash/settings/crostini_page/crostini_extra_containers.ts
+++ b/chrome/browser/resources/ash/settings/crostini_page/crostini_extra_containers.ts
@@ -35,7 +35,7 @@
   'dataContainerId': GuestId,
 };
 
-interface ExtraContainersElement {
+export interface ExtraContainersElement {
   $: {
     containerMenu: CrLazyRenderElement<CrActionMenuElement>,
   };
@@ -52,7 +52,7 @@
 
 const ExtraContainersElementBase = WebUiListenerMixin(PolymerElement);
 
-class ExtraContainersElement extends ExtraContainersElementBase {
+export class ExtraContainersElement extends ExtraContainersElementBase {
   static get is() {
     return 'settings-crostini-extra-containers';
   }
diff --git a/chrome/browser/resources/ash/settings/crostini_page/crostini_extra_containers_create_dialog.ts b/chrome/browser/resources/ash/settings/crostini_page/crostini_extra_containers_create_dialog.ts
index 310dcc0..0a592e73 100644
--- a/chrome/browser/resources/ash/settings/crostini_page/crostini_extra_containers_create_dialog.ts
+++ b/chrome/browser/resources/ash/settings/crostini_page/crostini_extra_containers_create_dialog.ts
@@ -23,7 +23,7 @@
 import {CrostiniBrowserProxy, CrostiniBrowserProxyImpl, DEFAULT_CROSTINI_CONTAINER, DEFAULT_CROSTINI_VM} from './crostini_browser_proxy.js';
 import {getTemplate} from './crostini_extra_containers_create_dialog.html.js';
 
-interface ExtraContainersCreateDialog {
+export interface ExtraContainersCreateDialog {
   $: {
     dialog: CrDialogElement,
     containerFileInput: CrInputElement,
@@ -34,7 +34,7 @@
   };
 }
 
-class ExtraContainersCreateDialog extends PolymerElement {
+export class ExtraContainersCreateDialog extends PolymerElement {
   static get is() {
     return 'settings-crostini-create-container-dialog';
   }
diff --git a/chrome/browser/resources/ash/settings/crostini_page/crostini_page.ts b/chrome/browser/resources/ash/settings/crostini_page/crostini_page.ts
index 0cbb62bb..e0428b3 100644
--- a/chrome/browser/resources/ash/settings/crostini_page/crostini_page.ts
+++ b/chrome/browser/resources/ash/settings/crostini_page/crostini_page.ts
@@ -24,6 +24,7 @@
 
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {PrefsState} from '../common/types.js';
 import {Section} from '../mojom-webui/routes.mojom-webui.js';
 
 import {getTemplate} from './crostini_page.html.js';
@@ -39,6 +40,11 @@
 
   static get properties() {
     return {
+      /** Preferences state. */
+      prefs: {
+        type: Object,
+        notify: true,
+      },
       section_: {
         type: Number,
         value: Section.kCrostini,
@@ -47,6 +53,7 @@
     };
   }
 
+  prefs: PrefsState;
   private section_: Section;
 }
 
diff --git a/chrome/browser/resources/ash/settings/lazy_load.ts b/chrome/browser/resources/ash/settings/lazy_load.ts
index 13a5ea1..70d8affc 100644
--- a/chrome/browser/resources/ash/settings/lazy_load.ts
+++ b/chrome/browser/resources/ash/settings/lazy_load.ts
@@ -138,7 +138,10 @@
 // Tests should use this export of `sanitizerInnerHtml` to prevent repeated
 // TrustedTypes policies from being created.
 export {sanitizeInnerHtml} from 'chrome://resources/js/parse_html_subset.js';
-export {CrostiniBrowserProxy, CrostiniBrowserProxyImpl} from './crostini_page/crostini_browser_proxy.js';
+export {CrostiniBrowserProxy, CrostiniBrowserProxyImpl, CrostiniDiskInfo, CrostiniPortActiveSetting, CrostiniPortProtocol} from './crostini_page/crostini_browser_proxy.js';
+export {ExtraContainersElement} from './crostini_page/crostini_extra_containers.js';
+export {ExtraContainersCreateDialog} from './crostini_page/crostini_extra_containers_create_dialog.js';
+export {SettingsCrostiniPageElement} from './crostini_page/crostini_page.js';
 export {CrostiniSettingsCardElement} from './crostini_page/crostini_settings_card.js';
 export {SettingsDateTimePageElement} from './date_time_page/date_time_page.js';
 export {DateTimeSettingsCardElement} from './date_time_page/date_time_settings_card.js';
@@ -154,7 +157,7 @@
 export {DragAndDropManager, getDataTransferOriginIndex, setDataTransferOriginIndex} from './device_page/drag_and_drop_manager.js';
 export {KeyCombinationInputDialogElement} from './device_page/key_combination_input_dialog.js';
 export {SettingsPowerElement} from './device_page/power.js';
-export {CROSTINI_TYPE, GuestOsBrowserProxy, GuestOsBrowserProxyImpl, GuestOsSharedUsbDevice, PLUGIN_VM_TYPE} from './guest_os/guest_os_browser_proxy.js';
+export {ContainerInfo, CROSTINI_TYPE, GuestId, GuestOsBrowserProxy, GuestOsBrowserProxyImpl, GuestOsSharedUsbDevice, PLUGIN_VM_TYPE, ShareableDevices} from './guest_os/guest_os_browser_proxy.js';
 export {SettingsGuestOsSharedPathsElement} from './guest_os/guest_os_shared_paths.js';
 export {SettingsGuestOsSharedUsbDevicesElement} from './guest_os/guest_os_shared_usb_devices.js';
 export {CellularNetworksListElement} from './internet_page/cellular_networks_list.js';
diff --git a/chrome/browser/resources/ash/settings/os_settings.ts b/chrome/browser/resources/ash/settings/os_settings.ts
index e46157e..67f192cd 100644
--- a/chrome/browser/resources/ash/settings/os_settings.ts
+++ b/chrome/browser/resources/ash/settings/os_settings.ts
@@ -91,6 +91,7 @@
 export {ProfileInfo, ProfileInfoBrowserProxy, ProfileInfoBrowserProxyImpl} from '/shared/settings/people_page/profile_info_browser_proxy.js';
 export {PageStatus, StatusAction, StoredAccount, SyncBrowserProxy, SyncBrowserProxyImpl, SyncPrefs, SyncStatus} from '/shared/settings/people_page/sync_browser_proxy.js';
 export {PrivacyPageBrowserProxyImpl, SecureDnsMode, SecureDnsUiManagementMode} from '/shared/settings/privacy_page/privacy_page_browser_proxy.js';
+export {ApnDetailDialog} from 'chrome://resources/ash/common/network/apn_detail_dialog.js';
 export {AppManagementFileHandlingItemElement} from 'chrome://resources/cr_components/app_management/file_handling_item.js';
 export {AppManagementSupportedLinksItemElement} from 'chrome://resources/cr_components/app_management/supported_links_item.js';
 export {AppManagementToggleRowElement} from 'chrome://resources/cr_components/app_management/toggle_row.js';
diff --git a/chrome/browser/resources/chromeos/about_os_credits.html b/chrome/browser/resources/chromeos/about_os_credits.html
index 6faec4cc..198cefc 100644
--- a/chrome/browser/resources/chromeos/about_os_credits.html
+++ b/chrome/browser/resources/chromeos/about_os_credits.html
@@ -16,8 +16,9 @@
 <body>
 <span class="page-title">Credits</span>
 <a id="print-link" href="#" hidden>Print</a>
-<input type="checkbox" hidden id="show-all">
-<label class="show show-all" for="show-all" tabindex="0"></label>
+<label class="show show-all" tabindex="0">
+<input type="checkbox" hidden>
+</label>
 <div style="clear:both; overflow:auto;">
 <h2>List of Packages used in Google ChromeOS</h2>
 <!-- Chromium <3s the following projects -->
@@ -42,8 +43,9 @@
 <div class="product">
 <span class="title">placeheld-1.0</span>
 <span class="homepage"><a href="https://dev.chromium.org/">homepage</a></span>
-<input type="checkbox" hidden id="placeheld">
-<label class="show" for="placeheld"></label>
+<label class="show">
+<input type="checkbox" hidden>
+</label>
 <div class="license">
 <pre>Custom placeholder license text
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@@ -59,8 +61,9 @@
 <div class="product">
 <span class="title">placeholder-1</span>
 <span class="homepage"><a href="https://dev.chromium.org/">homepage</a></span>
-<input type="checkbox" hidden id="placeholder">
-<label class="show" for="placeholder"></label>
+<label class="show">
+<input type="checkbox" hidden>
+</label>
 <div class="license">
 <pre>Custom placeholder license text
 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
@@ -77,8 +80,9 @@
 <h2>List of Shared Licenses used in Google ChromeOS</h2>
 <div class="product">
 <a name="Placeholder-License" class="title">Placeholder Stock License Placeholder-License</a>
-<input type="checkbox" hidden id="Placeholder-License">
-<label class="show" for="Placeholder-License"></label>
+<label class="show">
+<input type="checkbox" hidden>
+</label>
 <div class="license">
 <pre>
 Placeholder license text
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js
index a79e419a..d4705b0 100644
--- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js
+++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/editing/editable_text_base.js
@@ -230,11 +230,7 @@
     //   - one to speak
 
     if (this.isPassword) {
-      this.speak(
-          (new goog.i18n.MessageFormat(Msgs.getMsg('bullet')).format({
-            'COUNT': 1,
-          })),
-          evt.triggeredByUser);
+      this.speak(Msgs.getMsg('password_char'), evt.triggeredByUser);
       return;
     }
     if (evt.start === evt.end) {
@@ -335,10 +331,7 @@
     }
     if (this.isPassword) {
       this.speak(
-          (new goog.i18n.MessageFormat(Msgs.getMsg('bullet')).format({
-            'COUNT': 1,
-          })),
-          evt.triggeredByUser, personality);
+          Msgs.getMsg('password_char'), evt.triggeredByUser, personality);
       return;
     }
 
diff --git a/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp b/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
index 6f867c40..88cef8fc 100644
--- a/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
+++ b/chrome/browser/resources/chromeos/accessibility/strings/chromevox_strings.grdp
@@ -1894,13 +1894,13 @@
   <message desc="Backslash (\) character description." name="IDS_CHROMEVOX_BACKSLASH">
     {COUNT, plural, =1 {backslash}other {# backslashes}}
   </message>
-  <message desc="BULLET (•) character description." name="IDS_CHROMEVOX_BULLET">
+  <message desc="BULLET (•) character description announced by ChromeVox screen reader." name="IDS_CHROMEVOX_BULLET">
     {COUNT, plural, =1 {bullet}other {# bullets}}
   </message>
-  <message desc="Second level bullet (â—¦) character description." name="IDS_CHROMEVOX_WHITE_BULLET">
+  <message desc="Second level bullet (â—¦) character description announced by ChromeVox screen reader." name="IDS_CHROMEVOX_WHITE_BULLET">
     {COUNT, plural, =1 {white bullet}other {# white bullets}}
   </message>
-  <message desc="Third level bullet (â– ) character description." name="IDS_CHROMEVOX_SQUARE_BULLET">
+  <message desc="Third level bullet (â– ) character description announced by ChromeVox screen reader." name="IDS_CHROMEVOX_SQUARE_BULLET">
     {COUNT, plural, =1 {square bullet}other {# square bullets}}
   </message>
   <message desc="Describes the braille click command. Displayed in the options page." name="IDS_CHROMEVOX_BRAILLE_ROUTING">
@@ -3387,4 +3387,7 @@
   <message desc="Spoken message notifying users that using TalkBack on Chromebook is no longer supported and keyboard shortcut are no longer customized for Chromebooks." name="IDS_CHROMEVOX_ANNOUNCE_TALKBACK_DEPRECATION" is_accessibility_with_no_ui="true">
     TalkBack no longer provides customization for Chromebooks. You can still use it, but use TalkBack default keyboard shortcuts. Press Search+A, then K to see available shortcuts. If you still want to use TalkBack, press the command again.
   </message>
+  <message desc="Short message spoken by ChromeVox screen reader when a user adds, deletes, or moves a cursor caret across a character in a password field." name="IDS_CHROMEVOX_PASSWORD_CHAR" is_accessibility_with_no_ui="true">
+    bullet
+  </message>
 </grit-part>
diff --git a/chrome/browser/resources/chromeos/quickoffice b/chrome/browser/resources/chromeos/quickoffice
index 23bde34..79e797d 160000
--- a/chrome/browser/resources/chromeos/quickoffice
+++ b/chrome/browser/resources/chromeos/quickoffice
@@ -1 +1 @@
-Subproject commit 23bde3495989fbc0112213613d2498030be51417
+Subproject commit 79e797d69d4675a2f0ef916dbb65457fe9485fc9
diff --git a/chrome/browser/resources/downloads/item.html b/chrome/browser/resources/downloads/item.html
index 6358ad9..a83f703 100644
--- a/chrome/browser/resources/downloads/item.html
+++ b/chrome/browser/resources/downloads/item.html
@@ -307,11 +307,9 @@
 <div id="content" on-dragstart="onDragStart_"
     class$="[[computeClass_(isActive_, isDangerous_, showProgress_)]]"
     focus-row-container>
-  <!--
-    TODO(hcarmona): Investigate displaying danger level as text in alt
-    attribute and remove aria-hidden="true" from #file-icon-wrapper
-  -->
-  <div id="file-icon-wrapper" class="icon-wrapper" aria-hidden="true">
+  <div id="file-icon-wrapper" class="icon-wrapper" role="img"
+      aria-label="[[iconAriaLabel_]]"
+      aria-hidden="[[computeIconAriaHidden_(iconAriaLabel_)]]">
     <img class="icon" id="file-icon" alt="" hidden="[[!useFileIcon_]]"
         icon-color$="[[computeIconColor_(isDangerous_, data.dangerType,
         useFileIcon_, updateDeepScanningUx_, improvedDownloadWarningsUx_,
diff --git a/chrome/browser/resources/downloads/item.ts b/chrome/browser/resources/downloads/item.ts
index cb6e5ff..8fa6de0 100644
--- a/chrome/browser/resources/downloads/item.ts
+++ b/chrome/browser/resources/downloads/item.ts
@@ -105,6 +105,12 @@
         computed: 'computeControlRemoveFromListAriaLabel_(data.fileName)',
       },
 
+      iconAriaLabel_: {
+        type: String,
+        computed: 'computeIconAriaLabel_(' +
+            'displayType_, improvedDownloadWarningsUx_)',
+      },
+
       isActive_: {
         computed: 'computeIsActive_(' +
             'data.state, data.fileExternallyRemoved)',
@@ -208,6 +214,7 @@
   data: MojomData;
   private mojoHandler_: PageHandlerInterface|null = null;
   private controlledBy_: string;
+  private iconAriaLabel_: string;
   private isActive_: boolean;
   private isDangerous_: boolean;
   private isReviewable_: boolean;
@@ -485,6 +492,26 @@
     return '';
   }
 
+  private computeIconAriaHidden_(): string {
+    return (this.iconAriaLabel_ === '').toString();
+  }
+
+  private computeIconAriaLabel_(): string {
+    if (this.improvedDownloadWarningsUx_) {
+      switch (this.displayType_) {
+        case DisplayType.DANGEROUS:
+          return this.i18n('accessibleLabelDangerous');
+        case DisplayType.INSECURE:
+          return this.i18n('accessibleLabelInsecure');
+        case DisplayType.UNVERIFIED:
+          return this.i18n('accessibleLabelUnverified');
+        case DisplayType.SUSPICIOUS:
+          return this.i18n('accessibleLabelSuspicious');
+      }
+    }
+    return '';
+  }
+
   private iconAndDescriptionColor_(): string {
     if (this.improvedDownloadWarningsUx_) {
       switch (this.displayType_) {
diff --git a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
index 7c9329b..151641c 100644
--- a/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
+++ b/chrome/browser/safe_browsing/safe_browsing_blocking_page_test.cc
@@ -99,6 +99,7 @@
 #include "components/unified_consent/pref_names.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/disallow_activation_reason.h"
 #include "content/public/browser/navigation_controller.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/notification_types.h"
@@ -4020,6 +4021,7 @@
 // Attempt to prerender an unsafe page. The prerender navigation should be
 // cancelled and should not affect the security state of the primary page.
 IN_PROC_BROWSER_TEST_P(SafeBrowsingPrerenderBrowserTest, UnsafePrerender) {
+  base::HistogramTester histograms;
   const GURL initial_url = embedded_test_server()->GetURL("/title1.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), initial_url));
 
@@ -4027,12 +4029,16 @@
   SetURLThreatType(prerender_url, GetThreatType());
 
   PrerenderAndExpectCancellation(prerender_url);
+  histograms.ExpectUniqueSample(
+      "Prerender.Experimental.PrerenderHostFinalStatus.SpeculationRule",
+      /*PrerenderFinalStatus::kBlockedByClient=*/28, 1);
 }
 
 // Like SafeBrowsingPrerenderBrowserTest.UnsafePrerender, but for when a
 // prerendered page has a subresource that's unsafe.
 IN_PROC_BROWSER_TEST_P(SafeBrowsingPrerenderBrowserTest,
                        UnsafeSubresourcePrerender) {
+  base::HistogramTester histograms;
   const GURL initial_url = embedded_test_server()->GetURL("/title1.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), initial_url));
 
@@ -4041,12 +4047,22 @@
   SetURLThreatType(unsafe_resource_url, GetThreatType());
 
   PrerenderAndExpectCancellation(prerender_url);
+
+  histograms.ExpectUniqueSample(
+      "Prerender.Experimental.PrerenderHostFinalStatus.SpeculationRule",
+      /*PrerenderFinalStatus::kInactivePageRestriction=*/41, 1);
+
+  histograms.ExpectUniqueSample(
+      "Prerender.CanceledForInactivePageRestriction.DisallowActivationReason."
+      "SpeculationRule",
+      content::DisallowActivationReasonId::kSafeBrowsingUnsafeSubresource, 1);
 }
 
 // Like SafeBrowsingPrerenderBrowserTest.UnsafePrerender, but for when a
 // prerendered page has a subframe that's unsafe.
 IN_PROC_BROWSER_TEST_P(SafeBrowsingPrerenderBrowserTest,
                        UnsafeSubframePrerender) {
+  base::HistogramTester histograms;
   const GURL initial_url = embedded_test_server()->GetURL("/title1.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), initial_url));
 
@@ -4070,10 +4086,15 @@
 
   EXPECT_FALSE(IsShowingInterstitial(GetWebContents()));
   ExpectNoSecurityIndicatorDowngrade(GetWebContents());
+
+  histograms.ExpectUniqueSample(
+      "Prerender.Experimental.PrerenderHostFinalStatus.SpeculationRule",
+      /*PrerenderFinalStatus::kBlockedByClient=*/28, 1);
 }
 
 IN_PROC_BROWSER_TEST_P(SafeBrowsingPrerenderBrowserTest,
                        UnsafeSubresourceOfSubframePrerender) {
+  base::HistogramTester histograms;
   const GURL initial_url = embedded_test_server()->GetURL("/title1.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), initial_url));
 
@@ -4097,10 +4118,20 @@
 
   EXPECT_FALSE(IsShowingInterstitial(GetWebContents()));
   ExpectNoSecurityIndicatorDowngrade(GetWebContents());
+
+  histograms.ExpectUniqueSample(
+      "Prerender.Experimental.PrerenderHostFinalStatus.SpeculationRule",
+      /*PrerenderFinalStatus::kInactivePageRestriction=*/41, 1);
+
+  histograms.ExpectUniqueSample(
+      "Prerender.CanceledForInactivePageRestriction.DisallowActivationReason."
+      "SpeculationRule",
+      content::DisallowActivationReasonId::kSafeBrowsingUnsafeSubresource, 1);
 }
 
 IN_PROC_BROWSER_TEST_P(SafeBrowsingPrerenderBrowserTest,
                        UnsafeCrossOriginSubframePrerender) {
+  base::HistogramTester histograms;
   const GURL initial_url = embedded_test_server()->GetURL("/title1.html");
   ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), initial_url));
 
@@ -4111,6 +4142,10 @@
   SetURLThreatType(unsafe_iframe_url, GetThreatType());
 
   PrerenderAndExpectCancellation(prerender_url);
+
+  histograms.ExpectUniqueSample(
+      "Prerender.Experimental.PrerenderHostFinalStatus.SpeculationRule",
+      /*PrerenderFinalStatus::kBlockedByClient=*/28, 1);
 }
 
 class SafeBrowsingThreatDetailsPrerenderBrowserTest
diff --git a/chrome/browser/sync/test/integration/two_client_web_apps_sync_test.cc b/chrome/browser/sync/test/integration/two_client_web_apps_sync_test.cc
index 3680c88..57295dd0 100644
--- a/chrome/browser/sync/test/integration/two_client_web_apps_sync_test.cc
+++ b/chrome/browser/sync/test/integration/two_client_web_apps_sync_test.cc
@@ -12,8 +12,8 @@
 #include "chrome/browser/sync/test/integration/web_apps_sync_test_base.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
 #include "chrome/browser/web_applications/test/web_app_test_observers.h"
@@ -254,12 +254,12 @@
     ASSERT_TRUE(ui_test_utils::NavigateToURL(
         browser,
         embedded_test_server()->GetURL("/web_apps/favicon_only.html")));
-    chrome::SetAutoAcceptWebAppDialogForTesting(true, true);
+    SetAutoAcceptWebAppDialogForTesting(true, true);
     WebAppTestInstallObserver installObserver(sourceProfile);
     installObserver.BeginListening();
     chrome::ExecuteCommand(browser, IDC_CREATE_SHORTCUT);
     app_id = installObserver.Wait();
-    chrome::SetAutoAcceptWebAppDialogForTesting(false, false);
+    SetAutoAcceptWebAppDialogForTesting(false, false);
     chrome::CloseWindow(browser);
   }
   EXPECT_EQ(GetRegistrar(sourceProfile).GetAppShortName(app_id),
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn
index 4c0b56f..e24bfa4 100644
--- a/chrome/browser/ui/BUILD.gn
+++ b/chrome/browser/ui/BUILD.gn
@@ -1459,6 +1459,8 @@
       "tabs/organization/tab_organization_session.h",
       "tabs/organization/trigger.cc",
       "tabs/organization/trigger.h",
+      "tabs/organization/trigger_observer.cc",
+      "tabs/organization/trigger_observer.h",
       "tabs/pinned_tab_codec.cc",
       "tabs/pinned_tab_codec.h",
       "tabs/pinned_tab_service.cc",
@@ -6324,6 +6326,7 @@
       "web_applications/web_app_browser_controller.h",
       "web_applications/web_app_dialog_utils.cc",
       "web_applications/web_app_dialog_utils.h",
+      "web_applications/web_app_dialogs.h",
       "web_applications/web_app_launch_process.cc",
       "web_applications/web_app_launch_process.h",
       "web_applications/web_app_launch_utils.cc",
diff --git a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc
index 4d56fb6b..c4dbd1e 100644
--- a/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc
+++ b/chrome/browser/ui/ash/shelf/chrome_shelf_controller_browsertest.cc
@@ -72,7 +72,6 @@
 #include "chrome/browser/ui/ash/shelf/shelf_context_menu.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window.h"
@@ -85,6 +84,7 @@
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/external_install_options.h"
 #include "chrome/browser/web_applications/externally_managed_app_manager.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
@@ -1294,12 +1294,12 @@
   registration_waiter.AwaitRegistration();
 
   // Install PWA.
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(true);
   web_app::WebAppTestInstallWithOsHooksObserver install_observer(profile());
   install_observer.BeginListening();
   chrome::ExecuteCommand(browser(), IDC_INSTALL_PWA);
   const webapps::AppId app_id = install_observer.Wait();
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(false);
 
   // Find the native window for the app.
   gfx::NativeWindow native_window = gfx::NativeWindow();
@@ -2484,12 +2484,12 @@
   ASSERT_TRUE(AddTabAtIndex(1, url, ui::PAGE_TRANSITION_LINK));
   registration_waiter.AwaitRegistration();
   // Install PWA.
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(true);
   web_app::WebAppTestInstallWithOsHooksObserver install_observer(profile());
   install_observer.BeginListening();
   chrome::ExecuteCommand(browser(), IDC_INSTALL_PWA);
   const webapps::AppId app_id = install_observer.Wait();
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
+  web_app::SetAutoAcceptPWAInstallConfirmationForTesting(false);
 
   ash::ShelfID shelf_id(app_id);
   EXPECT_FALSE(ChromeShelfController::instance()->IsPinned(shelf_id));
@@ -2509,12 +2509,12 @@
       GURL(embedded_test_server()->GetURL("/banners/manifest_test_page.html")),
       ui::PAGE_TRANSITION_LINK));
   // Install shortcut app.
-  chrome::SetAutoAcceptWebAppDialogForTesting(true, true);
+  web_app::SetAutoAcceptWebAppDialogForTesting(true, true);
   web_app::WebAppTestInstallWithOsHooksObserver install_observer(profile());
   install_observer.BeginListening();
   chrome::ExecuteCommand(browser(), IDC_CREATE_SHORTCUT);
   const webapps::AppId app_id = install_observer.Wait();
-  chrome::SetAutoAcceptWebAppDialogForTesting(false, false);
+  web_app::SetAutoAcceptWebAppDialogForTesting(false, false);
 
   ash::ShelfID shelf_id(app_id);
   EXPECT_FALSE(ChromeShelfController::instance()->IsPinned(shelf_id));
diff --git a/chrome/browser/ui/browser_dialogs.h b/chrome/browser/ui/browser_dialogs.h
index 24c3d07..d9ccbd4 100644
--- a/chrome/browser/ui/browser_dialogs.h
+++ b/chrome/browser/ui/browser_dialogs.h
@@ -25,18 +25,7 @@
 #include "ui/base/models/dialog_model.h"
 #include "ui/gfx/native_widget_types.h"
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
-    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
-#include "chrome/browser/web_applications/web_app_callback_app_identity.h"
-#include "chrome/browser/web_applications/web_app_id.h"
-#include "chrome/browser/web_applications/web_app_install_info.h"
-#include "chrome/browser/web_applications/web_app_uninstall_dialog_user_options.h"
-#include "components/webapps/browser/installable/installable_metrics.h"
-#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
-        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
-
 class Browser;
-class GURL;
 class LoginHandler;
 class Profile;
 
@@ -83,15 +72,6 @@
 class Widget;
 }  // namespace views
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
-    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
-namespace webapps {
-class MlInstallOperationTracker;
-struct Screenshot;
-}  // namespace webapps
-#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
-        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
-
 namespace chrome {
 
 // Shows or hides the Task Manager. |browser| can be NULL when called from Ash.
@@ -161,135 +141,6 @@
     content::BluetoothDelegate::PairPromptCallback close_callback);
 #endif  // PAIR_BLUETOOTH_ON_DEMAND()
 
-#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
-    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
-// Callback used to indicate whether a user has accepted the installation of a
-// web app. The boolean parameter is true when the user accepts the dialog. The
-// WebAppInstallInfo parameter contains the information about the app,
-// possibly modified by the user.
-using AppInstallationAcceptanceCallback =
-    base::OnceCallback<void(bool, std::unique_ptr<web_app::WebAppInstallInfo>)>;
-
-// Shows the Web App install bubble.
-//
-// |web_app_info| is the WebAppInstallInfo being converted into an app.
-// |web_app_info.app_url| should contain a start url from a web app manifest
-// (for a Desktop PWA), or the current url (when creating a shortcut app).
-void ShowWebAppInstallDialog(
-    content::WebContents* web_contents,
-    std::unique_ptr<web_app::WebAppInstallInfo> web_app_info,
-    std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
-    AppInstallationAcceptanceCallback callback);
-
-// Creates a dialog that requests the consent from the user to install the
-// requested apps as sub apps to the named parent app. This is triggered by
-// an app calling the Multi App API add() function. The dialog is modal to
-// the browser containing the app calling the API. |sub_apps| contains the
-// information to represent each app to the user.
-views::Widget* CreateSubAppsInstallDialogWidget(
-    const std::string_view parent_app_name,
-    const std::string_view parent_app_scope,
-    const std::vector<std::unique_ptr<web_app::WebAppInstallInfo>>& sub_apps,
-    gfx::NativeWindow window);
-
-// When an app changes its icon or name, that is considered an app identity
-// change which (for some types of apps) needs confirmation from the user.
-// This function shows that confirmation dialog. |app_id| is the unique id of
-// the app that is updating and |title_change| and |icon_change| specify which
-// piece of information is changing. Can be one or the other, or both (but
-// both cannot be |false|). |old_title| and |new_title|, as well as |old_icon|
-// and |new_icon| show the 'before' and 'after' values. A response is sent
-// back via the |callback|.
-void ShowWebAppIdentityUpdateDialog(
-    const std::string& app_id,
-    bool title_change,
-    bool icon_change,
-    const std::u16string& old_title,
-    const std::u16string& new_title,
-    const SkBitmap& old_icon,
-    const SkBitmap& new_icon,
-    content::WebContents* web_contents,
-    web_app::AppIdentityDialogCallback callback);
-
-// Shows the web app uninstallation dialog on a page whenever user has decided
-// to uninstall an installed dPWA from a variety of OS surfaces and chrome.
-void ShowWebAppUninstallDialog(
-    Profile* profile,
-    const webapps::AppId& app_id,
-    webapps::WebappUninstallSource uninstall_source,
-    gfx::NativeWindow parent,
-    std::map<web_app::SquareSizePx, SkBitmap> icon_bitmaps,
-    web_app::UninstallDialogCallback uninstall_dialog_result_callback);
-
-// Callback used to indicate whether a user has accepted the launch of a
-// web app. The |allowed| is true when the user allows the app to launch.
-// |remember_user_choice| is true if the user wants to persist the decision.
-using WebAppLaunchAcceptanceCallback =
-    base::OnceCallback<void(bool allowed, bool remember_user_choice)>;
-
-// Shows the pre-launch dialog for protocol handling PWA launch. The user can
-// allow or block the launch.
-void ShowWebAppProtocolLaunchDialog(
-    const GURL& url,
-    Profile* profile,
-    const webapps::AppId& app_id,
-    WebAppLaunchAcceptanceCallback close_callback);
-
-// Shows the pre-launch dialog for a file handling PWA launch. The user can
-// allow or block the launch.
-void ShowWebAppFileLaunchDialog(const std::vector<base::FilePath>& file_paths,
-                                Profile* profile,
-                                const webapps::AppId& app_id,
-                                WebAppLaunchAcceptanceCallback close_callback);
-// Sets whether |ShowWebAppDialog| should accept immediately without any
-// user interaction. |auto_open_in_window| sets whether the open in window
-// checkbox is checked.
-void SetAutoAcceptWebAppDialogForTesting(bool auto_accept,
-                                         bool auto_open_in_window);
-
-// Sets an override title for the installation.
-void SetOverrideTitleForTesting(const char* title_to_use);
-
-// Describes the state of in-product-help being shown to the user.
-enum class PwaInProductHelpState {
-  // The in-product-help bubble was shown.
-  kShown,
-  // The in-product-help bubble was not shown.
-  kNotShown
-};
-
-// Shows the PWA installation confirmation bubble anchored off the PWA install
-// icon in the omnibox.
-//
-// |web_app_info| is the WebAppInstallInfo to be installed.
-// |callback| is called when install bubble closed.
-// |iph_state| records whether PWA install iph is shown before Install bubble is
-// shown.
-void ShowPWAInstallBubble(
-    content::WebContents* web_contents,
-    std::unique_ptr<web_app::WebAppInstallInfo> web_app_info,
-    std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
-    AppInstallationAcceptanceCallback callback,
-    PwaInProductHelpState iph_state = PwaInProductHelpState::kNotShown);
-
-// Shows the Web App detailed install dialog.
-// The dialog shows app's detailed information including screenshots. Users then
-// confirm or cancel install in this dialog.
-void ShowWebAppDetailedInstallDialog(
-    content::WebContents* web_contents,
-    std::unique_ptr<web_app::WebAppInstallInfo> web_app_info,
-    std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
-    AppInstallationAcceptanceCallback callback,
-    const std::vector<webapps::Screenshot>& screenshots,
-    PwaInProductHelpState iph_state = PwaInProductHelpState::kNotShown);
-
-// Sets whether |ShowPWAInstallBubble| should accept immediately without any
-// user interaction.
-void SetAutoAcceptPWAInstallConfirmationForTesting(bool auto_accept);
-
-#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
-        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA)
-
 #if BUILDFLAG(IS_MAC)
 
 // Bridging methods that show/hide the toolkit-views based Task Manager on Mac.
diff --git a/chrome/browser/ui/color/material_chrome_color_mixer.cc b/chrome/browser/ui/color/material_chrome_color_mixer.cc
index e28d8c3dc..e998e34 100644
--- a/chrome/browser/ui/color/material_chrome_color_mixer.cc
+++ b/chrome/browser/ui/color/material_chrome_color_mixer.cc
@@ -106,6 +106,26 @@
   // Cast Dialog colors.
   mixer[kColorCastDialogHelpIcon] = {ui::kColorSysPrimary};
 
+  if (base::FeatureList::IsEnabled(compose::features::kEnableCompose)) {
+    // Compose colors.
+    mixer[kColorComposeDialogBackground] = {ui::kColorSysSurface};
+    mixer[kColorComposeDialogForegroundSubtle] = {ui::kColorSysOnSurfaceSubtle};
+    mixer[kColorComposeDialogLink] = {ui::kColorSysPrimary};
+    mixer[kColorComposeDialogResultBackground] = {ui::kColorSysBaseContainer};
+    mixer[kColorComposeDialogResultForeground] = {ui::kColorSysOnSurface};
+    mixer[kColorComposeDialogResultIcon] = {ui::kColorSysOnSurfaceSubtle};
+    mixer[kColorComposeDialogTitle] = {ui::kColorSysOnSurface};
+    mixer[kColorComposeDialogTextarea] = {ui::kColorSysOnSurface};
+    mixer[kColorComposeDialogTextareaOutline] = {ui::kColorSysNeutralOutline};
+    mixer[kColorComposeDialogTextareaPlaceholder] = {
+        ui::kColorSysOnSurfaceSecondary};
+    mixer[kColorComposeDialogTextareaReadonlyBackground] = {
+        ui::kColorSysNeutralContainer};
+    mixer[kColorComposeDialogTextareaReadonlyForeground] = {
+        ui::kColorSysOnSurface};
+    mixer[kColorComposeDialogTextareaIcon] = {ui::kColorSysOnSurfaceSubtle};
+  }
+
   if (!ShouldApplyChromeMaterialOverrides(key)) {
     return;
   }
@@ -279,24 +299,4 @@
   mixer[kColorToolbarTextDisabledDefault] = {ui::kColorSysStateDisabled};
 
   mixer[kColorWebAuthnIconColor] = {ui::kColorSysPrimary};
-
-  if (base::FeatureList::IsEnabled(compose::features::kEnableCompose)) {
-    // Compose colors.
-    mixer[kColorComposeDialogBackground] = {ui::kColorSysSurface};
-    mixer[kColorComposeDialogForegroundSubtle] = {ui::kColorSysOnSurfaceSubtle};
-    mixer[kColorComposeDialogLink] = {ui::kColorSysPrimary};
-    mixer[kColorComposeDialogResultBackground] = {ui::kColorSysBaseContainer};
-    mixer[kColorComposeDialogResultForeground] = {ui::kColorSysOnSurface};
-    mixer[kColorComposeDialogResultIcon] = {ui::kColorSysOnSurfaceSubtle};
-    mixer[kColorComposeDialogTitle] = {ui::kColorSysOnSurface};
-    mixer[kColorComposeDialogTextarea] = {ui::kColorSysOnSurface};
-    mixer[kColorComposeDialogTextareaOutline] = {ui::kColorSysNeutralOutline};
-    mixer[kColorComposeDialogTextareaPlaceholder] = {
-        ui::kColorSysOnSurfaceSecondary};
-    mixer[kColorComposeDialogTextareaReadonlyBackground] = {
-        ui::kColorSysNeutralContainer};
-    mixer[kColorComposeDialogTextareaReadonlyForeground] = {
-        ui::kColorSysOnSurface};
-    mixer[kColorComposeDialogTextareaIcon] = {ui::kColorSysOnSurfaceSubtle};
-  }
 }
diff --git a/chrome/browser/ui/global_media_controls/media_notification_service.cc b/chrome/browser/ui/global_media_controls/media_notification_service.cc
index 0ba281c..b2894800 100644
--- a/chrome/browser/ui/global_media_controls/media_notification_service.cc
+++ b/chrome/browser/ui/global_media_controls/media_notification_service.cc
@@ -320,18 +320,31 @@
 
   // When the dialog is opened by a PresentationRequest, there should be only
   // one notification, in the following priority order:
-  // 1. A cast session associated with |contents|.
-  // 2. A local media session associated with |contents|.
+  // 1. A cast presentation session associated with `contents`.
+  // 2. A local media session associated with `contents`. This media session
+  // might potentially be associated with a Remote Playback route.
   // 3. A supplemental notification populated using the PresentationRequest.
   std::string item_id;
 
-  // Find the cast notification item associated with |contents|.
-  auto routes = media_router::WebContentsPresentationManager::Get(contents)
-                    ->GetMediaRoutes();
-  if (!routes.empty()) {
+  // Find the cast presentation route associated with `contents`.
+  // WebContentsPresentationManager manages all presentation routes including
+  // Cast and Remote Playback presentations. For the sake of displaying media
+  // routes in the GMC dialog, Cast presentation routes should be shown as Cast
+  // notification items and Remote Playback presentation routes should be shown
+  // as media session notification items.
+  absl::optional<std::string> cast_presentation_route_id;
+  for (auto route : media_router::WebContentsPresentationManager::Get(contents)
+                        ->GetMediaRoutes()) {
+    if (route.media_source().IsCastPresentationUrl()) {
+      cast_presentation_route_id = route.media_route_id();
+      break;
+    }
+  }
+
+  if (cast_presentation_route_id.has_value()) {
     // It is possible for a sender page to connect to two routes. For the
     // sake of the Zenith dialog, only one notification is needed.
-    item_id = routes.begin()->media_route_id();
+    item_id = cast_presentation_route_id.value();
   } else if (HasActiveControllableSessionForWebContents(contents)) {
     item_id = GetActiveControllableSessionForWebContents(contents);
   } else {
@@ -409,9 +422,20 @@
     const std::string& session_id,
     mojo::PendingReceiver<mojom::DeviceListHost> host_receiver,
     mojo::PendingRemote<mojom::DeviceListClient> client_remote) {
+  absl::optional<std::string> remoting_session_id;
+  // `remoting_session_id` is used to construct the MediaRemotingCallback for
+  // CastDeviceListHost to request Media Remoting for a MediaSession. This is
+  // used for Media Remoting sessions started from the GMC dialog. However, when
+  // the dialog is opened for RemotePlayback#prompt() (when `context_` is not
+  // nullptr), the Remote Playback API on the blink side handles sending Media
+  // Remoting request and there's no need for requesting Media Remoting from
+  // MNS.
+  if (context_ == nullptr) {
+    remoting_session_id = session_id;
+  }
   CreateCastDeviceListHost(CreateCastDialogControllerForSession(session_id),
                            std::move(host_receiver), std::move(client_remote),
-                           session_id);
+                           remoting_session_id);
 }
 
 void MediaNotificationService::GetDeviceListHostForPresentation(
@@ -479,17 +503,17 @@
     std::unique_ptr<media_router::CastDialogController> dialog_controller,
     mojo::PendingReceiver<mojom::DeviceListHost> host_pending_receiver,
     mojo::PendingRemote<mojom::DeviceListClient> client_remote,
-    absl::optional<std::string> session_id) {
+    absl::optional<std::string> remoting_session_id) {
   if (!dialog_controller) {
     // We discard the PendingReceiver/Remote here, and if they have disconnect
     // handlers set, those get called.
     return;
   }
   auto media_remoting_callback_ =
-      session_id.has_value()
+      remoting_session_id.has_value()
           ? base::BindRepeating(
                 &MediaNotificationService::OnMediaRemotingRequested,
-                weak_ptr_factory_.GetWeakPtr(), session_id.value())
+                weak_ptr_factory_.GetWeakPtr(), remoting_session_id.value())
           : base::DoNothing();
   auto host = std::make_unique<CastDeviceListHost>(
       std::move(dialog_controller), std::move(client_remote),
diff --git a/chrome/browser/ui/global_media_controls/media_notification_service.h b/chrome/browser/ui/global_media_controls/media_notification_service.h
index a3d7488..9ac096de 100644
--- a/chrome/browser/ui/global_media_controls/media_notification_service.h
+++ b/chrome/browser/ui/global_media_controls/media_notification_service.h
@@ -142,7 +142,7 @@
           host_receiver,
       mojo::PendingRemote<global_media_controls::mojom::DeviceListClient>
           client_remote,
-      absl::optional<std::string> session_id);
+      absl::optional<std::string> remoting_session_id);
 
   // True if there are cast notifications associated with |web_contents|.
   bool HasCastNotificationsForWebContents(
diff --git a/chrome/browser/ui/media_router/media_route_starter.cc b/chrome/browser/ui/media_router/media_route_starter.cc
index 93c9bee1..23257c1 100644
--- a/chrome/browser/ui/media_router/media_route_starter.cc
+++ b/chrome/browser/ui/media_router/media_route_starter.cc
@@ -28,6 +28,8 @@
 #include "content/public/browser/web_contents.h"
 #include "extensions/browser/extension_registry.h"
 #include "extensions/common/constants.h"
+#include "media/remoting/device_capability_checker.h"
+#include "net/base/url_util.h"
 #include "ui/base/l10n/l10n_util.h"
 
 #if BUILDFLAG(IS_MAC)
@@ -45,7 +47,6 @@
     const RouteRequestResult& result) {
   if (presentation_callback)
     std::move(presentation_callback).Run(std::move(connection), result);
-  DCHECK(!connection);
   for (auto& callback : route_result_callbacks)
     std::move(callback).Run(result);
 }
@@ -93,7 +94,9 @@
     bool presentation_sinks_available = base::ranges::any_of(
         GetQueryResultManager()->GetSinksWithCastModes(),
         [](const MediaSinkWithCastModes& sink) {
-          return base::Contains(sink.cast_modes, MediaCastMode::PRESENTATION);
+          return base::Contains(sink.cast_modes, MediaCastMode::PRESENTATION) ||
+                 base::Contains(sink.cast_modes,
+                                MediaCastMode::REMOTE_PLAYBACK);
         });
     if (presentation_sinks_available) {
       start_presentation_context_->InvokeErrorCallback(
@@ -190,6 +193,14 @@
 
   MediaRouteResponseCallback presentation_callback;
 
+  // There are two ways to initialize MediaRouterUI with Presentation cast mode
+  // and each method requires different way to propagate route responses back to
+  // sites.
+  // 1. For StartPresentationContext passed by sites. We should use
+  // the StartPresentationContext for presentation response callback.
+  // 2. For the default presentation request managed by
+  // WebContentsPresentationManager. In this case, we should use
+  // WebContentsPresentationManager::OnPresentationResponse.
   if (params->cast_mode == MediaCastMode::PRESENTATION) {
     if (start_presentation_context_) {
       presentation_callback =
@@ -204,6 +215,21 @@
     }
   }
 
+  // There are two ways to initialize MediaRouterUI for REMOTE_PLAYBACK cast
+  // mode:
+  // 1. Remote Playback API prompt() function passes a StartPresentationContext
+  // object. We should use the StartPresentationContext for presentation
+  // response callback.
+  // 2. Media Session items for Media Remoting from the GMC dialog. In this way,
+  // the site does not use the Remote Playback API and there's no need to set up
+  // presentation callback.
+  if (params->cast_mode == MediaCastMode::REMOTE_PLAYBACK &&
+      start_presentation_context_) {
+    presentation_callback =
+        base::BindOnce(&StartPresentationContext::HandleRouteResponse,
+                       std::move(start_presentation_context_));
+  }
+
   GetMediaRouter()->CreateRoute(
       params->source_id, params->request->sink_id, params->origin,
       GetWebContents(),
@@ -263,8 +289,19 @@
     return;
   }
   if (start_presentation_context_) {
-    OnDefaultPresentationChanged(
-        &start_presentation_context_->presentation_request());
+    auto media_source =
+        MediaSource(start_presentation_context_->presentation_request()
+                        .presentation_urls[0]);
+    if (media_source.IsRemotePlaybackSource()) {
+      media_source.AppendTabIdToRemotePlaybackUrlQuery(
+          sessions::SessionTabHelper::IdForTab(web_contents_).id());
+      GetQueryResultManager()->SetSourcesForCastMode(
+          MediaCastMode::REMOTE_PLAYBACK, {media_source},
+          url::Origin::Create(GURL()));
+    } else {
+      OnDefaultPresentationChanged(
+          &start_presentation_context_->presentation_request());
+    }
   } else if (presentation_manager_ &&
              presentation_manager_->HasDefaultPresentationRequest()) {
     OnDefaultPresentationChanged(
diff --git a/chrome/browser/ui/media_router/media_route_starter_unittest.cc b/chrome/browser/ui/media_router/media_route_starter_unittest.cc
index 8547a05..1c3f06af 100644
--- a/chrome/browser/ui/media_router/media_route_starter_unittest.cc
+++ b/chrome/browser/ui/media_router/media_route_starter_unittest.cc
@@ -67,6 +67,9 @@
 constexpr char kStartPresentationUrl[] = "https://startpresentrequest.com/";
 constexpr char kStartOriginUrl[] = "https://start.fakeurl/";
 
+constexpr char kRemotePlaybackUrl[] =
+    "remote-playback://<encoded-data>?video_codec=vp8&audio_codec=mp3";
+
 class MockPresentationRequestSourceObserver
     : public PresentationRequestSourceObserver {
  public:
@@ -259,11 +262,7 @@
   }
 
   std::unique_ptr<StartPresentationContext> CreateStartPresentationContext(
-      const content::PresentationRequest& presentation_request,
-      StartPresentationContext::PresentationConnectionCallback success_cb =
-          base::DoNothing(),
-      StartPresentationContext::PresentationConnectionErrorCallback error_cb =
-          base::DoNothing()) {
+      const content::PresentationRequest& presentation_request) {
     return std::make_unique<StartPresentationContext>(
         presentation_request,
         base::BindOnce(&MediaRouteStarterTest::RequestSuccess,
@@ -364,7 +363,15 @@
     StartRoute(std::move(params));
   }
 
- private:
+  void StartRemotePlayback(const MediaSinkInternal& sink) {
+    UpdateSinks({sink.sink()}, std::vector<url::Origin>());
+
+    auto params = media_route_starter()->CreateRouteParameters(
+        sink.id(), MediaCastMode::REMOTE_PLAYBACK);
+    EXPECT_TRUE(params);
+    StartRoute(std::move(params));
+  }
+
   content::PresentationRequest CreatePresentationRequest(
       const std::string& presentation_url,
       const std::string& origin_url) {
@@ -374,6 +381,7 @@
     return presentation_request;
   }
 
+ private:
   void StartRoute(std::unique_ptr<RouteParameters> params) {
     // To demonstrate that MediaRouteResultCallbacks are called
     params->route_result_callbacks.emplace_back(
@@ -809,7 +817,7 @@
 
 // Demonstrates that presentations routes from start presentation contexts are
 // created correctly.
-TEST_F(MediaRouteStarterTest, StartRoute_StartPresentationContext) {
+TEST_F(MediaRouteStarterTest, StartRoute_StartPresentationContext_Cast) {
   auto start_presentation_context =
       CreateStartPresentationContext(start_presentation_request());
 
@@ -829,6 +837,28 @@
   EXPECT_EQ(kStartPresentationUrl, route_request_result()->presentation_url());
 }
 
+TEST_F(MediaRouteStarterTest,
+       StartRoute_StartPresentationContext_RemotePlayback) {
+  auto start_presentation_context = CreateStartPresentationContext(
+      CreatePresentationRequest(kRemotePlaybackUrl, kStartOriginUrl));
+
+  CreateStarter(MediaRouterUIParameters(kDefaultModes, web_contents(),
+                                        std::move(start_presentation_context)));
+
+  set_expected_cast_result(mojom::RouteRequestResultCode::OK);
+
+  EXPECT_CALL(*this, RequestSuccess(_, _, _));
+
+  StartRemotePlayback(cast_sink());
+
+  EXPECT_EQ(mojom::RouteRequestResultCode::OK,
+            route_request_result()->result_code());
+  EXPECT_EQ(
+      "remote-playback://"
+      "<encoded-data>?video_codec=vp8&audio_codec=mp3&tab_id=1",
+      route_request_result()->presentation_url());
+}
+
 // Demonstrates that failures to create presentation routes from start
 // presentation contexts are created correctly.
 TEST_F(MediaRouteStarterTest, StartRoute_StartPresentationContextError) {
diff --git a/chrome/browser/ui/side_panel/side_panel_entry_id.h b/chrome/browser/ui/side_panel/side_panel_entry_id.h
index 04d0efc9..ab41305 100644
--- a/chrome/browser/ui/side_panel/side_panel_entry_id.h
+++ b/chrome/browser/ui/side_panel/side_panel_entry_id.h
@@ -5,29 +5,46 @@
 #ifndef CHROME_BROWSER_UI_SIDE_PANEL_SIDE_PANEL_ENTRY_ID_H_
 #define CHROME_BROWSER_UI_SIDE_PANEL_SIDE_PANEL_ENTRY_ID_H_
 
+#include <string>
+
+#include "base/notreached.h"
+
 // Note this order matches that of the combobox options in the side panel.
 // If adding a new Id here, you must also update id_to_histogram_name_map
 // in side_panel_util.cc and SidePanelEntry in browser/histograms.xml.
-enum class SidePanelEntryId {
-  // Global Entries
-  kReadingList,
-  kBookmarks,
-  kHistoryClusters,
-  kReadAnything,
-  kUserNote,
-  kFeed,
-  kWebView,
-  kPerformance,
-  // Contextual Entries
-  kSideSearch,
-  kLens,
-  kAssistant,
-  kAboutThisSite,
-  kCustomizeChrome,
-  kSearchCompanion,
-  kShoppingInsights,
-  // Extensions (nothing more should be added below here)
-  kExtension
-};
+
+#define SIDE_PANEL_ENTRY_IDS(V)                              \
+  /* Global Entries */                                       \
+  V(kReadingList)                                            \
+  V(kBookmarks)                                              \
+  V(kHistoryClusters)                                        \
+  V(kReadAnything)                                           \
+  V(kUserNote)                                               \
+  V(kFeed)                                                   \
+  V(kWebView)                                                \
+  V(kPerformance)                                            \
+  /* Contextual Entries */                                   \
+  V(kSideSearch)                                             \
+  V(kLens)                                                   \
+  V(kAssistant)                                              \
+  V(kAboutThisSite)                                          \
+  V(kCustomizeChrome)                                        \
+  V(kSearchCompanion)                                        \
+  V(kShoppingInsights)                                       \
+  /* Extensions (nothing more should be added below here) */ \
+  V(kExtension)
+
+#define SIDE_PANEL_ENTRY_ID_ENUM(id) id,
+enum class SidePanelEntryId { SIDE_PANEL_ENTRY_IDS(SIDE_PANEL_ENTRY_ID_ENUM) };
+#undef SIDE_PANEL_ENTRY_ID_ENUM
+
+#define SIDE_PANEL_CASE_STATEMENT(id) \
+  case SidePanelEntryId::id:          \
+    return #id;
+inline std::string SidePanelEntryIdToString(SidePanelEntryId id) {
+  switch (id) { SIDE_PANEL_ENTRY_IDS(SIDE_PANEL_CASE_STATEMENT) }
+  NOTREACHED();
+}
+#undef SIDE_PANEL_CASE_STATEMENT
 
 #endif  // CHROME_BROWSER_UI_SIDE_PANEL_SIDE_PANEL_ENTRY_ID_H_
diff --git a/chrome/browser/ui/side_panel/side_panel_entry_key.cc b/chrome/browser/ui/side_panel/side_panel_entry_key.cc
index 63241f5..4c701fc 100644
--- a/chrome/browser/ui/side_panel/side_panel_entry_key.cc
+++ b/chrome/browser/ui/side_panel/side_panel_entry_key.cc
@@ -2,10 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "chrome/browser/ui/side_panel/side_panel_entry_key.h"
+#include <sstream>
+#include <string>
 
 #include "base/check.h"
 #include "base/check_op.h"
+#include "chrome/browser/ui/side_panel/side_panel_entry_id.h"
+#include "chrome/browser/ui/side_panel/side_panel_entry_key.h"
 
 SidePanelEntryKey::SidePanelEntryKey(SidePanelEntryId id) : id_(id) {
   CHECK_NE(id_, SidePanelEntryId::kExtension);
@@ -43,3 +46,15 @@
   }
   return id_ < other.id_;
 }
+
+std::string SidePanelEntryKey::ToString() const {
+  std::ostringstream oss;
+
+  oss << SidePanelEntryIdToString(id_);
+
+  if (extension_id_.has_value()) {
+    oss << extension_id_.value();
+  }
+
+  return oss.str();
+}
diff --git a/chrome/browser/ui/side_panel/side_panel_entry_key.h b/chrome/browser/ui/side_panel/side_panel_entry_key.h
index 03dcbe07..41648f1 100644
--- a/chrome/browser/ui/side_panel/side_panel_entry_key.h
+++ b/chrome/browser/ui/side_panel/side_panel_entry_key.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_UI_SIDE_PANEL_SIDE_PANEL_ENTRY_KEY_H_
 #define CHROME_BROWSER_UI_SIDE_PANEL_SIDE_PANEL_ENTRY_KEY_H_
 
+#include <string>
+
 #include "chrome/browser/ui/side_panel/side_panel_entry_id.h"
 #include "extensions/common/extension_id.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -25,6 +27,7 @@
   absl::optional<extensions::ExtensionId> extension_id() const {
     return extension_id_;
   }
+  std::string ToString() const;
 
  private:
   SidePanelEntryId id_;
diff --git a/chrome/browser/ui/side_panel/side_panel_entry_key_unittest.cc b/chrome/browser/ui/side_panel/side_panel_entry_key_unittest.cc
new file mode 100644
index 0000000..6e300512
--- /dev/null
+++ b/chrome/browser/ui/side_panel/side_panel_entry_key_unittest.cc
@@ -0,0 +1,28 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "chrome/browser/ui/side_panel/side_panel_entry_key.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+class SidePanelEntryKeyTest : public ::testing::Test {
+ protected:
+  SidePanelEntryKeyTest() = default;
+  ~SidePanelEntryKeyTest() override = default;
+};
+
+// Tests the `ToString()` method for regular entries.
+TEST_F(SidePanelEntryKeyTest, ReturnsCorrectStringForRegularEntry) {
+  SidePanelEntryKey entryKey(SidePanelEntryId::kReadingList);
+  std::string result = entryKey.ToString();
+  EXPECT_EQ(result, "kReadingList");
+}
+
+// Tests the `ToString()` method for entries with extension.
+TEST_F(SidePanelEntryKeyTest, ReturnsCorrectStringForExtensionEntry) {
+  SidePanelEntryKey extension_key(SidePanelEntryId::kExtension, "extension_id");
+  std::string result = extension_key.ToString();
+  EXPECT_EQ(result, "kExtension" + extension_key.extension_id().value());
+}
diff --git a/chrome/browser/ui/startup/web_app_startup_utils.cc b/chrome/browser/ui/startup/web_app_startup_utils.cc
index bb80c9c..eab7e20f 100644
--- a/chrome/browser/ui/startup/web_app_startup_utils.cc
+++ b/chrome/browser/ui/startup/web_app_startup_utils.cc
@@ -31,12 +31,12 @@
 #include "chrome/browser/profiles/keep_alive/scoped_profile_keep_alive.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/startup/infobar_utils.h"
 #include "chrome/browser/ui/startup/launch_mode_recorder.h"
 #include "chrome/browser/ui/startup/startup_browser_creator.h"
 #include "chrome/browser/ui/startup/startup_browser_creator_impl.h"
 #include "chrome/browser/ui/startup/startup_types.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
 #include "chrome/browser/web_applications/os_integration/web_app_file_handler_manager.h"
 #include "chrome/browser/web_applications/web_app.h"
@@ -254,8 +254,8 @@
       std::move(launch_callback)
           .Run(/*allowed=*/true, /*remember_user_choice=*/false);
     } else {
-      chrome::ShowWebAppProtocolLaunchDialog(protocol_url_, profile_, app_id_,
-                                             std::move(launch_callback));
+      ShowWebAppProtocolLaunchDialog(protocol_url_, profile_, app_id_,
+                                     std::move(launch_callback));
     }
     return LaunchResult::kHandled;
   }
@@ -284,8 +284,8 @@
 
     switch (web_app->file_handler_approval_state()) {
       case ApiApprovalState::kRequiresPrompt:
-        chrome::ShowWebAppFileLaunchDialog(launch_files, profile_, app_id_,
-                                           std::move(launch_callback));
+        ShowWebAppFileLaunchDialog(launch_files, profile_, app_id_,
+                                   std::move(launch_callback));
         break;
       case ApiApprovalState::kAllowed:
         std::move(launch_callback)
diff --git a/chrome/browser/ui/tabs/organization/tab_organization_service.cc b/chrome/browser/ui/tabs/organization/tab_organization_service.cc
index 773ce49..ff1837fa 100644
--- a/chrome/browser/ui/tabs/organization/tab_organization_service.cc
+++ b/chrome/browser/ui/tabs/organization/tab_organization_service.cc
@@ -10,7 +10,12 @@
 #include "chrome/browser/ui/tabs/organization/request_factory.h"
 #include "chrome/browser/ui/tabs/organization/tab_organization_session.h"
 
-TabOrganizationService::TabOrganizationService() = default;
+TabOrganizationService::TabOrganizationService(
+    content::BrowserContext* browser_context)
+    : trigger_observer_(
+          base::BindRepeating(&TabOrganizationService::OnTriggerOccured,
+                              base::Unretained(this)),
+          browser_context) {}
 TabOrganizationService::~TabOrganizationService() = default;
 
 void TabOrganizationService::OnTriggerOccured(const Browser* browser) {
diff --git a/chrome/browser/ui/tabs/organization/tab_organization_service.h b/chrome/browser/ui/tabs/organization/tab_organization_service.h
index 6566e59..9b8837d8 100644
--- a/chrome/browser/ui/tabs/organization/tab_organization_service.h
+++ b/chrome/browser/ui/tabs/organization/tab_organization_service.h
@@ -10,18 +10,23 @@
 #include "base/memory/raw_ptr.h"
 #include "base/observer_list.h"
 #include "chrome/browser/ui/tabs/organization/tab_organization_observer.h"
+#include "chrome/browser/ui/tabs/organization/trigger_observer.h"
 #include "components/keyed_service/core/keyed_service.h"
 
 class Browser;
 class TabOrganizationSession;
 
+namespace content {
+class BrowserContext;
+}
+
 // Provides an interface for getting Organizations for tabs.
 class TabOrganizationService : public KeyedService {
  public:
   using BrowserSessionMap =
       std::unordered_map<const Browser*,
                          std::unique_ptr<TabOrganizationSession>>;
-  TabOrganizationService();
+  explicit TabOrganizationService(content::BrowserContext* browser_context);
   TabOrganizationService(const TabOrganizationService&) = delete;
   TabOrganizationService& operator=(const TabOrganizationService& other) =
       delete;
@@ -53,6 +58,8 @@
 
   // A list of the observers of a tab organization Service.
   base::ObserverList<TabOrganizationObserver>::Unchecked observers_;
+
+  TabOrganizationTriggerObserver trigger_observer_;
 };
 
 #endif  // CHROME_BROWSER_UI_TABS_ORGANIZATION_TAB_ORGANIZATION_SERVICE_H_
diff --git a/chrome/browser/ui/tabs/organization/tab_organization_service_factory.cc b/chrome/browser/ui/tabs/organization/tab_organization_service_factory.cc
index 2180dfb..af4036e 100644
--- a/chrome/browser/ui/tabs/organization/tab_organization_service_factory.cc
+++ b/chrome/browser/ui/tabs/organization/tab_organization_service_factory.cc
@@ -23,7 +23,7 @@
 TabOrganizationServiceFactory::BuildServiceInstanceForBrowserContext(
     content::BrowserContext* context) const {
   DCHECK(context);
-  return std::make_unique<TabOrganizationService>();
+  return std::make_unique<TabOrganizationService>(context);
 }
 
 // static
diff --git a/chrome/browser/ui/tabs/organization/tab_organization_service_unittest.cc b/chrome/browser/ui/tabs/organization/tab_organization_service_unittest.cc
index d03ca3d8..90d1091 100644
--- a/chrome/browser/ui/tabs/organization/tab_organization_service_unittest.cc
+++ b/chrome/browser/ui/tabs/organization/tab_organization_service_unittest.cc
@@ -57,7 +57,7 @@
  private:
   void SetUp() override {
     profile_ = std::make_unique<TestingProfile>();
-    service_ = std::make_unique<TabOrganizationService>();
+    service_ = std::make_unique<TabOrganizationService>(profile_.get());
   }
   void TearDown() override {
     for (auto& browser : browsers_) {
diff --git a/chrome/browser/ui/tabs/organization/trigger_observer.cc b/chrome/browser/ui/tabs/organization/trigger_observer.cc
new file mode 100644
index 0000000..0b263e7
--- /dev/null
+++ b/chrome/browser/ui/tabs/organization/trigger_observer.cc
@@ -0,0 +1,61 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/tabs/organization/trigger_observer.h"
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_list.h"
+#include "chrome/browser/ui/tabs/organization/trigger.h"
+#include "content/public/browser/browser_context.h"
+
+TabOrganizationTriggerObserver::TabOrganizationTriggerObserver(
+    base::RepeatingCallback<void(const Browser*)> on_trigger,
+    content::BrowserContext* browser_context,
+    std::unique_ptr<TabOrganizationTrigger> trigger_logic)
+    : trigger_logic_(std::move(trigger_logic)),
+      on_trigger_(on_trigger),
+      browser_context_(browser_context) {
+  for (Browser* browser : *BrowserList::GetInstance()) {
+    OnBrowserAdded(browser);
+  }
+  BrowserList::GetInstance()->AddObserver(this);
+}
+
+TabOrganizationTriggerObserver::~TabOrganizationTriggerObserver() {
+  BrowserList::GetInstance()->RemoveObserver(this);
+  // TabStripModelObserver destructor will stop observing the TabStripModels.
+}
+
+void TabOrganizationTriggerObserver::OnBrowserAdded(Browser* browser) {
+  if (browser_context_ != browser->profile()) {
+    return;
+  }
+
+  tab_strip_model_to_browser_map_.emplace(browser->tab_strip_model(), browser);
+  browser->tab_strip_model()->AddObserver(this);
+}
+
+void TabOrganizationTriggerObserver::OnBrowserRemoved(Browser* browser) {
+  if (browser_context_ != browser->profile()) {
+    return;
+  }
+
+  tab_strip_model_to_browser_map_.erase(browser->tab_strip_model());
+  browser->tab_strip_model()->RemoveObserver(this);
+}
+
+void TabOrganizationTriggerObserver::OnTabStripModelChanged(
+    TabStripModel* tab_strip_model,
+    const TabStripModelChange& change,
+    const TabStripSelectionChange& selection) {
+  if (trigger_logic_->ShouldTrigger(tab_strip_model)) {
+    on_trigger_.Run(BrowserForTabStripModel(tab_strip_model));
+  }
+}
+
+Browser* TabOrganizationTriggerObserver::BrowserForTabStripModel(
+    TabStripModel* tab_strip_model) const {
+  return tab_strip_model_to_browser_map_.at(tab_strip_model).get();
+}
diff --git a/chrome/browser/ui/tabs/organization/trigger_observer.h b/chrome/browser/ui/tabs/organization/trigger_observer.h
new file mode 100644
index 0000000..ffa54819
--- /dev/null
+++ b/chrome/browser/ui/tabs/organization/trigger_observer.h
@@ -0,0 +1,51 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_TABS_ORGANIZATION_TRIGGER_OBSERVER_H_
+#define CHROME_BROWSER_UI_TABS_ORGANIZATION_TRIGGER_OBSERVER_H_
+
+#include <memory>
+
+#include "base/functional/callback.h"
+#include "chrome/browser/ui/browser_list_observer.h"
+#include "chrome/browser/ui/tabs/organization/trigger.h"
+#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
+
+class TabStripModel;
+class TabOrganizationTrigger;
+namespace content {
+class BrowserContext;
+}
+
+// Gets inputs for triggering, runs triggering logic when anything changes.
+class TabOrganizationTriggerObserver : public BrowserListObserver,
+                                       TabStripModelObserver {
+ public:
+  explicit TabOrganizationTriggerObserver(
+      base::RepeatingCallback<void(const Browser*)> on_trigger,
+      content::BrowserContext* browser_context,
+      std::unique_ptr<TabOrganizationTrigger> trigger_logic = MakeMVPTrigger());
+  ~TabOrganizationTriggerObserver() override;
+
+  // BrowserListObserver:
+  void OnBrowserAdded(Browser* browser) override;
+  void OnBrowserRemoved(Browser* browser) override;
+
+  // TabStripModelObserver:
+  void OnTabStripModelChanged(
+      TabStripModel* tab_strip_model,
+      const TabStripModelChange& change,
+      const TabStripSelectionChange& selection) override;
+
+ private:
+  Browser* BrowserForTabStripModel(TabStripModel* tab_strip_model) const;
+
+  std::unique_ptr<TabOrganizationTrigger> trigger_logic_;
+  base::RepeatingCallback<void(const Browser*)> on_trigger_;
+  raw_ptr<content::BrowserContext> browser_context_;
+  std::unordered_map<TabStripModel*, raw_ptr<Browser>>
+      tab_strip_model_to_browser_map_;
+};
+
+#endif  // CHROME_BROWSER_UI_TABS_ORGANIZATION_TRIGGER_OBSERVER_H_
diff --git a/chrome/browser/ui/tabs/organization/trigger_observer_unittest.cc b/chrome/browser/ui/tabs/organization/trigger_observer_unittest.cc
new file mode 100644
index 0000000..2efdefb0
--- /dev/null
+++ b/chrome/browser/ui/tabs/organization/trigger_observer_unittest.cc
@@ -0,0 +1,111 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/tabs/organization/trigger_observer.h"
+
+#include <memory>
+
+#include "base/test/bind.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/test/base/browser_with_test_window_test.h"
+#include "chrome/test/base/testing_profile.h"
+// #include "content/public/test/browser_task_environment.h"
+// #include "content/public/test/test_renderer_host.h"
+#include "content/public/test/web_contents_tester.h"
+// #include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+// #include "ui/base/page_transition_types.h"
+
+namespace {
+class AlwaysTrigger : public TriggerPolicy {
+ public:
+  AlwaysTrigger() = default;
+  bool ShouldTrigger(float score) override { return true; };
+};
+
+std::unique_ptr<TabOrganizationTrigger> MakeTestTrigger() {
+  return std::make_unique<TabOrganizationTrigger>(
+      base::BindLambdaForTesting(
+          [](const TabStripModel* tab_strip_model) -> float {
+            return tab_strip_model->count();
+          }),
+      2.0f, std::make_unique<AlwaysTrigger>());
+}
+}  // namespace
+
+class TabOrganizationTriggerObserverTest : public BrowserWithTestWindowTest {
+ public:
+  TabOrganizationTriggerObserverTest() = default;
+  TabOrganizationTriggerObserverTest(
+      const TabOrganizationTriggerObserverTest&) = delete;
+  TabOrganizationTriggerObserverTest& operator=(
+      const TabOrganizationTriggerObserverTest&) = delete;
+
+  Browser* AddBrowser() {
+    Browser::CreateParams native_params(profile_.get(), true);
+    native_params.initial_show_state = ui::SHOW_STATE_DEFAULT;
+    std::unique_ptr<Browser> browser =
+        CreateBrowserWithTestWindowForParams(native_params);
+    Browser* browser_ptr = browser.get();
+    browsers_.emplace_back(std::move(browser));
+    return browser_ptr;
+  }
+
+  content::WebContents* AddTabToBrowser(Browser* browser, int index) {
+    std::unique_ptr<content::WebContents> web_contents =
+        content::WebContentsTester::CreateTestWebContents(profile_.get(),
+                                                          nullptr);
+
+    content::WebContents* web_contents_ptr = web_contents.get();
+
+    browser->tab_strip_model()->AddWebContents(
+        std::move(web_contents), index,
+        ui::PageTransition::PAGE_TRANSITION_TYPED, AddTabTypes::ADD_ACTIVE);
+
+    return web_contents_ptr;
+  }
+
+  TestingProfile* profile() { return profile_.get(); }
+  TabOrganizationTriggerObserver* trigger_observer() {
+    return trigger_observer_.get();
+  }
+  std::vector<raw_ptr<const Browser>> trigger_records() {
+    return trigger_records_;
+  }
+
+ private:
+  void SetUp() override {
+    profile_ = std::make_unique<TestingProfile>();
+    trigger_observer_ = std::make_unique<TabOrganizationTriggerObserver>(
+        base::BindRepeating(&TabOrganizationTriggerObserverTest::OnTrigger,
+                            base::Unretained(this)),
+        profile_.get(), MakeTestTrigger());
+    trigger_records_ = std::vector<raw_ptr<const Browser>>();
+  }
+  void TearDown() override {
+    for (auto& browser : browsers_) {
+      browser->tab_strip_model()->CloseAllTabs();
+    }
+  }
+
+  void OnTrigger(const Browser* browser) {
+    trigger_records_.push_back(browser);
+  }
+
+  content::RenderViewHostTestEnabler rvh_test_enabler_;
+  std::unique_ptr<TestingProfile> profile_;
+  std::unique_ptr<TabOrganizationTriggerObserver> trigger_observer_;
+  std::vector<std::unique_ptr<Browser>> browsers_;
+  std::vector<raw_ptr<const Browser>> trigger_records_;
+};
+
+TEST_F(TabOrganizationTriggerObserverTest, TriggersOnTabStripModelChange) {
+  ASSERT_TRUE(trigger_records().empty());
+  Browser* const browser = AddBrowser();
+  AddTabToBrowser(browser, 0);
+  EXPECT_TRUE(trigger_records().empty());
+  AddTabToBrowser(browser, 0);
+  EXPECT_EQ(trigger_records().size(), 1u);
+  EXPECT_EQ(trigger_records()[0], browser);
+}
diff --git a/chrome/browser/ui/thumbnails/background_thumbnail_video_capturer.cc b/chrome/browser/ui/thumbnails/background_thumbnail_video_capturer.cc
index d8c7439..3bb67127 100644
--- a/chrome/browser/ui/thumbnails/background_thumbnail_video_capturer.cc
+++ b/chrome/browser/ui/thumbnails/background_thumbnail_video_capturer.cc
@@ -97,7 +97,6 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
   CHECK(video_capturer_);
-  const base::TimeTicks time_of_call = base::TimeTicks::Now();
 
   mojo::Remote<::viz::mojom::FrameSinkVideoConsumerFrameCallbacks>
       callbacks_remote(std::move(callbacks));
@@ -125,9 +124,6 @@
     return;
   }
 
-  if (num_received_frames_ == 0)
-    UMA_HISTOGRAM_TIMES("Tab.Preview.TimeToFirstUsableFrameAfterStartCapture",
-                        time_of_call - start_time_);
   TRACE_EVENT_INSTANT1("ui", "Tab.Preview.VideoCaptureFrameReceived",
                        TRACE_EVENT_SCOPE_THREAD, "frame_number",
                        num_received_frames_);
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h
index df671f085..ee1c4f24 100644
--- a/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h
+++ b/chrome/browser/ui/views/bookmarks/bookmark_menu_delegate.h
@@ -188,11 +188,11 @@
   // an id.
   int GetAndIncrementNextMenuID();
 
-  const raw_ptr<Browser, LeakedDanglingUntriaged> browser_;
-  raw_ptr<Profile, LeakedDanglingUntriaged> profile_;
+  const raw_ptr<Browser> browser_;
+  raw_ptr<Profile> profile_;
 
   // Parent of menus.
-  raw_ptr<views::Widget, LeakedDanglingUntriaged> parent_;
+  raw_ptr<views::Widget> parent_;
 
   // Maps from menu id to BookmarkNode.
   MenuIDToNodeMap menu_id_to_node_map_;
diff --git a/chrome/browser/ui/views/frame/tab_strip_region_view.cc b/chrome/browser/ui/views/frame/tab_strip_region_view.cc
index c1e11b8..16b8975 100644
--- a/chrome/browser/ui/views/frame/tab_strip_region_view.cc
+++ b/chrome/browser/ui/views/frame/tab_strip_region_view.cc
@@ -99,7 +99,7 @@
   std::unique_ptr<TabSearchContainer> tab_search_container;
   if (browser && browser->is_type_normal()) {
     tab_search_container = std::make_unique<TabSearchContainer>(
-        tab_strip_, render_tab_search_before_tab_strip_);
+        tab_strip_->controller(), render_tab_search_before_tab_strip_);
     tab_search_container->SetProperty(views::kCrossAxisAlignmentKey,
                                       views::LayoutAlignment::kCenter);
   }
@@ -145,7 +145,7 @@
   if (ShouldShowNewTabButton(browser)) {
     if (features::IsChromeRefresh2023()) {
       new_tab_button_ = AddChildView(std::make_unique<TabStripControlButton>(
-          tab_strip_,
+          tab_strip_->controller(),
           base::BindRepeating(&TabStrip::NewTabButtonPressed,
                               base::Unretained(tab_strip_)),
           vector_icons::kAddChromeRefreshIcon));
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc
index 1d9c981..907081b 100644
--- a/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc
+++ b/chrome/browser/ui/views/frame/webui_tab_strip_container_view.cc
@@ -513,15 +513,17 @@
   base::Pickle pickle;
   if (data.GetPickledData(ui::ClipboardFormatType::WebCustomDataType(),
                           &pickle)) {
-    std::u16string result;
-    ui::ReadCustomDataForType(pickle.data(), pickle.size(), kWebUITabIdDataType,
-                              &result);
-    if (result.size())
+    if (absl::optional<std::u16string> result =
+            ui::ReadCustomDataForType(pickle, kWebUITabIdDataType);
+        result && !result->empty()) {
       return true;
-    ui::ReadCustomDataForType(pickle.data(), pickle.size(),
-                              kWebUITabGroupIdDataType, &result);
-    if (result.size())
+    }
+
+    if (absl::optional<std::u16string> result =
+            ui::ReadCustomDataForType(pickle, kWebUITabGroupIdDataType);
+        result && !result->empty()) {
       return true;
+    }
   }
 
   return false;
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_sink_view.cc b/chrome/browser/ui/views/media_router/cast_dialog_sink_view.cc
index 86855015..8969df9 100644
--- a/chrome/browser/ui/views/media_router/cast_dialog_sink_view.cc
+++ b/chrome/browser/ui/views/media_router/cast_dialog_sink_view.cc
@@ -73,12 +73,9 @@
   SetLayoutManager(std::make_unique<views::BoxLayout>(
       views::BoxLayout::Orientation::kVertical));
 
-  // If the sink is connected, and one of the features that allow new UI is
-  // enabled, then add labels and buttons. Else, default to a
+  // If the sink is connected, then add labels and buttons. Else, default to a
   // CastDialogSinkButton.
-  if (sink.state == UIMediaSinkState::CONNECTED &&
-      (IsAccessCodeCastFreezeUiEnabled(profile_) ||
-       base::FeatureList::IsEnabled(kCastDialogStopButton))) {
+  if (sink.state == UIMediaSinkState::CONNECTED) {
     // When sink is connected, the sink view looks like this:
     //
     // *----------------------------------*
diff --git a/chrome/browser/ui/views/media_router/cast_dialog_sink_view_unittest.cc b/chrome/browser/ui/views/media_router/cast_dialog_sink_view_unittest.cc
index 4f8324e..fa54abd 100644
--- a/chrome/browser/ui/views/media_router/cast_dialog_sink_view_unittest.cc
+++ b/chrome/browser/ui/views/media_router/cast_dialog_sink_view_unittest.cc
@@ -216,13 +216,8 @@
   EXPECT_TRUE(sink_view_2.stop_button_for_test()->GetEnabled());
 }
 
-// If only the StopButton feature is enabled, then CastDialogSinkView will show
-// the stop button, but not a freeze button.
+// CastDialogSinkView will show the stop button, but not a freeze button.
 TEST_F(CastDialogSinkViewTest, StopButton) {
-  // Enable the proper features / prefs.
-  base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitAndEnableFeature(kCastDialogStopButton);
-
   UIMediaSink sink_1 = CreateNonfreezableSink();
   CastDialogSinkView sink_view_1(
       &profile_, sink_1, views::Button::PressedCallback(),
diff --git a/chrome/browser/ui/views/page_action/pwa_install_view.cc b/chrome/browser/ui/views/page_action/pwa_install_view.cc
index ccb0c7b..f15e118 100644
--- a/chrome/browser/ui/views/page_action/pwa_install_view.cc
+++ b/chrome/browser/ui/views/page_action/pwa_install_view.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/ui/browser_window.h"
 #include "chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h"
 #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_prefs_utils.h"
@@ -174,12 +175,12 @@
   base::RecordAction(base::UserMetricsAction("PWAInstallIcon"));
 
   // Close PWA install IPH if it is showing.
-  chrome::PwaInProductHelpState iph_state =
-      chrome::PwaInProductHelpState::kNotShown;
+  web_app::PwaInProductHelpState iph_state =
+      web_app::PwaInProductHelpState::kNotShown;
   install_icon_clicked_after_iph_shown_ = browser_->window()->CloseFeaturePromo(
       feature_engagement::kIPHDesktopPwaInstallFeature);
   if (install_icon_clicked_after_iph_shown_) {
-    iph_state = chrome::PwaInProductHelpState::kShown;
+    iph_state = web_app::PwaInProductHelpState::kShown;
   }
 
 #if BUILDFLAG(IS_CHROMEOS)
diff --git a/chrome/browser/ui/views/page_action/pwa_install_view_browsertest.cc b/chrome/browser/ui/views/page_action/pwa_install_view_browsertest.cc
index ea67bd4c..86d4b91 100644
--- a/chrome/browser/ui/views/page_action/pwa_install_view_browsertest.cc
+++ b/chrome/browser/ui/views/page_action/pwa_install_view_browsertest.cc
@@ -14,7 +14,6 @@
 #include "chrome/browser/banners/test_app_banner_manager_desktop.h"
 #include "chrome/browser/extensions/extension_browsertest.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/color/chrome_color_id.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/frame/toolbar_button_provider.h"
@@ -23,6 +22,7 @@
 #include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
 #include "chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h"
 #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/install_bounce_metric.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
@@ -234,7 +234,7 @@
   }
 
   webapps::AppId ExecutePwaInstallIcon() {
-    chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
+    web_app::SetAutoAcceptPWAInstallConfirmationForTesting(true);
 
     webapps::AppId app_id;
     base::RunLoop run_loop;
@@ -249,7 +249,7 @@
 
     run_loop.Run();
 
-    chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
+    web_app::SetAutoAcceptPWAInstallConfirmationForTesting(false);
 
     return app_id;
   }
diff --git a/chrome/browser/ui/views/side_panel/side_panel_interactive_uitest.cc b/chrome/browser/ui/views/side_panel/side_panel_interactive_uitest.cc
index 8a419f29..bb3bbc8 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_interactive_uitest.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel_interactive_uitest.cc
@@ -232,8 +232,9 @@
 
 // Verify that we can open the ReadingMode side panel from the 3dot -> More
 // tools context menu.
+// TODO(dljames): Figure out why this is flaking.
 IN_PROC_BROWSER_TEST_F(PinnedSidePanelInteractiveTest,
-                       OpenReadingModeSidePanel) {
+                       DISABLED_OpenReadingModeSidePanel) {
   SidePanelUtil::GetSidePanelCoordinatorForBrowser(browser())
       ->SetNoDelaysForTesting(true);
 
diff --git a/chrome/browser/ui/views/tabs/tab_drag_controller.cc b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
index 4ce8ac1..098ba48 100644
--- a/chrome/browser/ui/views/tabs/tab_drag_controller.cc
+++ b/chrome/browser/ui/views/tabs/tab_drag_controller.cc
@@ -32,8 +32,6 @@
 #include "chrome/browser/ui/layout_constants.h"
 #include "chrome/browser/ui/sad_tab_helper.h"
 #include "chrome/browser/ui/tabs/organization/metrics.h"
-#include "chrome/browser/ui/tabs/organization/tab_organization_service.h"
-#include "chrome/browser/ui/tabs/organization/tab_organization_service_factory.h"
 #include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_keyed_service.h"
 #include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_service_factory.h"
 #include "chrome/browser/ui/tabs/tab_group.h"
@@ -2145,14 +2143,6 @@
     LogTabStripOrganizationUKM(
         attached_context_->GetTabStripModel(),
         SuggestedTabStripOrganizationReason::DRAGGED_WITHIN_SAME_TABSTRIP);
-    if (features::IsTabOrganization()) {
-      Browser* browser = BrowserView::GetBrowserViewForNativeWindow(
-                             GetAttachedBrowserWidget()->GetNativeWindow())
-                             ->browser();
-      TabOrganizationService* tab_organization_service =
-          TabOrganizationServiceFactory::GetForProfile(browser->profile());
-      tab_organization_service->OnTriggerOccured(browser);
-    }
   }
 }
 
diff --git a/chrome/browser/ui/views/tabs/tab_organization_button.cc b/chrome/browser/ui/views/tabs/tab_organization_button.cc
index d6d56c49..6a055b3 100644
--- a/chrome/browser/ui/views/tabs/tab_organization_button.cc
+++ b/chrome/browser/ui/views/tabs/tab_organization_button.cc
@@ -19,11 +19,12 @@
 constexpr int kTabOrganizeInsetsWidth = 20;
 }
 
-TabOrganizationButton::TabOrganizationButton(TabStrip* tab_strip,
-                                             PressedCallback pressed_callback,
-                                             Edge flat_edge)
+TabOrganizationButton::TabOrganizationButton(
+    TabStripController* tab_strip_controller,
+    PressedCallback pressed_callback,
+    Edge flat_edge)
     : TabStripControlButton(
-          tab_strip,
+          tab_strip_controller,
           base::BindRepeating(&TabOrganizationButton::ButtonPressed,
                               base::Unretained(this)),
           l10n_util::GetStringUTF16(IDS_TAB_ORGANIZE),
diff --git a/chrome/browser/ui/views/tabs/tab_organization_button.h b/chrome/browser/ui/views/tabs/tab_organization_button.h
index 401f38b4..6300fc1 100644
--- a/chrome/browser/ui/views/tabs/tab_organization_button.h
+++ b/chrome/browser/ui/views/tabs/tab_organization_button.h
@@ -9,12 +9,12 @@
 #include "ui/base/metadata/metadata_header_macros.h"
 
 class TabOrganizationSession;
-class TabStrip;
+class TabStripController;
 
 class TabOrganizationButton : public TabStripControlButton {
  public:
   METADATA_HEADER(TabOrganizationButton);
-  TabOrganizationButton(TabStrip* tab_strip,
+  TabOrganizationButton(TabStripController* tab_strip_controller,
                         PressedCallback pressed_callback,
                         Edge flat_edge);
   TabOrganizationButton(const TabOrganizationButton&) = delete;
diff --git a/chrome/browser/ui/views/tabs/tab_organization_button_unittest.cc b/chrome/browser/ui/views/tabs/tab_organization_button_unittest.cc
index ab9e813..686efb9bb 100644
--- a/chrome/browser/ui/views/tabs/tab_organization_button_unittest.cc
+++ b/chrome/browser/ui/views/tabs/tab_organization_button_unittest.cc
@@ -7,9 +7,9 @@
 #include "base/time/time.h"
 #include "chrome/browser/ui/tabs/organization/tab_organization_session.h"
 #include "chrome/browser/ui/ui_features.h"
+#include "chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "chrome/test/views/chrome_views_test_base.h"
-#include "fake_base_tab_strip_controller.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 class TabOrganizationButtonTest : public ChromeViewsTestBase {
@@ -17,10 +17,9 @@
   void SetUp() override {
     ChromeViewsTestBase::SetUp();
 
-    auto controller = std::make_unique<FakeBaseTabStripController>();
-    auto tab_strip = std::make_unique<TabStrip>(std::move(controller));
+    tab_strip_controller_ = std::make_unique<FakeBaseTabStripController>();
     button_ = std::make_unique<TabOrganizationButton>(
-        tab_strip.get(),
+        tab_strip_controller_.get(),
         base::BindRepeating(&TabOrganizationButtonTest::MockButtonCallback,
                             base::Unretained(this)),
         Edge::kRight);
@@ -33,6 +32,7 @@
  protected:
   std::unique_ptr<TabOrganizationButton> button_;
   std::unique_ptr<TabOrganizationSession> placeholder_session_;
+  std::unique_ptr<TabStripController> tab_strip_controller_;
   int button_callback_count_ = 0;
 };
 
diff --git a/chrome/browser/ui/views/tabs/tab_search_button.cc b/chrome/browser/ui/views/tabs/tab_search_button.cc
index 801c230..b9c87e2d 100644
--- a/chrome/browser/ui/views/tabs/tab_search_button.cc
+++ b/chrome/browser/ui/views/tabs/tab_search_button.cc
@@ -8,12 +8,11 @@
 #include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/tabs/new_tab_button.h"
+#include "chrome/browser/ui/views/tabs/tab_search_button.h"
+#include "chrome/browser/ui/views/tabs/tab_strip_control_button.h"
 #include "chrome/browser/ui/views/tabs/tab_strip_controller.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/vector_icons/vector_icons.h"
-#include "new_tab_button.h"
-#include "tab_search_button.h"
-#include "tab_strip_control_button.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/base/ui_base_features.h"
@@ -26,8 +25,9 @@
 constexpr int kCRTabSearchFlatCornerRadius = 2;
 }
 
-TabSearchButton::TabSearchButton(TabStrip* tab_strip, Edge flat_edge)
-    : TabStripControlButton(tab_strip,
+TabSearchButton::TabSearchButton(TabStripController* tab_strip_controller,
+                                 Edge flat_edge)
+    : TabStripControlButton(tab_strip_controller,
                             PressedCallback(),
                             features::IsChromeRefresh2023()
                                 ? vector_icons::kExpandMoreIcon
@@ -35,7 +35,7 @@
                             flat_edge),
       tab_search_bubble_host_(std::make_unique<TabSearchBubbleHost>(
           this,
-          tab_strip->controller()->GetProfile())) {
+          tab_strip_controller->GetProfile())) {
   SetProperty(views::kElementIdentifierKey, kTabSearchButtonElementId);
 
   SetTooltipText(l10n_util::GetStringUTF16(IDS_TOOLTIP_TAB_SEARCH));
diff --git a/chrome/browser/ui/views/tabs/tab_search_button.h b/chrome/browser/ui/views/tabs/tab_search_button.h
index 33d68fd..6ffb444 100644
--- a/chrome/browser/ui/views/tabs/tab_search_button.h
+++ b/chrome/browser/ui/views/tabs/tab_search_button.h
@@ -9,7 +9,7 @@
 #include "chrome/browser/ui/views/tabs/tab_strip_control_button.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 
-class TabStrip;
+class TabStripController;
 
 // TabSearchButton should leverage the look and feel of the existing
 // NewTabButton for sizing and appropriate theming. This class updates the
@@ -18,7 +18,7 @@
 class TabSearchButton : public TabStripControlButton {
  public:
   METADATA_HEADER(TabSearchButton);
-  TabSearchButton(TabStrip* tab_strip, Edge flat_edge);
+  TabSearchButton(TabStripController* tab_strip_controller, Edge flat_edge);
   TabSearchButton(const TabSearchButton&) = delete;
   TabSearchButton& operator=(const TabSearchButton&) = delete;
   ~TabSearchButton() override;
diff --git a/chrome/browser/ui/views/tabs/tab_search_container.cc b/chrome/browser/ui/views/tabs/tab_search_container.cc
index b1fbd4c..65f45e81 100644
--- a/chrome/browser/ui/views/tabs/tab_search_container.cc
+++ b/chrome/browser/ui/views/tabs/tab_search_container.cc
@@ -27,14 +27,14 @@
 
 }  // namespace
 
-TabSearchContainer::TabSearchContainer(TabStrip* tab_strip,
+TabSearchContainer::TabSearchContainer(TabStripController* tab_strip_controller,
                                        bool before_tab_strip)
     : AnimationDelegateViews(this) {
   std::unique_ptr<TabSearchButton> tab_search_button =
       std::make_unique<TabSearchButton>(
-          tab_strip, features::IsTabOrganization()
-                         ? GetFlatEdge(true, before_tab_strip)
-                         : Edge::kNone);
+          tab_strip_controller, features::IsTabOrganization()
+                                    ? GetFlatEdge(true, before_tab_strip)
+                                    : Edge::kNone);
   tab_search_button->SetProperty(views::kCrossAxisAlignmentKey,
                                  views::LayoutAlignment::kCenter);
 
@@ -44,13 +44,13 @@
 
   if (features::IsTabOrganization()) {
     tab_organization_service_ = TabOrganizationServiceFactory::GetForProfile(
-        tab_strip->controller()->GetProfile());
+        tab_strip_controller->GetProfile());
     tab_organization_service_->AddObserver(this);
     // TODO(1469126): Consider hiding the button when the request has started,
     // vs. when the button as clicked.
     tab_organization_button_ =
         AddChildView(std::make_unique<TabOrganizationButton>(
-            tab_strip,
+            tab_strip_controller,
             base::BindRepeating(&TabSearchContainer::HideTabOrganization,
                                 base::Unretained(this)),
             features::IsTabOrganization() ? GetFlatEdge(false, before_tab_strip)
diff --git a/chrome/browser/ui/views/tabs/tab_search_container.h b/chrome/browser/ui/views/tabs/tab_search_container.h
index 5ca35e2..9e881572 100644
--- a/chrome/browser/ui/views/tabs/tab_search_container.h
+++ b/chrome/browser/ui/views/tabs/tab_search_container.h
@@ -18,14 +18,15 @@
 class TabOrganizationButton;
 class TabOrganizationService;
 class TabSearchButton;
-class TabStrip;
+class TabStripController;
 
 class TabSearchContainer : public views::View,
                            public views::AnimationDelegateViews,
                            public TabOrganizationObserver {
  public:
   METADATA_HEADER(TabSearchContainer);
-  TabSearchContainer(TabStrip* tab_strip, bool before_tab_strip);
+  TabSearchContainer(TabStripController* tab_strip_controller,
+                     bool before_tab_strip);
   TabSearchContainer(const TabSearchContainer&) = delete;
   TabSearchContainer& operator=(const TabSearchContainer&) = delete;
   ~TabSearchContainer() override;
diff --git a/chrome/browser/ui/views/tabs/tab_search_container_unittest.cc b/chrome/browser/ui/views/tabs/tab_search_container_unittest.cc
index de50439e..36e38f8 100644
--- a/chrome/browser/ui/views/tabs/tab_search_container_unittest.cc
+++ b/chrome/browser/ui/views/tabs/tab_search_container_unittest.cc
@@ -35,17 +35,17 @@
     scoped_feature_list_.InitWithFeatures(
         {features::kTabOrganization, features::kChromeRefresh2023}, {});
 
-    auto controller = std::make_unique<FakeBaseTabStripControllerWithProfile>();
-    tab_strip_ = std::make_unique<TabStrip>(std::move(controller));
+    tab_strip_controller_ =
+        std::make_unique<FakeBaseTabStripControllerWithProfile>();
     container_before_tab_strip_ =
-        std::make_unique<TabSearchContainer>(tab_strip_.get(), true);
-    container_after_tab_strip_ =
-        std::make_unique<TabSearchContainer>(tab_strip_.get(), false);
+        std::make_unique<TabSearchContainer>(tab_strip_controller_.get(), true);
+    container_after_tab_strip_ = std::make_unique<TabSearchContainer>(
+        tab_strip_controller_.get(), false);
   }
 
  protected:
   base::test::ScopedFeatureList scoped_feature_list_;
-  std::unique_ptr<TabStrip> tab_strip_;
+  std::unique_ptr<TabStripController> tab_strip_controller_;
   std::unique_ptr<TabSearchContainer> container_before_tab_strip_;
   std::unique_ptr<TabSearchContainer> container_after_tab_strip_;
 };
diff --git a/chrome/browser/ui/views/tabs/tab_strip_control_button.cc b/chrome/browser/ui/views/tabs/tab_strip_control_button.cc
index e8ff20e..de4a73a 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_control_button.cc
+++ b/chrome/browser/ui/views/tabs/tab_strip_control_button.cc
@@ -56,31 +56,38 @@
 const gfx::Size TabStripControlButton::kButtonSize{28, 28};
 const gfx::VectorIcon kEmptyIcon;
 
-TabStripControlButton::TabStripControlButton(TabStrip* tab_strip,
-                                             PressedCallback callback,
-                                             const gfx::VectorIcon& icon,
-                                             Edge flat_edge)
-    : TabStripControlButton(tab_strip,
+TabStripControlButton::TabStripControlButton(
+    TabStripController* tab_strip_controller,
+    PressedCallback callback,
+    const gfx::VectorIcon& icon,
+    Edge flat_edge)
+    : TabStripControlButton(tab_strip_controller,
                             callback,
                             icon,
                             std::u16string(),
                             flat_edge) {}
 
-TabStripControlButton::TabStripControlButton(TabStrip* tab_strip,
-                                             PressedCallback callback,
-                                             const std::u16string& text,
-                                             Edge flat_edge)
-    : TabStripControlButton(tab_strip, callback, kEmptyIcon, text, flat_edge) {}
+TabStripControlButton::TabStripControlButton(
+    TabStripController* tab_strip_controller,
+    PressedCallback callback,
+    const std::u16string& text,
+    Edge flat_edge)
+    : TabStripControlButton(tab_strip_controller,
+                            callback,
+                            kEmptyIcon,
+                            text,
+                            flat_edge) {}
 
-TabStripControlButton::TabStripControlButton(TabStrip* tab_strip,
-                                             PressedCallback callback,
-                                             const gfx::VectorIcon& icon,
-                                             const std::u16string& text,
-                                             Edge flat_edge)
+TabStripControlButton::TabStripControlButton(
+    TabStripController* tab_strip_controller,
+    PressedCallback callback,
+    const gfx::VectorIcon& icon,
+    const std::u16string& text,
+    Edge flat_edge)
     : views::LabelButton(std::move(callback), text),
       icon_(icon),
       flat_edge_(flat_edge),
-      tab_strip_(tab_strip) {
+      tab_strip_controller_(tab_strip_controller) {
   SetImageCentered(true);
   SetEventTargeter(std::make_unique<views::ViewTargeter>(this));
 
@@ -189,7 +196,8 @@
   }
 
   const absl::optional<int> bg_id =
-      tab_strip_->GetCustomBackgroundId(BrowserFrameActiveState::kUseCurrent);
+      tab_strip_controller_->GetCustomBackgroundId(
+          BrowserFrameActiveState::kUseCurrent);
 
   // Paint the background as transparent for image based themes.
   if (bg_id.has_value() && paint_transparent_for_custom_image_theme_) {
@@ -242,7 +250,7 @@
 }
 
 bool TabStripControlButton::GetHitTestMask(SkPath* mask) const {
-  const bool extend_to_top = tab_strip_->controller()->IsFrameCondensed();
+  const bool extend_to_top = tab_strip_controller_->IsFrameCondensed();
 
   const SkScalar bottom_radius = GetCornerRadius();
   const SkScalar top_radius = extend_to_top ? 0.0f : bottom_radius;
@@ -261,7 +269,7 @@
 
   gfx::Rect rect = GetContentsBounds();
   if (extend_to_top) {
-    rect.set_y(0);
+    rect.SetVerticalBounds(0, rect.bottom());
   }
 
   mask->addRoundRect(gfx::RectToSkRect(rect), radii);
diff --git a/chrome/browser/ui/views/tabs/tab_strip_control_button.h b/chrome/browser/ui/views/tabs/tab_strip_control_button.h
index 9508eb45..f6eb602 100644
--- a/chrome/browser/ui/views/tabs/tab_strip_control_button.h
+++ b/chrome/browser/ui/views/tabs/tab_strip_control_button.h
@@ -16,7 +16,7 @@
 struct VectorIcon;
 }  // namespace gfx
 
-class TabStrip;
+class TabStripController;
 
 enum class Edge {
   kNone = 0,
@@ -32,17 +32,17 @@
   static const int kIconSize;
   static const gfx::Size kButtonSize;
 
-  TabStripControlButton(TabStrip* tab_strip,
+  TabStripControlButton(TabStripController* tab_strip,
                         PressedCallback callback,
                         const gfx::VectorIcon& icon,
                         Edge flat_edge = Edge::kNone);
 
-  TabStripControlButton(TabStrip* tab_strip,
+  TabStripControlButton(TabStripController* tab_strip,
                         PressedCallback callback,
                         const std::u16string& text,
                         Edge flat_edge = Edge::kNone);
 
-  TabStripControlButton(TabStrip* tab_strip,
+  TabStripControlButton(TabStripController* tab_strip,
                         PressedCallback callback,
                         const gfx::VectorIcon& icon,
                         const std::u16string& text,
@@ -131,7 +131,8 @@
   float flat_edge_factor_ = 1;
 
   // Tab strip that contains this button.
-  raw_ptr<TabStrip, AcrossTasksDanglingUntriaged> tab_strip_;
+  raw_ptr<TabStripController, AcrossTasksDanglingUntriaged>
+      tab_strip_controller_;
 
   // Stored ColorId values to differentiate for ChromeRefresh.
   ui::ColorId foreground_frame_active_color_id_;
diff --git a/chrome/browser/ui/views/tabs/tab_strip_control_button_unittest.cc b/chrome/browser/ui/views/tabs/tab_strip_control_button_unittest.cc
new file mode 100644
index 0000000..b90671f
--- /dev/null
+++ b/chrome/browser/ui/views/tabs/tab_strip_control_button_unittest.cc
@@ -0,0 +1,111 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/ui/views/tabs/tab_strip_control_button.h"
+
+#include "base/test/bind.h"
+#include "chrome/browser/ui/views/tabs/fake_base_tab_strip_controller.h"
+#include "chrome/test/views/chrome_views_test_base.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkPath.h"
+#include "third_party/skia/include/core/SkRegion.h"
+
+class TabStripController;
+
+constexpr int kBorderThickness = 4;
+
+class FrameCondensedController : public FakeBaseTabStripController {
+ public:
+  bool IsFrameCondensed() const override { return condensed_; }
+
+  void set_condensed(bool condensed) { condensed_ = condensed; }
+
+ private:
+  bool condensed_ = false;
+};
+
+class TabStripControlButtonTest : public ChromeViewsTestBase {
+ public:
+  void SetUp() override {
+    ChromeViewsTestBase::SetUp();
+
+    tab_strip_controller_ = std::make_unique<FrameCondensedController>();
+    button_ = std::make_unique<TabStripControlButton>(
+        tab_strip_controller_.get(), base::BindLambdaForTesting([]() {}), u"");
+    button_->SetBorder(
+        views::CreateEmptyBorder(gfx::Insets::VH(kBorderThickness, 0)));
+    button_->SetSize(button_->CalculatePreferredSize());
+  }
+
+ protected:
+  std::unique_ptr<TabStripControlButton> button_;
+  std::unique_ptr<FrameCondensedController> tab_strip_controller_;
+};
+
+TEST_F(TabStripControlButtonTest, UncondensedFrameHitTestMask) {
+  SkPath path;
+  button_->GetHitTestMask(&path);
+  SkRegion clip_region;
+  clip_region.setRect({0, 0, button_->width(), button_->height()});
+  SkRegion mask;
+  mask.setPath(path, clip_region);
+
+  const int center_x = button_->width() / 2;
+  const int center_y = button_->height() / 2;
+
+  const int top = kBorderThickness;
+  const int left = 0;
+  const int bottom = button_->height() - kBorderThickness - 1;
+  const int right = button_->width() - 1;
+
+  EXPECT_TRUE(mask.contains(center_x, center_y));
+
+  // The points where the circle touches the border are in the mask.
+  EXPECT_TRUE(mask.contains(center_x, top));
+  EXPECT_TRUE(mask.contains(center_x, bottom));
+  EXPECT_TRUE(mask.contains(left, center_y));
+  EXPECT_TRUE(mask.contains(right, center_y));
+
+  // The four corners of the border are not in the mask.
+  EXPECT_FALSE(mask.contains(left, top));
+  EXPECT_FALSE(mask.contains(left, bottom));
+  EXPECT_FALSE(mask.contains(right, top));
+  EXPECT_FALSE(mask.contains(right, bottom));
+}
+
+TEST_F(TabStripControlButtonTest, CondensedFrameHitTestMask) {
+  tab_strip_controller_->set_condensed(true);
+
+  SkPath path;
+  button_->GetHitTestMask(&path);
+  SkRegion clip_region;
+  clip_region.setRect({0, 0, button_->width(), button_->height()});
+  SkRegion mask;
+  mask.setPath(path, clip_region);
+
+  const int center_x = button_->width() / 2;
+  const int center_y = button_->height() / 2;
+
+  const int top = kBorderThickness;
+  const int left = 0;
+  const int bottom = button_->height() - kBorderThickness - 1;
+  const int right = button_->width() - 1;
+
+  EXPECT_TRUE(mask.contains(center_x, center_y));
+
+  // The points where the circle touches the border are in the mask.
+  EXPECT_TRUE(mask.contains(center_x, top));
+  EXPECT_TRUE(mask.contains(center_x, bottom));
+  EXPECT_TRUE(mask.contains(left, center_y));
+  EXPECT_TRUE(mask.contains(right, center_y));
+
+  // The entire top of the view (including the border!) is in the mask.
+  EXPECT_TRUE(mask.contains(center_x, 0));
+  EXPECT_TRUE(mask.contains(left, 0));
+  EXPECT_TRUE(mask.contains(right, 0));
+
+  // The bottom corners of the border are not in the mask.
+  EXPECT_FALSE(mask.contains(right, bottom));
+  EXPECT_FALSE(mask.contains(left, bottom));
+}
diff --git a/chrome/browser/ui/views/web_apps/file_handler_launch_dialog_view.cc b/chrome/browser/ui/views/web_apps/file_handler_launch_dialog_view.cc
index e50c591..831fe39 100644
--- a/chrome/browser/ui/views/web_apps/file_handler_launch_dialog_view.cc
+++ b/chrome/browser/ui/views/web_apps/file_handler_launch_dialog_view.cc
@@ -11,6 +11,7 @@
 #include "base/i18n/message_formatter.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_app_utils.h"
 #include "chrome/grit/generated_resources.h"
@@ -32,7 +33,7 @@
     const std::vector<base::FilePath>& file_paths,
     Profile* profile,
     const webapps::AppId& app_id,
-    chrome::WebAppLaunchAcceptanceCallback close_callback)
+    WebAppLaunchAcceptanceCallback close_callback)
     : LaunchAppUserChoiceDialogView(profile, app_id, std::move(close_callback)),
       file_paths_(file_paths) {
   DCHECK(!file_paths.empty());
@@ -163,10 +164,6 @@
 BEGIN_METADATA(FileHandlerLaunchDialogView, views::DialogDelegateView)
 END_METADATA
 
-}  // namespace web_app
-
-namespace chrome {
-
 void ShowWebAppFileLaunchDialog(const std::vector<base::FilePath>& file_paths,
                                 Profile* profile,
                                 const webapps::AppId& app_id,
@@ -180,4 +177,4 @@
       ->Show();
 }
 
-}  // namespace chrome
+}  // namespace web_app
diff --git a/chrome/browser/ui/views/web_apps/file_handler_launch_dialog_view.h b/chrome/browser/ui/views/web_apps/file_handler_launch_dialog_view.h
index ee8ea33..3a64efd 100644
--- a/chrome/browser/ui/views/web_apps/file_handler_launch_dialog_view.h
+++ b/chrome/browser/ui/views/web_apps/file_handler_launch_dialog_view.h
@@ -10,8 +10,8 @@
 
 #include "base/files/file_path.h"
 #include "base/functional/callback_forward.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_id.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "components/webapps/common/web_app_id.h"
@@ -27,11 +27,10 @@
  public:
   METADATA_HEADER(FileHandlerLaunchDialogView);
 
-  FileHandlerLaunchDialogView(
-      const std::vector<base::FilePath>& file_paths,
-      Profile* profile,
-      const webapps::AppId& app_id,
-      chrome::WebAppLaunchAcceptanceCallback close_callback);
+  FileHandlerLaunchDialogView(const std::vector<base::FilePath>& file_paths,
+                              Profile* profile,
+                              const webapps::AppId& app_id,
+                              WebAppLaunchAcceptanceCallback close_callback);
 
   FileHandlerLaunchDialogView(const FileHandlerLaunchDialogView&) = delete;
   FileHandlerLaunchDialogView& operator=(const FileHandlerLaunchDialogView&) =
diff --git a/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.cc b/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.cc
index ec9bcb3..64f2da9 100644
--- a/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.cc
+++ b/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.cc
@@ -45,7 +45,7 @@
 LaunchAppUserChoiceDialogView::LaunchAppUserChoiceDialogView(
     Profile* profile,
     const webapps::AppId& app_id,
-    chrome::WebAppLaunchAcceptanceCallback close_callback)
+    WebAppLaunchAcceptanceCallback close_callback)
     : profile_(profile),
       app_id_(app_id),
       close_callback_(std::move(close_callback)) {}
diff --git a/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.h b/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.h
index 677017a..649b5c9 100644
--- a/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.h
+++ b/chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.h
@@ -11,7 +11,7 @@
 #include "base/functional/callback_forward.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_id.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "components/webapps/common/web_app_id.h"
@@ -35,10 +35,9 @@
  public:
   METADATA_HEADER(LaunchAppUserChoiceDialogView);
 
-  LaunchAppUserChoiceDialogView(
-      Profile* profile,
-      const webapps::AppId& app_id,
-      chrome::WebAppLaunchAcceptanceCallback close_callback);
+  LaunchAppUserChoiceDialogView(Profile* profile,
+                                const webapps::AppId& app_id,
+                                WebAppLaunchAcceptanceCallback close_callback);
 
   LaunchAppUserChoiceDialogView(const LaunchAppUserChoiceDialogView&) = delete;
   LaunchAppUserChoiceDialogView& operator=(
@@ -72,7 +71,7 @@
   const webapps::AppId app_id_;
   raw_ptr<views::Checkbox> remember_selection_checkbox_;
   raw_ptr<views::ImageView> icon_image_view_;
-  chrome::WebAppLaunchAcceptanceCallback close_callback_;
+  WebAppLaunchAcceptanceCallback close_callback_;
   base::WeakPtrFactory<LaunchAppUserChoiceDialogView> weak_ptr_factory_{this};
 };
 
diff --git a/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_browsertest.cc b/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_browsertest.cc
index a02c4cb..5e948b5 100644
--- a/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_browsertest.cc
@@ -10,10 +10,10 @@
 #include "base/test/bind.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_view.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/test/base/in_process_browser_test.h"
@@ -61,9 +61,8 @@
           EXPECT_EQ(expected_remember_user_choice, remember_user_choice);
         });
 
-    chrome::ShowWebAppProtocolLaunchDialog(protocol_url, browser()->profile(),
-                                           test_app_id,
-                                           std::move(dialog_finished));
+    ShowWebAppProtocolLaunchDialog(protocol_url, browser()->profile(),
+                                   test_app_id, std::move(dialog_finished));
 
     waiter.WaitIfNeededAndGet()->CloseWithReason(reason);
     run_loop.Run();
@@ -123,8 +122,8 @@
                                          "ProtocolHandlerLaunchDialogView");
     GURL protocol_url("web+test://test");
     webapps::AppId test_app_id = InstallTestWebApp(browser()->profile());
-    chrome::ShowWebAppProtocolLaunchDialog(protocol_url, browser()->profile(),
-                                           test_app_id, base::DoNothing());
+    ShowWebAppProtocolLaunchDialog(protocol_url, browser()->profile(),
+                                   test_app_id, base::DoNothing());
     waiter.WaitIfNeededAndGet()->CloseWithReason(
         views::Widget::ClosedReason::kEscKeyPressed);
   }
diff --git a/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_view.cc b/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_view.cc
index 2872b649..ac3c7ca 100644
--- a/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_view.cc
+++ b/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_view.cc
@@ -8,6 +8,7 @@
 #include <string>
 #include <utility>
 
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/custom_handlers/protocol_handler.h"
 #include "components/strings/grit/components_strings.h"
@@ -22,7 +23,7 @@
     GURL url,
     Profile* profile,
     const webapps::AppId& app_id,
-    chrome::WebAppLaunchAcceptanceCallback close_callback)
+    WebAppLaunchAcceptanceCallback close_callback)
     : LaunchAppUserChoiceDialogView(profile, app_id, std::move(close_callback)),
       url_(std::move(url)) {
   auto* layout_provider = views::LayoutProvider::Get();
@@ -68,10 +69,6 @@
 BEGIN_METADATA(ProtocolHandlerLaunchDialogView, views::DialogDelegateView)
 END_METADATA
 
-}  // namespace web_app
-
-namespace chrome {
-
 void ShowWebAppProtocolLaunchDialog(
     const GURL& url,
     Profile* profile,
@@ -86,4 +83,4 @@
       ->Show();
 }
 
-}  // namespace chrome
+}  // namespace web_app
diff --git a/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_view.h b/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_view.h
index 923fca1..163e92f 100644
--- a/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_view.h
+++ b/chrome/browser/ui/views/web_apps/protocol_handler_launch_dialog_view.h
@@ -11,6 +11,7 @@
 #include "base/functional/callback_forward.h"
 #include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/views/web_apps/launch_app_user_choice_dialog_view.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_id.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "components/webapps/common/web_app_id.h"
@@ -31,7 +32,7 @@
       GURL url,
       Profile* profile,
       const webapps::AppId& app_id,
-      chrome::WebAppLaunchAcceptanceCallback close_callback);
+      WebAppLaunchAcceptanceCallback close_callback);
 
   ProtocolHandlerLaunchDialogView(const ProtocolHandlerLaunchDialogView&) =
       delete;
diff --git a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc
index d0628c8..4cf3bd76 100644
--- a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc
+++ b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.cc
@@ -15,7 +15,6 @@
 #include "build/build_config.h"
 #include "chrome/browser/feature_engagement/tracker_factory.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
@@ -23,6 +22,7 @@
 #include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
 #include "chrome/browser/ui/views/web_apps/web_app_info_image_source.h"
 #include "chrome/browser/ui/views/web_apps/web_app_views_utils.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
@@ -103,8 +103,8 @@
     PageActionIconView* highlight_icon_button,
     std::unique_ptr<web_app::WebAppInstallInfo> web_app_info,
     std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
-    chrome::AppInstallationAcceptanceCallback callback,
-    chrome::PwaInProductHelpState iph_state,
+    web_app::AppInstallationAcceptanceCallback callback,
+    web_app::PwaInProductHelpState iph_state,
     PrefService* prefs,
     feature_engagement::Tracker* tracker)
     : LocationBarBubbleDelegateView(anchor_view, web_contents),
@@ -235,7 +235,7 @@
   if (web_app_info_) {
     base::RecordAction(base::UserMetricsAction("WebAppInstallCancelled"));
 
-    if (iph_state_ == chrome::PwaInProductHelpState::kShown) {
+    if (iph_state_ == web_app::PwaInProductHelpState::kShown) {
       webapps::AppId app_id =
           web_app::GenerateAppIdFromManifestId(web_app_info_->manifest_id);
       web_app::RecordInstallIphIgnored(prefs_, app_id, base::Time::Now());
@@ -280,7 +280,7 @@
   }
 #endif
 
-  if (iph_state_ == chrome::PwaInProductHelpState::kShown) {
+  if (iph_state_ == web_app::PwaInProductHelpState::kShown) {
     web_app::RecordInstallIphInstalled(prefs_, app_id);
     tracker_->NotifyEvent(feature_engagement::events::kDesktopPwaInstalled);
   }
@@ -310,7 +310,7 @@
   params->name = "PWAConfirmationBubbleView";
 }
 
-namespace chrome {
+namespace web_app {
 
 void ShowPWAInstallBubble(
     content::WebContents* web_contents,
@@ -371,4 +371,4 @@
   g_auto_accept_pwa_for_testing = auto_accept;
 }
 
-}  // namespace chrome
+}  // namespace web_app
diff --git a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h
index b37e04b6..16722a6d 100644
--- a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h
+++ b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h
@@ -8,8 +8,8 @@
 #include <memory>
 
 #include "base/memory/raw_ptr.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/views/location_bar/location_bar_bubble_delegate_view.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "components/prefs/pref_service.h"
 #include "ui/base/interaction/element_tracker.h"
@@ -21,14 +21,14 @@
 class WebContents;
 }  // namespace content
 
-namespace views {
-class Checkbox;
-}  // namespace views
-
 namespace feature_engagement {
 class Tracker;
 }  // namespace feature_engagement
 
+namespace views {
+class Checkbox;
+}  // namespace views
+
 namespace webapps {
 class MlInstallOperationTracker;
 }  // namespace webapps
@@ -47,8 +47,8 @@
       PageActionIconView* highlight_icon_button,
       std::unique_ptr<web_app::WebAppInstallInfo> web_app_info,
       std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
-      chrome::AppInstallationAcceptanceCallback callback,
-      chrome::PwaInProductHelpState iph_state,
+      web_app::AppInstallationAcceptanceCallback callback,
+      web_app::PwaInProductHelpState iph_state,
       PrefService* prefs,
       feature_engagement::Tracker* tracker);
 
@@ -75,16 +75,17 @@
  protected:
   void OnBeforeBubbleWidgetInit(views::Widget::InitParams* params,
                                 views::Widget* widget) const override;
+
  private:
   raw_ptr<PageActionIconView> highlight_icon_button_ = nullptr;
   std::unique_ptr<web_app::WebAppInstallInfo> web_app_info_;
   std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker_;
-  chrome::AppInstallationAcceptanceCallback callback_;
+  web_app::AppInstallationAcceptanceCallback callback_;
 
   // Checkbox to launch window with tab strip.
   raw_ptr<views::Checkbox> tabbed_window_checkbox_ = nullptr;
 
-  chrome::PwaInProductHelpState iph_state_;
+  web_app::PwaInProductHelpState iph_state_;
   raw_ptr<PrefService> prefs_;
   raw_ptr<feature_engagement::Tracker> tracker_;
 };
diff --git a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view_browsertest.cc b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view_browsertest.cc
index 7f841ea61..fb8097ef 100644
--- a/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view_browsertest.cc
@@ -8,10 +8,10 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/views/web_apps/pwa_confirmation_bubble_view.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/os_integration/os_integration_manager.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
@@ -85,9 +85,9 @@
       GetInstallTracker(browser);
 
   // Tests that we don't crash when showing the install prompt in a PWA window.
-  chrome::ShowPWAInstallBubble(
-      browser->tab_strip_model()->GetActiveWebContents(), std::move(app_info),
-      std::move(install_tracker), base::DoNothing());
+  ShowPWAInstallBubble(browser->tab_strip_model()->GetActiveWebContents(),
+                       std::move(app_info), std::move(install_tracker),
+                       base::DoNothing());
 }
 
 IN_PROC_BROWSER_TEST_F(PWAConfirmationBubbleViewBrowserTest,
@@ -99,7 +99,7 @@
 
   base::RunLoop loop;
   // Show the PWA install dialog.
-  chrome::ShowPWAInstallBubble(
+  ShowPWAInstallBubble(
       browser()->tab_strip_model()->GetActiveWebContents(), std::move(app_info),
       std::move(install_tracker),
       base::BindLambdaForTesting(
@@ -131,14 +131,14 @@
       GetInstallTracker(browser());
   content::WebContents* web_contents =
       browser()->tab_strip_model()->GetActiveWebContents();
-  chrome::ShowPWAInstallBubble(
+  ShowPWAInstallBubble(
       web_contents, std::move(app_info), std::move(install_tracker),
       base::BindLambdaForTesting(
           [&](bool accepted,
               std::unique_ptr<WebAppInstallInfo> app_info_callback) {
             loop.Quit();
           }),
-      chrome::PwaInProductHelpState::kShown);
+      PwaInProductHelpState::kShown);
 
   PWAConfirmationBubbleView* bubble_dialog =
       PWAConfirmationBubbleView::GetBubble();
@@ -186,7 +186,7 @@
   // Show the PWA install dialog.
   std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker =
       GetInstallTracker(browser());
-  chrome::ShowPWAInstallBubble(
+  ShowPWAInstallBubble(
       browser()->tab_strip_model()->GetActiveWebContents(), std::move(app_info),
       std::move(install_tracker),
       base::BindLambdaForTesting(
@@ -194,7 +194,7 @@
               std::unique_ptr<WebAppInstallInfo> app_info_callback) {
             loop.Quit();
           }),
-      chrome::PwaInProductHelpState::kShown);
+      PwaInProductHelpState::kShown);
 
   PWAConfirmationBubbleView* bubble_dialog =
       PWAConfirmationBubbleView::GetBubble();
@@ -216,7 +216,7 @@
 
   std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker =
       GetInstallTracker(browser());
-  chrome::ShowPWAInstallBubble(
+  ShowPWAInstallBubble(
       browser()->tab_strip_model()->GetActiveWebContents(), GetAppInfo(),
       std::move(install_tracker),
       base::BindLambdaForTesting(
diff --git a/chrome/browser/ui/views/web_apps/sub_apps_install_dialog.cc b/chrome/browser/ui/views/web_apps/sub_apps_install_dialog.cc
index c72365b..3ddd1c1 100644
--- a/chrome/browser/ui/views/web_apps/sub_apps_install_dialog.cc
+++ b/chrome/browser/ui/views/web_apps/sub_apps_install_dialog.cc
@@ -5,10 +5,10 @@
 #include "base/i18n/message_formatter.h"
 #include "base/memory/raw_ptr.h"
 #include "base/types/cxx23_to_underlying.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/web_apps/web_app_info_image_source.h"
 #include "chrome/browser/ui/web_applications/sub_apps_install_dialog_controller.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/constrained_window/constrained_window_views.h"
@@ -57,7 +57,7 @@
 
 }  // namespace
 
-namespace chrome {
+namespace web_app {
 
 views::Widget* CreateSubAppsInstallDialogWidget(
     const std::string_view parent_app_name,
@@ -88,7 +88,7 @@
   return widget;
 }
 
-}  // namespace chrome
+}  // namespace web_app
 
 namespace {
 
diff --git a/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc b/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc
index d5c86e4c..d7381b0 100644
--- a/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_confirmation_view.cc
@@ -14,6 +14,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/web_apps/web_app_info_image_source.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/common/chrome_features.h"
@@ -82,7 +83,7 @@
 WebAppConfirmationView::WebAppConfirmationView(
     std::unique_ptr<web_app::WebAppInstallInfo> web_app_info,
     std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
-    chrome::AppInstallationAcceptanceCallback callback)
+    web_app::AppInstallationAcceptanceCallback callback)
     : web_app_info_(std::move(web_app_info)),
       install_tracker_(std::move(install_tracker)),
       callback_(std::move(callback)) {
@@ -274,7 +275,7 @@
 ADD_READONLY_PROPERTY_METADATA(std::u16string, TrimmedTitle)
 END_METADATA
 
-namespace chrome {
+namespace web_app {
 
 void ShowWebAppInstallDialog(
     content::WebContents* web_contents,
@@ -303,4 +304,4 @@
   g_title_to_use_for_app = title_to_use;
 }
 
-}  // namespace chrome
+}  // namespace web_app
diff --git a/chrome/browser/ui/views/web_apps/web_app_confirmation_view.h b/chrome/browser/ui/views/web_apps/web_app_confirmation_view.h
index e02ab79..b1f16df 100644
--- a/chrome/browser/ui/views/web_apps/web_app_confirmation_view.h
+++ b/chrome/browser/ui/views/web_apps/web_app_confirmation_view.h
@@ -10,7 +10,7 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "ui/base/metadata/metadata_header_macros.h"
 #include "ui/views/controls/textfield/textfield_controller.h"
@@ -36,7 +36,7 @@
   WebAppConfirmationView(
       std::unique_ptr<web_app::WebAppInstallInfo> web_app_info,
       std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
-      chrome::AppInstallationAcceptanceCallback callback);
+      web_app::AppInstallationAcceptanceCallback callback);
   WebAppConfirmationView(const WebAppConfirmationView&) = delete;
   WebAppConfirmationView& operator=(const WebAppConfirmationView&) = delete;
   ~WebAppConfirmationView() override;
@@ -69,7 +69,7 @@
   std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker_;
 
   // The callback to be invoked when the dialog is completed.
-  chrome::AppInstallationAcceptanceCallback callback_;
+  web_app::AppInstallationAcceptanceCallback callback_;
 
   // Checkbox to launch as a window.
   raw_ptr<views::Checkbox> open_as_window_checkbox_ = nullptr;
diff --git a/chrome/browser/ui/views/web_apps/web_app_confirmation_view_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_confirmation_view_browsertest.cc
index f9b7fae9..57a9fb3 100644
--- a/chrome/browser/ui/views/web_apps/web_app_confirmation_view_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_confirmation_view_browsertest.cc
@@ -6,8 +6,8 @@
 #include "base/test/bind.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/common/chrome_features.h"
@@ -47,9 +47,9 @@
             ->RegisterCurrentInstallForWebContents(
                 webapps::WebappInstallSource::MENU_CREATE_SHORTCUT);
 
-    chrome::ShowWebAppInstallDialog(web_contents, std::move(app_info),
-                                    std::move(install_tracker),
-                                    base::BindLambdaForTesting(callback));
+    web_app::ShowWebAppInstallDialog(web_contents, std::move(app_info),
+                                     std::move(install_tracker),
+                                     base::BindLambdaForTesting(callback));
   }
 
   void SetUp() override {
@@ -75,8 +75,8 @@
   app_info->title = u"Test app";
   app_info->start_url = GURL("https://example.com");
 
-  chrome::SetAutoAcceptWebAppDialogForTesting(/*auto_accept=*/true,
-                                              /*auto_open_in_window=*/true);
+  web_app::SetAutoAcceptWebAppDialogForTesting(/*auto_accept=*/true,
+                                               /*auto_open_in_window=*/true);
   bool is_accepted = false;
   auto callback = [&is_accepted](bool result,
                                  std::unique_ptr<web_app::WebAppInstallInfo>) {
@@ -90,9 +90,9 @@
           ->RegisterCurrentInstallForWebContents(
               webapps::WebappInstallSource::MENU_CREATE_SHORTCUT);
 
-  chrome::ShowWebAppInstallDialog(web_contents, std::move(app_info),
-                                  std::move(install_tracker),
-                                  base::BindLambdaForTesting(callback));
+  web_app::ShowWebAppInstallDialog(web_contents, std::move(app_info),
+                                   std::move(install_tracker),
+                                   base::BindLambdaForTesting(callback));
   EXPECT_TRUE(is_accepted);
 }
 
@@ -101,8 +101,8 @@
 }
 
 IN_PROC_BROWSER_TEST_P(WebAppConfirmViewBrowserTest, NormalizeTitles) {
-  chrome::SetAutoAcceptWebAppDialogForTesting(/*auto_accept=*/true,
-                                              /*auto_open_in_window=*/true);
+  web_app::SetAutoAcceptWebAppDialogForTesting(/*auto_accept=*/true,
+                                               /*auto_open_in_window=*/true);
 
   struct TestCases {
     std::u16string input;
@@ -136,9 +136,9 @@
             ->RegisterCurrentInstallForWebContents(
                 webapps::WebappInstallSource::MENU_CREATE_SHORTCUT);
 
-    chrome::ShowWebAppInstallDialog(web_contents, std::move(app_info),
-                                    std::move(install_tracker),
-                                    base::BindLambdaForTesting(callback));
+    web_app::ShowWebAppInstallDialog(web_contents, std::move(app_info),
+                                     std::move(install_tracker),
+                                     base::BindLambdaForTesting(callback));
     EXPECT_TRUE(is_accepted) << test_case.input;
     EXPECT_EQ(test_case.expected_result, title) << test_case.input;
   }
diff --git a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
index f67e657..2a02ad0 100644
--- a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.cc
@@ -23,6 +23,7 @@
 #include "chrome/browser/ui/views/page_action/page_action_icon_view.h"
 #include "chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.h"
 #include "chrome/browser/ui/views/web_apps/web_app_info_image_source.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_prefs_utils.h"
 #include "chrome/grit/generated_resources.h"
@@ -323,15 +324,15 @@
 
 }  // namespace
 
-namespace chrome {
+namespace web_app {
 
 void ShowWebAppDetailedInstallDialog(
     content::WebContents* web_contents,
     std::unique_ptr<web_app::WebAppInstallInfo> install_info,
     std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
-    chrome::AppInstallationAcceptanceCallback callback,
+    AppInstallationAcceptanceCallback callback,
     const std::vector<webapps::Screenshot>& screenshots,
-    chrome::PwaInProductHelpState iph_state) {
+    PwaInProductHelpState iph_state) {
   content::BrowserContext* browser_context = web_contents->GetBrowserContext();
   PrefService* const prefs =
       Profile::FromBrowserContext(browser_context)->GetPrefs();
@@ -393,16 +394,12 @@
   base::RecordAction(base::UserMetricsAction("WebAppDetailedInstallShown"));
 }
 
-}  // namespace chrome
-
-namespace web_app {
-
 WebAppDetailedInstallDialogDelegate::WebAppDetailedInstallDialogDelegate(
     content::WebContents* web_contents,
     std::unique_ptr<web_app::WebAppInstallInfo> web_app_info,
     std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
-    chrome::AppInstallationAcceptanceCallback callback,
-    chrome::PwaInProductHelpState iph_state,
+    AppInstallationAcceptanceCallback callback,
+    PwaInProductHelpState iph_state,
     PrefService* prefs,
     feature_engagement::Tracker* tracker)
     : WebContentsObserver(web_contents),
@@ -443,7 +440,7 @@
 
 void WebAppDetailedInstallDialogDelegate::OnAccept() {
   base::RecordAction(base::UserMetricsAction("WebAppDetailedInstallAccepted"));
-  if (iph_state_ == chrome::PwaInProductHelpState::kShown) {
+  if (iph_state_ == PwaInProductHelpState::kShown) {
     webapps::AppId app_id =
         web_app::GenerateAppIdFromManifestId(install_info_->manifest_id);
     web_app::RecordInstallIphInstalled(prefs_, app_id);
@@ -509,7 +506,7 @@
 
   base::RecordAction(base::UserMetricsAction("WebAppDetailedInstallCancelled"));
 
-  if (iph_state_ == chrome::PwaInProductHelpState::kShown && install_info_) {
+  if (iph_state_ == PwaInProductHelpState::kShown && install_info_) {
     webapps::AppId app_id =
         web_app::GenerateAppIdFromManifestId(install_info_->manifest_id);
     web_app::RecordInstallIphIgnored(prefs_, app_id, base::Time::Now());
diff --git a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.h b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.h
index a0f4ba3..3f10b454 100644
--- a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.h
+++ b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog.h
@@ -9,7 +9,7 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
-#include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "ui/base/models/dialog_model.h"
@@ -39,8 +39,8 @@
       content::WebContents* web_contents,
       std::unique_ptr<WebAppInstallInfo> install_info,
       std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
-      chrome::AppInstallationAcceptanceCallback callback,
-      chrome::PwaInProductHelpState iph_state,
+      AppInstallationAcceptanceCallback callback,
+      PwaInProductHelpState iph_state,
       PrefService* prefs,
       feature_engagement::Tracker* tracker);
 
@@ -67,8 +67,8 @@
   raw_ptr<content::WebContents> web_contents_;
   std::unique_ptr<WebAppInstallInfo> install_info_;
   std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker_;
-  chrome::AppInstallationAcceptanceCallback callback_;
-  chrome::PwaInProductHelpState iph_state_;
+  AppInstallationAcceptanceCallback callback_;
+  PwaInProductHelpState iph_state_;
   raw_ptr<PrefService> prefs_;
   raw_ptr<feature_engagement::Tracker> tracker_;
 
diff --git a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc
index cd977e5..e1b94d91 100644
--- a/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_detailed_install_dialog_browsertest.cc
@@ -8,8 +8,8 @@
 #include "base/test/bind.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "chrome/test/base/ui_test_utils.h"
@@ -75,14 +75,14 @@
             ->RegisterCurrentInstallForWebContents(
                 webapps::WebappInstallSource::MENU_CREATE_SHORTCUT);
 
-    chrome::ShowWebAppDetailedInstallDialog(
+    ShowWebAppDetailedInstallDialog(
         browser()->tab_strip_model()->GetWebContentsAt(0),
         std::move(install_info), std::move(install_tracker),
         base::BindLambdaForTesting(
             [&](bool result, std::unique_ptr<WebAppInstallInfo>) {
               dialog_accepted_ = result;
             }),
-        screenshots, chrome::PwaInProductHelpState::kNotShown);
+        screenshots, PwaInProductHelpState::kNotShown);
   }
   absl::optional<bool> dialog_accepted() { return dialog_accepted_; }
 
diff --git a/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view.cc b/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view.cc
index 2cb69d9..26900be5 100644
--- a/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view.cc
@@ -5,10 +5,10 @@
 #include "chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view.h"
 
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/view_ids.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_callback_app_identity.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_app_ui_manager.h"
@@ -197,21 +197,20 @@
 BEGIN_METADATA(WebAppIdentityUpdateConfirmationView, views::DialogDelegateView)
 END_METADATA
 
-namespace chrome {
+namespace web_app {
 
-void ShowWebAppIdentityUpdateDialog(
-    const std::string& app_id,
-    bool title_change,
-    bool icon_change,
-    const std::u16string& old_title,
-    const std::u16string& new_title,
-    const SkBitmap& old_icon,
-    const SkBitmap& new_icon,
-    content::WebContents* web_contents,
-    web_app::AppIdentityDialogCallback callback) {
-  if (web_app::GetIdentityUpdateDialogActionForTesting() ==  // IN-TEST
-      web_app::AppIdentityUpdate::kSkipped) {
-    std::move(callback).Run(web_app::AppIdentityUpdate::kSkipped);
+void ShowWebAppIdentityUpdateDialog(const std::string& app_id,
+                                    bool title_change,
+                                    bool icon_change,
+                                    const std::u16string& old_title,
+                                    const std::u16string& new_title,
+                                    const SkBitmap& old_icon,
+                                    const SkBitmap& new_icon,
+                                    content::WebContents* web_contents,
+                                    AppIdentityDialogCallback callback) {
+  if (GetIdentityUpdateDialogActionForTesting() ==  // IN-TEST
+      AppIdentityUpdate::kSkipped) {
+    std::move(callback).Run(AppIdentityUpdate::kSkipped);
     return;
   }
 
@@ -225,10 +224,10 @@
           dialog, web_contents->GetTopLevelNativeWindow());
   dialog_widget->Show();
 
-  if (web_app::GetIdentityUpdateDialogActionForTesting() ==  // IN-TEST
-      web_app::AppIdentityUpdate::kAllowed) {
+  if (GetIdentityUpdateDialogActionForTesting() ==  // IN-TEST
+      AppIdentityUpdate::kAllowed) {
     dialog->AcceptDialog();
   }
 }
 
-}  // namespace chrome
+}  // namespace web_app
diff --git a/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view_browsertest.cc b/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view_browsertest.cc
index e33282d8..34be1e0 100644
--- a/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view_browsertest.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_identity_update_confirmation_view_browsertest.cc
@@ -6,9 +6,9 @@
 #include "base/memory/raw_ptr.h"
 #include "base/test/bind.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "chrome/browser/ui/view_ids.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/browser/web_applications/web_app_callback_app_identity.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
@@ -53,7 +53,7 @@
     auto* bitmap = image.bitmap();
     std::u16string old_name = u"Old App Title";
     std::u16string new_name = title_change_ ? u"New App Title" : old_name;
-    chrome::ShowWebAppIdentityUpdateDialog(
+    web_app::ShowWebAppIdentityUpdateDialog(
         app_id_, title_change_, icon_change_, old_name, new_name, *bitmap,
         *bitmap, browser()->tab_strip_model()->GetActiveWebContents(),
         base::DoNothing());
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
index ec19947..7341520 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -48,7 +48,6 @@
 #include "chrome/browser/shell_integration.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
@@ -76,6 +75,7 @@
 #include "chrome/browser/ui/web_applications/sub_apps_install_dialog_controller.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/ui/web_applications/web_app_launch_utils.h"
 #include "chrome/browser/ui/web_applications/web_app_menu_model.h"
 #include "chrome/browser/ui/webui/app_management/app_management_page_handler.h"
@@ -165,7 +165,6 @@
 #endif
 
 #if BUILDFLAG(IS_CHROMEOS_LACROS)
-#include "base/test/test_future.h"
 #include "base/version.h"
 #include "chrome/browser/apps/app_service/app_service_proxy_lacros.h"
 #include "chromeos/crosapi/mojom/test_controller.mojom.h"
@@ -181,7 +180,6 @@
 #include "chrome/browser/apps/app_shim/app_shim_manager_mac.h"
 #include "chrome/browser/apps/app_shim/web_app_shim_manager_delegate_mac.h"
 #include "chrome/browser/chrome_browser_main.h"
-#include "chrome/browser/shell_integration.h"
 #include "chrome/browser/web_applications/app_shim_registry_mac.h"
 #include "chrome/browser/web_applications/os_integration/web_app_shortcut_mac.h"
 #include "chrome/browser/web_applications/web_app_ui_manager.h"
@@ -194,7 +192,6 @@
 #if BUILDFLAG(IS_WIN)
 #include "base/test/test_reg_util_win.h"
 #include "base/win/shortcut.h"
-#include "chrome/browser/browser_process.h"
 #include "chrome/browser/web_applications/os_integration/web_app_handler_registration_utils_win.h"
 #include "chrome/installer/util/shell_util.h"
 #endif
@@ -1207,7 +1204,7 @@
   }
   MaybeNavigateTabbedBrowserInScope(site);
   bool open_in_window = options == WindowOptions::kWindowed;
-  chrome::SetAutoAcceptWebAppDialogForTesting(
+  SetAutoAcceptWebAppDialogForTesting(
       /*auto_accept=*/true,
       /*auto_open_in_window=*/open_in_window);
   WebAppTestInstallWithOsHooksObserver observer(profile());
@@ -1215,7 +1212,7 @@
   BrowserAddedWaiter browser_added_waiter;
   CHECK(chrome::ExecuteCommand(browser(), IDC_CREATE_SHORTCUT));
   active_app_id_ = observer.Wait();
-  chrome::SetAutoAcceptWebAppDialogForTesting(false, false);
+  SetAutoAcceptWebAppDialogForTesting(false, false);
   if (open_in_window) {
     browser_added_waiter.Wait();
     app_browser_ = browser_added_waiter.browser_added();
diff --git a/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc b/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc
index 5cd98da..c3865df4 100644
--- a/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_uninstall_dialog_view.cc
@@ -9,10 +9,10 @@
 #include "base/metrics/histogram_macros.h"
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/views/chrome_layout_provider.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/web_apps/web_app_info_image_source.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_command_scheduler.h"
 #include "chrome/browser/web_applications/web_app_icon_manager.h"
 #include "chrome/browser/web_applications/web_app_provider.h"
@@ -204,7 +204,7 @@
 BEGIN_METADATA(WebAppUninstallDialogDelegateView, views::DialogDelegateView)
 END_METADATA
 
-namespace chrome {
+namespace web_app {
 
 void ShowWebAppUninstallDialog(
     Profile* profile,
@@ -220,4 +220,4 @@
   view->ProcessAutoConfirmValue();
 }
 
-}  // namespace chrome
+}  // namespace web_app
diff --git a/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc b/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc
index 67d1af89a..9a3c2e2 100644
--- a/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc
+++ b/chrome/browser/ui/web_applications/create_shortcut_browsertest.cc
@@ -23,10 +23,10 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom-shared.h"
 #include "chrome/browser/web_applications/test/web_app_test_observers.h"
 #include "chrome/browser/web_applications/web_app.h"
@@ -70,12 +70,12 @@
 class CreateShortcutBrowserTest : public WebAppControllerBrowserTest {
  public:
   webapps::AppId InstallShortcutAppForCurrentUrl(bool open_as_window = false) {
-    chrome::SetAutoAcceptWebAppDialogForTesting(true, open_as_window);
+    SetAutoAcceptWebAppDialogForTesting(true, open_as_window);
     WebAppTestInstallObserver observer(profile());
     observer.BeginListening();
     CHECK(chrome::ExecuteCommand(browser(), IDC_CREATE_SHORTCUT));
     webapps::AppId app_id = observer.Wait();
-    chrome::SetAutoAcceptWebAppDialogForTesting(false, false);
+    SetAutoAcceptWebAppDialogForTesting(false, false);
     return app_id;
   }
 
diff --git a/chrome/browser/ui/web_applications/lacros_web_app_shelf_browsertest.cc b/chrome/browser/ui/web_applications/lacros_web_app_shelf_browsertest.cc
index bda7d69..6604d36 100644
--- a/chrome/browser/ui/web_applications/lacros_web_app_shelf_browsertest.cc
+++ b/chrome/browser/ui/web_applications/lacros_web_app_shelf_browsertest.cc
@@ -14,7 +14,6 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_navigator.h"
 #include "chrome/browser/ui/browser_tabstrip.h"
@@ -23,6 +22,7 @@
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/test/web_app_navigation_browsertest.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
 #include "chrome/browser/web_applications/test/web_app_test_observers.h"
@@ -355,7 +355,7 @@
     EXPECT_EQ(GetAppMenuCommandState(IDC_CREATE_SHORTCUT, browser()), kEnabled);
     EXPECT_EQ(GetAppMenuCommandState(IDC_INSTALL_PWA, browser()), kNotPresent);
 
-    chrome::SetAutoAcceptWebAppDialogForTesting(
+    SetAutoAcceptWebAppDialogForTesting(
         /*auto_accept=*/true,
         /*auto_open_in_window=*/true);
     ui_test_utils::BrowserChangeObserver browser_change_observer(
@@ -366,7 +366,7 @@
     app1_id = install_observer.Wait();
     app1_browser = browser_change_observer.Wait();
     EXPECT_TRUE(AppBrowserController::IsForWebApp(app1_browser, app1_id));
-    chrome::SetAutoAcceptWebAppDialogForTesting(
+    SetAutoAcceptWebAppDialogForTesting(
         /*auto_accept=*/false,
         /*auto_open_in_window=*/false);
   }
@@ -402,7 +402,7 @@
     EXPECT_EQ(GetAppMenuCommandState(IDC_CREATE_SHORTCUT, browser()), kEnabled);
     EXPECT_EQ(GetAppMenuCommandState(IDC_INSTALL_PWA, browser()), kEnabled);
 
-    chrome::SetAutoAcceptPWAInstallConfirmationForTesting(/*auto_accept=*/true);
+    SetAutoAcceptPWAInstallConfirmationForTesting(/*auto_accept=*/true);
     ui_test_utils::BrowserChangeObserver browser_change_observer(
         nullptr, ui_test_utils::BrowserChangeObserver::ChangeType::kAdded);
     WebAppTestInstallObserver observer(profile());
@@ -411,7 +411,7 @@
     app2_id = observer.Wait();
     app2_browser = browser_change_observer.Wait();
     EXPECT_TRUE(AppBrowserController::IsForWebApp(app2_browser, app2_id));
-    chrome::SetAutoAcceptPWAInstallConfirmationForTesting(
+    SetAutoAcceptPWAInstallConfirmationForTesting(
         /*auto_accept=*/false);
   }
 
diff --git a/chrome/browser/ui/web_applications/sub_apps_install_dialog_controller.cc b/chrome/browser/ui/web_applications/sub_apps_install_dialog_controller.cc
index eff10723..b96ba70 100644
--- a/chrome/browser/ui/web_applications/sub_apps_install_dialog_controller.cc
+++ b/chrome/browser/ui/web_applications/sub_apps_install_dialog_controller.cc
@@ -4,7 +4,7 @@
 
 #include "chrome/browser/ui/web_applications/sub_apps_install_dialog_controller.h"
 
-#include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
 #include "ui/views/widget/widget.h"
 
@@ -48,8 +48,8 @@
 
   callback_ = std::move(callback);
 
-  widget_ = chrome::CreateSubAppsInstallDialogWidget(
-      parent_app_name, parent_app_scope, sub_apps, window);
+  widget_ = CreateSubAppsInstallDialogWidget(parent_app_name, parent_app_scope,
+                                             sub_apps, window);
   widget_->AddObserver(this);
   widget_->Show();
 }
diff --git a/chrome/browser/ui/web_applications/sub_apps_install_dialog_controller_unittest.cc b/chrome/browser/ui/web_applications/sub_apps_install_dialog_controller_unittest.cc
index 7c44842..4220667 100644
--- a/chrome/browser/ui/web_applications/sub_apps_install_dialog_controller_unittest.cc
+++ b/chrome/browser/ui/web_applications/sub_apps_install_dialog_controller_unittest.cc
@@ -7,7 +7,7 @@
 #include "base/functional/callback_helpers.h"
 #include "base/test/test_future.h"
 #include "base/types/cxx23_to_underlying.h"
-#include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/test/web_app_icon_test_utils.h"
 #include "chrome/browser/web_applications/web_app_icon_generator.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
@@ -60,7 +60,7 @@
   sub_apps.emplace_back(CreateInstallInfoWithIconForSubApp(kSubAppName2));
   sub_apps.emplace_back(CreateInstallInfoWithIconForSubApp(kSubAppName3));
 
-  views::Widget* widget = chrome::CreateSubAppsInstallDialogWidget(
+  views::Widget* widget = CreateSubAppsInstallDialogWidget(
       kParentAppName, kParentAppScope, sub_apps, GetContext());
   views::DialogDelegate* dialog = widget->widget_delegate()->AsDialogDelegate();
 
diff --git a/chrome/browser/ui/web_applications/web_app_browsertest.cc b/chrome/browser/ui/web_applications/web_app_browsertest.cc
index 3acf6bd..3f0885f 100644
--- a/chrome/browser/ui/web_applications/web_app_browsertest.cc
+++ b/chrome/browser/ui/web_applications/web_app_browsertest.cc
@@ -44,7 +44,6 @@
 #include "chrome/browser/themes/theme_service_factory.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_navigator_params.h"
@@ -57,6 +56,7 @@
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/ui/web_applications/web_app_launch_utils.h"
 #include "chrome/browser/ui/web_applications/web_app_menu_model.h"
 #include "chrome/browser/ui/web_applications/web_app_ui_utils.h"
@@ -2045,13 +2045,13 @@
   // Install a non-promotable web app.
   NavigateToURLAndWait(
       browser(), https_server()->GetURL("/banners/no_manifest_test_page.html"));
-  chrome::SetAutoAcceptWebAppDialogForTesting(/*auto_accept=*/true,
-                                              /*auto_open_in_window=*/false);
+  SetAutoAcceptWebAppDialogForTesting(/*auto_accept=*/true,
+                                      /*auto_open_in_window=*/false);
   WebAppTestInstallObserver observer(profile());
   observer.BeginListening();
   CHECK(chrome::ExecuteCommand(browser(), IDC_CREATE_SHORTCUT));
   observer.Wait();
-  chrome::SetAutoAcceptWebAppDialogForTesting(false, false);
+  SetAutoAcceptWebAppDialogForTesting(false, false);
   // Loads with two apps.
   NavigateToURLAndWait(browser(), GURL("chrome://web-app-internals"));
 }
@@ -2065,13 +2065,13 @@
   EXPECT_EQ(GetAppMenuCommandState(IDC_INSTALL_PWA, browser()), kNotPresent);
 
   // Install using Create Shortcut.
-  chrome::SetAutoAcceptWebAppDialogForTesting(/*auto_accept=*/true,
-                                              /*auto_open_in_window=*/false);
+  SetAutoAcceptWebAppDialogForTesting(/*auto_accept=*/true,
+                                      /*auto_open_in_window=*/false);
   WebAppTestInstallObserver observer(profile());
   observer.BeginListening();
   CHECK(chrome::ExecuteCommand(browser(), IDC_CREATE_SHORTCUT));
   observer.Wait();
-  chrome::SetAutoAcceptWebAppDialogForTesting(false, false);
+  SetAutoAcceptWebAppDialogForTesting(false, false);
 
   // Navigate to this site again and install should still be disabled.
   Browser* new_browser = NavigateInNewWindowAndAwaitInstallabilityCheck(url);
@@ -2244,7 +2244,7 @@
   NavigateToURLAndWait(browser(), app_url);
 
   // Wait for OS hooks and installation to complete.
-  chrome::SetAutoAcceptWebAppDialogForTesting(true, true);
+  SetAutoAcceptWebAppDialogForTesting(true, true);
   base::RunLoop run_loop_install;
   WebAppInstallManagerObserverAdapter observer(profile());
   observer.SetWebAppInstalledWithOsHooksDelegate(
@@ -2257,7 +2257,7 @@
   const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser());
   run_loop_install.Run();
   content::RunAllTasksUntilIdle();
-  chrome::SetAutoAcceptWebAppDialogForTesting(false, false);
+  SetAutoAcceptWebAppDialogForTesting(false, false);
 
 #if BUILDFLAG(IS_WIN)
   const std::wstring prog_id =
@@ -2343,7 +2343,7 @@
   NavigateToURLAndWait(browser(), app_url);
 
   // Wait for OS hooks and installation to complete.
-  chrome::SetAutoAcceptWebAppDialogForTesting(true, true);
+  SetAutoAcceptWebAppDialogForTesting(true, true);
   base::RunLoop run_loop_install;
   WebAppInstallManagerObserverAdapter observer(profile());
   observer.SetWebAppInstalledWithOsHooksDelegate(
@@ -2353,7 +2353,7 @@
   const webapps::AppId app_id = test::InstallPwaForCurrentUrl(browser());
   run_loop_install.Run();
   content::RunAllTasksUntilIdle();
-  chrome::SetAutoAcceptWebAppDialogForTesting(false, false);
+  SetAutoAcceptWebAppDialogForTesting(false, false);
 
   // Simulate the user permanently denying file handling permission. Regression
   // test for crbug.com/1269387
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_utils.cc b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
index 6b372f6d..e53fe8a 100644
--- a/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
+++ b/chrome/browser/ui/web_applications/web_app_dialog_utils.cc
@@ -14,8 +14,8 @@
 #include "base/no_destructor.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/web_app_command_manager.h"
 #include "chrome/browser/web_applications/web_app_command_scheduler.h"
@@ -51,7 +51,7 @@
 void OnWebAppInstallShowInstallDialog(
     WebAppInstallFlow flow,
     webapps::WebappInstallSource install_source,
-    chrome::PwaInProductHelpState iph_state,
+    PwaInProductHelpState iph_state,
     std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
     content::WebContents* initiator_web_contents,
     std::unique_ptr<WebAppInstallInfo> web_app_info,
@@ -75,7 +75,7 @@
       if (webapps::AppBannerManager::FromWebContents(initiator_web_contents)
               ->screenshots()
               .size()) {
-        chrome::ShowWebAppDetailedInstallDialog(
+        ShowWebAppDetailedInstallDialog(
             initiator_web_contents, std::move(web_app_info),
             std::move(install_tracker), std::move(web_app_acceptance_callback),
             webapps::AppBannerManager::FromWebContents(initiator_web_contents)
@@ -83,10 +83,9 @@
             iph_state);
         return;
       } else {
-        chrome::ShowPWAInstallBubble(
-            initiator_web_contents, std::move(web_app_info),
-            std::move(install_tracker), std::move(web_app_acceptance_callback),
-            iph_state);
+        ShowPWAInstallBubble(initiator_web_contents, std::move(web_app_info),
+                             std::move(install_tracker),
+                             std::move(web_app_acceptance_callback), iph_state);
         return;
       }
     case WebAppInstallFlow::kCreateShortcut:
@@ -101,9 +100,9 @@
       }
 #endif
 
-      chrome::ShowWebAppInstallDialog(
-          initiator_web_contents, std::move(web_app_info),
-          std::move(install_tracker), std::move(web_app_acceptance_callback));
+      ShowWebAppInstallDialog(initiator_web_contents, std::move(web_app_info),
+                              std::move(install_tracker),
+                              std::move(web_app_acceptance_callback));
       return;
     case WebAppInstallFlow::kUnknown:
       NOTREACHED();
@@ -187,7 +186,7 @@
       install_source, web_contents->GetWeakPtr(),
       /*bypass_service_worker_check=*/false,
       base::BindOnce(OnWebAppInstallShowInstallDialog, flow, install_source,
-                     chrome::PwaInProductHelpState::kNotShown,
+                     PwaInProductHelpState::kNotShown,
                      std::move(install_tracker)),
       base::BindOnce(OnWebAppInstalled, std::move(callback)),
       /*use_fallback=*/true);
@@ -197,7 +196,7 @@
                               bool bypass_service_worker_check,
                               webapps::WebappInstallSource install_source,
                               WebAppInstalledCallback installed_callback,
-                              chrome::PwaInProductHelpState iph_state) {
+                              PwaInProductHelpState iph_state) {
   auto* provider = WebAppProvider::GetForWebContents(web_contents);
   if (!provider)
     return false;
diff --git a/chrome/browser/ui/web_applications/web_app_dialog_utils.h b/chrome/browser/ui/web_applications/web_app_dialog_utils.h
index 3f3af2c7..71baf12 100644
--- a/chrome/browser/ui/web_applications/web_app_dialog_utils.h
+++ b/chrome/browser/ui/web_applications/web_app_dialog_utils.h
@@ -6,7 +6,7 @@
 #define CHROME_BROWSER_UI_WEB_APPLICATIONS_WEB_APP_DIALOG_UTILS_H_
 
 #include "base/functional/callback_forward.h"
-#include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/web_app_id.h"
 #include "chrome/browser/web_applications/web_app_install_manager.h"
 #include "components/webapps/common/web_app_id.h"
@@ -46,12 +46,12 @@
 // a promotional banner or omnibox install icon.
 // Returns false if WebApps are disabled for the profile behind |web_contents|.
 // |iph_state| indicates whether or not in-product-help prompted this call.
-bool CreateWebAppFromManifest(content::WebContents* web_contents,
-                              bool bypass_service_worker_check,
-                              webapps::WebappInstallSource install_source,
-                              WebAppInstalledCallback installed_callback,
-                              chrome::PwaInProductHelpState iph_state =
-                                  chrome::PwaInProductHelpState::kNotShown);
+bool CreateWebAppFromManifest(
+    content::WebContents* web_contents,
+    bool bypass_service_worker_check,
+    webapps::WebappInstallSource install_source,
+    WebAppInstalledCallback installed_callback,
+    PwaInProductHelpState iph_state = PwaInProductHelpState::kNotShown);
 
 void SetInstalledCallbackForTesting(WebAppInstalledCallback callback);
 
diff --git a/chrome/browser/ui/web_applications/web_app_dialogs.h b/chrome/browser/ui/web_applications/web_app_dialogs.h
new file mode 100644
index 0000000..58a6344
--- /dev/null
+++ b/chrome/browser/ui/web_applications/web_app_dialogs.h
@@ -0,0 +1,176 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_WEB_APPLICATIONS_WEB_APP_DIALOGS_H_
+#define CHROME_BROWSER_UI_WEB_APPLICATIONS_WEB_APP_DIALOGS_H_
+
+#include <map>
+#include <memory>
+#include <string>
+#include <vector>
+
+#include "base/functional/callback.h"
+#include "build/build_config.h"
+#include "build/chromeos_buildflags.h"
+#include "chrome/browser/web_applications/web_app_callback_app_identity.h"
+#include "chrome/browser/web_applications/web_app_id.h"
+#include "chrome/browser/web_applications/web_app_install_info.h"
+#include "chrome/browser/web_applications/web_app_uninstall_dialog_user_options.h"
+#include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/gfx/native_widget_types.h"
+
+static_assert(BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+              BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_FUCHSIA));
+
+class GURL;
+class Profile;
+
+namespace base {
+class FilePath;
+}
+
+namespace content {
+class WebContents;
+}
+
+namespace views {
+class Widget;
+}  // namespace views
+
+namespace webapps {
+class MlInstallOperationTracker;
+enum class WebappUninstallSource;
+struct Screenshot;
+}  // namespace webapps
+
+namespace web_app {
+
+struct WebAppInstallInfo;
+
+// Callback used to indicate whether a user has accepted the installation of a
+// web app. The boolean parameter is true when the user accepts the dialog. The
+// WebAppInstallInfo parameter contains the information about the app,
+// possibly modified by the user.
+using AppInstallationAcceptanceCallback =
+    base::OnceCallback<void(bool, std::unique_ptr<WebAppInstallInfo>)>;
+
+// Shows the Web App install bubble.
+//
+// |web_app_info| is the WebAppInstallInfo being converted into an app.
+// |web_app_info.app_url| should contain a start url from a web app manifest
+// (for a Desktop PWA), or the current url (when creating a shortcut app).
+void ShowWebAppInstallDialog(
+    content::WebContents* web_contents,
+    std::unique_ptr<WebAppInstallInfo> web_app_info,
+    std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
+    AppInstallationAcceptanceCallback callback);
+
+// Creates a dialog that requests the consent from the user to install the
+// requested apps as sub apps to the named parent app. This is triggered by
+// an app calling the Multi App API add() function. The dialog is modal to
+// the browser containing the app calling the API. |sub_apps| contains the
+// information to represent each app to the user.
+views::Widget* CreateSubAppsInstallDialogWidget(
+    const std::string_view parent_app_name,
+    const std::string_view parent_app_scope,
+    const std::vector<std::unique_ptr<WebAppInstallInfo>>& sub_apps,
+    gfx::NativeWindow window);
+
+// When an app changes its icon or name, that is considered an app identity
+// change which (for some types of apps) needs confirmation from the user.
+// This function shows that confirmation dialog. |app_id| is the unique id of
+// the app that is updating and |title_change| and |icon_change| specify which
+// piece of information is changing. Can be one or the other, or both (but
+// both cannot be |false|). |old_title| and |new_title|, as well as |old_icon|
+// and |new_icon| show the 'before' and 'after' values. A response is sent
+// back via the |callback|.
+void ShowWebAppIdentityUpdateDialog(const std::string& app_id,
+                                    bool title_change,
+                                    bool icon_change,
+                                    const std::u16string& old_title,
+                                    const std::u16string& new_title,
+                                    const SkBitmap& old_icon,
+                                    const SkBitmap& new_icon,
+                                    content::WebContents* web_contents,
+                                    AppIdentityDialogCallback callback);
+
+// Shows the web app uninstallation dialog on a page whenever user has decided
+// to uninstall an installed dPWA from a variety of OS surfaces and chrome.
+void ShowWebAppUninstallDialog(
+    Profile* profile,
+    const webapps::AppId& app_id,
+    webapps::WebappUninstallSource uninstall_source,
+    gfx::NativeWindow parent,
+    std::map<SquareSizePx, SkBitmap> icon_bitmaps,
+    UninstallDialogCallback uninstall_dialog_result_callback);
+
+// Callback used to indicate whether a user has accepted the launch of a
+// web app. The |allowed| is true when the user allows the app to launch.
+// |remember_user_choice| is true if the user wants to persist the decision.
+using WebAppLaunchAcceptanceCallback =
+    base::OnceCallback<void(bool allowed, bool remember_user_choice)>;
+
+// Shows the pre-launch dialog for protocol handling PWA launch. The user can
+// allow or block the launch.
+void ShowWebAppProtocolLaunchDialog(
+    const GURL& url,
+    Profile* profile,
+    const webapps::AppId& app_id,
+    WebAppLaunchAcceptanceCallback close_callback);
+
+// Shows the pre-launch dialog for a file handling PWA launch. The user can
+// allow or block the launch.
+void ShowWebAppFileLaunchDialog(const std::vector<base::FilePath>& file_paths,
+                                Profile* profile,
+                                const webapps::AppId& app_id,
+                                WebAppLaunchAcceptanceCallback close_callback);
+// Sets whether |ShowWebAppDialog| should accept immediately without any
+// user interaction. |auto_open_in_window| sets whether the open in window
+// checkbox is checked.
+void SetAutoAcceptWebAppDialogForTesting(bool auto_accept,
+                                         bool auto_open_in_window);
+
+// Sets an override title for the installation.
+void SetOverrideTitleForTesting(const char* title_to_use);
+
+// Describes the state of in-product-help being shown to the user.
+enum class PwaInProductHelpState {
+  // The in-product-help bubble was shown.
+  kShown,
+  // The in-product-help bubble was not shown.
+  kNotShown
+};
+
+// Shows the PWA installation confirmation bubble anchored off the PWA install
+// icon in the omnibox.
+//
+// |web_app_info| is the WebAppInstallInfo to be installed.
+// |callback| is called when install bubble closed.
+// |iph_state| records whether PWA install iph is shown before Install bubble is
+// shown.
+void ShowPWAInstallBubble(
+    content::WebContents* web_contents,
+    std::unique_ptr<WebAppInstallInfo> web_app_info,
+    std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
+    AppInstallationAcceptanceCallback callback,
+    PwaInProductHelpState iph_state = PwaInProductHelpState::kNotShown);
+
+// Shows the Web App detailed install dialog.
+// The dialog shows app's detailed information including screenshots. Users then
+// confirm or cancel install in this dialog.
+void ShowWebAppDetailedInstallDialog(
+    content::WebContents* web_contents,
+    std::unique_ptr<WebAppInstallInfo> web_app_info,
+    std::unique_ptr<webapps::MlInstallOperationTracker> install_tracker,
+    AppInstallationAcceptanceCallback callback,
+    const std::vector<webapps::Screenshot>& screenshots,
+    PwaInProductHelpState iph_state = PwaInProductHelpState::kNotShown);
+
+// Sets whether |ShowPWAInstallBubble| should accept immediately without any
+// user interaction.
+void SetAutoAcceptPWAInstallConfirmationForTesting(bool auto_accept);
+
+}  // namespace web_app
+
+#endif  // CHROME_BROWSER_UI_WEB_APPLICATIONS_WEB_APP_DIALOGS_H_
diff --git a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
index 2225e1a..2b8e0294 100644
--- a/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
+++ b/chrome/browser/ui/web_applications/web_app_ui_manager_impl.cc
@@ -27,7 +27,6 @@
 #include "chrome/browser/apps/app_service/app_launch_params.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_navigator.h"
@@ -37,6 +36,7 @@
 #include "chrome/browser/ui/web_applications/app_browser_controller.h"
 #include "chrome/browser/ui/web_applications/commands/launch_web_app_command.h"
 #include "chrome/browser/ui/web_applications/web_app_dialog_utils.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/ui/web_applications/web_app_launch_utils.h"
 #include "chrome/browser/ui/web_applications/web_app_metrics.h"
 #include "chrome/browser/ui/web_applications/web_app_run_on_os_login_notification.h"
@@ -305,8 +305,8 @@
     const std::vector<base::FilePath>& file_paths,
     const webapps::AppId& app_id,
     WebAppLaunchAcceptanceCallback launch_callback) {
-  chrome::ShowWebAppFileLaunchDialog(file_paths, profile_, app_id,
-                                     std::move(launch_callback));
+  ::web_app::ShowWebAppFileLaunchDialog(file_paths, profile_, app_id,
+                                        std::move(launch_callback));
 }
 
 void WebAppUiManagerImpl::ShowWebAppIdentityUpdateDialog(
@@ -319,7 +319,7 @@
     const SkBitmap& new_icon,
     content::WebContents* web_contents,
     web_app::AppIdentityDialogCallback callback) {
-  chrome::ShowWebAppIdentityUpdateDialog(
+  ::web_app::ShowWebAppIdentityUpdateDialog(
       app_id, title_change, icon_change, old_title, new_title, old_icon,
       new_icon, web_contents, std::move(callback));
 }
@@ -545,7 +545,7 @@
     return;
   }
 
-  chrome::ShowWebAppUninstallDialog(
+  ShowWebAppUninstallDialog(
       profile_, app_id, uninstall_source, parent_window,
       std::move(icon_bitmaps),
       base::BindOnce(&WebAppUiManagerImpl::ScheduleUninstallIfUserRequested,
diff --git a/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.cc b/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.cc
index 0158ec0a..8b56957 100644
--- a/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.cc
+++ b/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_dialog.cc
@@ -442,23 +442,23 @@
 // the files before opening.
 void CloudOpenTask::OpenOrMoveFiles() {
   // Record the source volume type of the opened file.
-  int source_type;
+  OfficeFilesSourceVolume source_volume;
   if (UrlIsOnODFS(profile_, file_urls_.front())) {
-    source_type = static_cast<int>(OfficeFilesSourceVolume::kMicrosoftOneDrive);
+    source_volume = OfficeFilesSourceVolume::kMicrosoftOneDrive;
   } else {
     auto* volume_manager = file_manager::VolumeManager::Get(profile_);
     base::WeakPtr<file_manager::Volume> source =
         volume_manager->FindVolumeFromPath(file_urls_.front().path());
     if (source) {
-      source_type = source->type();
+      source_volume = VolumeTypeToSourceVolume(source->type());
     } else {
-      source_type = static_cast<int>(OfficeFilesSourceVolume::kUnknown);
+      source_volume = OfficeFilesSourceVolume::kUnknown;
     }
   }
   if (cloud_provider_ == CloudProvider::kGoogleDrive) {
-    UMA_HISTOGRAM_SPARSE(kDriveOpenSourceVolumeMetric, source_type);
+    UMA_HISTOGRAM_ENUMERATION(kDriveOpenSourceVolumeMetric, source_volume);
   } else if (cloud_provider_ == CloudProvider::kOneDrive) {
-    UMA_HISTOGRAM_SPARSE(kOneDriveOpenSourceVolumeMetric, source_type);
+    UMA_HISTOGRAM_ENUMERATION(kOneDriveOpenSourceVolumeMetric, source_volume);
   }
 
   if (cloud_provider_ == CloudProvider::kGoogleDrive &&
diff --git a/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_util.cc b/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_util.cc
index 9791144..45a4108 100644
--- a/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_util.cc
+++ b/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_util.cc
@@ -61,6 +61,43 @@
   return file_system_context->CrackURLInFirstPartyContext(url);
 }
 
+OfficeFilesSourceVolume VolumeTypeToSourceVolume(
+    file_manager::VolumeType volume_type) {
+  switch (volume_type) {
+    case file_manager::VOLUME_TYPE_GOOGLE_DRIVE:
+      return OfficeFilesSourceVolume::kGoogleDrive;
+    case file_manager::VOLUME_TYPE_DOWNLOADS_DIRECTORY:
+      return OfficeFilesSourceVolume::kDownloadsDirectory;
+    case file_manager::VOLUME_TYPE_REMOVABLE_DISK_PARTITION:
+      return OfficeFilesSourceVolume::kRemovableDiskPartition;
+    case file_manager::VOLUME_TYPE_MOUNTED_ARCHIVE_FILE:
+      return OfficeFilesSourceVolume::kMountedArchiveFile;
+    case file_manager::VOLUME_TYPE_PROVIDED:
+      return OfficeFilesSourceVolume::kProvided;
+    case file_manager::VOLUME_TYPE_MTP:
+      return OfficeFilesSourceVolume::kMtp;
+    case file_manager::VOLUME_TYPE_MEDIA_VIEW:
+      return OfficeFilesSourceVolume::kMediaView;
+    case file_manager::VOLUME_TYPE_CROSTINI:
+      return OfficeFilesSourceVolume::kCrostini;
+    case file_manager::VOLUME_TYPE_ANDROID_FILES:
+      return OfficeFilesSourceVolume::kAndriodFiles;
+    case file_manager::VOLUME_TYPE_DOCUMENTS_PROVIDER:
+      return OfficeFilesSourceVolume::kDocumentsProvider;
+    case file_manager::VOLUME_TYPE_SMB:
+      return OfficeFilesSourceVolume::kSmb;
+    case file_manager::VOLUME_TYPE_SYSTEM_INTERNAL:
+      return OfficeFilesSourceVolume::kSystemInternal;
+    case file_manager::VOLUME_TYPE_GUEST_OS:
+      return OfficeFilesSourceVolume::kGuestOS;
+    // TODO(b/304383409): remove default class after making VolumeType an enum
+    // class.
+    default:
+      LOG(ERROR) << "Unknown VolumeType " << volume_type;
+      return OfficeFilesSourceVolume::kUnknown;
+  }
+}
+
 SourceType GetSourceType(Profile* profile,
                          const storage::FileSystemURL& source_url) {
   file_manager::VolumeManager* volume_manager =
diff --git a/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_util.h b/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_util.h
index 8271837..3654d30 100644
--- a/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_util.h
+++ b/chrome/browser/ui/webui/ash/cloud_upload/cloud_upload_util.h
@@ -10,6 +10,7 @@
 #include "base/files/file_path.h"
 #include "base/functional/callback.h"
 #include "chrome/browser/ash/file_manager/io_task.h"
+#include "chrome/browser/ash/file_manager/volume.h"
 #include "chrome/browser/ash/file_system_provider/provided_file_system_interface.h"
 #include "chrome/browser/ash/file_system_provider/provider_interface.h"
 #include "chrome/browser/platform_util.h"
@@ -110,15 +111,28 @@
   kMaxValue = kEmailsDoNotMatch,
 };
 
-// Records the source volume that an office file is opened from. These values
-// represent the source volume types that are only relevant to office file
-// handling code - the rest are obtained from file_manager::VolumeType.
+// Records the source volume that an office file is opened from. The values up
+// to 12 must be kept in sync with file_manager::VolumeType.
 //
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
 enum class OfficeFilesSourceVolume {
+  kGoogleDrive = 0,
+  kDownloadsDirectory = 1,
+  kRemovableDiskPartition = 2,
+  kMountedArchiveFile = 3,
+  kProvided = 4,  // File system provided by FileSystemProvider API.
+  kMtp = 5,
+  kMediaView = 6,
+  kCrostini = 7,
+  kAndriodFiles = 8,
+  kDocumentsProvider = 9,
+  kSmb = 10,
+  kSystemInternal = 11,  // Internal volume never exposed to users.
+  kGuestOS = 12,         // Guest OS volumes (Crostini, Bruschetta, etc)
   kUnknown = 100,
   kMicrosoftOneDrive = 101,
+  kMaxValue = kMicrosoftOneDrive,
 };
 
 // List of UMA enum value for Web Drive Office task results. The enum values
@@ -232,6 +246,10 @@
     storage::FileSystemURL destination_folder_url,
     base::OnceCallback<void(base::File::Error)> complete_callback);
 
+// Converts the `volume_type` to the equivalent `OfficeFilesSourceVolume`.
+OfficeFilesSourceVolume VolumeTypeToSourceVolume(
+    ::file_manager::VolumeType volume_type);
+
 // Returns the type of the source location from which the file is getting
 // uploaded (see SourceType values).
 SourceType GetSourceType(Profile* profile,
diff --git a/chrome/browser/ui/webui/downloads/downloads_ui.cc b/chrome/browser/ui/webui/downloads/downloads_ui.cc
index 9a8570f..d8e9880 100644
--- a/chrome/browser/ui/webui/downloads/downloads_ui.cc
+++ b/chrome/browser/ui/webui/downloads/downloads_ui.cc
@@ -126,6 +126,15 @@
       {"controlKeepSuspicious", IDS_DOWNLOAD_KEEP_SUSPICIOUS_FILE},
       {"controlKeepUnverified", IDS_DOWNLOAD_KEEP_UNVERIFIED_FILE},
       {"controlKeepInsecure", IDS_DOWNLOAD_KEEP_INSECURE_FILE},
+
+      // Accessible labels for file icons.
+      {"accessibleLabelDangerous",
+       IDS_DOWNLOAD_DANGEROUS_ICON_ACCESSIBLE_LABEL},
+      {"accessibleLabelSuspicious",
+       IDS_DOWNLOAD_SUSPICIOUS_ICON_ACCESSIBLE_LABEL},
+      {"accessibleLabelInsecure", IDS_DOWNLOAD_INSECURE_ICON_ACCESSIBLE_LABEL},
+      {"accessibleLabelUnverified",
+       IDS_DOWNLOAD_UNVERIFIED_ICON_ACCESSIBLE_LABEL},
   };
   source->AddLocalizedStrings(kStrings);
 
diff --git a/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc b/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
index ca963fa..2d165615 100644
--- a/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
+++ b/chrome/browser/ui/webui/print_preview/pdf_printer_handler.cc
@@ -519,7 +519,7 @@
   // Prompts the user to select the file.
   ui::SelectFileDialog::FileTypeInfo file_type_info;
   file_type_info.extensions.resize(1);
-  file_type_info.extensions[0].push_back(FILE_PATH_LITERAL("pdf"));
+  file_type_info.extensions[0].push_back(kPdfExtension);
   file_type_info.include_all_files = true;
   // Print Preview requires native paths to write PDF files.
   // Note that Chrome OS save-as dialog has Google Drive as a saving location
@@ -533,7 +533,7 @@
       ui::SelectFileDialog::Create(this, nullptr /*policy already checked*/);
   select_file_dialog_->SelectFile(
       ui::SelectFileDialog::SELECT_SAVEAS_FILE, std::u16string(), path,
-      &file_type_info, 0, base::FilePath::StringType(),
+      &file_type_info, 0, kPdfExtension,
       platform_util::GetTopLevel(preview_web_contents_->GetNativeView()),
       nullptr);
 }
diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc
index 84ac672..c38a207b 100644
--- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc
+++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc
@@ -19,8 +19,10 @@
 #include "base/test/mock_callback.h"
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/browser_features.h"
+#include "chrome/browser/optimization_guide/mock_optimization_guide_keyed_service.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
+#include "chrome/browser/prefs/browser_prefs.h"
 #include "chrome/browser/search/background/ntp_background_data.h"
 #include "chrome/browser/search/background/ntp_background_service_factory.h"
 #include "chrome/browser/search/background/ntp_custom_background_service.h"
@@ -37,12 +39,14 @@
 #include "chrome/common/pref_names.h"
 #include "chrome/grit/generated_resources.h"
 #include "chrome/test/base/test_browser_window.h"
+#include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/optimization_guide/core/optimization_guide_features.h"
 #include "components/optimization_guide/proto/model_execution.pb.h"
 #include "components/optimization_guide/proto/wallpaper_search.pb.h"
 #include "components/prefs/pref_service.h"
+#include "components/prefs/testing_pref_service.h"
 #include "components/search/ntp_features.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_task_environment.h"
@@ -226,20 +230,6 @@
   ThemeHelper theme_helper_;
 };
 
-class MockOptimizationGuideKeyedService : public OptimizationGuideKeyedService {
- public:
-  explicit MockOptimizationGuideKeyedService(content::BrowserContext* context)
-      : OptimizationGuideKeyedService(context) {}
-  MOCK_METHOD(
-      void,
-      ExecuteModel,
-      (optimization_guide::proto::ModelExecutionFeature,
-       const google::protobuf::MessageLite&,
-       optimization_guide::OptimizationGuideModelExecutionResultCallback));
-
-  bool ComponentUpdatesEnabledProvider() const override { return false; }
-};
-
 std::unique_ptr<TestingProfile> MakeTestingProfile(
     scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) {
   TestingProfile::Builder profile_builder;
@@ -292,6 +282,8 @@
                     profile_.get()))) {}
 
   void SetUp() override {
+    TestingBrowserProcess::GetGlobal()->SetLocalState(&local_state_);
+    RegisterLocalState(local_state_.registry());
     EXPECT_CALL(mock_ntp_background_service(), AddObserver)
         .Times(1)
         .WillOnce(SaveArg<0>(&ntp_background_service_observer_));
@@ -316,12 +308,14 @@
     browser_ = std::unique_ptr<Browser>(Browser::Create(browser_params));
 
     scoped_feature_list_.Reset();
+    task_environment_.RunUntilIdle();
   }
 
   void TearDown() override {
     browser_->tab_strip_model()->CloseAllTabs();
     browser_.reset();
     browser_window_.reset();
+    TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr);
   }
 
   TestingProfile& profile() { return *profile_; }
@@ -348,6 +342,7 @@
   // NOTE: The initialization order of these members matters.
   content::BrowserTaskEnvironment task_environment_;
   std::unique_ptr<TestingProfile> profile_;
+  TestingPrefServiceSimple local_state_;
   testing::NiceMock<MockNtpCustomBackgroundService>
       mock_ntp_custom_background_service_;
   // This field is not a raw_ptr<> because it was filtered by the rewriter for:
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc
index e966c8ac..0773bf55 100644
--- a/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc
+++ b/chrome/browser/ui/webui/tab_strip/tab_strip_ui_util.cc
@@ -184,14 +184,21 @@
   drop_data.GetPickledData(ui::ClipboardFormatType::WebCustomDataType(),
                            &pickle);
 
-  ui::ReadCustomDataForType(pickle.data(), pickle.size(), kWebUITabIdDataType,
-                            tab_id_str);
-  if (tab_id_str->empty()) {
-    ui::ReadCustomDataForType(pickle.data(), pickle.size(),
-                              kWebUITabGroupIdDataType, group_id_str);
+  if (absl::optional<std::u16string> maybe_tab_id =
+          ui::ReadCustomDataForType(pickle, kWebUITabIdDataType);
+      maybe_tab_id && !maybe_tab_id->empty()) {
+    *tab_id_str = std::move(*maybe_tab_id);
+    return true;
   }
 
-  return !tab_id_str->empty() || !group_id_str->empty();
+  if (absl::optional<std::u16string> maybe_group_id =
+          ui::ReadCustomDataForType(pickle, kWebUITabGroupIdDataType);
+      maybe_group_id && !maybe_group_id->empty()) {
+    *group_id_str = std::move(*maybe_group_id);
+    return true;
+  }
+
+  return false;
 }
 
 }  // namespace tab_strip_ui
diff --git a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
index 292324b..e49abd9 100644
--- a/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
+++ b/chrome/browser/web_applications/manifest_update_manager_browsertest.cc
@@ -39,13 +39,13 @@
 #include "chrome/app/chrome_command_ids.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/web_applications/test/isolated_web_app_test_utils.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
 #include "chrome/browser/ui/web_applications/web_app_browser_controller.h"
 #include "chrome/browser/ui/web_applications/web_app_controller_browsertest.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/external_install_options.h"
 #include "chrome/browser/web_applications/externally_managed_app_manager.h"
 #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_info.h"
@@ -4460,16 +4460,16 @@
       Browser* browser,
       bool open_as_window = false,
       const char* override_title = nullptr) {
-    chrome::SetAutoAcceptWebAppDialogForTesting(
+    SetAutoAcceptWebAppDialogForTesting(
         /*auto_accept=*/true,
         /*auto_open_in_window=*/open_as_window);
-    chrome::SetOverrideTitleForTesting(override_title);
+    SetOverrideTitleForTesting(override_title);
     WebAppTestInstallWithOsHooksObserver observer(browser->profile());
     observer.BeginListening();
     CHECK(chrome::ExecuteCommand(browser, IDC_CREATE_SHORTCUT));
     webapps::AppId app_id = observer.Wait();
-    chrome::SetAutoAcceptWebAppDialogForTesting(false, false);
-    chrome::SetOverrideTitleForTesting(nullptr);
+    SetAutoAcceptWebAppDialogForTesting(false, false);
+    SetOverrideTitleForTesting(nullptr);
     return app_id;
   }
 
@@ -4700,7 +4700,7 @@
 
   base::RunLoop run_loop;
 
-  chrome::ShowWebAppIdentityUpdateDialog(
+  ShowWebAppIdentityUpdateDialog(
       app_id,
       /* title_change= */ true,
       /* icon_change= */ false, u"old_title", u"new_title",
diff --git a/chrome/browser/web_applications/test/web_app_test_utils.cc b/chrome/browser/web_applications/test/web_app_test_utils.cc
index faa09324..7c1811b 100644
--- a/chrome/browser/web_applications/test/web_app_test_utils.cc
+++ b/chrome/browser/web_applications/test/web_app_test_utils.cc
@@ -38,7 +38,7 @@
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_commands.h"
-#include "chrome/browser/ui/browser_dialogs.h"
+#include "chrome/browser/ui/web_applications/web_app_dialogs.h"
 #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_location.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/proto/web_app_os_integration_state.pb.h"
@@ -968,14 +968,14 @@
 
 webapps::AppId InstallPwaForCurrentUrl(Browser* browser) {
   // Depending on the installability criteria, different dialogs can be used.
-  chrome::SetAutoAcceptWebAppDialogForTesting(true, true);
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
+  SetAutoAcceptWebAppDialogForTesting(true, true);
+  SetAutoAcceptPWAInstallConfirmationForTesting(true);
   WebAppTestInstallWithOsHooksObserver observer(browser->profile());
   observer.BeginListening();
   CHECK(chrome::ExecuteCommand(browser, IDC_INSTALL_PWA));
   webapps::AppId app_id = observer.Wait();
-  chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
-  chrome::SetAutoAcceptWebAppDialogForTesting(false, false);
+  SetAutoAcceptPWAInstallConfirmationForTesting(false);
+  SetAutoAcceptWebAppDialogForTesting(false, false);
   return app_id;
 }
 
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index b8d6b32..b454046b 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1696873882-5fcf5e48e1cc525d0a00300529617716e2bd1b23.profdata
+chrome-android32-main-1696892773-082be0591d8f058564398a623b78d39701b9ede1.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 6fd90b4..4cbb467 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1696873882-e38d36fc8704a6a26ba33bca22031d93b3c4b5a7.profdata
+chrome-android64-main-1696892773-75c57050ecb05acdd4a96aefb39411de0772a58f.profdata
diff --git a/chrome/build/lacros64.pgo.txt b/chrome/build/lacros64.pgo.txt
index 37ff9d8..6551e71b 100644
--- a/chrome/build/lacros64.pgo.txt
+++ b/chrome/build/lacros64.pgo.txt
@@ -1 +1 @@
-chrome-chromeos-amd64-generic-main-1696852600-2a64014178360799db5dc0850185a67f4cc7b6a8.profdata
+chrome-chromeos-amd64-generic-main-1696892773-3bda6ed7b1ef84fcbd2205d0cb7f13e6358e30ff.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 45319a5b..bb0e2a5 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1696852600-5424f507b723f71878ff9e8527f4a98828bef4ce.profdata
+chrome-linux-main-1696892773-55b13d340dc80b42f3aa9172d140567d3cf3d88b.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index c002cdd..258627ea 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1696873882-3abac10e15b87a20765bbd2aea6708c86ee1f337.profdata
+chrome-mac-arm-main-1696903089-a0deda634bc563a9c1fe5f601e4730da51aa34eb.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 1ee5b0c9..15cf8a4 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1696852600-0f13718aedc9358d3253eabc5f24080d407065f2.profdata
+chrome-mac-main-1696892773-e945e6e02003a60286317f75fbcd2c1ea7b9614e.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 7c8a3057..0470463 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1696873882-12286c80b678d352ae027c3b7f6c08a4f7ab33f3.profdata
+chrome-win-arm64-main-1696892773-fc74a078be050c0234eeb151792b6e895bc11241.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 9097b04c..e5a0426 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1696863453-8e4a72fca14ccb84f609b5497fd79be80f8797a8.profdata
+chrome-win32-main-1696885193-e0c1afd7cd1f5b72f4707b084a6683150aff24e7.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 0c992f69..af13b21 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1696863453-94ed2f8af800dcb502e204d1ada6eb2b75580d63.profdata
+chrome-win64-main-1696892773-08c02187a27ae58b8a69257db7be2369081327b8.profdata
diff --git a/chrome/common/extensions/api/_permission_features.json b/chrome/common/extensions/api/_permission_features.json
index 6ad72cd..aff483f8 100644
--- a/chrome/common/extensions/api/_permission_features.json
+++ b/chrome/common/extensions/api/_permission_features.json
@@ -308,7 +308,14 @@
     "location": "external_component",
     "platforms": ["chromeos"],
     "allowlist": [
-      "EC8EA268128FECE14CEC68B90686D87755D87083",  // http://crbug.com/854695
+      "EC8EA268128FECE14CEC68B90686D87755D87083"   // http://crbug.com/854695
+    ]
+  },
+  {
+    "channel": "stable",
+    "platforms": ["chromeos", "lacros"],
+    "extension_types": ["extension"],
+    "allowlist": [
       "A4CC6F00ACF41015AF38F1D5C98E97C2B8B3B320",  // http://crbug.com/1483151
       "4E09F1C1EEC4D27F1F7DF18BA3643307107A7C41"   // http://crbug.com/1483151
     ]
diff --git a/chrome/common/profiler/thread_profiler.cc b/chrome/common/profiler/thread_profiler.cc
index 560e2329..f98d195 100644
--- a/chrome/common/profiler/thread_profiler.cc
+++ b/chrome/common/profiler/thread_profiler.cc
@@ -253,7 +253,12 @@
               process_, thread,
               CallStackProfileParams::Trigger::kProcessStartup),
           work_id_recorder_.get()),
+#if BUILDFLAG(IS_ANDROID)
+      CreateCoreUnwindersFactory(
+          ThreadProfilerConfiguration::Get()->IsJavaNameHashingEnabled()),
+#else
       CreateCoreUnwindersFactory(),
+#endif  // BUILDFLAG(IS_ANDROID)
       GetApplyPerSampleMetadataCallback(process_));
 
   startup_profiler_->Start();
@@ -322,7 +327,12 @@
           base::BindOnce(&ThreadProfiler::OnPeriodicCollectionCompleted,
                          owning_thread_task_runner_,
                          weak_factory_.GetWeakPtr())),
+#if BUILDFLAG(IS_ANDROID)
+      CreateCoreUnwindersFactory(
+          ThreadProfilerConfiguration::Get()->IsJavaNameHashingEnabled()),
+#else
       CreateCoreUnwindersFactory(),
+#endif  // BUILDFLAG(IS_ANDROID)
       GetApplyPerSampleMetadataCallback(process_));
   if (aux_unwinder_factory_)
     periodic_profiler_->AddAuxUnwinder(aux_unwinder_factory_.Run());
diff --git a/chrome/common/profiler/thread_profiler_configuration.cc b/chrome/common/profiler/thread_profiler_configuration.cc
index f74e02a6..a5d6b6f 100644
--- a/chrome/common/profiler/thread_profiler_configuration.cc
+++ b/chrome/common/profiler/thread_profiler_configuration.cc
@@ -112,6 +112,12 @@
       *group_name = "Control";
       break;
 
+#if BUILDFLAG(IS_ANDROID)
+    case kProfileEnabledWithJavaNameHashing:
+      *group_name = "EnabledWithJavaNameHashing";
+      break;
+#endif  // BUILDFLAG(IS_ANDROID)
+
     case kProfileEnabled:
       *group_name = "Enabled";
       break;
@@ -151,6 +157,13 @@
   }
 }
 
+#if BUILDFLAG(IS_ANDROID)
+bool ThreadProfilerConfiguration::IsJavaNameHashingEnabled() const {
+  const auto& config = absl::get<BrowserProcessConfiguration>(configuration_);
+  return config.variation_group == kProfileEnabledWithJavaNameHashing;
+}
+#endif  // BUILDFLAG(IS_ANDROID)
+
 ThreadProfilerConfiguration::ThreadProfilerConfiguration()
     : platform_configuration_(ThreadProfilerPlatformConfiguration::Create(
           IsBrowserTestModeEnabled())),
@@ -163,8 +176,12 @@
     absl::optional<VariationGroup> variation_group) {
   // Enable if assigned to a variation group, and the group is one of the groups
   // that are to be enabled.
-  return variation_group.has_value() && (*variation_group == kProfileEnabled ||
-                                         *variation_group == kProfileControl);
+  return variation_group.has_value() &&
+         (*variation_group == kProfileEnabled ||
+#if BUILDFLAG(IS_ANDROID)
+          *variation_group == kProfileEnabledWithJavaNameHashing ||
+#endif  // BUILDFLAG(IS_ANDROID)
+          *variation_group == kProfileControl);
 }
 
 // static
@@ -227,6 +244,17 @@
   const absl::optional<metrics::CallStackProfileParams::Process>
       process_type_to_sample = platform_configuration.ChooseEnabledProcess();
 
+#if BUILDFLAG(IS_ANDROID)
+  CHECK_EQ(0, relative_populations.experiment % 3);
+  return {ChooseVariationGroup({
+              {kProfileEnabled, relative_populations.enabled},
+              {kProfileControl, relative_populations.experiment / 3},
+              {kProfileEnabledWithJavaNameHashing,
+               relative_populations.experiment / 3},
+              {kProfileDisabled, relative_populations.experiment / 3},
+          }),
+          process_type_to_sample};
+#else
   CHECK_EQ(0, relative_populations.experiment % 2);
   return {ChooseVariationGroup({
               {kProfileEnabled, relative_populations.enabled},
@@ -234,6 +262,7 @@
               {kProfileDisabled, relative_populations.experiment / 2},
           }),
           process_type_to_sample};
+#endif
 }
 
 // static
diff --git a/chrome/common/profiler/thread_profiler_configuration.h b/chrome/common/profiler/thread_profiler_configuration.h
index fca7d26..c1d94f54 100644
--- a/chrome/common/profiler/thread_profiler_configuration.h
+++ b/chrome/common/profiler/thread_profiler_configuration.h
@@ -60,6 +60,10 @@
   void AppendCommandLineSwitchForChildProcess(
       base::CommandLine* command_line) const;
 
+#if BUILDFLAG(IS_ANDROID)
+  bool IsJavaNameHashingEnabled() const;
+#endif  // BUILDFLAG(IS_ANDROID)
+
  private:
   friend base::NoDestructor<ThreadProfilerConfiguration>;
 
@@ -77,6 +81,13 @@
     // kProfileDisabled group).
     kProfileControl,
 
+#if BUILDFLAG(IS_ANDROID)
+    // Enabled within the experiment (and paired with equal-sized
+    // kProfileDisabled and kProfileControl groups). Java names will be
+    // hashed within this group.
+    kProfileEnabledWithJavaNameHashing,
+#endif  // BUILDFLAG(IS_ANDROID)
+
     // Enabled outside of the experiment.
     kProfileEnabled,
   };
diff --git a/chrome/common/profiler/thread_profiler_platform_configuration.cc b/chrome/common/profiler/thread_profiler_platform_configuration.cc
index f15bb9c..39bb24de 100644
--- a/chrome/common/profiler/thread_profiler_platform_configuration.cc
+++ b/chrome/common/profiler/thread_profiler_platform_configuration.cc
@@ -57,7 +57,14 @@
 
   if (!release_channel) {
     // This is a local/CQ build.
+#if BUILDFLAG(IS_ANDROID)
+    // This is temporary, in order to run the Java Name Hashing field trial.
+    //
+    // TODO(crbug.com/1475718): Remove this once the field trial is done.
+    return RelativePopulations{99, 1};
+#else
     return RelativePopulations{100, 0};
+#endif  // BUILDFLAG(IS_ANDROID)
   }
 
 #if BUILDFLAG(IS_CHROMEOS)
@@ -71,7 +78,14 @@
   CHECK(*release_channel == version_info::Channel::CANARY ||
         *release_channel == version_info::Channel::DEV);
 
+#if BUILDFLAG(IS_ANDROID)
+  // This is temporary, in order to run the Java Name Hashing field trial.
+  //
+  // TODO(crbug.com/1475718): Remove this once the field trial is done.
+  return RelativePopulations{81, 19};
+#else
   return RelativePopulations{80, 20};
+#endif  // BUILDFLAG(IS_ANDROID)
 }
 
 double DefaultPlatformConfiguration::GetChildProcessPerExecutionEnableFraction(
diff --git a/chrome/common/profiler/unwind_util.cc b/chrome/common/profiler/unwind_util.cc
index c724af3a..74a4b123 100644
--- a/chrome/common/profiler/unwind_util.cc
+++ b/chrome/common/profiler/unwind_util.cc
@@ -122,7 +122,8 @@
 
 #if ANDROID_UNWINDING_SUPPORTED
 std::vector<std::unique_ptr<base::Unwinder>> CreateCoreUnwinders(
-    stack_unwinder::Module* const stack_unwinder_module) {
+    stack_unwinder::Module* const stack_unwinder_module,
+    bool is_java_name_hashing_enabled) {
   CHECK_NE(getpid(), gettid());
 
   static base::NoDestructor<NativeUnwinderAndroidMapDelegateImpl> map_delegate(
@@ -137,7 +138,7 @@
   std::vector<std::unique_ptr<base::Unwinder>> unwinders;
   unwinders.push_back(stack_unwinder_module->CreateNativeUnwinder(
       map_delegate.get(), reinterpret_cast<uintptr_t>(&__executable_start),
-      /*is_java_name_hashing_enabled=*/false));
+      is_java_name_hashing_enabled));
   unwinders.push_back(chrome_unwinder_creator->Create());
   return unwinders;
 }
@@ -244,12 +245,18 @@
 }
 #endif  // ANDROID_UNWINDING_SUPPORTED
 
+#if BUILDFLAG(IS_ANDROID)
+base::StackSamplingProfiler::UnwindersFactory CreateCoreUnwindersFactory(
+    bool is_java_name_hashing_enabled) {
+#else
 base::StackSamplingProfiler::UnwindersFactory CreateCoreUnwindersFactory() {
+#endif  // BUILDFLAG(IS_ANDROID)
   if (!AreUnwindPrerequisitesAvailable(chrome::GetChannel())) {
     return base::StackSamplingProfiler::UnwindersFactory();
   }
 #if ANDROID_UNWINDING_SUPPORTED
-  return base::BindOnce(CreateCoreUnwinders, GetOrLoadModule());
+  return base::BindOnce(CreateCoreUnwinders, GetOrLoadModule(),
+                        is_java_name_hashing_enabled);
 #else   // ANDROID_UNWINDING_SUPPORTED
   return base::StackSamplingProfiler::UnwindersFactory();
 #endif  // ANDROID_UNWINDING_SUPPORTED
diff --git a/chrome/common/profiler/unwind_util.h b/chrome/common/profiler/unwind_util.h
index 00bac04..fc4bf51e 100644
--- a/chrome/common/profiler/unwind_util.h
+++ b/chrome/common/profiler/unwind_util.h
@@ -56,7 +56,12 @@
     version_info::Channel channel,
     UnwindPrerequisitesDelegate* prerequites_delegate = nullptr);
 
+#if BUILDFLAG(IS_ANDROID)
+base::StackSamplingProfiler::UnwindersFactory CreateCoreUnwindersFactory(
+    bool is_java_name_hashing_enabled);
+#else
 base::StackSamplingProfiler::UnwindersFactory CreateCoreUnwindersFactory();
+#endif  // BUILDFLAG(IS_ANDROID)
 
 base::StackSamplingProfiler::UnwindersFactory
 CreateLibunwindstackUnwinderFactory();
diff --git a/chrome/gpu/chrome_content_gpu_client.cc b/chrome/gpu/chrome_content_gpu_client.cc
index ac6e6df..55afaf0 100644
--- a/chrome/gpu/chrome_content_gpu_client.cc
+++ b/chrome/gpu/chrome_content_gpu_client.cc
@@ -125,10 +125,16 @@
   // We pass in CreateCoreUnwindersFactory here since it lives in the chrome/
   // layer while TracingSamplerProfiler is outside of chrome/.
   task_runner->PostTask(
-      FROM_HERE,
-      base::BindOnce(&tracing::TracingSamplerProfiler::
-                         CreateOnChildThreadWithCustomUnwinders,
-                     base::BindRepeating(&CreateCoreUnwindersFactory)));
+      FROM_HERE, base::BindOnce(&tracing::TracingSamplerProfiler::
+                                    CreateOnChildThreadWithCustomUnwinders,
+#if BUILDFLAG(IS_ANDROID)
+                                base::BindRepeating(
+                                    &CreateCoreUnwindersFactory,
+                                    /*is_java_name_hashing_enabled=*/false)));
+#else
+                                base::BindRepeating(
+                                    &CreateCoreUnwindersFactory)));
+#endif  // BUILDFLAG(IS_ANDROID)
 }
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/installer/setup/setup_main.cc b/chrome/installer/setup/setup_main.cc
index d7e98f17..f581e41c 100644
--- a/chrome/installer/setup/setup_main.cc
+++ b/chrome/installer/setup/setup_main.cc
@@ -18,8 +18,10 @@
 #include <string>
 
 #include "base/at_exit.h"
+#include "base/clang_profiling_buildflags.h"
 #include "base/command_line.h"
 #include "base/dcheck_is_on.h"
+#include "base/debug/alias.h"
 #include "base/debug/handle_hooks_win.h"
 #include "base/file_version_info.h"
 #include "base/files/file_path.h"
@@ -104,6 +106,10 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "url/gurl.h"
 
+#if BUILDFLAG(CLANG_PROFILING)
+#include "base/test/clang_profiling.h"
+#endif
+
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
 #include "chrome/installer/util/google_update_util.h"
 #endif
@@ -1723,8 +1729,37 @@
                     HINSTANCE prev_instance,
                     wchar_t* command_line,
                     int show_command) {
+  const auto process_exit_code = SetupMain();
+
   // https://crbug.com/896565: Graceful shutdown sometimes fails for reasons out
   // of the installer's control. Crashes from such failures are inactionable, so
-  // terminate the process forthwith.
-  base::Process::TerminateCurrentProcessImmediately(SetupMain());
+  // terminate the process forthwith. Do not use
+  // base::Process::TerminateCurrentProcessImmediately because it will crash the
+  // process with int 3 in cases where ::TerminateProcess returns; see
+  // https://crbug.com/1489598. It is better for the installer to try to return
+  // the actual exit code (risking the original crash).
+#if BUILDFLAG(CLANG_PROFILING)
+  base::WriteClangProfilingProfile();
+#endif
+
+  ::SetLastError(ERROR_SUCCESS);
+  const auto terminate_result = ::TerminateProcess(
+      ::GetCurrentProcess(), static_cast<UINT>(process_exit_code));
+
+  // It is unexpected that this code is reached. In the event that it is,
+  // capture error information left behind by TerminateProcess in case the
+  // process crashes during exit and put it on the stack in the hopes that
+  // we can find it in a post-return crash dump.
+  const auto terminate_error_code = ::GetLastError();
+
+  DWORD exit_codes[] = {
+      0xDEADBECF,
+      static_cast<DWORD>(process_exit_code),
+      static_cast<DWORD>(terminate_result),
+      terminate_error_code,
+      0xDEADBEDF,
+  };
+  base::debug::Alias(exit_codes);
+
+  return process_exit_code;
 }
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc
index 7564daae..77519431 100644
--- a/chrome/renderer/chrome_content_renderer_client.cc
+++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -1377,7 +1377,11 @@
       FROM_HERE,
       base::BindOnce(&tracing::TracingSamplerProfiler::
                          CreateOnChildThreadWithCustomUnwinders,
+#if BUILDFLAG(IS_ANDROID)
+                     base::BindRepeating(&CreateCoreUnwindersFactory, false)));
+#else
                      base::BindRepeating(&CreateCoreUnwindersFactory)));
+#endif  // BUILDFLAG(IS_ANDROID)
 }
 
 bool ChromeContentRendererClient::RunIdleHandlerWhenWidgetsHidden() {
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index ed26b64e..6fea1dfd 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -454,6 +454,7 @@
     "//ui/gl",
   ]
 
+  data = []
   data_deps = []
 
   if (enable_pdf) {
@@ -688,6 +689,17 @@
       "base/chromeos/crosier/crosier_util.cc",
       "base/chromeos/crosier/crosier_util.h",
     ]
+
+    if (is_chrome_branded) {
+      sources += [
+        "base/chromeos/crosier/test_accounts.cc",
+        "base/chromeos/crosier/test_accounts.h",
+      ]
+      data += [
+        "../browser/internal/resources/chromeos/crosier/test_accounts.json",
+      ]
+    }
+
     deps += [
       "base/chromeos/crosier:proto",
       "//base/test:proto_test_support",
@@ -1032,6 +1044,10 @@
         "base/chromeos/crosier/interactive_ash_test_uitest.cc",
       ]
 
+      if (is_chrome_branded) {
+        sources += [ "base/chromeos/crosier/test_accounts_test.cc" ]
+      }
+
       deps += [
         "//chrome/test/base/chromeos/crosier:proto",
         "//chrome/test/base/chromeos/crosier/helper:common",
@@ -1628,6 +1644,8 @@
       "//components/commerce/core:feature_list",
       "//components/commerce/core:shopping_service_test_support",
       "//components/component_updater/installer_policies:installer_policies_no_content_deps",
+      "//components/compose:buildflags",
+      "//components/compose/core/browser:features",
       "//components/constrained_window",
       "//components/content_settings/browser",
       "//components/content_settings/common:mojom",
@@ -7626,6 +7644,7 @@
       "../browser/ui/serial/serial_chooser_controller_unittest.cc",
       "../browser/ui/side_panel/companion/companion_utils_unittest.cc",
       "../browser/ui/side_panel/companion/exps_registration_success_observer_unittest.cc",
+      "../browser/ui/side_panel/side_panel_entry_key_unittest.cc",
       "../browser/ui/singleton_tabs_unittest.cc",
       "../browser/ui/startup/launch_mode_recorder_unittest.cc",
       "../browser/ui/sync/sync_promo_ui_unittest.cc",
@@ -7638,6 +7657,7 @@
       "../browser/ui/tabs/existing_window_sub_menu_model_unittest.cc",
       "../browser/ui/tabs/organization/tab_organization_service_unittest.cc",
       "../browser/ui/tabs/organization/tab_organization_unittest.cc",
+      "../browser/ui/tabs/organization/trigger_observer_unittest.cc",
       "../browser/ui/tabs/organization/trigger_unittest.cc",
       "../browser/ui/tabs/pinned_tab_codec_unittest.cc",
       "../browser/ui/tabs/pinned_tab_service_unittest.cc",
@@ -9706,6 +9726,7 @@
       "../browser/ui/views/tabs/tab_hover_card_controller_unittest.cc",
       "../browser/ui/views/tabs/tab_organization_button_unittest.cc",
       "../browser/ui/views/tabs/tab_search_container_unittest.cc",
+      "../browser/ui/views/tabs/tab_strip_control_button_unittest.cc",
       "../browser/ui/views/tabs/tab_strip_layout_unittest.cc",
       "../browser/ui/views/tabs/tab_strip_scroll_container_unittest.cc",
       "../browser/ui/views/tabs/tab_strip_scroll_session_unittest.cc",
diff --git a/chrome/test/base/chromeos/crosier/test_accounts.cc b/chrome/test/base/chromeos/crosier/test_accounts.cc
new file mode 100644
index 0000000..e353963
--- /dev/null
+++ b/chrome/test/base/chromeos/crosier/test_accounts.cc
@@ -0,0 +1,56 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/test/base/chromeos/crosier/test_accounts.h"
+
+#include <memory>
+
+#include "base/check.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/json/json_file_value_serializer.h"
+#include "base/path_service.h"
+#include "base/rand_util.h"
+#include "base/values.h"
+
+namespace crosier {
+
+namespace {
+
+std::unique_ptr<base::Value> ReadJsonFile(const base::FilePath& json_path) {
+  int error_code = 0;
+  std::string error_str;
+  JSONFileValueDeserializer deserializer(json_path);
+  std::unique_ptr<base::Value> value =
+      deserializer.Deserialize(&error_code, &error_str);
+  CHECK(error_code == 0) << "Error reading json file at " << json_path
+                         << ". Error code: " << error_code << " " << error_str;
+  CHECK(value);
+  return value;
+}
+
+}  // namespace
+
+void GetGaiaTestAccount(std::string& out_email, std::string& out_password) {
+  base::FilePath root_path;
+  base::PathService::Get(base::BasePathKey::DIR_SOURCE_ROOT, &root_path);
+
+  base::FilePath::StringPieceType kTestAccountFilePath = FILE_PATH_LITERAL(
+      "chrome/browser/internal/resources/chromeos/crosier/test_accounts.json");
+  base::FilePath test_accounts_path =
+      base::MakeAbsoluteFilePath(root_path.Append(kTestAccountFilePath));
+
+  std::unique_ptr<base::Value> store = ReadJsonFile(test_accounts_path);
+  const base::Value::List* default_pool =
+      store->GetDict().FindList("ui.gaiaPoolDefault");
+  CHECK(default_pool);
+  CHECK(!default_pool->empty());
+
+  const base::Value::Dict& account =
+      (*default_pool)[base::RandInt(0, default_pool->size() - 1)].GetDict();
+  out_email = *account.FindString("email");
+  out_password = *account.FindString("password");
+}
+
+}  // namespace crosier
diff --git a/chrome/test/base/chromeos/crosier/test_accounts.h b/chrome/test/base/chromeos/crosier/test_accounts.h
new file mode 100644
index 0000000..1f32432
--- /dev/null
+++ b/chrome/test/base/chromeos/crosier/test_accounts.h
@@ -0,0 +1,17 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_TEST_BASE_CHROMEOS_CROSIER_TEST_ACCOUNTS_H_
+#define CHROME_TEST_BASE_CHROMEOS_CROSIER_TEST_ACCOUNTS_H_
+
+#include <string>
+
+namespace crosier {
+
+// Randomly picks a gaia test account from the test accounts pool.
+void GetGaiaTestAccount(std::string& out_email, std::string& out_password);
+
+}  // namespace crosier
+
+#endif  // CHROME_TEST_BASE_CHROMEOS_CROSIER_TEST_ACCOUNTS_H_
diff --git a/chrome/test/base/chromeos/crosier/test_accounts_test.cc b/chrome/test/base/chromeos/crosier/test_accounts_test.cc
new file mode 100644
index 0000000..d4d073a
--- /dev/null
+++ b/chrome/test/base/chromeos/crosier/test_accounts_test.cc
@@ -0,0 +1,20 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/test/base/chromeos/crosier/test_accounts.h"
+
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace crosier {
+
+TEST(TestAccountTest, Get) {
+  std::string email;
+  std::string password;
+
+  GetGaiaTestAccount(email, password);
+  EXPECT_TRUE(!email.empty());
+  EXPECT_TRUE(!password.empty());
+}
+
+}  // namespace crosier
diff --git a/chrome/test/data/extensions/api_test/user_scripts/get_scripts/worker.js b/chrome/test/data/extensions/api_test/user_scripts/get_scripts/worker.js
index d800af8..99d07b3f 100644
--- a/chrome/test/data/extensions/api_test/user_scripts/get_scripts/worker.js
+++ b/chrome/test/data/extensions/api_test/user_scripts/get_scripts/worker.js
@@ -12,8 +12,7 @@
         matches: ['*://*/*'],
         excludeMatches: ['*://abc.com/*'],
         allFrames: true,
-        js: [{file: 'empty.js'}],
-        world: chrome.userScripts.ExecutionWorld.MAIN
+        js: [{file: 'empty.js'}]
       },
       {
         id: 'script2',
@@ -35,16 +34,14 @@
         excludeMatches: ['*://abc.com/*'],
         allFrames: true,
         js: [{file: 'empty.js'}],
-        runAt: 'document_idle',
-        world: chrome.userScripts.ExecutionWorld.MAIN
+        runAt: 'document_idle'
       },
       {
         id: 'script2',
         matches: ['*://requested.com/*'],
         js: [{file: 'empty2.js'}],
         allFrames: false,
-        runAt: 'document_end',
-        world: chrome.userScripts.ExecutionWorld.USER_SCRIPT
+        runAt: 'document_end'
       }
     ];
 
@@ -107,8 +104,7 @@
       matches: ['*://*/*'],
       allFrames: false,
       js: [{file: 'empty.js'}],
-      runAt: 'document_idle',
-      world: chrome.userScripts.ExecutionWorld.USER_SCRIPT
+      runAt: 'document_idle'
     }];
 
     await chrome.userScripts.register(scriptsToRegister);
diff --git a/chrome/test/data/extensions/api_test/user_scripts/persistent_scripts/worker.js b/chrome/test/data/extensions/api_test/user_scripts/persistent_scripts/worker.js
index 914db82..c36128d 100644
--- a/chrome/test/data/extensions/api_test/user_scripts/persistent_scripts/worker.js
+++ b/chrome/test/data/extensions/api_test/user_scripts/persistent_scripts/worker.js
@@ -52,16 +52,14 @@
       matches: ['*://*/*'],
       js: [{file: 'user_script.js'}],
       allFrames: false,
-      runAt: 'document_end',
-      world: 'USER_SCRIPT'
+      runAt: 'document_end'
     },
     {
       id: 'us2',
       matches: ['*://*/*'],
       js: [{file: 'user_script_2.js'}],
       allFrames: false,
-      runAt: 'document_end',
-      world: 'USER_SCRIPT'
+      runAt: 'document_end'
     }
   ];
 
diff --git a/chrome/test/data/extensions/api_test/user_scripts/register/inject_to_world.js b/chrome/test/data/extensions/api_test/user_scripts/register/inject_to_world.js
deleted file mode 100644
index 98690eb..0000000
--- a/chrome/test/data/extensions/api_test/user_scripts/register/inject_to_world.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Changes the document's title based on the existence/value of
-// window.mainWorldFlag, which is set by a script that's part of a web page.
-document.title = window.mainWorldFlag === 'from main world' ?
-    'MAIN_WORLD' :
-    'USER_SCRIPTS_WORLD';
diff --git a/chrome/test/data/extensions/api_test/user_scripts/register/worker.js b/chrome/test/data/extensions/api_test/user_scripts/register/worker.js
index 308c4ea..d7d0ec9 100644
--- a/chrome/test/data/extensions/api_test/user_scripts/register/worker.js
+++ b/chrome/test/data/extensions/api_test/user_scripts/register/worker.js
@@ -4,31 +4,6 @@
 
 import { openTab, getInjectedElementIds } from '/_test_resources/test_util/tabs_util.js';
 
-// Inject a script which changes the page's title based on the execution world
-// it's running on, then call executeScript which checks the title.
-async function runExecutionWorldTest(world, expectedTitle) {
-  await chrome.userScripts.unregister();
-
-  const scripts = [{
-    id: 'us1',
-    matches: ['*://*/*'],
-    js: [{file: 'inject_to_world.js'}],
-    runAt: 'document_end',
-    world
-  }];
-  await chrome.userScripts.register(scripts);
-  const config = await chrome.test.getConfig();
-
-  // After the scripts has been registered, navigate to a url where they will be
-  // injected.
-  const url = `http://requested.com:${
-      config.testServer.port}/extensions/main_world_script_flag.html`;
-  const tab = await openTab(url);
-  chrome.test.assertEq(expectedTitle, tab.title);
-
-  chrome.test.succeed();
-}
-
 chrome.test.runTests([
   // Tests that an error is returned when multiple user script entries in
   // userScripts.register share the same ID.
@@ -338,12 +313,6 @@
     chrome.test.succeed();
   },
 
-  async function registerFile_ExecutionWorld() {
-    runExecutionWorldTest(chrome.userScripts.ExecutionWorld.MAIN, 'MAIN_WORLD');
-    runExecutionWorldTest(
-        chrome.userScripts.ExecutionWorld.USER_SCRIPT, 'USER_SCRIPT_WORLD');
-  },
-
   // Tests that a file can be used both as a user script and content script.
   async function fileUsedAsContentScript() {
     await chrome.userScripts.unregister();
diff --git a/chrome/test/data/extensions/api_test/user_scripts/update/inject_to_world.js b/chrome/test/data/extensions/api_test/user_scripts/update/inject_to_world.js
deleted file mode 100644
index c0b7588..0000000
--- a/chrome/test/data/extensions/api_test/user_scripts/update/inject_to_world.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright 2023 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Changes the document's title based on the existence/value of
-// window.mainWorldFlag, which is set by a script that's part of a web page.
-document.title = window.mainWorldFlag === 'from main world' ?
-    'MAIN_WORLD' :
-    'USER_SCRIPT_WORLD';
diff --git a/chrome/test/data/extensions/api_test/user_scripts/update/worker.js b/chrome/test/data/extensions/api_test/user_scripts/update/worker.js
index d99f5ac..0829de31 100644
--- a/chrome/test/data/extensions/api_test/user_scripts/update/worker.js
+++ b/chrome/test/data/extensions/api_test/user_scripts/update/worker.js
@@ -67,8 +67,7 @@
       matches: ['*://*/*'],
       js: [{file: 'user_script.js'}],
       runAt: 'document_idle',
-      allFrames: false,
-      world: 'USER_SCRIPT'
+      allFrames: false
     }];
     const registeredScripts = await chrome.userScripts.getScripts();
     chrome.test.assertEq(expectedScripts, registeredScripts);
@@ -112,8 +111,7 @@
       matches: ['*://*/*'],
       js: [{file: 'user_script.js'}],
       runAt: 'document_idle',
-      allFrames: false,
-      world: 'USER_SCRIPT'
+      allFrames: false
     }];
     const registeredScripts = await chrome.userScripts.getScripts();
     chrome.test.assertEq(expectedScripts, registeredScripts);
@@ -216,8 +214,7 @@
       excludeMatches: ['*://def.com/*'],
       js: [{file: 'user_script_2.js'}],
       runAt: 'document_end',
-      allFrames: false,
-      world: 'USER_SCRIPT'
+      allFrames: false
     }];
     registeredScripts = await chrome.userScripts.getScripts();
     chrome.test.assertEq(expectedScripts, registeredScripts);
@@ -237,56 +234,6 @@
     chrome.test.succeed();
   },
 
-  // Tests that calling userScripts.update with a specific ID updates such
-  // script and injects the script in the corresponding world.
-  async function scriptUpdated_World() {
-    await chrome.userScripts.unregister();
-
-    // Register user script with a file that changes the document title based on
-    // its execution world.
-    const scriptsToRegister = [{
-      id: 'us1',
-      matches: ['*://hostperms-a.com/*'],
-      js: [{file: 'inject_to_world.js'}],
-      world: 'MAIN'
-    }];
-    await chrome.userScripts.register(scriptsToRegister);
-
-    // Verify user script was registered.
-    let registeredScripts = await chrome.userScripts.getScripts();
-    chrome.test.assertEq(1, registeredScripts.length);
-
-    // Verify script file is injected in the main world.
-    const config = await chrome.test.getConfig();
-    const url = `http://hostperms-a.com:${
-        config.testServer.port}/extensions/main_world_script_flag.html`;
-    let tab = await openTab(url);
-    chrome.test.assertEq('MAIN_WORLD', tab.title);
-
-    // Update user script world.
-    var scriptsToUpdate =
-        [{id: 'us1', js: [{file: 'inject_to_world.js'}], world: 'USER_SCRIPT'}];
-    await chrome.userScripts.update(scriptsToUpdate);
-
-    // Verify user script was updated.
-    const expectedScripts = [{
-      id: 'us1',
-      matches: ['*://hostperms-a.com/*'],
-      js: [{file: 'inject_to_world.js'}],
-      runAt: 'document_idle',
-      allFrames: false,
-      world: 'USER_SCRIPT'
-    }];
-    registeredScripts = await chrome.userScripts.getScripts();
-    chrome.test.assertEq(expectedScripts, registeredScripts);
-
-    // Verify script file is injected in the user script world.
-    tab = await openTab(url);
-    chrome.test.assertEq('USER_SCRIPT_WORLD', tab.title);
-
-    chrome.test.succeed();
-  },
-
   // Test that if two userScript.update calls are made in quick succession,
   // then both calls should succeed in updating their scripts and the old
   // version of these scripts are overwritten.
diff --git a/chrome/test/data/webui/downloads/item_test.ts b/chrome/test/data/webui/downloads/item_test.ts
index 6af84db..663c596 100644
--- a/chrome/test/data/webui/downloads/item_test.ts
+++ b/chrome/test/data/webui/downloads/item_test.ts
@@ -355,6 +355,44 @@
                 'description-color'));
       });
 
+  test(
+      'icon aria-hidden determined by display type for improvedDownloadWarningsUX',
+      () => {
+        loadTimeData.overrideValues({'improvedDownloadWarningsUX': true});
+        const item = document.createElement('downloads-item');
+        document.body.innerHTML = window.trustedTypes!.emptyHTML;
+        document.body.appendChild(item);
+        testIconLoader.setShouldIconsLoad(true);
+
+        const iconWrapper = item.shadowRoot!.querySelector('.icon-wrapper');
+
+        item.set('data', createDownload({
+                   filePath: 'unique1',
+                   hideDate: false,
+                   isInsecure: true,
+                 }));
+        flush();
+        assertTrue(!!iconWrapper);
+        assertEquals('false', iconWrapper.ariaHidden);
+
+        item.set('data', createDownload({
+                   dangerType: DangerType.kDangerousFile,
+                   hideDate: true,
+                   state: State.kDangerous,
+                 }));
+        flush();
+        assertTrue(!!iconWrapper);
+        assertEquals('false', iconWrapper.ariaHidden);
+
+        item.set('data', createDownload({
+                   filePath: 'unique1',
+                   hideDate: false,
+                 }));
+        flush();
+        assertTrue(!!iconWrapper);
+        assertEquals('true', iconWrapper!.ariaHidden);
+      });
+
   test('open now dropdown button allowed by load time data', async () => {
     loadTimeData.overrideValues({
       'allowOpenNow': true,
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn
index 53ba3c9..d26a59ff 100644
--- a/chrome/test/data/webui/settings/chromeos/BUILD.gn
+++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -22,10 +22,9 @@
 
   files = [
     "apn_subpage_tests.js",
-    "apn_detail_dialog_tests.js",
+    "apn_detail_dialog_test.ts",
     "cellular_networks_list_test.js",
     "cellular_roaming_toggle_button_test.js",
-    "crostini_extra_containers_subpage_test.js",
     "crostini_page_test.js",
     "crostini_settings_card_test.js",
     "esim_remove_profile_dialog_test.js",
@@ -52,7 +51,6 @@
     "test_about_page_browser_proxy_chromeos.js",
     "test_api.ts",
     "test_bluetooth_page_browser_proxy.js",
-    "test_crostini_browser_proxy.js",
     "test_device_name_browser_proxy.js",
     "test_lacros_extension_control_browser_proxy.ts",
     "test_os_lifetime_browser_proxy.ts",
@@ -68,6 +66,9 @@
     "app_management/test_util.ts",
     "app_management/toggle_row_test.ts",
 
+    "crostini_page/crostini_extra_containers_subpage_test.ts",
+    "crostini_page/test_crostini_browser_proxy.ts",
+
     "date_time_page/date_time_settings_card_test.ts",
     "date_time_page/date_time_page_test.ts",
     "date_time_page/test_timezone_browser_proxy.ts",
diff --git a/chrome/test/data/webui/settings/chromeos/apn_detail_dialog_test.ts b/chrome/test/data/webui/settings/chromeos/apn_detail_dialog_test.ts
new file mode 100644
index 0000000..698e666e
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/apn_detail_dialog_test.ts
@@ -0,0 +1,520 @@
+// 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.
+
+import 'chrome://os-settings/os_settings.js';
+
+import {ApnDetailDialog, CrCheckboxElement, CrDialogElement, CrInputElement} from 'chrome://os-settings/os_settings.js';
+import {ApnDetailDialogMode} from 'chrome://resources/ash/common/network/cellular_utils.js';
+import {MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
+import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
+import {ApnAuthenticationType, ApnIpType, ApnProperties, ApnState, ApnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
+import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
+import {assertEquals, assertFalse, assertNull, assertStringContains, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {FakeNetworkConfig} from 'chrome://webui-test/chromeos/fake_network_config_mojom.js';
+import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
+import {disableAnimationsAndTransitions} from 'chrome://webui-test/test_api.js';
+import {eventToPromise} from 'chrome://webui-test/test_util.js';
+
+const TEST_APN: ApnProperties = {
+  accessPointName: 'apn',
+  username: 'username',
+  password: 'password',
+  authentication: ApnAuthenticationType.kAutomatic,
+  ipType: ApnIpType.kAutomatic,
+  apnTypes: [ApnType.kDefault],
+  state: ApnState.kEnabled,
+  id: undefined,
+  language: undefined,
+  localizedName: undefined,
+  name: undefined,
+  attach: undefined,
+};
+
+suite('<apn-detail-dialog>', () => {
+  let apnDetailDialog: ApnDetailDialog;
+  let mojoApi: FakeNetworkConfig;
+
+  function toggleAdvancedSettings(): void {
+    const advancedSettingsBtn =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#advancedSettingsBtn');
+    assertTrue(!!advancedSettingsBtn);
+    advancedSettingsBtn.click();
+  }
+
+  function assertElementEnabled(selector: string): void {
+    const element = apnDetailDialog.shadowRoot!.querySelector<
+        HTMLInputElement|HTMLSelectElement|HTMLButtonElement|CrCheckboxElement>(
+        selector);
+    assertTrue(!!element);
+    assertFalse(element.disabled);
+  }
+
+  function assertAllInputsEnabled(): void {
+    assertElementEnabled('#apnInput');
+    assertElementEnabled('#usernameInput');
+    assertElementEnabled('#passwordInput');
+    assertElementEnabled('#authTypeDropDown');
+    assertElementEnabled('#apnDefaultTypeCheckbox');
+    assertElementEnabled('#apnAttachTypeCheckbox');
+    assertElementEnabled('#ipTypeDropDown');
+  }
+
+  suiteSetup(() => {
+    disableAnimationsAndTransitions();
+    mojoApi = new FakeNetworkConfig();
+    MojoInterfaceProviderImpl.getInstance().setMojoServiceRemoteForTest(
+        mojoApi);
+  });
+
+  teardown(() => {
+    apnDetailDialog.remove();
+    mojoApi.resetForTest();
+  });
+
+  async function init(
+      mode?: ApnDetailDialogMode,
+      apnProperties?: ApnProperties): Promise<void> {
+    apnDetailDialog = document.createElement('apn-detail-dialog');
+    apnDetailDialog.guid = 'fake-guid';
+    apnDetailDialog.apnList = [TEST_APN];
+    apnDetailDialog.mode = mode || ApnDetailDialogMode.CREATE;
+    apnDetailDialog.apnProperties = apnProperties;
+    document.body.appendChild(apnDetailDialog);
+    await waitAfterNextRender(apnDetailDialog);
+  }
+
+  test('Element contains dialog', async () => {
+    await init();
+    const dialog = apnDetailDialog.shadowRoot!.querySelector('cr-dialog');
+    assertTrue(!!dialog);
+    assertTrue(dialog.open);
+    // Confirm that the dialog has the add apn title.
+    const apnDetailDialogTitle =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLElement>(
+            '#apnDetailDialogTitle');
+    assertTrue(!!apnDetailDialogTitle);
+    assertEquals(
+        apnDetailDialog.i18n('apnDetailAddApnDialogTitle'),
+        apnDetailDialogTitle.innerText);
+    assertTrue(!!apnDetailDialog.shadowRoot!.querySelector('#apnInput'));
+    assertTrue(!!apnDetailDialog.shadowRoot!.querySelector('#usernameInput'));
+    assertTrue(!!apnDetailDialog.shadowRoot!.querySelector('#passwordInput'));
+
+    assertTrue(
+        !!apnDetailDialog.shadowRoot!.querySelector('#authTypeDropDown'));
+    const defaultTypeCheckbox =
+        apnDetailDialog.shadowRoot!.querySelector<CrCheckboxElement>(
+            '#apnDefaultTypeCheckbox');
+    assertTrue(!!defaultTypeCheckbox);
+    assertTrue(defaultTypeCheckbox.checked);
+    assertTrue(
+        !!apnDetailDialog.shadowRoot!.querySelector('#apnAttachTypeCheckbox'));
+    assertTrue(!!apnDetailDialog.shadowRoot!.querySelector('#ipTypeDropDown'));
+    assertTrue(
+        !!apnDetailDialog.shadowRoot!.querySelector('#apnDetailCancelBtn'));
+    assertTrue(
+        !!apnDetailDialog.shadowRoot!.querySelector('#apnDetailActionBtn'));
+    assertNull(apnDetailDialog.shadowRoot!.querySelector('#apnDoneBtn'));
+    assertEquals(
+        apnDetailDialog.shadowRoot!.querySelector('#apnInput'),
+        apnDetailDialog.shadowRoot!.activeElement);
+  });
+
+  test('Clicking the cancel button fires the close event', async () => {
+    await init();
+    const closeEventPromise = eventToPromise('close', window);
+    const cancelBtn =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#apnDetailCancelBtn');
+    assertTrue(!!cancelBtn);
+
+    cancelBtn.click();
+    await closeEventPromise;
+    const crDialogElement =
+        apnDetailDialog.shadowRoot!.querySelector<CrDialogElement>(
+            '#apnDetailDialog');
+    assertTrue(!!crDialogElement);
+    assertFalse(crDialogElement.open);
+  });
+
+  test(
+      'Clicking on the advanced settings button expands/collapses section',
+      async () => {
+        await init();
+        const isAdvancedSettingShowing = () => {
+          const ironCollapseElement =
+              apnDetailDialog.shadowRoot!.querySelector('iron-collapse');
+          assertTrue(!!ironCollapseElement);
+          return ironCollapseElement.opened;
+        };
+        assertFalse(isAdvancedSettingShowing());
+        toggleAdvancedSettings();
+        assertTrue(!!isAdvancedSettingShowing());
+        toggleAdvancedSettings();
+        assertFalse(isAdvancedSettingShowing());
+        toggleAdvancedSettings();
+        const assertOptions =
+            (expectedTextArray: string[],
+             optionNodes: NodeListOf<HTMLOptionElement>) => {
+              for (const [idx, expectedText] of expectedTextArray.entries()) {
+                assertTrue(!!optionNodes[idx]);
+                assertTrue(!!optionNodes[idx]!.text);
+                assertEquals(expectedText, optionNodes[idx]!.text);
+              }
+            };
+        const authTypeDropDown =
+            apnDetailDialog.shadowRoot!.querySelector('#authTypeDropDown');
+        assertTrue(!!authTypeDropDown);
+        const authTypeOptionNodes = authTypeDropDown.querySelectorAll('option');
+        assertEquals(3, authTypeOptionNodes.length);
+        // Note: We are also checking that the items appear in a certain order.
+        assertOptions(
+            [
+              apnDetailDialog.i18n('apnDetailTypeAuto'),
+              apnDetailDialog.i18n('apnDetailAuthTypePAP'),
+              apnDetailDialog.i18n('apnDetailAuthTypeCHAP'),
+            ],
+            authTypeOptionNodes);
+
+        const ipTypeDropDown =
+            apnDetailDialog.shadowRoot!.querySelector('#ipTypeDropDown');
+        assertTrue(!!ipTypeDropDown);
+        const ipTypeOptionNodes =
+            ipTypeDropDown.querySelectorAll<HTMLOptionElement>('option');
+        assertEquals(4, ipTypeOptionNodes.length);
+
+        assertOptions(
+            [
+              apnDetailDialog.i18n('apnDetailTypeAuto'),
+              apnDetailDialog.i18n('apnDetailIpTypeIpv4'),
+              apnDetailDialog.i18n('apnDetailIpTypeIpv6'),
+              apnDetailDialog.i18n('apnDetailIpTypeIpv4_Ipv6'),
+            ],
+            ipTypeOptionNodes);
+      });
+
+  test('Clicking on the add button calls createCustomApn', async () => {
+    await init();
+    const apnInput =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLInputElement>(
+            '#apnInput');
+    assertTrue(!!apnInput);
+    apnInput.value = TEST_APN.accessPointName;
+    const usernameInput =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLInputElement>(
+            '#usernameInput');
+    assertTrue(!!usernameInput);
+    usernameInput.value = TEST_APN.username!;
+    const passwordInput =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLInputElement>(
+            '#passwordInput');
+    assertTrue(!!passwordInput);
+    passwordInput.value = TEST_APN.password!;
+
+    assertAllInputsEnabled();
+    assertElementEnabled('#apnDetailCancelBtn');
+    let actionBtn =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#apnDetailActionBtn');
+    assertTrue(!!actionBtn);
+    assertEquals(apnDetailDialog.i18n('add'), actionBtn.innerText);
+
+    // Add a network.
+    const network = OncMojo.getDefaultManagedProperties(
+        NetworkType.kCellular, apnDetailDialog.guid, apnDetailDialog.guid);
+    mojoApi.setManagedPropertiesForTest(network);
+    await flushTasks();
+
+    const properties = await mojoApi.getManagedProperties(apnDetailDialog.guid);
+    assertTrue(!!properties);
+    assertEquals(
+        undefined, properties.result.typeProperties.cellular!.customApnList);
+
+    actionBtn = apnDetailDialog.shadowRoot!.querySelector<HTMLButtonElement>(
+        '#apnDetailActionBtn');
+    assertTrue(!!actionBtn);
+    actionBtn.click();
+    await flushTasks();
+    await mojoApi.whenCalled('createCustomApn');
+
+    assertEquals(
+        1, properties.result.typeProperties.cellular!.customApnList!.length);
+
+    const apn = properties.result.typeProperties.cellular!.customApnList![0];
+    assertTrue(!!apn);
+    assertEquals(TEST_APN.accessPointName, apn.accessPointName);
+    assertEquals(TEST_APN.username, apn.username);
+    assertEquals(TEST_APN.password, apn.password);
+    assertEquals(TEST_APN.authentication, apn.authentication);
+    assertEquals(TEST_APN.ipType, apn.ipType);
+    assertEquals(TEST_APN.apnTypes.length, apn.apnTypes.length);
+    assertEquals(TEST_APN.apnTypes[0], apn.apnTypes[0]);
+  });
+
+  test('Setting mode to view changes buttons and fields', async () => {
+    const assertFieldDisabled = (selector: string) => {
+      const element = apnDetailDialog.shadowRoot!.querySelector<
+          HTMLInputElement|HTMLSelectElement|CrCheckboxElement>(selector);
+      assertTrue(!!element);
+      assertTrue(element.disabled);
+    };
+
+    // Set the dialog mode before opening the dialog so that the default focus
+    // can be tested.
+    await init(
+        /* mode= */ ApnDetailDialogMode.VIEW, /* apnProperties= */ TEST_APN);
+
+    const apnDetailDialogTitle =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLElement>(
+            '#apnDetailDialogTitle');
+    assertTrue(!!apnDetailDialogTitle);
+    assertEquals(
+        apnDetailDialog.i18n('apnDetailViewApnDialogTitle'),
+        apnDetailDialogTitle.innerText);
+    assertNull(
+        apnDetailDialog.shadowRoot!.querySelector('#apnDetailCancelBtn'));
+    assertNull(
+        apnDetailDialog.shadowRoot!.querySelector('#apnDetailActionBtn'));
+    const doneBtn =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#apnDoneBtn');
+    assertTrue(!!doneBtn);
+    assertFalse(doneBtn.disabled);
+    assertFieldDisabled('#apnInput');
+    assertFieldDisabled('#usernameInput');
+    assertFieldDisabled('#passwordInput');
+    assertFieldDisabled('#authTypeDropDown');
+    assertFieldDisabled('#apnDefaultTypeCheckbox');
+    assertFieldDisabled('#apnAttachTypeCheckbox');
+    assertFieldDisabled('#ipTypeDropDown');
+    assertEquals(doneBtn, apnDetailDialog.shadowRoot!.activeElement);
+  });
+
+  test('Dialog input fields are validated', async () => {
+    await init();
+    const apnInputField =
+        apnDetailDialog.shadowRoot!.querySelector<CrInputElement>('#apnInput');
+    assertTrue(!!apnInputField);
+    const actionButton =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#apnDetailActionBtn');
+    assertTrue(!!actionButton);
+    // Case: After opening dialog before user input
+    assertFalse(apnInputField.invalid);
+    assertTrue(actionButton.disabled);
+
+    // Case : After valid user input
+    apnInputField.value = 'test';
+    assertFalse(apnInputField.invalid);
+    assertFalse(actionButton.disabled);
+
+    // Case : After Removing all user input no error state but button disabled
+    apnInputField.value = '';
+    assertFalse(apnInputField.invalid);
+    assertTrue(actionButton.disabled);
+
+    // Case : Non ascii user input
+    apnInputField.value = 'testμ';
+    assertTrue(apnInputField.invalid);
+    assertTrue(actionButton.disabled);
+    assertStringContains(apnInputField.value, 'μ');
+
+    // Case : longer than 63 characters then removing one character
+    apnInputField.value = 'a'.repeat(64);
+    assertTrue(apnInputField.invalid);
+    assertTrue(actionButton.disabled);
+    assertEquals(63, apnInputField.value.length);
+    apnInputField.value = apnInputField.value.slice(0, -1);
+    assertFalse(apnInputField.invalid);
+    assertFalse(actionButton.disabled);
+
+    // Case : longer than 63 non-ASCII characters
+    apnInputField.value = 'μ'.repeat(64);
+    assertTrue(apnInputField.invalid);
+    assertTrue(actionButton.disabled);
+  });
+
+  test('Apn types are correctly validated in all modes', async () => {
+    await init();
+    const updateApnTypeCheckboxes =
+        (defaultType: boolean, attachType: boolean) => {
+          const apnDefaultTypeCheckbox =
+              apnDetailDialog.shadowRoot!.querySelector<CrCheckboxElement>(
+                  '#apnDefaultTypeCheckbox');
+          assertTrue(!!apnDefaultTypeCheckbox);
+          apnDefaultTypeCheckbox.checked = defaultType;
+
+          const apnAttachTypeCheckbox =
+              apnDetailDialog.shadowRoot!.querySelector<CrCheckboxElement>(
+                  '#apnAttachTypeCheckbox');
+          assertTrue(!!apnAttachTypeCheckbox);
+          apnAttachTypeCheckbox.checked = attachType;
+        };
+
+    toggleAdvancedSettings();
+    const getDefaultApnInfo = () =>
+        apnDetailDialog.shadowRoot!.querySelector('#defaultApnRequiredInfo');
+
+    TEST_APN.id = '1';
+    const currentApn = {...TEST_APN};
+    currentApn.id = '2';
+    apnDetailDialog.set('apnList', [TEST_APN, currentApn]);
+    apnDetailDialog.set('apnProperties', currentApn);
+
+    const actionButton =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLButtonElement>(
+            '#apnDetailActionBtn');
+    assertTrue(!!actionButton);
+    const apnInputField =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLInputElement>(
+            '#apnInput');
+    assertTrue(!!apnInputField);
+    apnInputField.value = 'valid_name';
+
+    // CREATE mode tests
+    apnDetailDialog.mode = ApnDetailDialogMode.CREATE;
+    TEST_APN.state = ApnState.kDisabled;
+    apnDetailDialog.set('apnList', [TEST_APN]);
+
+    // Case: Default APN type is checked
+    updateApnTypeCheckboxes(/* default= */ true, /* attach= */ false);
+    await flushTasks();
+    assertFalse(actionButton.disabled);
+    assertNull(getDefaultApnInfo());
+
+    // Case: No enabled default APNs, default unchecked and attach is checked.
+    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ true);
+    await flushTasks();
+    assertTrue(actionButton.disabled);
+    assertTrue(!!getDefaultApnInfo());
+
+    // Case: No enabled default APNs and both unchecked.
+    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ false);
+    await flushTasks();
+    assertTrue(actionButton.disabled);
+    assertNull(getDefaultApnInfo());
+
+    // Case: Enabled default APNs, default unchecked and attach is checked.
+    TEST_APN.state = ApnState.kEnabled;
+    apnDetailDialog.set('apnList', [TEST_APN]);
+    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ true);
+    await flushTasks();
+    assertFalse(actionButton.disabled);
+    assertNull(getDefaultApnInfo());
+
+    // Case: Enabled default APNs and both unchecked.
+    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ false);
+    await flushTasks();
+    assertTrue(actionButton.disabled);
+    assertNull(getDefaultApnInfo());
+
+    // Edit mode tests
+    apnDetailDialog.set('mode', ApnDetailDialogMode.EDIT);
+    TEST_APN.apnTypes = [ApnType.kAttach];
+    currentApn.apnTypes = [ApnType.kDefault, ApnType.kAttach];
+    apnDetailDialog.set('apnList', [TEST_APN, currentApn]);
+
+    // Case: Default APN type is checked
+    updateApnTypeCheckboxes(/* default= */ true, /* attach= */ false);
+    await flushTasks();
+    assertFalse(actionButton.disabled);
+    assertNull(getDefaultApnInfo());
+
+    // Case: User unchecks the default checkbox, APN being modified is the
+    // only default APN
+    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ true);
+    await flushTasks();
+    assertTrue(actionButton.disabled);
+    assertTrue(!!getDefaultApnInfo());
+
+    // Case: User unchecks both checkboxes, APN being modified is the
+    // only enabled default APN but there are other enabled attach APNs.
+    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ false);
+    await flushTasks();
+    assertTrue(actionButton.disabled);
+    assertTrue(!!getDefaultApnInfo());
+
+    // Case: User unchecks both checkboxes, APN being modified is the
+    // only enabled default APN and is the only enabled attachApn.
+    currentApn.apnTypes = [ApnType.kDefault, ApnType.kAttach];
+    apnDetailDialog.set('apnList', [currentApn]);
+    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ false);
+    await flushTasks();
+    assertTrue(actionButton.disabled);
+    assertNull(getDefaultApnInfo());
+
+    // Case: User unchecks default APN type checkbox and checks the attach
+    // APN type checkbox, APN being modified is the only enabled default APN
+    // and there are no other enabled attach type APNs.
+    currentApn.apnTypes = [ApnType.kDefault];
+    apnDetailDialog.set('apnList', [currentApn]);
+    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ true);
+    await flushTasks();
+    assertTrue(actionButton.disabled);
+    assertTrue(!!getDefaultApnInfo());
+  });
+
+  test('Setting mode to edit changes buttons and fields', async () => {
+    const apnWithId = TEST_APN;
+    apnWithId.id = '1';
+    apnWithId.apnTypes = [ApnType.kDefault];
+
+    // Set the dialog mode before opening the dialog so that the default focus
+    // can be tested.
+    await init(
+        /* mode= */ ApnDetailDialogMode.EDIT, /* apnProperties= */ apnWithId);
+
+    const apnDetailDialogTitle =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLElement>(
+            '#apnDetailDialogTitle');
+    assertTrue(!!apnDetailDialogTitle);
+    assertEquals(
+        apnDetailDialog.i18n('apnDetailEditApnDialogTitle'),
+        apnDetailDialogTitle.innerText);
+    assertElementEnabled('#apnDetailCancelBtn');
+    let button = apnDetailDialog.shadowRoot!.querySelector<HTMLButtonElement>(
+        '#apnDetailActionBtn');
+    assertTrue(!!button);
+    assertEquals(apnDetailDialog.i18n('save'), button.innerText);
+    assertNull(apnDetailDialog.shadowRoot!.querySelector('#apnDoneBtn'));
+    assertAllInputsEnabled();
+
+    // Case: clicking on the action button calls the correct method
+    const network = OncMojo.getDefaultManagedProperties(
+        NetworkType.kCellular, apnDetailDialog.guid, apnDetailDialog.guid);
+    mojoApi.setManagedPropertiesForTest(network);
+    await flushTasks();
+    const managedProperties =
+        await mojoApi.getManagedProperties(apnDetailDialog.guid);
+    assertTrue(!!managedProperties);
+    mojoApi.createCustomApn(apnDetailDialog.guid, apnWithId);
+    const newExpectedApn = 'modified';
+    const apnInputField =
+        apnDetailDialog.shadowRoot!.querySelector<HTMLInputElement>(
+            '#apnInput');
+    assertTrue(!!apnInputField);
+    apnInputField.value = newExpectedApn;
+    button = apnDetailDialog.shadowRoot!.querySelector<HTMLButtonElement>(
+        '#apnDetailActionBtn');
+    assertTrue(!!button);
+    button.click();
+    await mojoApi.whenCalled('modifyCustomApn');
+
+    const apn =
+        managedProperties.result.typeProperties.cellular!.customApnList![0];
+    assertTrue(!!apn);
+    assertEquals(newExpectedApn, apn.accessPointName);
+    assertEquals(apnWithId.id, apn.id);
+    assertEquals(apnWithId.username, apn.username);
+    assertEquals(apnWithId.password, apn.password);
+    assertEquals(apnWithId.authentication, apn.authentication);
+    assertEquals(apnWithId.ipType, apn.ipType);
+    assertEquals(apnWithId.apnTypes.length, apn.apnTypes.length);
+    assertEquals(apnWithId.apnTypes[0], apn.apnTypes[0]);
+    assertEquals(
+        apnDetailDialog.shadowRoot!.querySelector('#apnInput'),
+        apnDetailDialog.shadowRoot!.activeElement);
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/apn_detail_dialog_tests.js b/chrome/test/data/webui/settings/chromeos/apn_detail_dialog_tests.js
deleted file mode 100644
index 396f57d..0000000
--- a/chrome/test/data/webui/settings/chromeos/apn_detail_dialog_tests.js
+++ /dev/null
@@ -1,461 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import 'chrome://os-settings/strings.m.js';
-import 'chrome://resources/ash/common/network/apn_detail_dialog.js';
-
-import {ApnDetailDialog} from 'chrome://resources/ash/common/network/apn_detail_dialog.js';
-import {ApnDetailDialogMode} from 'chrome://resources/ash/common/network/cellular_utils.js';
-import {MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
-import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {ApnAuthenticationType, ApnIpType, ApnProperties, ApnState, ApnType, ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
-import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
-import {FakeNetworkConfig} from 'chrome://test/chromeos/fake_network_config_mojom.js';
-import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
-import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
-import {eventToPromise} from 'chrome://webui-test/test_util.js';
-
-/** @type {!ApnProperties} */
-const TEST_APN = {
-  accessPointName: 'apn',
-  username: 'username',
-  password: 'password',
-  authentication: ApnAuthenticationType.kAutomatic,
-  ipType: ApnIpType.kAutomatic,
-  apnTypes: [ApnType.kDefault],
-  state: ApnState.kEnabled,
-};
-
-suite('ApnDetailDialog', function() {
-  /** @type {ApnDetailDialog} */
-  let apnDetailDialog = null;
-
-  let mojoApi_ = null;
-
-  async function toggleAdvancedSettings() {
-    const advancedSettingsBtn =
-        apnDetailDialog.shadowRoot.querySelector('#advancedSettingsBtn');
-    assertTrue(!!advancedSettingsBtn);
-    advancedSettingsBtn.click();
-  }
-
-  /**
-   * @param {string} selector
-   */
-  function assertElementEnabled(selector) {
-    const element = apnDetailDialog.shadowRoot.querySelector(selector);
-    assertTrue(!!element);
-    assertFalse(element.disabled);
-  }
-
-  function assertAllInputsEnabled() {
-    assertElementEnabled('#apnInput');
-    assertElementEnabled('#usernameInput');
-    assertElementEnabled('#passwordInput');
-    assertElementEnabled('#authTypeDropDown');
-    assertElementEnabled('#apnDefaultTypeCheckbox');
-    assertElementEnabled('#apnAttachTypeCheckbox');
-    assertElementEnabled('#ipTypeDropDown');
-  }
-
-  setup(async function() {
-    testing.Test.disableAnimationsAndTransitions();
-    PolymerTest.clearBody();
-    mojoApi_ = new FakeNetworkConfig();
-    MojoInterfaceProviderImpl.getInstance().remote_ = mojoApi_;
-    apnDetailDialog = document.createElement('apn-detail-dialog');
-    apnDetailDialog.guid = 'fake-guid';
-    apnDetailDialog.apnList = [TEST_APN];
-  });
-
-  teardown(function() {
-    return flushTasks().then(() => {
-      apnDetailDialog.remove();
-      apnDetailDialog = null;
-    });
-  });
-
-  async function init() {
-    document.body.appendChild(apnDetailDialog);
-    return waitAfterNextRender(apnDetailDialog);
-  }
-
-  test('Element contains dialog', async function() {
-    await init();
-    const dialog = apnDetailDialog.shadowRoot.querySelector('cr-dialog');
-    assertTrue(!!dialog);
-    assertTrue(dialog.open);
-    // Confirm that the dialog has the add apn title.
-    assertEquals(
-        apnDetailDialog.i18n('apnDetailAddApnDialogTitle'),
-        apnDetailDialog.shadowRoot.querySelector('#apnDetailDialogTitle')
-            .innerText);
-    assertTrue(!!apnDetailDialog.shadowRoot.querySelector('#apnInput'));
-    assertTrue(!!apnDetailDialog.shadowRoot.querySelector('#usernameInput'));
-    assertTrue(!!apnDetailDialog.shadowRoot.querySelector('#passwordInput'));
-
-    assertTrue(!!apnDetailDialog.shadowRoot.querySelector('#authTypeDropDown'));
-    const defaultTypeCheckbox =
-        apnDetailDialog.shadowRoot.querySelector('#apnDefaultTypeCheckbox');
-    assertTrue(!!defaultTypeCheckbox);
-    assertTrue(defaultTypeCheckbox.checked);
-    assertTrue(
-        !!apnDetailDialog.shadowRoot.querySelector('#apnAttachTypeCheckbox'));
-    assertTrue(!!apnDetailDialog.shadowRoot.querySelector('#ipTypeDropDown'));
-    assertTrue(
-        !!apnDetailDialog.shadowRoot.querySelector('#apnDetailCancelBtn'));
-    assertTrue(
-        !!apnDetailDialog.shadowRoot.querySelector('#apnDetailActionBtn'));
-    assertFalse(!!apnDetailDialog.shadowRoot.querySelector('#apnDoneBtn'));
-    assertEquals(
-        apnDetailDialog.shadowRoot.querySelector('#apnInput'),
-        apnDetailDialog.shadowRoot.activeElement);
-  });
-
-  test('Clicking the cancel button fires the close event', async function() {
-    await init();
-    const closeEventPromise = eventToPromise('close', window);
-    const cancelBtn =
-        apnDetailDialog.shadowRoot.querySelector('#apnDetailCancelBtn');
-    assertTrue(!!cancelBtn);
-
-    cancelBtn.click();
-    await closeEventPromise;
-    assertFalse(!!apnDetailDialog.$.apnDetailDialog.open);
-  });
-
-  test(
-      'Clicking on the advanced settings button expands/collapses section',
-      async function() {
-        await init();
-        const isAdvancedSettingShowing = () =>
-            apnDetailDialog.shadowRoot.querySelector('iron-collapse').opened;
-        assertFalse(!!isAdvancedSettingShowing());
-        toggleAdvancedSettings();
-        assertTrue(!!isAdvancedSettingShowing());
-        toggleAdvancedSettings();
-        assertFalse(!!isAdvancedSettingShowing());
-        toggleAdvancedSettings();
-        const assertOptions = (expectedTextArray, optionNodes) => {
-          for (const [idx, expectedText] of expectedTextArray.entries()) {
-            assertTrue(!!optionNodes[idx]);
-            assertTrue(!!optionNodes[idx].text);
-            assertEquals(expectedText, optionNodes[idx].text);
-          }
-        };
-        const authTypeDropDown =
-            apnDetailDialog.shadowRoot.querySelector('#authTypeDropDown');
-        assertTrue(!!authTypeDropDown);
-        const authTypeOptionNodes = authTypeDropDown.querySelectorAll('option');
-        assertEquals(3, authTypeOptionNodes.length);
-        // Note: We are also checking that the items appear in a certain order.
-        assertOptions(
-            [
-              apnDetailDialog.i18n('apnDetailTypeAuto'),
-              apnDetailDialog.i18n('apnDetailAuthTypePAP'),
-              apnDetailDialog.i18n('apnDetailAuthTypeCHAP'),
-            ],
-            authTypeOptionNodes);
-
-        const ipTypeDropDown =
-            apnDetailDialog.shadowRoot.querySelector('#ipTypeDropDown');
-        assertTrue(!!ipTypeDropDown);
-        const ipTypeOptionNodes = ipTypeDropDown.querySelectorAll('option');
-        assertEquals(4, ipTypeOptionNodes.length);
-
-        assertOptions(
-            [
-              apnDetailDialog.i18n('apnDetailTypeAuto'),
-              apnDetailDialog.i18n('apnDetailIpTypeIpv4'),
-              apnDetailDialog.i18n('apnDetailIpTypeIpv6'),
-              apnDetailDialog.i18n('apnDetailIpTypeIpv4_Ipv6'),
-            ],
-            ipTypeOptionNodes);
-      });
-
-  test('Clicking on the add button calls createCustomApn', async () => {
-    await init();
-    apnDetailDialog.$.apnInput.value = TEST_APN.accessPointName;
-    apnDetailDialog.$.usernameInput.value = TEST_APN.username;
-    apnDetailDialog.$.passwordInput.value = TEST_APN.password;
-
-    assertAllInputsEnabled();
-    assertElementEnabled('#apnDetailCancelBtn');
-    assertElementEnabled('#apnDetailActionBtn');
-    assertEquals(
-        apnDetailDialog.i18n('add'),
-        apnDetailDialog.shadowRoot.querySelector('#apnDetailActionBtn')
-            .innerText);
-
-    // Add a network.
-    const network = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, apnDetailDialog.guid);
-    mojoApi_.setManagedPropertiesForTest(network);
-    await flushTasks();
-
-    /**
-     * @type {!ManagedProperties}
-     */
-    const properties =
-        await mojoApi_.getManagedProperties(apnDetailDialog.guid);
-    assertTrue(!!properties);
-    assertFalse(!!properties.result.typeProperties.cellular.customApnList);
-
-    const actionBtn =
-        apnDetailDialog.shadowRoot.querySelector('#apnDetailActionBtn');
-    assertTrue(!!actionBtn);
-    actionBtn.click();
-    await flushTasks();
-    await mojoApi_.whenCalled('createCustomApn');
-
-    assertEquals(
-        1, properties.result.typeProperties.cellular.customApnList.length);
-
-    const apn = properties.result.typeProperties.cellular.customApnList[0];
-    assertEquals(TEST_APN.accessPointName, apn.accessPointName);
-    assertEquals(TEST_APN.username, apn.username);
-    assertEquals(TEST_APN.password, apn.password);
-    assertEquals(TEST_APN.authentication, apn.authentication);
-    assertEquals(TEST_APN.ipType, apn.ipType);
-    assertEquals(TEST_APN.apnTypes.length, apn.apnTypes.length);
-    assertEquals(TEST_APN.apnTypes[0], apn.apnTypes[0]);
-  });
-
-  test('Setting mode to view changes buttons and fields', async () => {
-    const assertFieldDisabled = (selector) => {
-      const element = apnDetailDialog.shadowRoot.querySelector(selector);
-      assertTrue(!!element);
-      assertTrue(element.disabled);
-    };
-
-    // Set the dialog mode before opening the dialog so that the default focus
-    // can be tested.
-    apnDetailDialog.mode = ApnDetailDialogMode.VIEW;
-    apnDetailDialog.apnProperties = TEST_APN;
-
-    await init();
-    assertEquals(
-        apnDetailDialog.i18n('apnDetailViewApnDialogTitle'),
-        apnDetailDialog.shadowRoot.querySelector('#apnDetailDialogTitle')
-            .innerText);
-    assertFalse(
-        !!apnDetailDialog.shadowRoot.querySelector('#apnDetailCancelBtn'));
-    assertFalse(
-        !!apnDetailDialog.shadowRoot.querySelector('#apnDetailActionBtn'));
-    const doneBtn = apnDetailDialog.shadowRoot.querySelector('#apnDoneBtn');
-    assertTrue(!!doneBtn);
-    assertFalse(doneBtn.disabled);
-    assertFieldDisabled('#apnInput');
-    assertFieldDisabled('#usernameInput');
-    assertFieldDisabled('#passwordInput');
-    assertFieldDisabled('#authTypeDropDown');
-    assertFieldDisabled('#apnDefaultTypeCheckbox');
-    assertFieldDisabled('#apnAttachTypeCheckbox');
-    assertFieldDisabled('#ipTypeDropDown');
-    assertEquals(doneBtn, apnDetailDialog.shadowRoot.activeElement);
-  });
-
-  test('Dialog input fields are validated', async () => {
-    await init();
-    const apnInputField = apnDetailDialog.$.apnInput;
-    const actionButton =
-        apnDetailDialog.shadowRoot.querySelector('#apnDetailActionBtn');
-    assertTrue(!!actionButton);
-    // Case: After opening dialog before user input
-    assertFalse(!!apnInputField.invalid);
-    assertTrue(!!actionButton.disabled);
-
-    // Case : After valid user input
-    apnInputField.value = 'test';
-    assertFalse(!!apnInputField.invalid);
-    assertFalse(!!actionButton.disabled);
-
-    // Case : After Removing all user input no error state but button disabled
-    apnInputField.value = '';
-    assertFalse(!!apnInputField.invalid);
-    assertTrue(!!actionButton.disabled);
-
-    // Case : Non ascii user input
-    apnInputField.value = 'testμ';
-    assertTrue(!!apnInputField.invalid);
-    assertTrue(!!actionButton.disabled);
-    assertTrue(apnInputField.value.includes('μ'));
-
-    // Case : longer than 63 characters then removing one character
-    apnInputField.value = 'a'.repeat(64);
-    assertTrue(!!apnInputField.invalid);
-    assertTrue(!!actionButton.disabled);
-    assertFalse(apnInputField.value.length > 63);
-    apnInputField.value = apnInputField.value.slice(0, -1);
-    assertFalse(!!apnInputField.invalid);
-    assertFalse(!!actionButton.disabled);
-
-    // Case : longer than 63 non-ASCII characters
-    apnInputField.value = 'μ'.repeat(64);
-    assertTrue(!!apnInputField.invalid);
-    assertTrue(!!actionButton.disabled);
-  });
-
-  test('Apn types are correctly validated in all modes', async () => {
-    await init();
-    const updateApnTypeCheckboxes = (defaultType, attachType) => {
-      apnDetailDialog.$.apnDefaultTypeCheckbox.checked = defaultType;
-      apnDetailDialog.$.apnAttachTypeCheckbox.checked = attachType;
-    };
-    await toggleAdvancedSettings();
-    const getDefaultApnInfo = () => {
-      return apnDetailDialog.shadowRoot.querySelector(
-          '#defaultApnRequiredInfo');
-    };
-
-    TEST_APN.id = '1';
-    const currentApn = /** @type {ApnProperties} */ ({});
-    Object.assign(currentApn, TEST_APN);
-    currentApn.id = '2';
-    apnDetailDialog.apnList = [TEST_APN, currentApn];
-    apnDetailDialog.apnProperties = currentApn;
-
-    const actionButton =
-        apnDetailDialog.shadowRoot.querySelector('#apnDetailActionBtn');
-    apnDetailDialog.$.apnInput.value = 'valid_name';
-
-    // CREATE mode tests
-    apnDetailDialog.mode = ApnDetailDialogMode.CREATE;
-    TEST_APN.state = ApnState.kDisabled;
-    apnDetailDialog.apnList = [TEST_APN];
-
-    // Case: Default APN type is checked
-    updateApnTypeCheckboxes(/* default= */ true, /* attach= */ false);
-    await flushTasks();
-    assertFalse(actionButton.disabled);
-    assertFalse(!!getDefaultApnInfo());
-
-    // Case: No enabled default APNs, default unchecked and attach is checked.
-    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ true);
-    await flushTasks();
-    assertTrue(actionButton.disabled);
-    assertTrue(!!getDefaultApnInfo());
-
-    // Case: No enabled default APNs and both unchecked.
-    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ false);
-    await flushTasks();
-    assertTrue(actionButton.disabled);
-    assertFalse(!!getDefaultApnInfo());
-
-    // Case: Enabled default APNs, default unchecked and attach is checked.
-    TEST_APN.state = ApnState.kEnabled;
-    apnDetailDialog.apnList = [TEST_APN];
-    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ true);
-    await flushTasks();
-    assertFalse(actionButton.disabled);
-    assertFalse(!!getDefaultApnInfo());
-
-    // Case: Enabled default APNs and both unchecked.
-    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ false);
-    await flushTasks();
-    assertTrue(actionButton.disabled);
-    assertFalse(!!getDefaultApnInfo());
-
-    // Edit mode tests
-    apnDetailDialog.mode = ApnDetailDialogMode.EDIT;
-    TEST_APN.apnTypes = [ApnType.kAttach];
-    currentApn.apnTypes = [ApnType.kDefault, ApnType.kAttach];
-    apnDetailDialog.apnList = [TEST_APN, currentApn];
-
-    // Case: Default APN type is checked
-    updateApnTypeCheckboxes(/* default= */ true, /* attach= */ false);
-    await flushTasks();
-    assertFalse(actionButton.disabled);
-    assertFalse(!!getDefaultApnInfo());
-
-    // Case: User unchecks the default checkbox, APN being modified is the
-    // only default APN
-    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ true);
-    await flushTasks();
-    assertTrue(actionButton.disabled);
-    assertTrue(!!getDefaultApnInfo());
-
-    // Case: User unchecks both checkboxes, APN being modified is the
-    // only enabled default APN but there are other enabled attach APNs.
-    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ false);
-    await flushTasks();
-    assertTrue(actionButton.disabled);
-    assertTrue(!!getDefaultApnInfo());
-
-    // Case: User unchecks both checkboxes, APN being modified is the
-    // only enabled default APN and is the only enabled attachApn.
-    currentApn.apnTypes = [ApnType.kDefault, ApnType.kAttach];
-    apnDetailDialog.apnList = [currentApn];
-    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ false);
-    await flushTasks();
-    assertTrue(actionButton.disabled);
-    assertFalse(!!getDefaultApnInfo());
-
-    // Case: User unchecks default APN type checkbox and checks the attach
-    // APN type checkbox, APN being modified is the only enabled default APN
-    // and there are no other enabled attach type APNs.
-    currentApn.apnTypes = [ApnType.kDefault];
-    apnDetailDialog.apnList = [currentApn];
-    updateApnTypeCheckboxes(/* default= */ false, /* attach= */ true);
-    await flushTasks();
-    assertTrue(actionButton.disabled);
-    assertTrue(!!getDefaultApnInfo());
-  });
-
-  test('Setting mode to edit changes buttons and fields', async () => {
-    const apnWithId = TEST_APN;
-    apnWithId.id = '1';
-    apnWithId.apnTypes = [ApnType.kDefault];
-
-    // Set the dialog mode before opening the dialog so that the default focus
-    // can be tested.
-    apnDetailDialog.mode = ApnDetailDialogMode.EDIT;
-    apnDetailDialog.apnProperties = apnWithId;
-
-    await init();
-    assertEquals(
-        apnDetailDialog.i18n('apnDetailEditApnDialogTitle'),
-        apnDetailDialog.shadowRoot.querySelector('#apnDetailDialogTitle')
-            .innerText);
-    assertElementEnabled('#apnDetailCancelBtn');
-    assertElementEnabled('#apnDetailActionBtn');
-    assertEquals(
-        apnDetailDialog.i18n('save'),
-        apnDetailDialog.shadowRoot.querySelector('#apnDetailActionBtn')
-            .innerText);
-    assertFalse(!!apnDetailDialog.shadowRoot.querySelector('#apnDoneBtn'));
-    assertAllInputsEnabled();
-
-    // Case: clicking on the action button calls the correct method
-    const network = OncMojo.getDefaultManagedProperties(
-        NetworkType.kCellular, apnDetailDialog.guid);
-    mojoApi_.setManagedPropertiesForTest(network);
-    await flushTasks();
-    const managedProperties =
-        await mojoApi_.getManagedProperties(apnDetailDialog.guid);
-    assertTrue(!!managedProperties);
-    managedProperties.result.typeProperties.cellular = {
-      customApnList: [apnWithId],
-    };
-    const newExpectedApn = 'modified';
-    apnDetailDialog.$.apnInput.value = newExpectedApn;
-    apnDetailDialog.shadowRoot.querySelector('#apnDetailActionBtn').click();
-    await mojoApi_.whenCalled('modifyCustomApn');
-
-    const apn =
-        managedProperties.result.typeProperties.cellular.customApnList[0];
-    assertEquals(newExpectedApn, apn.accessPointName);
-    assertEquals(apnWithId.id, apn.id);
-    assertEquals(apnWithId.username, apn.username);
-    assertEquals(apnWithId.password, apn.password);
-    assertEquals(apnWithId.authentication, apn.authentication);
-    assertEquals(apnWithId.ipType, apn.ipType);
-    assertEquals(apnWithId.apnTypes.length, apn.apnTypes.length);
-    assertEquals(apnWithId.apnTypes[0], apn.apnTypes[0]);
-    assertEquals(
-        apnDetailDialog.shadowRoot.querySelector('#apnInput'),
-        apnDetailDialog.shadowRoot.activeElement);
-  });
-
-});
diff --git a/chrome/test/data/webui/settings/chromeos/crostini_extra_containers_subpage_test.js b/chrome/test/data/webui/settings/chromeos/crostini_extra_containers_subpage_test.js
deleted file mode 100644
index 592bf60..0000000
--- a/chrome/test/data/webui/settings/chromeos/crostini_extra_containers_subpage_test.js
+++ /dev/null
@@ -1,399 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {CrostiniBrowserProxyImpl} from 'chrome://os-settings/lazy_load.js';
-import {Router, routes} from 'chrome://os-settings/os_settings.js';
-import {webUIListenerCallback} from 'chrome://resources/ash/common/cr.m.js';
-import {loadTimeData} from 'chrome://resources/ash/common/load_time_data.m.js';
-import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {assertArrayEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
-import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
-
-import {TestCrostiniBrowserProxy} from './test_crostini_browser_proxy.js';
-
-suite('CrostiniExtraContainersSubpageTests', function() {
-  /** @type {?SettingsCrostiniPageElement} */
-  let crostiniPage = null;
-
-  /** @type {?TestCrostiniBrowserProxy} */
-  let crostiniBrowserProxy = null;
-
-  /** @type {?SettingsCrostinuExtraContainersElement} */
-  let subpage;
-
-  setup(async function() {
-    crostiniBrowserProxy = new TestCrostiniBrowserProxy();
-    CrostiniBrowserProxyImpl.setInstanceForTesting(crostiniBrowserProxy);
-    crostiniPage = document.createElement('settings-crostini-page');
-    document.body.appendChild(crostiniPage);
-    testing.Test.disableAnimationsAndTransitions();
-
-    const allContainers_ = [
-      {
-        'id': {'container_name': 'penguin', 'vm_name': 'termina'},
-      },
-      {
-        'id': {'container_name': 'custom_container_1', 'vm_name': 'termina'},
-      },
-      {
-        'id':
-            {'container_name': 'custom_container_2', 'vm_name': 'not_termina'},
-      },
-    ];
-
-    const sharedVmDevices_ = [
-      {
-        id: allContainers_[0].id,
-        vmDevices: {microphone: true},
-      },
-      {
-        id: allContainers_[1].id,
-        vmDevices: {microphone: false},
-      },
-      {
-        id: allContainers_[2].id,
-        vmDevices: {microphone: true},
-      },
-    ];
-
-    crostiniBrowserProxy.containerInfo = allContainers_;
-    crostiniBrowserProxy.sharedVmDevices = sharedVmDevices_;
-    crostiniPage.prefs = {
-      crostini: {
-        enabled: {value: true},
-      },
-    };
-    flush();
-    assertEquals(0, crostiniBrowserProxy.getCallCount('requestContainerInfo'));
-    assertEquals(
-        0, crostiniBrowserProxy.getCallCount('requestSharedVmDevices'));
-
-    Router.getInstance().navigateTo(
-        routes.CROSTINI_EXTRA_CONTAINERS);
-
-    await flushTasks();
-    subpage = crostiniPage.shadowRoot.querySelector(
-        'settings-crostini-extra-containers');
-    assertTrue(!!subpage);
-    assertEquals(1, crostiniBrowserProxy.getCallCount('requestContainerInfo'));
-    assertEquals(
-        1, crostiniBrowserProxy.getCallCount('requestSharedVmDevices'));
-  });
-
-  teardown(function() {
-    crostiniPage.remove();
-    Router.getInstance().resetRouteForTesting();
-  });
-
-  suite('CreateContainerDialog', function() {
-    /** @type {?Element} */
-    let containerNameInput;
-
-    /** @type {?Element} */
-    let vmNameInput;
-
-    /** @type {?Element} */
-    let createButton;
-
-    /** @type {?Element} */
-    let advancedToggle;
-
-    /** @type {?Element} */
-    let advancedSection;
-
-    setup(async function() {
-      subpage.shadowRoot.querySelector('#create').click();
-
-      await flushTasks();
-      subpage = subpage.shadowRoot.querySelector(
-          'settings-crostini-create-container-dialog');
-
-      containerNameInput = subpage.root.querySelector('#containerNameInput');
-      vmNameInput = subpage.root.querySelector('#vmNameInput');
-      createButton = subpage.root.querySelector('#create');
-      advancedToggle = subpage.root.querySelector('#advancedToggle');
-      advancedSection = subpage.root.querySelector('.advanced-section');
-    });
-
-    /**
-     * Helper function to enter |inputValue| in the element |input| and fire an
-     * input event.
-     * @param {!Element} inputElement
-     * @param {string} inputValue
-     */
-    function setInput(inputElement, inputValue) {
-      inputElement.value = inputValue;
-      inputElement.dispatchEvent(new Event('input'));
-    }
-
-    /**
-     * Helper function to check that the containerNameInput is valid and
-     * createButton is enabled.
-     */
-    function assertValidAndEnabled() {
-      assertFalse(containerNameInput.invalid);
-      assertFalse(createButton.disabled);
-    }
-
-    /**
-     * Helper function to check that the containerNameInput is invalid with
-     * |errorMsgName|, and createButton is disabled.
-     * @param {string} errorMsg
-     */
-    function assertInvalidAndDisabled(errorMsgName) {
-      assertTrue(containerNameInput.invalid);
-      assertTrue(createButton.disabled);
-      assertEquals(
-          containerNameInput.errorMessage,
-          loadTimeData.getString(errorMsgName));
-    }
-
-    test('AddContainerValidInDefaultVm', async function() {
-      setInput(containerNameInput, 'custom_container_2');
-      assertValidAndEnabled();
-
-      createButton.click();
-      assertEquals(1, crostiniBrowserProxy.getCallCount('createContainer'));
-    });
-
-    test('AddContainerValidInNonDefaultVm', async function() {
-      setInput(containerNameInput, 'custom_container_1');
-      setInput(vmNameInput, 'not_termina');
-      assertValidAndEnabled();
-
-      createButton.click();
-      assertEquals(1, crostiniBrowserProxy.getCallCount('createContainer'));
-    });
-
-    test(
-        'ErrorAndDisabledCreateForDefaultContainerNameInDefaultVm',
-        async function() {
-          setInput(containerNameInput, 'penguin');
-
-          assertInvalidAndDisabled(
-              'crostiniExtraContainersCreateDialogContainerExistsError');
-        });
-
-    test(
-        'ErrorAndDisabledCreateForDefaultContainerNameInNonDefaultVm',
-        async function() {
-          setInput(containerNameInput, 'penguin');
-          setInput(vmNameInput, 'not_termina');
-
-          assertInvalidAndDisabled(
-              'crostiniExtraContainersCreateDialogContainerExistsError');
-        });
-
-    test(
-        'ErrorAndDisabledCreateForDuplicateContainerNameInDefaultVm',
-        async function() {
-          setInput(containerNameInput, 'custom_container_1');
-
-          assertInvalidAndDisabled(
-              'crostiniExtraContainersCreateDialogContainerExistsError');
-        });
-
-    test(
-        'ErrorAndDisabledCreateForDuplicateContainerNameInNonDefaultVm',
-        async function() {
-          setInput(containerNameInput, 'custom_container_2');
-          setInput(vmNameInput, 'not_termina');
-
-          assertInvalidAndDisabled(
-              'crostiniExtraContainersCreateDialogContainerExistsError');
-        });
-
-    test(
-        'ErrorAndDisabledCreateForEmptyContainerNameInDefaultVm',
-        async function() {
-          setInput(containerNameInput, '');
-
-          assertInvalidAndDisabled(
-              'crostiniExtraContainersCreateDialogEmptyContainerNameError');
-        });
-
-    test(
-        'ErrorAndDisabledCreateForEmptyContainerNameInNonDefaultVm',
-        async function() {
-          setInput(containerNameInput, '');
-          setInput(vmNameInput, 'not_termina');
-
-          assertInvalidAndDisabled(
-              'crostiniExtraContainersCreateDialogEmptyContainerNameError');
-        });
-
-    test('ReenabledButtonAfterError', async function() {
-      setInput(containerNameInput, 'penguin');
-      assertInvalidAndDisabled(
-          'crostiniExtraContainersCreateDialogContainerExistsError');
-
-      setInput(containerNameInput, 'custom_container_2');
-      assertValidAndEnabled();
-
-      createButton.click();
-      assertEquals(1, crostiniBrowserProxy.getCallCount('createContainer'));
-    });
-
-    test('CreateContainerAdvancedWithFile', async function() {
-      setInput(containerNameInput, 'advanced_container');
-      setInput(vmNameInput, 'termina');
-
-      assertTrue(advancedSection.hidden);
-      advancedToggle.click();
-      assertFalse(advancedSection.hidden);
-
-      const containerFileInput =
-          subpage.root.querySelector('#containerFileInput');
-      setInput(containerFileInput, 'test_backup.tini');
-      assertValidAndEnabled();
-
-      createButton.click();
-      assertEquals(1, crostiniBrowserProxy.getCallCount('createContainer'));
-      const args = crostiniBrowserProxy.getArgs('createContainer')[0];
-      assertArrayEquals(
-          [
-            {vm_name: 'termina', container_name: 'advanced_container'},
-            '',
-            '',
-            'test_backup.tini',
-          ],
-          args);
-    });
-  });
-
-  suite('ExportImportContainer', function() {
-    test('Export', async function() {
-      subpage.shadowRoot.querySelector('#showContainerMenu1').click();
-
-      await flushTasks();
-      assertTrue(!!subpage.shadowRoot.querySelector('#exportContainerButton'));
-      subpage.shadowRoot.querySelector('#exportContainerButton').click();
-      const args = crostiniBrowserProxy.getArgs('exportCrostiniContainer');
-      assertEquals(1, args.length);
-      assertEquals(args[0].vm_name, 'termina');
-      assertEquals(args[0].container_name, 'custom_container_1');
-    });
-
-    test('Import', async function() {
-      subpage.shadowRoot.querySelector('#showContainerMenu1').click();
-
-      await flushTasks();
-      assertTrue(!!subpage.shadowRoot.querySelector('#importContainerButton'));
-      subpage.shadowRoot.querySelector('#importContainerButton').click();
-      const args = crostiniBrowserProxy.getArgs('importCrostiniContainer');
-      assertEquals(1, args.length);
-      assertEquals(args[0].vm_name, 'termina');
-      assertEquals(args[0].container_name, 'custom_container_1');
-    });
-
-    test('ExportImportButtonsGetDisabledOnOperationStatus', async function() {
-      subpage.shadowRoot.querySelector('#showContainerMenu1').click();
-
-      await flushTasks();
-      assertFalse(
-          subpage.shadowRoot.querySelector('#exportContainerButton').disabled);
-      assertFalse(
-          subpage.shadowRoot.querySelector('#importContainerButton').disabled);
-      webUIListenerCallback(
-          'crostini-export-import-operation-status-changed', true);
-
-      await flushTasks();
-      assertTrue(
-          subpage.shadowRoot.querySelector('#exportContainerButton').disabled);
-      assertTrue(
-          subpage.shadowRoot.querySelector('#importContainerButton').disabled);
-      webUIListenerCallback(
-          'crostini-export-import-operation-status-changed', false);
-
-      await flushTasks();
-      assertFalse(
-          subpage.shadowRoot.querySelector('#exportContainerButton').disabled);
-      assertFalse(
-          subpage.shadowRoot.querySelector('#importContainerButton').disabled);
-    });
-
-    test(
-        'ExportImportButtonsDisabledOnWhenInstallingCrostini',
-        async function() {
-          subpage.shadowRoot.querySelector('#showContainerMenu1').click();
-
-          await flushTasks();
-          assertFalse(subpage.shadowRoot.querySelector('#exportContainerButton')
-                          .disabled);
-          assertFalse(subpage.shadowRoot.querySelector('#importContainerButton')
-                          .disabled);
-          webUIListenerCallback('crostini-installer-status-changed', true);
-
-          await flushTasks();
-          assertTrue(subpage.shadowRoot.querySelector('#exportContainerButton')
-                         .disabled);
-          assertTrue(subpage.shadowRoot.querySelector('#importContainerButton')
-                         .disabled);
-          webUIListenerCallback('crostini-installer-status-changed', false);
-
-          await flushTasks();
-          assertFalse(subpage.shadowRoot.querySelector('#exportContainerButton')
-                          .disabled);
-          assertFalse(subpage.shadowRoot.querySelector('#importContainerButton')
-                          .disabled);
-        });
-  });
-
-  suite('ContainerDetails', function() {
-    test('ExpandButton', async function() {
-      const expandButton =
-          subpage.shadowRoot.querySelector('#expand-button-termina-penguin');
-      assertTrue(!!expandButton);
-
-      // The collapse element should open/close on clicking |expandButton|.
-      const collapse =
-          subpage.shadowRoot.querySelector('#collapse-termina-penguin');
-      assertTrue(!!collapse);
-
-      assertFalse(collapse.opened);
-      expandButton.click();
-      await flushTasks();
-      assertTrue(collapse.opened);
-
-      expandButton.click();
-      await flushTasks();
-      assertFalse(collapse.opened);
-    });
-
-    test('ToggleMicrophoneOff', async function() {
-      // The toggle is inside an iron-collapse, but we can still click it
-      // via the testing apis.
-      const toggle =
-          subpage.shadowRoot.querySelector('#microphone-termina-penguin');
-
-      assertTrue(!!toggle);
-      assertTrue(toggle.checked);
-
-      toggle.click();
-      await crostiniBrowserProxy.resolvePromises('setVmDeviceShared', true);
-      await crostiniBrowserProxy.resolvePromises('isVmDeviceShared', false);
-
-      assertFalse(toggle.checked);
-
-      assertEquals(1, crostiniBrowserProxy.getCallCount('setVmDeviceShared'));
-      const args1 = crostiniBrowserProxy.getArgs('setVmDeviceShared')[0];
-      assertArrayEquals(
-          [
-            {vm_name: 'termina', container_name: 'penguin'},
-            'microphone',
-            false,
-          ],
-          args1);
-
-      assertEquals(1, crostiniBrowserProxy.getCallCount('isVmDeviceShared'));
-      const args2 = crostiniBrowserProxy.getArgs('isVmDeviceShared')[0];
-      assertArrayEquals(
-          [
-            {vm_name: 'termina', container_name: 'penguin'},
-            'microphone',
-          ],
-          args2);
-    });
-  });
-});
diff --git a/chrome/test/data/webui/settings/chromeos/crostini_page/crostini_extra_containers_subpage_test.ts b/chrome/test/data/webui/settings/chromeos/crostini_page/crostini_extra_containers_subpage_test.ts
new file mode 100644
index 0000000..d00c85e
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/crostini_page/crostini_extra_containers_subpage_test.ts
@@ -0,0 +1,468 @@
+// 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.
+
+import 'chrome://os-settings/lazy_load.js';
+
+import {ContainerInfo, CrostiniBrowserProxyImpl, ExtraContainersCreateDialog, ExtraContainersElement, SettingsCrostiniPageElement} from 'chrome://os-settings/lazy_load.js';
+import {CrInputElement, CrToggleElement, IronCollapseElement, Router, routes} from 'chrome://os-settings/os_settings.js';
+import {webUIListenerCallback} from 'chrome://resources/js/cr.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {assertArrayEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
+import {disableAnimationsAndTransitions} from 'chrome://webui-test/test_api.js';
+
+import {SharedVmDevices, TestCrostiniBrowserProxy} from './test_crostini_browser_proxy.js';
+
+suite('<settings-crostini-extra-containers>', () => {
+  let crostiniPage: SettingsCrostiniPageElement;
+  let crostiniBrowserProxy: TestCrostiniBrowserProxy;
+  let subpage: ExtraContainersElement;
+
+  setup(async () => {
+    crostiniBrowserProxy = new TestCrostiniBrowserProxy();
+    CrostiniBrowserProxyImpl.setInstanceForTesting(crostiniBrowserProxy);
+    crostiniPage = document.createElement('settings-crostini-page');
+    document.body.appendChild(crostiniPage);
+    disableAnimationsAndTransitions();
+
+    const allContainers: ContainerInfo[] = [
+      {
+        id: {container_name: 'penguin', vm_name: 'termina'},
+        ipv4: null,
+      },
+      {
+        id: {container_name: 'custom_container_1', vm_name: 'termina'},
+        ipv4: null,
+      },
+      {
+        id: {container_name: 'custom_container_2', vm_name: 'not_termina'},
+        ipv4: null,
+      },
+    ];
+
+    const sharedVmDevices: SharedVmDevices[] = [
+      {
+        id: allContainers[0]!.id,
+        vmDevices: {microphone: true},
+      },
+      {
+        id: allContainers[1]!.id,
+        vmDevices: {microphone: false},
+      },
+      {
+        id: allContainers[2]!.id,
+        vmDevices: {microphone: true},
+      },
+    ];
+
+    crostiniBrowserProxy.containerInfo = allContainers;
+    crostiniBrowserProxy.sharedVmDevices = sharedVmDevices;
+    crostiniPage.prefs = {
+      crostini: {
+        enabled: {value: true},
+      },
+    };
+    flush();
+
+    assertEquals(0, crostiniBrowserProxy.getCallCount('requestContainerInfo'));
+    assertEquals(
+        0, crostiniBrowserProxy.getCallCount('requestSharedVmDevices'));
+
+    Router.getInstance().navigateTo(routes.CROSTINI_EXTRA_CONTAINERS);
+
+    await flushTasks();
+    const subpageElement =
+        crostiniPage.shadowRoot!.querySelector<ExtraContainersElement>(
+            'settings-crostini-extra-containers');
+    assertTrue(!!subpageElement);
+    subpage = subpageElement;
+    assertTrue(!!subpage);
+    assertEquals(1, crostiniBrowserProxy.getCallCount('requestContainerInfo'));
+    assertEquals(
+        1, crostiniBrowserProxy.getCallCount('requestSharedVmDevices'));
+  });
+
+  teardown(() => {
+    crostiniPage.remove();
+    Router.getInstance().resetRouteForTesting();
+  });
+
+  suite('CreateContainerDialog', () => {
+    let createDialogSubpage: ExtraContainersCreateDialog;
+    let containerNameInput: CrInputElement;
+    let vmNameInput: CrInputElement;
+    let createButton: HTMLButtonElement;
+    let advancedToggle: HTMLButtonElement;
+    let advancedSection: HTMLElement;
+
+    setup(async () => {
+      const button =
+          subpage.shadowRoot!.querySelector<HTMLButtonElement>('#create');
+      assertTrue(!!button);
+      button.click();
+
+      await flushTasks();
+      const dialogElement =
+          subpage.shadowRoot!.querySelector<ExtraContainersCreateDialog>(
+              'settings-crostini-create-container-dialog');
+      assertTrue(!!dialogElement);
+      createDialogSubpage = dialogElement;
+
+      const containerNameInputElement =
+          createDialogSubpage.shadowRoot!.querySelector<CrInputElement>(
+              '#containerNameInput');
+      assertTrue(!!containerNameInputElement);
+      containerNameInput = containerNameInputElement;
+
+      const vmNameInputElement =
+          createDialogSubpage.shadowRoot!.querySelector<CrInputElement>(
+              '#vmNameInput');
+      assertTrue(!!vmNameInputElement);
+      vmNameInput = vmNameInputElement;
+
+      const createButtonElement =
+          createDialogSubpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#create');
+      assertTrue(!!createButtonElement);
+      createButton = createButtonElement;
+
+      const advancedToggleElement =
+          createDialogSubpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#advancedToggle');
+      assertTrue(!!advancedToggleElement);
+      advancedToggle = advancedToggleElement;
+
+      const advancedSectionElement =
+          createDialogSubpage.shadowRoot!.querySelector<HTMLElement>(
+              '.advanced-section');
+      assertTrue(!!advancedSectionElement);
+      advancedSection = advancedSectionElement;
+    });
+
+    /**
+     * Helper function to enter |inputValue| in the element |input| and fire an
+     * input event.
+     */
+    function setInput(inputElement: CrInputElement, inputValue: string): void {
+      inputElement.value = inputValue;
+      inputElement.dispatchEvent(new Event('input'));
+    }
+
+    /**
+     * Helper function to check that the containerNameInput is valid and
+     * createButton is enabled.
+     */
+    function assertValidAndEnabled(): void {
+      assertFalse(containerNameInput.invalid);
+      assertFalse(createButton.disabled);
+    }
+
+    /**
+     * Helper function to check that the containerNameInput is invalid with
+     * |errorMsgName|, and createButton is disabled.
+     */
+    function assertInvalidAndDisabled(errorMsgName: string): void {
+      assertTrue(containerNameInput.invalid);
+      assertTrue(createButton.disabled);
+      assertEquals(
+          loadTimeData.getString(errorMsgName),
+          containerNameInput.errorMessage);
+    }
+
+    test('AddContainerValidInDefaultVm', () => {
+      setInput(containerNameInput, 'custom_container_2');
+      assertValidAndEnabled();
+
+      createButton.click();
+      assertEquals(1, crostiniBrowserProxy.getCallCount('createContainer'));
+    });
+
+    test('AddContainerValidInNonDefaultVm', () => {
+      setInput(containerNameInput, 'custom_container_1');
+      setInput(vmNameInput, 'not_termina');
+      assertValidAndEnabled();
+
+      createButton.click();
+      assertEquals(1, crostiniBrowserProxy.getCallCount('createContainer'));
+    });
+
+    test('ErrorAndDisabledCreateForDefaultContainerNameInDefaultVm', () => {
+      setInput(containerNameInput, 'penguin');
+
+      assertInvalidAndDisabled(
+          'crostiniExtraContainersCreateDialogContainerExistsError');
+    });
+
+    test('ErrorAndDisabledCreateForDefaultContainerNameInNonDefaultVm', () => {
+      setInput(containerNameInput, 'penguin');
+      setInput(vmNameInput, 'not_termina');
+
+      assertInvalidAndDisabled(
+          'crostiniExtraContainersCreateDialogContainerExistsError');
+    });
+
+    test('ErrorAndDisabledCreateForDuplicateContainerNameInDefaultVm', () => {
+      setInput(containerNameInput, 'custom_container_1');
+
+      assertInvalidAndDisabled(
+          'crostiniExtraContainersCreateDialogContainerExistsError');
+    });
+
+    test(
+        'ErrorAndDisabledCreateForDuplicateContainerNameInNonDefaultVm', () => {
+          setInput(containerNameInput, 'custom_container_2');
+          setInput(vmNameInput, 'not_termina');
+
+          assertInvalidAndDisabled(
+              'crostiniExtraContainersCreateDialogContainerExistsError');
+        });
+
+    test('ErrorAndDisabledCreateForEmptyContainerNameInDefaultVm', () => {
+      setInput(containerNameInput, '');
+
+      assertInvalidAndDisabled(
+          'crostiniExtraContainersCreateDialogEmptyContainerNameError');
+    });
+
+    test('ErrorAndDisabledCreateForEmptyContainerNameInNonDefaultVm', () => {
+      setInput(containerNameInput, '');
+      setInput(vmNameInput, 'not_termina');
+
+      assertInvalidAndDisabled(
+          'crostiniExtraContainersCreateDialogEmptyContainerNameError');
+    });
+
+    test('ReenabledButtonAfterError', () => {
+      setInput(containerNameInput, 'penguin');
+      assertInvalidAndDisabled(
+          'crostiniExtraContainersCreateDialogContainerExistsError');
+
+      setInput(containerNameInput, 'custom_container_2');
+      assertValidAndEnabled();
+
+      createButton.click();
+      assertEquals(1, crostiniBrowserProxy.getCallCount('createContainer'));
+    });
+
+    test('CreateContainerAdvancedWithFile', () => {
+      setInput(containerNameInput, 'advanced_container');
+      setInput(vmNameInput, 'termina');
+
+      assertTrue(advancedSection.hidden);
+      advancedToggle.click();
+      assertFalse(advancedSection.hidden);
+
+      const containerFileInput =
+          createDialogSubpage.shadowRoot!.querySelector<CrInputElement>(
+              '#containerFileInput');
+      assertTrue(!!containerFileInput);
+      setInput(containerFileInput, 'test_backup.tini');
+      assertValidAndEnabled();
+
+      createButton.click();
+      assertEquals(1, crostiniBrowserProxy.getCallCount('createContainer'));
+      const args = crostiniBrowserProxy.getArgs('createContainer')[0];
+      assertArrayEquals(
+          [
+            {vm_name: 'termina', container_name: 'advanced_container'},
+            '',
+            '',
+            'test_backup.tini',
+          ],
+          args);
+    });
+  });
+
+  suite('ExportImportContainer', () => {
+    test('Export', async () => {
+      const showContainerMenuBtn =
+          subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#showContainerMenu1');
+      assertTrue(!!showContainerMenuBtn);
+      showContainerMenuBtn.click();
+
+      await flushTasks();
+      const exportContainerBtn =
+          subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#exportContainerButton');
+      assertTrue(!!exportContainerBtn);
+      exportContainerBtn.click();
+
+      const args = crostiniBrowserProxy.getArgs('exportCrostiniContainer');
+      assertEquals(1, args.length);
+      assertEquals('termina', args[0].vm_name);
+      assertEquals('custom_container_1', args[0].container_name);
+    });
+
+    test('Import', async () => {
+      const showContainerMenuBtn =
+          subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#showContainerMenu1');
+      assertTrue(!!showContainerMenuBtn);
+      showContainerMenuBtn.click();
+
+      await flushTasks();
+      const importContainerBtn =
+          subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#importContainerButton');
+      assertTrue(!!importContainerBtn);
+      importContainerBtn.click();
+
+      const args = crostiniBrowserProxy.getArgs('importCrostiniContainer');
+      assertEquals(1, args.length);
+      assertEquals('termina', args[0].vm_name);
+      assertEquals('custom_container_1', args[0].container_name);
+    });
+
+    test('ExportImportButtonsGetDisabledOnOperationStatus', async () => {
+      const showContainerMenuBtn =
+          subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#showContainerMenu1');
+      assertTrue(!!showContainerMenuBtn);
+      showContainerMenuBtn.click();
+
+      await flushTasks();
+      let exportContainerBtn =
+          subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#exportContainerButton');
+      assertTrue(!!exportContainerBtn);
+      let importContainerBtn =
+          subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#importContainerButton');
+      assertTrue(!!importContainerBtn);
+
+      assertFalse(exportContainerBtn.disabled);
+      assertFalse(importContainerBtn.disabled);
+      webUIListenerCallback(
+          'crostini-export-import-operation-status-changed', true);
+
+      await flushTasks();
+      exportContainerBtn =
+          subpage.shadowRoot!.querySelector('#exportContainerButton');
+      assertTrue(!!exportContainerBtn);
+      importContainerBtn =
+          subpage.shadowRoot!.querySelector('#importContainerButton');
+      assertTrue(!!importContainerBtn);
+
+      assertTrue(exportContainerBtn.disabled);
+      assertTrue(importContainerBtn.disabled);
+      webUIListenerCallback(
+          'crostini-export-import-operation-status-changed', false);
+
+      await flushTasks();
+      exportContainerBtn =
+          subpage.shadowRoot!.querySelector('#exportContainerButton');
+      assertTrue(!!exportContainerBtn);
+      importContainerBtn =
+          subpage.shadowRoot!.querySelector('#importContainerButton');
+      assertTrue(!!importContainerBtn);
+
+      assertFalse(exportContainerBtn.disabled);
+      assertFalse(importContainerBtn.disabled);
+    });
+
+    test('ExportImportButtonsDisabledOnWhenInstallingCrostini', async () => {
+      const showContainerMenuBtn =
+          subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#showContainerMenu1');
+      assertTrue(!!showContainerMenuBtn);
+      showContainerMenuBtn.click();
+
+      await flushTasks();
+      let exportContainerBtn =
+          subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#exportContainerButton');
+      assertTrue(!!exportContainerBtn);
+      let importContainerBtn =
+          subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+              '#importContainerButton');
+      assertTrue(!!importContainerBtn);
+
+      assertFalse(exportContainerBtn.disabled);
+      assertFalse(importContainerBtn.disabled);
+      webUIListenerCallback('crostini-installer-status-changed', true);
+
+      await flushTasks();
+      exportContainerBtn =
+          subpage.shadowRoot!.querySelector('#exportContainerButton');
+      assertTrue(!!exportContainerBtn);
+      importContainerBtn =
+          subpage.shadowRoot!.querySelector('#importContainerButton');
+      assertTrue(!!importContainerBtn);
+
+      assertTrue(exportContainerBtn.disabled);
+      assertTrue(importContainerBtn.disabled);
+      webUIListenerCallback('crostini-installer-status-changed', false);
+
+      await flushTasks();
+      exportContainerBtn =
+          subpage.shadowRoot!.querySelector('#exportContainerButton');
+      assertTrue(!!exportContainerBtn);
+      importContainerBtn =
+          subpage.shadowRoot!.querySelector('#importContainerButton');
+      assertTrue(!!importContainerBtn);
+
+      assertFalse(exportContainerBtn.disabled);
+      assertFalse(importContainerBtn.disabled);
+    });
+  });
+
+  suite('ContainerDetails', () => {
+    test('ExpandButton', async () => {
+      const expandButton = subpage.shadowRoot!.querySelector<HTMLButtonElement>(
+          '#expand-button-termina-penguin');
+      assertTrue(!!expandButton);
+
+      // The collapse element should open/close on clicking |expandButton|.
+      const collapse = subpage.shadowRoot!.querySelector<IronCollapseElement>(
+          '#collapse-termina-penguin');
+      assertTrue(!!collapse);
+
+      assertFalse(collapse.opened);
+      expandButton.click();
+      await flushTasks();
+      assertTrue(collapse.opened);
+
+      expandButton.click();
+      await flushTasks();
+      assertFalse(collapse.opened);
+    });
+
+    test('ToggleMicrophoneOff', async () => {
+      // The toggle is inside an iron-collapse, but we can still click it
+      // via the testing apis.
+      const toggle = subpage.shadowRoot!.querySelector<CrToggleElement>(
+          '#microphone-termina-penguin');
+
+      assertTrue(!!toggle);
+      assertTrue(toggle.checked);
+
+      toggle.click();
+      await crostiniBrowserProxy.resolvePromises('setVmDeviceShared', true);
+      await crostiniBrowserProxy.resolvePromises('isVmDeviceShared', false);
+
+      assertFalse(toggle.checked);
+
+      assertEquals(1, crostiniBrowserProxy.getCallCount('setVmDeviceShared'));
+      const args1 = crostiniBrowserProxy.getArgs('setVmDeviceShared')[0];
+      assertArrayEquals(
+          [
+            {vm_name: 'termina', container_name: 'penguin'},
+            'microphone',
+            false,
+          ],
+          args1);
+
+      assertEquals(1, crostiniBrowserProxy.getCallCount('isVmDeviceShared'));
+      const args2 = crostiniBrowserProxy.getArgs('isVmDeviceShared')[0];
+      assertArrayEquals(
+          [
+            {vm_name: 'termina', container_name: 'penguin'},
+            'microphone',
+          ],
+          args2);
+    });
+  });
+});
diff --git a/chrome/test/data/webui/settings/chromeos/crostini_page/test_crostini_browser_proxy.ts b/chrome/test/data/webui/settings/chromeos/crostini_page/test_crostini_browser_proxy.ts
new file mode 100644
index 0000000..f71824be
--- /dev/null
+++ b/chrome/test/data/webui/settings/chromeos/crostini_page/test_crostini_browser_proxy.ts
@@ -0,0 +1,291 @@
+// Copyright 2018 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {ContainerInfo, CrostiniBrowserProxy, CrostiniDiskInfo, CrostiniPortActiveSetting, CrostiniPortProtocol, GuestId, ShareableDevices} from 'chrome://os-settings/lazy_load.js';
+import {webUIListenerCallback} from 'chrome://resources/js/cr.js';
+import {SkColor} from 'chrome://resources/mojo/skia/public/mojom/skcolor.mojom-webui.js';
+import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
+
+export interface SharedVmDevices {
+  id: GuestId;
+  vmDevices: ShareableDevices;
+}
+
+export class TestCrostiniBrowserProxy extends TestBrowserProxy implements
+    CrostiniBrowserProxy {
+  crostiniMicSharingEnabled: boolean;
+  crostiniIsRunning: boolean;
+  methodCalls: any;
+  portOperationSuccess: boolean;
+  containerInfo: ContainerInfo[];
+  selectedContainerFileName: string;
+  sharedVmDevices: SharedVmDevices[];
+
+  constructor() {
+    super([
+      'requestCrostiniInstallerView',
+      'requestRemoveCrostini',
+      'exportCrostiniContainer',
+      'importCrostiniContainer',
+      'requestCrostiniContainerUpgradeView',
+      'requestCrostiniUpgraderDialogStatus',
+      'requestCrostiniContainerUpgradeAvailable',
+      'getCrostiniDiskInfo',
+      'resizeCrostiniDisk',
+      'addCrostiniPortForward',
+      'removeCrostiniPortForward',
+      'removeAllCrostiniPortForwards',
+      'activateCrostiniPortForward',
+      'deactivateCrostiniPortForward',
+      'getCrostiniActivePorts',
+      'getCrostiniActiveNetworkInfo',
+      'checkCrostiniIsRunning',
+      'shutdownCrostini',
+      'setCrostiniMicSharingEnabled',
+      'getCrostiniMicSharingEnabled',
+      'requestCrostiniInstallerStatus',
+      'requestArcAdbSideloadStatus',
+      'getCanChangeArcAdbSideloading',
+      'createContainer',
+      'deleteContainer',
+      'requestContainerInfo',
+      'setContainerBadgeColor',
+      'stopContainer',
+      'requestCrostiniExportImportOperationStatus',
+      'openContainerFileSelector',
+      'requestSharedVmDevices',
+      'isVmDeviceShared',
+      'setVmDeviceShared',
+      'requestBruschettaInstallerView',
+      'requestBruschettaUninstallerView',
+      'enableArcAdbSideload',
+      'disableArcAdbSideload',
+      'checkCrostiniMicSharingStatus',
+    ]);
+    this.crostiniMicSharingEnabled = false;
+    this.crostiniIsRunning = true;
+    this.methodCalls = {};
+    this.portOperationSuccess = true;
+    this.containerInfo = [];
+    this.selectedContainerFileName = '';
+    this.sharedVmDevices = [];
+  }
+
+  getNewPromiseFor(name: string): Promise<any> {
+    if (name in this.methodCalls) {
+      return new Promise((resolve, reject) => {
+        this.methodCalls[name].push({name, resolve, reject});
+      });
+    }
+    return new Promise((resolve, reject) => {
+      this.methodCalls[name] = [{name, resolve, reject}];
+    });
+  }
+
+  async resolvePromises(name: string, ...args: any): Promise<void> {
+    for (const o of this.methodCalls[name]) {
+      await o.resolve(...args);
+    }
+    this.methodCalls[name] = [];
+  }
+
+  async rejectPromises(name: string, ...args: any): Promise<void> {
+    for (const o of this.methodCalls[name]) {
+      await o.reject(...args);
+    }
+    this.methodCalls[name] = [];
+  }
+
+  requestCrostiniInstallerView(): void {
+    this.methodCalled('requestCrostiniInstallerView');
+  }
+
+  requestRemoveCrostini(): void {
+    this.methodCalled('requestRemoveCrostini');
+  }
+
+  requestArcAdbSideloadStatus(): void {
+    this.methodCalled('requestArcAdbSideloadStatus');
+  }
+
+  getCanChangeArcAdbSideloading(): void {
+    this.methodCalled('getCanChangeArcAdbSideloading');
+  }
+
+  requestCrostiniInstallerStatus(): void {
+    this.methodCalled('requestCrostiniInstallerStatus');
+    webUIListenerCallback('crostini-installer-status-changed', false);
+  }
+
+  requestCrostiniExportImportOperationStatus(): void {
+    this.methodCalled('requestCrostiniExportImportOperationStatus');
+    webUIListenerCallback(
+        'crostini-export-import-operation-status-changed', false);
+  }
+
+  exportCrostiniContainer(containerId: GuestId): void {
+    this.methodCalled('exportCrostiniContainer', containerId);
+  }
+
+  importCrostiniContainer(containerId: GuestId): void {
+    this.methodCalled('importCrostiniContainer', containerId);
+  }
+
+  requestCrostiniContainerUpgradeView(): void {
+    this.methodCalled('requestCrostiniContainerUpgradeView');
+  }
+
+  requestCrostiniUpgraderDialogStatus(): void {
+    webUIListenerCallback('crostini-upgrader-status-changed', false);
+  }
+
+  requestCrostiniContainerUpgradeAvailable(): void {
+    webUIListenerCallback('crostini-container-upgrade-available-changed', true);
+  }
+
+  addCrostiniPortForward(
+      containerId: GuestId, portNumber: number,
+      protocolIndex: CrostiniPortProtocol, label: string): Promise<boolean> {
+    this.methodCalled(
+        'addCrostiniPortForward', containerId, portNumber, protocolIndex,
+        label);
+    return Promise.resolve(this.portOperationSuccess);
+  }
+
+  removeCrostiniPortForward(
+      containerId: GuestId, portNumber: number,
+      protocolIndex: CrostiniPortProtocol): Promise<boolean> {
+    this.methodCalled(
+        'removeCrostiniPortForward', containerId, portNumber, protocolIndex);
+    return Promise.resolve(this.portOperationSuccess);
+  }
+
+  activateCrostiniPortForward(
+      containerId: GuestId, portNumber: number,
+      protocolIndex: CrostiniPortProtocol): Promise<boolean> {
+    this.methodCalled(
+        'activateCrostiniPortForward', containerId, portNumber, protocolIndex);
+    return Promise.resolve(this.portOperationSuccess);
+  }
+
+  deactivateCrostiniPortForward(
+      containerId: GuestId, portNumber: number,
+      protocolIndex: CrostiniPortProtocol): Promise<boolean> {
+    this.methodCalled(
+        'deactivateCrostiniPortForward', containerId, portNumber,
+        protocolIndex);
+    return Promise.resolve(this.portOperationSuccess);
+  }
+
+  removeAllCrostiniPortForwards(containerId: GuestId): void {
+    this.methodCalled('removeAllCrostiniPortForwards', containerId);
+  }
+
+  getCrostiniActivePorts(): Promise<CrostiniPortActiveSetting[]> {
+    this.methodCalled('getCrostiniActivePorts');
+    return Promise.resolve([]);
+  }
+
+  getCrostiniActiveNetworkInfo(): Promise<string[]> {
+    this.methodCalled('getCrostiniActiveNetworkInfo');
+    return Promise.resolve([]);
+  }
+
+  getCrostiniDiskInfo(vmName: string, requestFullInfo: boolean):
+      Promise<CrostiniDiskInfo> {
+    this.methodCalled('getCrostiniDiskInfo', vmName, requestFullInfo);
+    return this.getNewPromiseFor('getCrostiniDiskInfo');
+  }
+
+  resizeCrostiniDisk(vmName: string, newSizeBytes: number): Promise<boolean> {
+    this.methodCalled('resizeCrostiniDisk', vmName, newSizeBytes);
+    return this.getNewPromiseFor('resizeCrostiniDisk');
+  }
+
+  checkCrostiniIsRunning(): Promise<boolean> {
+    this.methodCalled('checkCrostiniIsRunning');
+    return Promise.resolve(this.crostiniIsRunning);
+  }
+
+  shutdownCrostini(): void {
+    this.methodCalled('shutdownCrostini');
+    this.crostiniIsRunning = false;
+  }
+
+  setCrostiniMicSharingEnabled(enabled: boolean): void {
+    this.methodCalled('setCrostiniMicSharingEnabled');
+    this.crostiniMicSharingEnabled = enabled;
+  }
+
+  getCrostiniMicSharingEnabled(): Promise<boolean> {
+    this.methodCalled('getCrostiniMicSharingEnabled');
+    return Promise.resolve(this.crostiniMicSharingEnabled);
+  }
+
+  createContainer(
+      containerId: GuestId, imageServer: string|null, imageAlias: string|null,
+      containerFile: string|null): void {
+    this.methodCalled(
+        'createContainer', containerId, imageServer, imageAlias, containerFile);
+  }
+
+  deleteContainer(containerId: GuestId): void {
+    this.methodCalled('deleteContainer', containerId);
+  }
+
+  requestContainerInfo(): void {
+    this.methodCalled('requestContainerInfo');
+    webUIListenerCallback('crostini-container-info', this.containerInfo);
+  }
+
+  setContainerBadgeColor(containerId: GuestId, badgeColor: SkColor): void {
+    this.methodCalled('setContainerBadgeColor', [containerId, badgeColor]);
+  }
+
+  stopContainer(containerId: GuestId): void {
+    this.methodCalled('stopContainer', containerId);
+  }
+
+  openContainerFileSelector(): Promise<string> {
+    this.methodCalled('openContainerFileSelector');
+    return Promise.resolve(this.selectedContainerFileName);
+  }
+
+  requestSharedVmDevices(): void {
+    this.methodCalled('requestSharedVmDevices');
+    webUIListenerCallback('crostini-shared-vmdevices', this.sharedVmDevices);
+  }
+
+  isVmDeviceShared(id: GuestId, device: string): Promise<boolean> {
+    this.methodCalled('isVmDeviceShared', id, device);
+    return this.getNewPromiseFor('isVmDeviceShared');
+  }
+
+  setVmDeviceShared(id: GuestId, device: string, shared: boolean):
+      Promise<boolean> {
+    this.methodCalled('setVmDeviceShared', id, device, shared);
+    return this.getNewPromiseFor('setVmDeviceShared');
+  }
+
+  requestBruschettaInstallerView(): void {
+    this.methodCalled('requestBruschettaInstallerView');
+  }
+
+  requestBruschettaUninstallerView(): void {
+    this.methodCalled('requestBruschettaUninstallerView');
+  }
+
+  enableArcAdbSideload(): void {
+    this.methodCalled('enableArcAdbSideload');
+  }
+
+  disableArcAdbSideload(): void {
+    this.methodCalled('disableArcAdbSideload');
+  }
+
+  checkCrostiniMicSharingStatus(proposedValue: boolean): Promise<boolean> {
+    this.methodCalled('checkCrostiniMicSharingStatus', proposedValue);
+    return Promise.resolve(true);
+  }
+}
diff --git a/chrome/test/data/webui/settings/chromeos/crostini_page_test.js b/chrome/test/data/webui/settings/chromeos/crostini_page_test.js
index 5078418ee..05463cb53 100644
--- a/chrome/test/data/webui/settings/chromeos/crostini_page_test.js
+++ b/chrome/test/data/webui/settings/chromeos/crostini_page_test.js
@@ -12,8 +12,8 @@
 import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
 import {eventToPromise, isVisible} from 'chrome://webui-test/test_util.js';
 
+import {TestCrostiniBrowserProxy} from './crostini_page/test_crostini_browser_proxy.js';
 import {TestGuestOsBrowserProxy} from './guest_os/test_guest_os_browser_proxy.js';
-import {TestCrostiniBrowserProxy} from './test_crostini_browser_proxy.js';
 
 /** @type {?SettingsCrostiniPageElement} */
 let crostiniPage = null;
diff --git a/chrome/test/data/webui/settings/chromeos/crostini_settings_card_test.js b/chrome/test/data/webui/settings/chromeos/crostini_settings_card_test.js
index bcc8637..0f7cf90c 100644
--- a/chrome/test/data/webui/settings/chromeos/crostini_settings_card_test.js
+++ b/chrome/test/data/webui/settings/chromeos/crostini_settings_card_test.js
@@ -12,8 +12,8 @@
 import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js';
 import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
+import {TestCrostiniBrowserProxy} from './crostini_page/test_crostini_browser_proxy.js';
 import {TestGuestOsBrowserProxy} from './guest_os/test_guest_os_browser_proxy.js';
-import {TestCrostiniBrowserProxy} from './test_crostini_browser_proxy.js';
 
 suite('<crostini-settings-card>', () => {
   /** @type {?CrostiniSettingsCardElement} */
diff --git a/chrome/test/data/webui/settings/chromeos/os_files_page/one_drive_page_test.ts b/chrome/test/data/webui/settings/chromeos/os_files_page/one_drive_page_test.ts
index 7261b874..f9522de 100644
--- a/chrome/test/data/webui/settings/chromeos/os_files_page/one_drive_page_test.ts
+++ b/chrome/test/data/webui/settings/chromeos/os_files_page/one_drive_page_test.ts
@@ -46,7 +46,7 @@
         oneDrivePage.shadowRoot!.querySelector<CrButtonElement>(
             '#openOneDriveFolder')!;
     assertEquals('Signed in as ' + email, signedInAsLabelElement.innerText);
-    assertEquals('Remove', connectDisconnectButton.textContent!.trim());
+    assertEquals('Remove access', connectDisconnectButton.textContent!.trim());
     assertFalse(connectDisconnectButton.hasAttribute('disabled'));
     assertTrue(openOneDriveFolderButton.checkVisibility());
   });
@@ -66,7 +66,7 @@
             '#openOneDriveFolder')!;
     assertEquals(
         'Add your Microsoft account', signedInAsLabelElement.innerText);
-    assertEquals('Add', connectDisconnectButton.textContent!.trim());
+    assertEquals('Connect', connectDisconnectButton.textContent!.trim());
     assertFalse(connectDisconnectButton.hasAttribute('disabled'));
     assertFalse(!!openOneDriveFolderButton);
   });
@@ -90,7 +90,7 @@
         OneDriveConnectionState.LOADING);
     flush();
     assertEquals('Loading…', signedInAsLabelElement.innerText);
-    assertEquals('Add', connectDisconnectButton.textContent!.trim());
+    assertEquals('Connect', connectDisconnectButton.textContent!.trim());
     assertTrue(connectDisconnectButton.hasAttribute('disabled'));
     assertFalse(openOneDriveFolderButton.checkVisibility());
   });
@@ -105,7 +105,7 @@
             '#oneDriveConnectDisconnect')!;
     assertEquals(
         'Add your Microsoft account', signedInAsLabelElement.innerText);
-    assertEquals('Add', connectDisconnectButton.textContent!.trim());
+    assertEquals('Connect', connectDisconnectButton.textContent!.trim());
 
     // Simulate OneDrive mount: mount signal to observer and ability to return
     // an email address.
@@ -115,7 +115,7 @@
 
     await assertAsync(
         () => signedInAsLabelElement.innerText === 'Signed in as ' + email);
-    assertEquals('Remove', connectDisconnectButton.textContent!.trim());
+    assertEquals('Remove access', connectDisconnectButton.textContent!.trim());
   });
 
   test('Update page to signed out state on OneDrive unmount', async () => {
@@ -128,7 +128,7 @@
         oneDrivePage.shadowRoot!.querySelector<CrButtonElement>(
             '#oneDriveConnectDisconnect')!;
     assertEquals('Signed in as ' + email, signedInAsLabelElement.innerText);
-    assertEquals('Remove', connectDisconnectButton.textContent!.trim());
+    assertEquals('Remove access', connectDisconnectButton.textContent!.trim());
 
     // Simulate OneDrive unmount: unmount signal and returns an empty email
     // address.
@@ -139,7 +139,7 @@
     await assertAsync(
         () =>
             signedInAsLabelElement.innerText === 'Add your Microsoft account');
-    assertEquals('Add', connectDisconnectButton.textContent!.trim());
+    assertEquals('Connect', connectDisconnectButton.textContent!.trim());
   });
 
   test('Connect button click', async () => {
@@ -147,7 +147,7 @@
     const connectDisconnectButton =
         oneDrivePage.shadowRoot!.querySelector<CrButtonElement>(
             '#oneDriveConnectDisconnect')!;
-    assertEquals('Add', connectDisconnectButton.textContent!.trim());
+    assertEquals('Connect', connectDisconnectButton.textContent!.trim());
 
     connectDisconnectButton.click();
     assertEquals(
@@ -162,7 +162,7 @@
     const connectDisconnectButton =
         oneDrivePage.shadowRoot!.querySelector<CrButtonElement>(
             '#oneDriveConnectDisconnect')!;
-    assertEquals('Remove', connectDisconnectButton.textContent!.trim());
+    assertEquals('Remove access', connectDisconnectButton.textContent!.trim());
 
     connectDisconnectButton.click();
     assertEquals(
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
index 1ee1d22e..1b6a112 100644
--- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
+++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -187,11 +187,11 @@
   mocha.run();
 });
 
-var OSSettingsCrostiniExtraContainerPageTest =
+var OSSettingsCrostiniPageCrostiniExtraContainersSubpageTest =
     class extends OSSettingsBrowserTest {
   /** @override */
   get browsePreload() {
-    return 'chrome://os-settings/test_loader.html?module=settings/chromeos/crostini_extra_containers_subpage_test.js';
+    return 'chrome://os-settings/test_loader.html?module=settings/chromeos/crostini_page/crostini_extra_containers_subpage_test.js';
   }
 
   /** @override */
@@ -200,12 +200,14 @@
   }
 };
 
-TEST_F('OSSettingsCrostiniExtraContainerPageTest', 'AllJsTests', () => {
-  mocha.run();
-});
+TEST_F(
+    'OSSettingsCrostiniPageCrostiniExtraContainersSubpageTest', 'AllJsTests',
+    () => {
+      mocha.run();
+    });
 
 [['AboutPage', 'os_about_page_tests.js'],
- ['ApnDetailDialog', 'apn_detail_dialog_tests.js'],
+ ['ApnDetailDialog', 'apn_detail_dialog_test.js'],
  // TODO(crbug.com/1455866): Enable the ApnSubpage test.
  // [
  //   'ApnSubpage', 'apn_subpage_tests.js',
diff --git a/chrome/test/data/webui/settings/chromeos/test_crostini_browser_proxy.js b/chrome/test/data/webui/settings/chromeos/test_crostini_browser_proxy.js
deleted file mode 100644
index d780457..0000000
--- a/chrome/test/data/webui/settings/chromeos/test_crostini_browser_proxy.js
+++ /dev/null
@@ -1,284 +0,0 @@
-// Copyright 2018 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import {webUIListenerCallback} from 'chrome://resources/ash/common/cr.m.js';
-
-import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
-
-/** @implements {CrostiniBrowserProxy} */
-export class TestCrostiniBrowserProxy extends TestBrowserProxy {
-  constructor() {
-    super([
-      'requestCrostiniInstallerView',
-      'requestRemoveCrostini',
-      'exportCrostiniContainer',
-      'importCrostiniContainer',
-      'requestCrostiniContainerUpgradeView',
-      'requestCrostiniUpgraderDialogStatus',
-      'requestCrostiniContainerUpgradeAvailable',
-      'getCrostiniDiskInfo',
-      'resizeCrostiniDisk',
-      'addCrostiniPortForward',
-      'removeCrostiniPortForward',
-      'removeAllCrostiniPortForwards',
-      'activateCrostiniPortForward',
-      'deactivateCrostiniPortForward',
-      'getCrostiniActivePorts',
-      'getCrostiniActiveNetworkInfo',
-      'checkCrostiniIsRunning',
-      'shutdownCrostini',
-      'setCrostiniMicSharingEnabled',
-      'getCrostiniMicSharingEnabled',
-      'requestCrostiniInstallerStatus',
-      'requestArcAdbSideloadStatus',
-      'getCanChangeArcAdbSideloading',
-      'createContainer',
-      'deleteContainer',
-      'requestContainerInfo',
-      'setContainerBadgeColor',
-      'stopContainer',
-      'requestCrostiniExportImportOperationStatus',
-      'openContainerFileSelector',
-      'requestSharedVmDevices',
-      'isVmDeviceShared',
-      'setVmDeviceShared',
-      'requestBruschettaInstallerView',
-      'requestBruschettaUninstallerView',
-    ]);
-    this.crostiniMicSharingEnabled = false;
-    this.crostiniIsRunning = true;
-    this.methodCalls_ = {};
-    this.portOperationSuccess = true;
-    this.containerInfo = [];
-    this.selectedContainerFileName = '';
-    this.sharedVmDevices = [];
-  }
-
-  getNewPromiseFor(name) {
-    if (name in this.methodCalls_) {
-      return new Promise((resolve, reject) => {
-        this.methodCalls_[name].push({name, resolve, reject});
-      });
-    } else {
-      return new Promise((resolve, reject) => {
-        this.methodCalls_[name] = [{name, resolve, reject}];
-      });
-    }
-  }
-
-  async resolvePromises(name, ...args) {
-    for (const o of this.methodCalls_[name]) {
-      await o.resolve(...args);
-    }
-    this.methodCalls_[name] = [];
-  }
-
-  async rejectPromises(name, ...args) {
-    for (const o of this.methodCalls_[name]) {
-      await o.reject(...args);
-    }
-    this.methodCalls_[name] = [];
-  }
-
-  /** @override */
-  requestCrostiniInstallerView() {
-    this.methodCalled('requestCrostiniInstallerView');
-  }
-
-  /** override */
-  requestRemoveCrostini() {
-    this.methodCalled('requestRemoveCrostini');
-  }
-
-  /**override */
-  requestArcAdbSideloadStatus() {
-    this.methodCalled('requestArcAdbSideloadStatus');
-  }
-
-  /** override */
-  getCanChangeArcAdbSideloading() {
-    this.methodCalled('getCanChangeArcAdbSideloading');
-  }
-
-  /** @override */
-  requestCrostiniInstallerStatus() {
-    this.methodCalled('requestCrostiniInstallerStatus');
-    webUIListenerCallback('crostini-installer-status-changed', false);
-  }
-
-  /** @override */
-  requestCrostiniExportImportOperationStatus() {
-    this.methodCalled('requestCrostiniExportImportOperationStatus');
-    webUIListenerCallback(
-        'crostini-export-import-operation-status-changed', false);
-  }
-
-  /** override */
-  exportCrostiniContainer(containerId) {
-    this.methodCalled('exportCrostiniContainer', containerId);
-  }
-
-  /** override */
-  importCrostiniContainer(containerId) {
-    this.methodCalled('importCrostiniContainer', containerId);
-  }
-
-  /** @override */
-  requestCrostiniContainerUpgradeView() {
-    this.methodCalled('requestCrostiniContainerUpgradeView');
-  }
-
-  /** @override */
-  requestCrostiniUpgraderDialogStatus() {
-    webUIListenerCallback('crostini-upgrader-status-changed', false);
-  }
-
-  /** @override */
-  requestCrostiniContainerUpgradeAvailable() {
-    webUIListenerCallback('crostini-container-upgrade-available-changed', true);
-  }
-
-  /** @override */
-  addCrostiniPortForward(containerId, portNumber, protocolIndex, label) {
-    this.methodCalled(
-        'addCrostiniPortForward', containerId, portNumber, protocolIndex,
-        label);
-    return Promise.resolve(this.portOperationSuccess);
-  }
-
-  /** @override */
-  removeCrostiniPortForward(containerId, portNumber, protocolIndex) {
-    this.methodCalled(
-        'removeCrostiniPortForward', containerId, portNumber, protocolIndex);
-    return Promise.resolve(this.portOperationSuccess);
-  }
-
-  /** @override */
-  activateCrostiniPortForward(containerId, portNumber, protocolIndex) {
-    this.methodCalled(
-        'activateCrostiniPortForward', containerId, portNumber, protocolIndex);
-    return Promise.resolve(this.portOperationSuccess);
-  }
-
-  /** @override */
-  deactivateCrostiniPortForward(containerId, portNumber, protocolIndex) {
-    this.methodCalled(
-        'deactivateCrostiniPortForward', containerId, portNumber,
-        protocolIndex);
-    return Promise.resolve(this.portOperationSuccess);
-  }
-
-  /** @override */
-  removeAllCrostiniPortForwards(containerId) {
-    this.methodCalled('removeAllCrostiniPortForwards', containerId);
-  }
-
-  /** @override */
-  getCrostiniActivePorts() {
-    this.methodCalled('getCrostiniActivePorts');
-    return Promise.resolve([]);
-  }
-
-  getCrostiniActiveNetworkInfo() {
-    this.methodCalled('getCrostiniActiveNetworkInfo');
-    return Promise.resolve([]);
-  }
-
-  /** @override */
-  getCrostiniDiskInfo(vmName, requestFullInfo) {
-    this.methodCalled('getCrostiniDiskInfo', vmName, requestFullInfo);
-    return this.getNewPromiseFor('getCrostiniDiskInfo');
-  }
-
-  /** @override */
-  resizeCrostiniDisk(vmName, newSizeBytes) {
-    this.methodCalled('resizeCrostiniDisk', vmName, newSizeBytes);
-    return this.getNewPromiseFor('resizeCrostiniDisk');
-  }
-
-  /** @override */
-  checkCrostiniIsRunning() {
-    this.methodCalled('checkCrostiniIsRunning');
-    return Promise.resolve(this.crostiniIsRunning);
-  }
-
-  /** @override */
-  shutdownCrostini() {
-    this.methodCalled('shutdownCrostini');
-    this.crostiniIsRunning = false;
-  }
-
-  /** @override */
-  setCrostiniMicSharingEnabled(enabled) {
-    this.methodCalled('setCrostiniMicSharingEnabled');
-    this.crostiniMicSharingEnabled = enabled;
-  }
-
-  /** @override */
-  getCrostiniMicSharingEnabled() {
-    this.methodCalled('getCrostiniMicSharingEnabled');
-    return Promise.resolve(this.CrostiniMicSharingEnabled);
-  }
-
-  /** @override */
-  createContainer(containerId, imageServer, imageAlias, containerFile) {
-    this.methodCalled(
-        'createContainer', containerId, imageServer, imageAlias, containerFile);
-  }
-
-  /** @override */
-  deleteContainer(containerId) {
-    this.methodCalled('deleteContainer');
-  }
-
-  /** @override */
-  requestContainerInfo() {
-    this.methodCalled('requestContainerInfo');
-    webUIListenerCallback('crostini-container-info', this.containerInfo);
-  }
-
-  /** @override */
-  setContainerBadgeColor(containerId, badge_color) {
-    this.methodCalled('setContainerBadgeColor');
-  }
-
-  /** @override */
-  stopContainer(containerId) {
-    this.methodCalled('stopContainer');
-  }
-
-  /** @override */
-  openContainerFileSelector() {
-    this.methodCalled('openContainerFileSelector');
-    return Promise.resolve(this.selectedContainerFileName);
-  }
-
-  /** @override */
-  requestSharedVmDevices() {
-    this.methodCalled('requestSharedVmDevices');
-    webUIListenerCallback('crostini-shared-vmdevices', this.sharedVmDevices);
-  }
-
-  /** @override */
-  isVmDeviceShared(id, device) {
-    this.methodCalled('isVmDeviceShared', id, device);
-    return this.getNewPromiseFor('isVmDeviceShared');
-  }
-
-  /** @override */
-  setVmDeviceShared(id, device, shared) {
-    this.methodCalled('setVmDeviceShared', id, device, shared);
-    return this.getNewPromiseFor('setVmDeviceShared');
-  }
-
-  /** @override */
-  requestBruschettaInstallerView() {
-    this.methodCalled('requestBruschettaInstallerView');
-  }
-
-  /** @override */
-  requestBruschettaUninstallerView() {
-    this.methodCalled('requestBruschettaUninstallerView');
-  }
-}
diff --git a/chromeos/ash/components/dbus/BUILD.gn b/chromeos/ash/components/dbus/BUILD.gn
index 2955643..5057488 100644
--- a/chromeos/ash/components/dbus/BUILD.gn
+++ b/chromeos/ash/components/dbus/BUILD.gn
@@ -121,12 +121,6 @@
   proto_out_dir = "chromeos/ash/components/dbus/vm_applications"
 }
 
-proto_library("vm_disk_management_proto") {
-  sources = [ "//third_party/cros_system_api/dbus/vm_disk_management/disk_management.proto" ]
-
-  proto_out_dir = "chromeos/ash/components/dbus/vm_disk_management"
-}
-
 proto_library("vm_launch_proto") {
   sources = [ "//third_party/cros_system_api/dbus/vm_launch/launch.proto" ]
 
diff --git a/chromeos/ash/components/drivefs/drivefs_pin_manager.cc b/chromeos/ash/components/drivefs/drivefs_pin_manager.cc
index 8ba3075..f43b23f 100644
--- a/chromeos/ash/components/drivefs/drivefs_pin_manager.cc
+++ b/chromeos/ash/components/drivefs/drivefs_pin_manager.cc
@@ -145,10 +145,6 @@
   return out << "'***'";
 }
 
-ostream& operator<<(ostream& out, Quoter<std::string> q) {
-  return out << "'" << (*q.value) << "'";
-}
-
 template <typename T>
 ostream& operator<<(ostream& out, Quoter<absl::optional<T>> q) {
   const absl::optional<T>& v = *q.value;
@@ -206,16 +202,6 @@
   return out << "}";
 }
 
-ostream& operator<<(ostream& out, Quoter<mojom::ItemEvent> q) {
-  const mojom::ItemEvent& e = *q.value;
-  return out << "{" << Quote(e.state) << " " << PinManager::Id(e.stable_id)
-             << " " << Quote(e.path) << ", bytes_transferred: "
-             << HumanReadableSize(e.bytes_transferred)
-             << ", bytes_to_transfer: "
-             << HumanReadableSize(e.bytes_to_transfer)
-             << ", is_download: " << e.is_download << "}";
-}
-
 ostream& operator<<(ostream& out, Quoter<mojom::ProgressEvent> q) {
   const mojom::ProgressEvent& e = *q.value;
   out << "{" << PinManager::Id(e.stable_id) << " "
@@ -1335,100 +1321,9 @@
   DCHECK(!files_to_pin_.contains(id));
 }
 
-// TODO(b/297442320): Remove `OnSyncingStatusUpdate` now we entirely rely on
-// `OnItemProgress.
-void PinManager::OnSyncingStatusUpdate(const mojom::SyncingStatus& status) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (use_on_item_progress_) {
-    return;
-  }
-
-  for (const mojom::ItemEventPtr& event : status.item_events) {
-    DCHECK(event);
-
-    if (!InProgress(progress_.stage)) {
-      VLOG(2) << "Ignored " << Quote(*event);
-      continue;
-    }
-
-    if (OnSyncingEvent(*event)) {
-      progress_.useful_events++;
-    } else {
-      progress_.duplicated_events++;
-      VLOG(3) << "Discarded " << Quote(*event);
-    }
-  }
-
-  PinSomeFiles();
-}
-
-// TODO(b/297442320): Remove `OnSyncingEvent`.
-bool PinManager::OnSyncingEvent(mojom::ItemEvent& event) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  if (!event.is_download) {
-    // We're only interested in download events.
-    VLOG(3) << "Ignored upload-related event " << Quote(event);
-    return false;
-  }
-
-  const Id id = Id(event.stable_id);
-  const Path path = Path(event.path);
-
-  using State = mojom::ItemEvent::State;
-  switch (event.state) {
-    case State::kQueued:
-    case State::kInProgress:
-      if (!Update(id, path, event.bytes_transferred, event.bytes_to_transfer)) {
-        return false;
-      }
-
-      VLOG(3) << Quote(event.state) << " " << id << " " << Quote(path) << ": "
-              << Quote(event);
-      VLOG_IF(2, !VLOG_IS_ON(3))
-          << Quote(event.state) << " " << id << " " << Quote(path);
-      return true;
-
-    case State::kCompleted:
-      if (!Remove(id, path)) {
-        return false;
-      }
-
-      VLOG(2) << "Synced " << id << " " << Quote(path) << ": " << Quote(event);
-      VLOG_IF(1, !VLOG_IS_ON(2)) << "Synced " << id << " " << Quote(path);
-      progress_.pinned_files++;
-      UmaHistogramBoolean("FileBrowser.GoogleDrive.BulkPinning.PinnedFiles",
-                          true);
-      return true;
-
-    case State::kFailed:
-      if (!Remove(id, path, 0)) {
-        return false;
-      }
-
-      LOG(ERROR) << Quote(event.state) << " " << id << " " << Quote(path)
-                 << ": " << Quote(event);
-      progress_.failed_files++;
-      UmaHistogramBoolean("FileBrowser.GoogleDrive.BulkPinning.PinnedFiles",
-                          false);
-      return true;
-    case State::kCancelledAndDeleted:
-    case State::kCancelledAndTrashed:
-      return false;
-  }
-
-  LOG(ERROR) << "Unexpected event type: " << Quote(event);
-  return false;
-}
-
 void PinManager::OnItemProgress(const mojom::ProgressEvent& event) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
-  if (!use_on_item_progress_) {
-    return;
-  }
-
   if (!InProgress(progress_.stage)) {
     VLOG(2) << "Ignored " << Quote(event);
     return;
diff --git a/chromeos/ash/components/drivefs/drivefs_pin_manager.h b/chromeos/ash/components/drivefs/drivefs_pin_manager.h
index 01e1c9f..087e64c 100644
--- a/chromeos/ash/components/drivefs/drivefs_pin_manager.h
+++ b/chromeos/ash/components/drivefs/drivefs_pin_manager.h
@@ -239,9 +239,6 @@
     return observers_.HasObserver(observer);
   }
 
-  // Processes a syncing status event. Returns true if the event was useful.
-  bool OnSyncingEvent(mojom::ItemEvent& event);
-
   // Stable ID provided by DriveFS.
   enum class Id : int64_t { kNone = 0 };
 
@@ -249,7 +246,6 @@
   void NotifyDelete(Id id, const Path& path);
 
   // DriveFsHost::Observer implementation.
-  void OnSyncingStatusUpdate(const mojom::SyncingStatus& status) override;
   void OnUnmounted() override;
   void OnFilesChanged(const std::vector<mojom::FileChange>& changes) override;
   void OnError(const mojom::DriveError& error) override;
@@ -481,10 +477,6 @@
   // Is this the first full sync after the size estimation?
   bool is_first_sync_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
 
-  // Should the feature use `OnItemProgress`, if false it will fall back to
-  // `OnSyncingStatusUpdate`.
-  bool use_on_item_progress_ GUARDED_BY_CONTEXT(sequence_checker_) = true;
-
   // Stop at the `PinSomeFiles` stage during testing to perform assertions, this
   // should always be true and only overridden in browser tests.
   bool should_pin_files_for_testing_ GUARDED_BY_CONTEXT(sequence_checker_) =
diff --git a/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc b/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc
index 9e31b03..589f3b0 100644
--- a/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc
+++ b/chromeos/ash/components/drivefs/drivefs_pin_manager_unittest.cc
@@ -1437,386 +1437,11 @@
   manager.progress_.stage = Stage::kStopped;
 }
 
-// Tests PinManager::OnSyncingEvent().
-TEST_F(DriveFsPinManagerTest, OnSyncingEvent) {
-  PinManager manager(profile_path_, mount_path_, &drivefs_, kMaxQueueSize);
-
-  DCHECK_CALLED_ON_VALID_SEQUENCE(manager.sequence_checker_);
-  manager.progress_.bytes_to_pin = 30000;
-  manager.progress_.required_space = 32768;
-
-  {
-    const Progress progress = manager.GetProgress();
-    EXPECT_EQ(progress.failed_files, 0);
-    EXPECT_EQ(progress.pinned_files, 0);
-    EXPECT_EQ(progress.pinned_bytes, 0);
-    EXPECT_EQ(progress.bytes_to_pin, 30000);
-    EXPECT_EQ(progress.required_space, 32768);
-  }
-
-  const Id id1 = Id(549);
-  const Path path1 = Path("Path 1");
-
-  const Id id2 = Id(17);
-  const Path path2 = Path("Path 2");
-
-  // Put in place a couple of files to track.
-  {
-    const auto [it, ok] = manager.files_to_track_.try_emplace(
-        id1, PinManager::File{.path = path1, .total = 10000, .pinned = true});
-    ASSERT_TRUE(ok);
-    manager.progress_.syncing_files++;
-  }
-  {
-    const auto [it, ok] = manager.files_to_track_.try_emplace(
-        id2, PinManager::File{.path = path2, .total = 20000, .pinned = true});
-    ASSERT_TRUE(ok);
-    manager.progress_.syncing_files++;
-  }
-
-  EXPECT_THAT(manager.files_to_track_, SizeIs(2));
-
-  // An event with an unknown type is ignored.
-  {
-    ItemEvent event;
-    event.is_download = true;
-    event.stable_id = static_cast<int64_t>(id2);
-    event.path = path2.value();
-    event.state = ItemEvent::State(-1);
-    event.bytes_to_transfer = -1;
-    event.bytes_transferred = -1;
-    EXPECT_FALSE(manager.OnSyncingEvent(event));
-  }
-
-  EXPECT_THAT(manager.files_to_track_, SizeIs(2));
-
-  {
-    const Progress progress = manager.GetProgress();
-    EXPECT_EQ(progress.syncing_files, 2);
-    EXPECT_EQ(progress.failed_files, 0);
-    EXPECT_EQ(progress.pinned_files, 0);
-    EXPECT_EQ(progress.pinned_bytes, 0);
-    EXPECT_EQ(progress.bytes_to_pin, 30000);
-    EXPECT_EQ(progress.required_space, 32768);
-  }
-
-  // Mark file 1 as queued.
-  {
-    ItemEvent event;
-    event.is_download = true;
-    event.stable_id = static_cast<int64_t>(id1);
-    event.path = path1.value();
-    event.state = ItemEvent::State::kQueued;
-    event.bytes_to_transfer = 10000;
-    event.bytes_transferred = 0;
-    EXPECT_FALSE(manager.OnSyncingEvent(event));
-  }
-
-  EXPECT_THAT(manager.files_to_track_, SizeIs(2));
-
-  {
-    const Progress progress = manager.GetProgress();
-    EXPECT_EQ(progress.syncing_files, 2);
-    EXPECT_EQ(progress.failed_files, 0);
-    EXPECT_EQ(progress.pinned_files, 0);
-    EXPECT_EQ(progress.pinned_bytes, 0);
-    EXPECT_EQ(progress.bytes_to_pin, 30000);
-    EXPECT_EQ(progress.required_space, 32768);
-  }
-
-  {
-    const auto it = manager.files_to_track_.find(id1);
-    ASSERT_NE(it, manager.files_to_track_.end());
-    const auto& [id, file] = *it;
-    EXPECT_EQ(id, id1);
-    EXPECT_EQ(file.path, path1);
-    EXPECT_EQ(file.total, 10000);
-    EXPECT_EQ(file.transferred, 0);
-    EXPECT_TRUE(file.pinned);
-    EXPECT_FALSE(file.in_progress);
-  }
-
-  // Mark file 1 as in progress.
-  {
-    ItemEvent event;
-    event.is_download = true;
-    event.stable_id = static_cast<int64_t>(id1);
-    event.path = path1.value();
-    event.state = ItemEvent::State::kInProgress;
-    event.bytes_to_transfer = 10000;
-    event.bytes_transferred = 5000;
-    EXPECT_TRUE(manager.OnSyncingEvent(event));
-    EXPECT_FALSE(manager.OnSyncingEvent(event));
-  }
-
-  // Upload events should be ignored.
-  {
-    ItemEvent event;
-    event.is_download = false;
-    event.stable_id = static_cast<int64_t>(id1);
-    event.path = path1.value();
-    event.state = ItemEvent::State::kInProgress;
-    event.bytes_to_transfer = 30000;
-    event.bytes_transferred = 7000;
-    EXPECT_FALSE(manager.OnSyncingEvent(event));
-  }
-
-  EXPECT_THAT(manager.files_to_track_, SizeIs(2));
-
-  {
-    const Progress progress = manager.GetProgress();
-    EXPECT_EQ(progress.syncing_files, 2);
-    EXPECT_EQ(progress.failed_files, 0);
-    EXPECT_EQ(progress.pinned_files, 0);
-    EXPECT_EQ(progress.pinned_bytes, 5000);
-    EXPECT_EQ(progress.bytes_to_pin, 30000);
-    EXPECT_EQ(progress.required_space, 24576);
-  }
-
-  {
-    const auto it = manager.files_to_track_.find(id1);
-    ASSERT_NE(it, manager.files_to_track_.end());
-    const auto& [id, file] = *it;
-    EXPECT_EQ(id, id1);
-    EXPECT_EQ(file.path, path1);
-    EXPECT_EQ(file.total, 10000);
-    EXPECT_EQ(file.transferred, 5000);
-    EXPECT_TRUE(file.pinned);
-    EXPECT_TRUE(file.in_progress);
-  }
-
-  // Mark file 1 as completed.
-  {
-    ItemEvent event;
-    event.is_download = true;
-    event.stable_id = static_cast<int64_t>(id1);
-    event.path = path1.value();
-    event.state = ItemEvent::State::kCompleted;
-    event.bytes_to_transfer = -1;
-    event.bytes_transferred = -1;
-    EXPECT_TRUE(manager.OnSyncingEvent(event));
-    EXPECT_FALSE(manager.OnSyncingEvent(event));
-  }
-
-  EXPECT_THAT(manager.files_to_track_, SizeIs(1));
-
-  {
-    const Progress progress = manager.GetProgress();
-    EXPECT_EQ(progress.syncing_files, 1);
-    EXPECT_EQ(progress.failed_files, 0);
-    EXPECT_EQ(progress.pinned_files, 1);
-    EXPECT_EQ(progress.pinned_bytes, 10000);
-    EXPECT_EQ(progress.bytes_to_pin, 30000);
-    EXPECT_EQ(progress.required_space, 20480);
-  }
-
-  {
-    const auto it = manager.files_to_track_.find(id1);
-    EXPECT_EQ(it, manager.files_to_track_.end());
-  }
-
-  // Mark file 2 as failed.
-  {
-    ItemEvent event;
-    event.is_download = true;
-    event.stable_id = static_cast<int64_t>(id2);
-    event.path = path2.value();
-    event.state = ItemEvent::State::kFailed;
-    event.bytes_to_transfer = -1;
-    event.bytes_transferred = -1;
-    EXPECT_TRUE(manager.OnSyncingEvent(event));
-    EXPECT_FALSE(manager.OnSyncingEvent(event));
-  }
-
-  EXPECT_THAT(manager.files_to_track_, IsEmpty());
-
-  {
-    const Progress progress = manager.GetProgress();
-    EXPECT_EQ(progress.syncing_files, 0);
-    EXPECT_EQ(progress.failed_files, 1);
-    EXPECT_EQ(progress.pinned_files, 1);
-    EXPECT_EQ(progress.pinned_bytes, 10000);
-    EXPECT_EQ(progress.bytes_to_pin, 10000);
-    EXPECT_EQ(progress.required_space, 0);
-  }
-
-  {
-    const auto it = manager.files_to_track_.find(id2);
-    EXPECT_EQ(it, manager.files_to_track_.end());
-  }
-}
-
-// Tests PinManager::OnSyncingStatusUpdate().
-TEST_F(DriveFsPinManagerTest, OnSyncingStatusUpdate) {
-  PinManager manager(profile_path_, mount_path_, &drivefs_, kMaxQueueSize);
-
-  DCHECK_CALLED_ON_VALID_SEQUENCE(manager.sequence_checker_);
-  manager.progress_.stage = Stage::kSyncing;
-  manager.progress_.bytes_to_pin = 30000;
-  manager.progress_.required_space = 32768;
-  manager.use_on_item_progress_ = false;
-
-  const Id id1 = Id(549);
-  const Path path1 = Path("Path 1");
-
-  const Id id2 = Id(17);
-  const Path path2 = Path("Path 2");
-
-  // Put in place a couple of files to track.
-  {
-    const auto [it, ok] = manager.files_to_track_.try_emplace(
-        id1, PinManager::File{.path = path1, .total = 10000, .pinned = true});
-    ASSERT_TRUE(ok);
-    manager.progress_.syncing_files++;
-  }
-  {
-    const auto [it, ok] = manager.files_to_track_.try_emplace(
-        id2, PinManager::File{.path = path2, .total = 20000, .pinned = true});
-    ASSERT_TRUE(ok);
-    manager.progress_.syncing_files++;
-  }
-
-  EXPECT_THAT(manager.files_to_track_, SizeIs(2));
-
-  // Expect `OnItemProgress` events are ignored.
-  {
-    ProgressEvent event;
-    event.stable_id = static_cast<int64_t>(id1);
-    event.file_path = path1;
-    event.progress = 20;
-    manager.OnItemProgress(event);
-  }
-
-  {
-    const Progress progress = manager.GetProgress();
-    EXPECT_EQ(manager.progress_.stage, Stage::kSyncing);
-    EXPECT_EQ(progress.syncing_files, 2);
-    EXPECT_EQ(progress.failed_files, 0);
-    EXPECT_EQ(progress.pinned_files, 0);
-    EXPECT_EQ(progress.pinned_bytes, 0);
-    EXPECT_EQ(progress.bytes_to_pin, 30000);
-    EXPECT_EQ(progress.required_space, 32768);
-    EXPECT_EQ(progress.useful_events, 0);
-    EXPECT_EQ(progress.duplicated_events, 0);
-  }
-
-  // Prepare a list of syncing status events.
-  SyncingStatus events;
-
-  {
-    // An event with an unknown type is ignored.
-    ItemEventPtr event = ItemEvent::New();
-    event->is_download = true;
-    event->stable_id = static_cast<int64_t>(id2);
-    event->path = path2.value();
-    event->state = ItemEvent::State(-1);
-    event->bytes_to_transfer = -1;
-    event->bytes_transferred = -1;
-    events.item_events.push_back(std::move(event));
-  }
-  {
-    // Mark file 1 as queued.
-    ItemEventPtr event = ItemEvent::New();
-    event->is_download = true;
-    event->stable_id = static_cast<int64_t>(id1);
-    event->path = path1.value();
-    event->state = ItemEvent::State::kQueued;
-    event->bytes_to_transfer = 10000;
-    event->bytes_transferred = 0;
-    events.item_events.push_back(ItemEvent::New(*event));
-    events.item_events.push_back(std::move(event));
-  }
-  {
-    // Mark file 1 as in progress.
-    ItemEventPtr event = ItemEvent::New();
-    event->is_download = true;
-    event->stable_id = static_cast<int64_t>(id1);
-    event->path = path1.value();
-    event->state = ItemEvent::State::kInProgress;
-    event->bytes_to_transfer = 10000;
-    event->bytes_transferred = 5000;
-    events.item_events.push_back(ItemEvent::New(*event));
-    events.item_events.push_back(std::move(event));
-  }
-  {
-    // Upload events should be ignored.
-    ItemEventPtr event = ItemEvent::New();
-    event->is_download = false;
-    event->stable_id = static_cast<int64_t>(id1);
-    event->path = path1.value();
-    event->state = ItemEvent::State::kInProgress;
-    event->bytes_to_transfer = 30000;
-    event->bytes_transferred = 7000;
-    events.item_events.push_back(ItemEvent::New(*event));
-    events.item_events.push_back(std::move(event));
-  }
-  {
-    // Mark file 1 as completed.
-    ItemEventPtr event = ItemEvent::New();
-    event->is_download = true;
-    event->stable_id = static_cast<int64_t>(id1);
-    event->path = path1.value();
-    event->state = ItemEvent::State::kCompleted;
-    event->bytes_to_transfer = -1;
-    event->bytes_transferred = -1;
-    events.item_events.push_back(ItemEvent::New(*event));
-    events.item_events.push_back(std::move(event));
-  }
-  {
-    // Mark file 2 as failed.
-    ItemEventPtr event = ItemEvent::New();
-    event->is_download = true;
-    event->stable_id = static_cast<int64_t>(id2);
-    event->path = path2.value();
-    event->state = ItemEvent::State::kFailed;
-    event->bytes_to_transfer = -1;
-    event->bytes_transferred = -1;
-    events.item_events.push_back(ItemEvent::New(*event));
-    events.item_events.push_back(std::move(event));
-  }
-
-  manager.OnSyncingStatusUpdate(std::as_const(events));
-
-  EXPECT_THAT(manager.files_to_track_, IsEmpty());
-
-  {
-    const Progress progress = manager.GetProgress();
-    EXPECT_EQ(manager.progress_.stage, Stage::kSyncing);
-    EXPECT_EQ(progress.syncing_files, 0);
-    EXPECT_EQ(progress.failed_files, 1);
-    EXPECT_EQ(progress.pinned_files, 1);
-    EXPECT_EQ(progress.pinned_bytes, 10000);
-    EXPECT_EQ(progress.bytes_to_pin, 10000);
-    EXPECT_EQ(progress.required_space, 0);
-    EXPECT_EQ(progress.useful_events, 3);
-    EXPECT_EQ(progress.duplicated_events, 8);
-  }
-
-  manager.Stop();
-
-  // Events received when the PinManager is stopped are ignored.
-  manager.OnSyncingStatusUpdate(std::as_const(events));
-
-  {
-    const Progress progress = manager.GetProgress();
-    EXPECT_EQ(manager.progress_.stage, Stage::kStopped);
-    EXPECT_EQ(progress.syncing_files, 0);
-    EXPECT_EQ(progress.failed_files, 1);
-    EXPECT_EQ(progress.pinned_files, 1);
-    EXPECT_EQ(progress.pinned_bytes, 10000);
-    EXPECT_EQ(progress.bytes_to_pin, 10000);
-    EXPECT_EQ(progress.required_space, 0);
-    EXPECT_EQ(progress.useful_events, 3);
-    EXPECT_EQ(progress.duplicated_events, 8);
-  }
-}
-
 // Tests PinManager::OnItemProgress().
 TEST_F(DriveFsPinManagerTest, OnItemProgress) {
   PinManager manager(profile_path_, mount_path_, &drivefs_, kMaxQueueSize);
 
   DCHECK_CALLED_ON_VALID_SEQUENCE(manager.sequence_checker_);
-  manager.use_on_item_progress_ = true;
   manager.progress_.bytes_to_pin = 30000;
   manager.progress_.required_space = 32768;
   manager.progress_.stage = Stage::kSyncing;
diff --git a/chromeos/crosapi/mojom/url_handler.mojom b/chromeos/crosapi/mojom/url_handler.mojom
index 121036ec..3a80637 100644
--- a/chromeos/crosapi/mojom/url_handler.mojom
+++ b/chromeos/crosapi/mojom/url_handler.mojom
@@ -13,4 +13,12 @@
   // Open the given URL. May be ignored if Ash does not know how to handle
   // the given URL.
   OpenUrl@0(url.mojom.Url url);
+
+  // Return the name of a handler for the external URL. Added in M120.
+  [MinVersion=1]
+  GetExternalHandler@1(url.mojom.Url url) => (string? name);
+
+  // Open the external URL using platform_util::OpenExternal(). Added in M120.
+  [MinVersion=1]
+  OpenExternal@2(url.mojom.Url url);
 };
diff --git a/chromeos/ui/frame/caption_buttons/caption_button_model.h b/chromeos/ui/frame/caption_buttons/caption_button_model.h
index 4b6a6bf..0cfb886 100644
--- a/chromeos/ui/frame/caption_buttons/caption_button_model.h
+++ b/chromeos/ui/frame/caption_buttons/caption_button_model.h
@@ -21,7 +21,7 @@
   // Returns true if |type| is enabled.
   virtual bool IsEnabled(views::CaptionButtonIcon type) const = 0;
 
-  // In zoom mode, the maximize/restore button will be repalced
+  // In zoom mode, the maximize/restore button will be replaced
   // with zoom/unzoom button.
   virtual bool InZoomMode() const = 0;
 };
diff --git a/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc
index 47ddddb..9ba2743 100644
--- a/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc
+++ b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.cc
@@ -206,8 +206,7 @@
   tablet_mode_animation_->SetTweenType(gfx::Tween::LINEAR);
 
   // Ensure animation tracks visibility of size button.
-  if (model_->IsVisible(views::CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE) ||
-      model_->InZoomMode()) {
+  if (SizeButtonShouldBeVisible()) {
     tablet_mode_animation_->Reset(1.0f);
   }
 
@@ -380,9 +379,7 @@
 }
 
 void FrameCaptionButtonContainerView::UpdateCaptionButtonState(bool animate) {
-  bool size_button_visible =
-      (model_->IsVisible(views::CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE) ||
-       model_->InZoomMode());
+  bool size_button_visible = SizeButtonShouldBeVisible();
   if (size_button_visible) {
     size_button_->SetVisible(true);
     if (animate) {
@@ -397,6 +394,7 @@
       size_button_->SetVisible(false);
     }
   }
+
   if (custom_button_) {
     custom_button_->SetEnabled(
         model_->IsEnabled(views::CAPTION_BUTTON_ICON_CUSTOM));
@@ -410,8 +408,9 @@
         model_->IsVisible(views::CAPTION_BUTTON_ICON_FLOAT));
   }
   size_button_->SetEnabled(
-      (model_->IsEnabled(views::CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE) ||
-       model_->InZoomMode()));
+      model_->IsEnabled(views::CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE) ||
+      model_->InZoomMode());
+
   minimize_button_->SetVisible(
       model_->IsVisible(views::CAPTION_BUTTON_ICON_MINIMIZE));
   minimize_button_->SetEnabled(
@@ -499,48 +498,17 @@
 
 void FrameCaptionButtonContainerView::AnimationEnded(
     const gfx::Animation* animation) {
-  // Ensure that position is calculated at least once.
-  AnimationProgressed(animation);
-
-  double current_value = tablet_mode_animation_->GetCurrentValue();
-  if (current_value == 0.0) {
-    size_button_->SetVisible(false);
+  if (SizeButtonShouldBeVisible()) {
+    LayoutButtonsFromAnimation(0, SK_AlphaOPAQUE);
+  } else {
+    LayoutButtonsFromAnimation(size_button_->width(), SK_AlphaTRANSPARENT);
   }
+  size_button_->SetVisible(SizeButtonShouldBeVisible());
 }
 
-void FrameCaptionButtonContainerView::AnimationProgressed(
-    const gfx::Animation* animation) {
-  double current_value = animation->GetCurrentValue();
-  int size_alpha = 0;
-  int x_slide = 0;
-  if (tablet_mode_animation_->IsShowing()) {
-    double scaled_value_alpha =
-        CapAnimationValue((current_value - SizeButtonShowStartValue()) /
-                          SizeButtonShowDuration());
-    double tweened_value_alpha =
-        gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, scaled_value_alpha);
-    size_alpha = gfx::Tween::LinearIntValueBetween(tweened_value_alpha, 0, 255);
-
-    double tweened_value_slide =
-        gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, current_value);
-    x_slide = gfx::Tween::LinearIntValueBetween(tweened_value_slide,
-                                                size_button_->width(), 0);
-  } else {
-    double scaled_value_alpha =
-        CapAnimationValue((1.0f - current_value) / SizeButtonHideDuration());
-    double tweened_value_alpha =
-        gfx::Tween::CalculateValue(gfx::Tween::EASE_IN, scaled_value_alpha);
-    size_alpha = gfx::Tween::LinearIntValueBetween(tweened_value_alpha, 255, 0);
-
-    double scaled_value_position = CapAnimationValue(
-        (HidePositionStartValue() - current_value) / HidePositionStartValue());
-    double tweened_value_slide =
-        gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, scaled_value_position);
-    x_slide = gfx::Tween::LinearIntValueBetween(tweened_value_slide, 0,
-                                                size_button_->width());
-  }
-  size_button_->SetAlpha(size_alpha);
-
+void FrameCaptionButtonContainerView::LayoutButtonsFromAnimation(int x_slide,
+                                                                 int alpha) {
+  size_button_->SetAlpha(alpha);
   // Slide all buttons to the left of the size button. Usually this is just the
   // minimize button but it can also include a PWA menu button.
   int previous_x = 0;
@@ -621,9 +589,6 @@
 
   // Size button also needs to update its visibility when float state changes.
   UpdateCaptionButtonState(/*animate=*/true);
-  size_button_->SetEnabled(
-      model_->IsEnabled(views::CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE) ||
-      use_zoom_icons);
 
   // Alpha may be not fully opaque from a previous tablet mode animation.
   if (size_button_->GetVisible()) {
@@ -744,6 +709,46 @@
   }
 }
 
+bool FrameCaptionButtonContainerView::SizeButtonShouldBeVisible() const {
+  return model_->IsVisible(views::CAPTION_BUTTON_ICON_MAXIMIZE_RESTORE) ||
+         model_->InZoomMode();
+}
+
+void FrameCaptionButtonContainerView::AnimationProgressed(
+    const gfx::Animation* animation) {
+  double current_value = animation->GetCurrentValue();
+  int size_alpha = 0;
+  int x_slide = 0;
+  if (tablet_mode_animation_->IsShowing()) {
+    double scaled_value_alpha =
+        CapAnimationValue((current_value - SizeButtonShowStartValue()) /
+                          SizeButtonShowDuration());
+    double tweened_value_alpha =
+        gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, scaled_value_alpha);
+    size_alpha = gfx::Tween::LinearIntValueBetween(tweened_value_alpha, 0, 255);
+
+    double tweened_value_slide =
+        gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, current_value);
+    x_slide = gfx::Tween::LinearIntValueBetween(tweened_value_slide,
+                                                size_button_->width(), 0);
+  } else {
+    double scaled_value_alpha =
+        CapAnimationValue((1.0f - current_value) / SizeButtonHideDuration());
+    double tweened_value_alpha =
+        gfx::Tween::CalculateValue(gfx::Tween::EASE_IN, scaled_value_alpha);
+    size_alpha = gfx::Tween::LinearIntValueBetween(tweened_value_alpha, 255, 0);
+
+    double scaled_value_position = CapAnimationValue(
+        (HidePositionStartValue() - current_value) / HidePositionStartValue());
+    double tweened_value_slide =
+        gfx::Tween::CalculateValue(gfx::Tween::EASE_OUT, scaled_value_position);
+    x_slide = gfx::Tween::LinearIntValueBetween(tweened_value_slide, 0,
+                                                size_button_->width());
+  }
+
+  LayoutButtonsFromAnimation(x_slide, size_alpha);
+}
+
 bool FrameCaptionButtonContainerView::IsMinimizeButtonVisible() const {
   return minimize_button_->GetVisible();
 }
diff --git a/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h
index 64da772..54b2783e 100644
--- a/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h
+++ b/chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h
@@ -194,6 +194,9 @@
   void MenuButtonPressed();
   void FloatButtonPressed();
 
+  bool SizeButtonShouldBeVisible() const;
+  void LayoutButtonsFromAnimation(int x_slide, int alpha);
+
   // FrameSizeButtonDelegate:
   bool IsMinimizeButtonVisible() const override;
   void SetButtonsToNormal(Animate animate) override;
diff --git a/clank b/clank
index fd4d51c..f3c11d5a 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit fd4d51c6e2648885dcd16d6135d09277c04ecc8f
+Subproject commit f3c11d5a9082c1bf8659c48dc8d6cba286d8a300
diff --git a/components/about_ui/resources/about_credits.css b/components/about_ui/resources/about_credits.css
index 88164720..c8c0404 100644
--- a/components/about_ui/resources/about_credits.css
+++ b/components/about_ui/resources/about_credits.css
@@ -97,25 +97,25 @@
 .dialog .homepage {
   display: none;
 }
-input + label + div.license {
+label.show + div.license {
   display: none;
 }
-input + label::after {
+label.show::after {
   content: 'show license';
   cursor: pointer;
 }
-input#show-all + label::after {
+label.show-all::after {
   content: 'show all licenses';
 }
-input#show-all:checked ~ * input + label + div.license,
-input:checked + label + div {
+label.show-all:has(input:checked) ~ * label.show + div.license,
+label.show:has(input:checked) + div {
   display: block;
 }
-input:checked + label::after {
+label.show:has(input:checked)::after {
   content: 'hide license';
   cursor: pointer;
 }
-input#show-all:checked + label::after {
+label.show-all:has(input:checked)::after {
   content: 'hide all licenses';
 }
 
diff --git a/components/about_ui/resources/about_credits.tmpl b/components/about_ui/resources/about_credits.tmpl
index 1280301e..17db00c 100644
--- a/components/about_ui/resources/about_credits.tmpl
+++ b/components/about_ui/resources/about_credits.tmpl
@@ -11,8 +11,9 @@
 <body>
 <span class="page-title">Credits</span>
 <a id="print-link" href="#" hidden>Print</a>
-<input type="checkbox" hidden id="show-all">
-<label class="show show-all" for="show-all" tabindex="0"></label>
+<label class="show show-all" tabindex="0">
+<input type="checkbox" hidden>
+</label>
 {{reciprocal-license-statement}}
 <div style="clear:both; overflow:auto;"><!-- Chromium <3s the following projects -->
 {{entries}}
diff --git a/components/about_ui/resources/about_credits_entry.tmpl b/components/about_ui/resources/about_credits_entry.tmpl
index 270119a..0968216 100644
--- a/components/about_ui/resources/about_credits_entry.tmpl
+++ b/components/about_ui/resources/about_credits_entry.tmpl
@@ -1,8 +1,9 @@
 <div class="product">
 <span class="title">{{name}}</span>
 <span class="homepage"><a href="{{url}}">homepage</a></span>
-<input type="checkbox" hidden id="{{id}}">
-<label class="show" for="{{id}}" tabindex="0"></label>
+<label class="show" tabindex="0">
+<input type="checkbox" hidden>
+</label>
 <div class="license">
 <pre>{{license}}</pre>
 </div>
diff --git a/components/autofill/core/browser/autofill_granular_filling_utils.cc b/components/autofill/core/browser/autofill_granular_filling_utils.cc
index 953de8ab..f0efd2b 100644
--- a/components/autofill/core/browser/autofill_granular_filling_utils.cc
+++ b/components/autofill/core/browser/autofill_granular_filling_utils.cc
@@ -25,9 +25,9 @@
 
 ServerFieldTypeSet GetTargetServerFieldsForTypeAndLastTargetedFields(
     const ServerFieldTypeSet& last_targeted_fields,
-    const AutofillType& triggering_field_type) {
+    ServerFieldType triggering_field_type) {
   if (AreFieldsGranularFillingGroup(last_targeted_fields)) {
-    switch (triggering_field_type.group()) {
+    switch (GroupTypeOfServerFieldType(triggering_field_type)) {
       case FieldTypeGroup::kName:
         return GetServerFieldTypesOfGroup(FieldTypeGroup::kName);
       case FieldTypeGroup::kAddress:
@@ -44,7 +44,7 @@
   } else if (last_targeted_fields == kAllServerFieldTypes) {
     return kAllServerFieldTypes;
   } else if (last_targeted_fields.size() == 1) {
-    return {triggering_field_type.GetStorableType()};
+    return {triggering_field_type};
   } else {
     NOTREACHED_NORETURN();
   }
diff --git a/components/autofill/core/browser/autofill_granular_filling_utils.h b/components/autofill/core/browser/autofill_granular_filling_utils.h
index 165d740..bd2618a 100644
--- a/components/autofill/core/browser/autofill_granular_filling_utils.h
+++ b/components/autofill/core/browser/autofill_granular_filling_utils.h
@@ -8,7 +8,7 @@
 #include "components/autofill/core/browser/autofill_type.h"
 #include "components/autofill/core/browser/field_types.h"
 
-// Helper methods specific for granular filling related behaviour.
+// Helper methods specific for granular filling related behavior.
 namespace autofill {
 
 // Helper method that returns all address related fields for the purpose of
@@ -18,19 +18,19 @@
 // FieldTypeGroup::kAddress and FieldTypeGroup::kCompany.
 ServerFieldTypeSet GetAddressFieldsForGroupFilling();
 
-// Returns true if `fields` matches one of granullar
-// filling groups, i.e., FieldTypeGroup::kName fields, FieldTypeGroup::kPhone
-// fields or `GetAddressFieldsForGroupFilling` (from the method above).
+// Returns true if `fields` matches one of granular filling groups, i.e.,
+// FieldTypeGroup::kName fields, FieldTypeGroup::kPhone fields or
+// `GetAddressFieldsForGroupFilling` (from the method above).
 bool AreFieldsGranularFillingGroup(const ServerFieldTypeSet& fields);
 
 // Returns a set of fields to be filled, given the last targeted fields and
-// the current field type. For example, if the last targeted fields matches
-// one of the group filling sets, we will return the set of fields that matches
-// the trigering field group. This is done so that the user stays at the same
-// granularity as the one previously chosen.
+// the current trigger field type. For example, if the last targeted fields
+// matches one of the group filling sets, we will return the set of fields that
+// matches the triggering field group. This is done so that the user stays at
+// the same granularity as the one previously chosen.
 ServerFieldTypeSet GetTargetServerFieldsForTypeAndLastTargetedFields(
     const ServerFieldTypeSet& last_targeted_fields,
-    const AutofillType& type);
+    ServerFieldType trigger_field_type);
 
 }  // namespace autofill
 
diff --git a/components/autofill/core/browser/autofill_granular_filling_utils_unittest.cc b/components/autofill/core/browser/autofill_granular_filling_utils_unittest.cc
index cdb0ee9..12555395 100644
--- a/components/autofill/core/browser/autofill_granular_filling_utils_unittest.cc
+++ b/components/autofill/core/browser/autofill_granular_filling_utils_unittest.cc
@@ -36,7 +36,7 @@
     AutofillGranularFillingUtilsTest,
     GetTargetServerFieldsForTypeAndLastTargetedFields_SingleField_ReturnsTriggeringFieldType) {
   EXPECT_EQ(GetTargetServerFieldsForTypeAndLastTargetedFields(
-                {ADDRESS_HOME_LINE1}, AutofillType(NAME_FIRST)),
+                {ADDRESS_HOME_LINE1}, NAME_FIRST),
             ServerFieldTypeSet({NAME_FIRST}));
 }
 
@@ -44,20 +44,19 @@
     AutofillGranularFillingUtilsTest,
     GetTargetServerFieldsForTypeAndLastTargetedFields_AddressFieldsGroup_ReturnsTriggeringFieldTypeGroup) {
   EXPECT_EQ(GetTargetServerFieldsForTypeAndLastTargetedFields(
-                GetAddressFieldsForGroupFilling(), AutofillType(NAME_FIRST)),
+                GetAddressFieldsForGroupFilling(), NAME_FIRST),
             GetServerFieldTypesOfGroup(FieldTypeGroup::kName));
 }
 
 TEST(
     AutofillGranularFillingUtilsTest,
-    GetTargetServerFieldsForTypeAndLastTargetedFields_FieldsMatchGroupFillingButTargetFieldDoesnot_ReturnsAllServerTypes) {
+    GetTargetServerFieldsForTypeAndLastTargetedFields_FieldsMatchGroupFillingButTargetFieldDoesNot_ReturnsAllServerTypes) {
   // If the previously targeted fields match a group of fields (such as name or
   // address), but the triggering field is not a field for which we offer group
   // filling (such as CREDIT_CARD_NAME_FULL), we default back to full form
   // filling.
   EXPECT_EQ(GetTargetServerFieldsForTypeAndLastTargetedFields(
-                GetAddressFieldsForGroupFilling(),
-                AutofillType(CREDIT_CARD_NAME_FULL)),
+                GetAddressFieldsForGroupFilling(), CREDIT_CARD_NAME_FULL),
             kAllServerFieldTypes);
 }
 
@@ -69,7 +68,7 @@
   // kAllServerFieldTypes, so that the user stays in the full form granularity
   // level.
   EXPECT_EQ(GetTargetServerFieldsForTypeAndLastTargetedFields(
-                kAllServerFieldTypes, AutofillType(NAME_FIRST)),
+                kAllServerFieldTypes, NAME_FIRST),
             kAllServerFieldTypes);
 }
 
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.cc b/components/autofill/core/browser/autofill_suggestion_generator.cc
index 95bed6f8..26bd8fe 100644
--- a/components/autofill/core/browser/autofill_suggestion_generator.cc
+++ b/components/autofill/core/browser/autofill_suggestion_generator.cc
@@ -506,12 +506,13 @@
 // `field_contents_canon`.
 bool IsValidSuggestionForFieldContents(std::u16string suggestion_canon,
                                        std::u16string field_contents_canon,
-                                       const AutofillType& type,
+                                       ServerFieldType trigger_field_type,
                                        bool is_masked_server_card,
                                        bool field_is_autofilled) {
   // Phones should do a substring match because they can be trimmed to remove
   // the first parts (e.g. country code or prefix).
-  if (type.group() == FieldTypeGroup::kPhone &&
+  if (GroupTypeOfServerFieldType(trigger_field_type) ==
+          FieldTypeGroup::kPhone &&
       suggestion_canon.find(field_contents_canon) != std::u16string::npos) {
     return true;
   }
@@ -521,7 +522,7 @@
   // - it's a masked card and there are 6 or fewer typed so far.
   // - it's a masked card, field is autofilled, and the last 4 digits in the
   // field match the last 4 digits of the card.
-  if (type.GetStorableType() == CREDIT_CARD_NUMBER) {
+  if (trigger_field_type == CREDIT_CARD_NUMBER) {
     if (suggestion_canon.find(field_contents_canon) != std::u16string::npos) {
       return true;
     }
@@ -573,7 +574,7 @@
 std::vector<Suggestion> AutofillSuggestionGenerator::GetSuggestionsForProfiles(
     const ServerFieldTypeSet& field_types,
     const FormFieldData& triggering_field,
-    AutofillType triggering_field_type,
+    ServerFieldType triggering_field_type,
     absl::optional<ServerFieldTypeSet> last_targeted_fields,
     AutofillSuggestionTriggerSource trigger_source) {
   // If the user manually triggered suggestions from the context menu, all
@@ -596,12 +597,12 @@
 
 std::vector<const AutofillProfile*>
 AutofillSuggestionGenerator::GetProfilesToSuggest(
-    const AutofillType& type,
+    ServerFieldType trigger_field_type,
     const std::u16string& field_contents,
     bool field_is_autofilled,
     const ServerFieldTypeSet& field_types) {
   std::u16string field_contents_canon =
-      NormalizeForComparisonForType(field_contents, type.GetStorableType());
+      NormalizeForComparisonForType(field_contents, trigger_field_type);
 
   // Get the profiles to suggest, which are already sorted.
   std::vector<AutofillProfile*> sorted_profiles =
@@ -616,15 +617,16 @@
   }
 
   std::vector<const AutofillProfile*> matched_profiles =
-      GetPrefixMatchedProfiles(sorted_profiles, type, field_contents,
-                               field_contents_canon, field_is_autofilled);
+      GetPrefixMatchedProfiles(sorted_profiles, trigger_field_type,
+                               field_contents, field_contents_canon,
+                               field_is_autofilled);
 
   const AutofillProfileComparator comparator(personal_data_->app_locale());
   // Don't show two suggestions if one is a subset of the other.
   // Duplicates across sources are resolved in favour of `kAccount` profiles.
   std::vector<const AutofillProfile*> unique_matched_profiles =
-      DeduplicatedProfilesForSuggestions(matched_profiles, type, field_types,
-                                         comparator);
+      DeduplicatedProfilesForSuggestions(matched_profiles, trigger_field_type,
+                                         field_types, comparator);
 
   return unique_matched_profiles;
 }
@@ -634,26 +636,29 @@
     const std::vector<const AutofillProfile*>& profiles,
     const ServerFieldTypeSet& field_types,
     absl::optional<ServerFieldTypeSet> last_targeted_fields,
-    const AutofillType& trigger_field_type,
+    ServerFieldType trigger_field_type,
     uint64_t trigger_field_max_length) {
   std::vector<Suggestion> suggestions;
   std::string app_locale = personal_data_->app_locale();
 
   // This will be used to check if suggestions should be supported with icons.
   const bool contains_profile_related_fields =
-      base::ranges::count_if(field_types, [](ServerFieldType type) {
-        FieldTypeGroup group = AutofillType(type).group();
-        return group == FieldTypeGroup::kName ||
-               group == FieldTypeGroup::kAddress ||
-               group == FieldTypeGroup::kPhone ||
-               group == FieldTypeGroup::kEmail;
+      base::ranges::count_if(field_types, [](ServerFieldType field_type) {
+        FieldTypeGroup field_type_group =
+            GroupTypeOfServerFieldType(field_type);
+        return field_type_group == FieldTypeGroup::kName ||
+               field_type_group == FieldTypeGroup::kAddress ||
+               field_type_group == FieldTypeGroup::kPhone ||
+               field_type_group == FieldTypeGroup::kEmail;
       }) > 1;
 
+  FieldTypeGroup trigger_field_type_group =
+      GroupTypeOfServerFieldType(trigger_field_type);
   for (const AutofillProfile* profile : profiles) {
     // Compute the main text to be displayed in the suggestion bubble.
     std::u16string main_text =
         GetProfileSuggestionMainText(profile, trigger_field_type);
-    if (trigger_field_type.group() == FieldTypeGroup::kPhone) {
+    if (trigger_field_type_group == FieldTypeGroup::kPhone) {
       main_text = FieldFiller::GetPhoneNumberValueForInput(
           trigger_field_max_length, main_text,
           profile->GetInfo(PHONE_HOME_CITY_AND_NUMBER, app_locale));
@@ -689,11 +694,11 @@
 
     if (base::FeatureList::IsEnabled(
             features::kAutofillGranularFillingAvailable)) {
-      AddGranularFillingChildSuggestions(trigger_field_type.group(),
+      AddGranularFillingChildSuggestions(trigger_field_type_group,
                                          last_targeted_fields, *profile,
                                          suggestions.back());
       AddSuggestionDetailsForCurrentFillingGranularity(
-          last_targeted_fields, trigger_field_type.group(), suggestions.back());
+          last_targeted_fields, trigger_field_type_group, suggestions.back());
     } else {
       // Granular filling handles assigning the popup type where the suggestion
       // is created.
@@ -703,8 +708,7 @@
 
   AssignLabelsAndDeduplicate(
       suggestions,
-      GetProfileSuggestionLabels(profiles, field_types,
-                                 trigger_field_type.GetStorableType(),
+      GetProfileSuggestionLabels(profiles, field_types, trigger_field_type,
                                  app_locale),
       app_locale);
 
@@ -716,7 +720,7 @@
 std::vector<const AutofillProfile*>
 AutofillSuggestionGenerator::DeduplicatedProfilesForSuggestions(
     const std::vector<const AutofillProfile*>& matched_profiles,
-    const AutofillType& trigger_field_type,
+    ServerFieldType trigger_field_type,
     const ServerFieldTypeSet& field_types,
     const AutofillProfileComparator& comparator) {
   // TODO(crbug.com/1417975): Remove when
@@ -783,7 +787,7 @@
 std::vector<const AutofillProfile*>
 AutofillSuggestionGenerator::GetPrefixMatchedProfiles(
     const std::vector<AutofillProfile*>& profiles,
-    const AutofillType& trigger_field_type,
+    ServerFieldType trigger_field_type,
     const std::u16string& raw_field_contents,
     const std::u16string& field_contents_canon,
     bool field_is_autofilled) {
@@ -799,8 +803,7 @@
     // TODO(fhorschig): Consider refilling form instead (at least on Android).
 #if BUILDFLAG(IS_ANDROID)
     if (field_is_autofilled &&
-        profile->GetRawInfo(trigger_field_type.GetStorableType()) ==
-            raw_field_contents) {
+        profile->GetRawInfo(trigger_field_type) == raw_field_contents) {
       continue;
     }
 #endif  // BUILDFLAG(IS_ANDROID)
@@ -813,8 +816,8 @@
       continue;
     }
 
-    std::u16string suggestion_canon = NormalizeForComparisonForType(
-        main_text, trigger_field_type.GetStorableType());
+    std::u16string suggestion_canon =
+        NormalizeForComparisonForType(main_text, trigger_field_type);
     if (IsValidSuggestionForFieldContents(
             suggestion_canon, field_contents_canon, trigger_field_type,
             /*is_masked_server_card=*/false, field_is_autofilled)) {
@@ -838,11 +841,10 @@
 
 std::u16string AutofillSuggestionGenerator::GetProfileSuggestionMainText(
     const AutofillProfile* profile,
-    const AutofillType& type) {
-  // TODO(crbug.com/1490529): Remove special treatment for street addresses.
+    ServerFieldType trigger_field_type) {
   std::string app_locale = personal_data_->app_locale();
   ::i18n::addressinput::AddressField address_field;
-  if (i18n::FieldForType(type.GetStorableType(), &address_field) &&
+  if (i18n::FieldForType(trigger_field_type, &address_field) &&
       address_field == ::i18n::addressinput::STREET_ADDRESS) {
     std::string street_address_line;
     ::i18n::addressinput::GetStreetAddressLinesAsSingleLine(
@@ -851,7 +853,7 @@
     return base::UTF8ToUTF16(street_address_line);
   }
 
-  return profile->GetInfo(type, app_locale);
+  return profile->GetInfo(trigger_field_type, app_locale);
 }
 
 void AutofillSuggestionGenerator::AddGranularFillingChildSuggestions(
@@ -872,11 +874,12 @@
 std::vector<Suggestion>
 AutofillSuggestionGenerator::GetSuggestionsForCreditCards(
     const FormFieldData& field,
-    const AutofillType& type,
+    ServerFieldType trigger_field_type,
     bool& should_display_gpay_logo,
     bool& with_offer,
     autofill_metrics::CardMetadataLoggingContext& metadata_logging_context) {
-  DCHECK(type.group() == FieldTypeGroup::kCreditCard);
+  DCHECK(GroupTypeOfServerFieldType(trigger_field_type) ==
+         FieldTypeGroup::kCreditCard);
   std::vector<Suggestion> suggestions;
   const std::string& app_locale = personal_data_->app_locale();
 
@@ -906,13 +909,13 @@
   for (const CreditCard& credit_card : cards_to_suggest) {
     // The value of the stored data for this field type in the |credit_card|.
     std::u16string creditcard_field_value =
-        credit_card.GetInfo(type, app_locale);
+        credit_card.GetInfo(trigger_field_type, app_locale);
     if (creditcard_field_value.empty())
       continue;
 
     if (IsValidSuggestionForFieldContents(
             base::i18n::ToLower(creditcard_field_value), field_contents_lower,
-            type,
+            trigger_field_type,
             credit_card.record_type() ==
                 CreditCard::RecordType::kMaskedServerCard,
             field.is_autofilled)) {
@@ -920,11 +923,11 @@
           base::Contains(card_linked_offers_map, credit_card.guid());
       if (ShouldShowVirtualCardOption(&credit_card)) {
         suggestions.push_back(CreateCreditCardSuggestion(
-            credit_card, type,
+            credit_card, trigger_field_type,
             /*virtual_card_option=*/true, card_linked_offer_available));
       }
       suggestions.push_back(CreateCreditCardSuggestion(
-          credit_card, type,
+          credit_card, trigger_field_type,
           /*virtual_card_option=*/false, card_linked_offer_available));
     }
   }
@@ -1002,7 +1005,8 @@
   // conclude that it was hidden previously and is only showing now because
   // Autofill is considering address field types.
   std::vector<const AutofillProfile*> profiles_to_suggest =
-      GetProfilesToSuggest(field.Type(), field.value, field.is_autofilled,
+      GetProfilesToSuggest(field.Type().GetStorableType(), field.value,
+                           field.is_autofilled,
                            suggestion_field_types_without_address_types);
 
   return base::ranges::find_if(
@@ -1214,10 +1218,11 @@
 // Keyboard Accessory.
 Suggestion AutofillSuggestionGenerator::CreateCreditCardSuggestion(
     const CreditCard& credit_card,
-    const AutofillType& type,
+    ServerFieldType trigger_field_type,
     bool virtual_card_option,
     bool card_linked_offer_available) const {
-  DCHECK(type.group() == FieldTypeGroup::kCreditCard);
+  DCHECK(GroupTypeOfServerFieldType(trigger_field_type) ==
+         FieldTypeGroup::kCreditCard);
 
   Suggestion suggestion;
   suggestion.icon = credit_card.CardIconStringForAutofillSuggestion();
@@ -1230,11 +1235,11 @@
 #endif  // BUILDFLAG(IS_ANDROID)
 
   auto [main_text, minor_text] =
-      GetSuggestionMainTextAndMinorTextForCard(credit_card, type);
+      GetSuggestionMainTextAndMinorTextForCard(credit_card, trigger_field_type);
   suggestion.main_text = std::move(main_text);
   suggestion.minor_text = std::move(minor_text);
   if (std::vector<Suggestion::Text> card_labels =
-          GetSuggestionLabelsForCard(credit_card, type);
+          GetSuggestionLabelsForCard(credit_card, trigger_field_type);
       !card_labels.empty()) {
     suggestion.labels.push_back(std::move(card_labels));
   }
@@ -1244,7 +1249,8 @@
   // For virtual cards, make some adjustments for the suggestion contents.
   if (virtual_card_option) {
     // We don't show card linked offers for virtual card options.
-    AdjustVirtualCardSuggestionContent(suggestion, credit_card, type);
+    AdjustVirtualCardSuggestionContent(suggestion, credit_card,
+                                       trigger_field_type);
   } else if (card_linked_offer_available) {
     // For Keyboard Accessory, set Suggestion::feature_for_iph and change the
     // suggestion icon only if card linked offers are also enabled.
@@ -1273,10 +1279,10 @@
 std::pair<Suggestion::Text, Suggestion::Text>
 AutofillSuggestionGenerator::GetSuggestionMainTextAndMinorTextForCard(
     const CreditCard& credit_card,
-    const AutofillType& type) const {
+    ServerFieldType trigger_field_type) const {
   std::u16string main_text;
   std::u16string minor_text;
-  if (type.GetStorableType() == CREDIT_CARD_NUMBER) {
+  if (trigger_field_type == CREDIT_CARD_NUMBER) {
     std::u16string nickname = GetDisplayNicknameForCreditCard(credit_card);
     if (ShouldSplitCardNameAndLastFourDigits()) {
       main_text = credit_card.CardNameForAutofillDisplay(nickname);
@@ -1286,12 +1292,13 @@
       main_text = credit_card.CardNameAndLastFourDigits(nickname,
                                                         GetObfuscationLength());
     }
-  } else if (type.GetStorableType() == CREDIT_CARD_VERIFICATION_CODE) {
+  } else if (trigger_field_type == CREDIT_CARD_VERIFICATION_CODE) {
     CHECK(!credit_card.cvc().empty());
     main_text =
         l10n_util::GetStringUTF16(IDS_AUTOFILL_CVC_SUGGESTION_MAIN_TEXT);
   } else {
-    main_text = credit_card.GetInfo(type, personal_data_->app_locale());
+    main_text =
+        credit_card.GetInfo(trigger_field_type, personal_data_->app_locale());
   }
 
   return {Suggestion::Text(main_text, Suggestion::Text::IsPrimary(true),
@@ -1305,20 +1312,20 @@
 std::vector<Suggestion::Text>
 AutofillSuggestionGenerator::GetSuggestionLabelsForCard(
     const CreditCard& credit_card,
-    const AutofillType& type) const {
-  DCHECK(type.group() == FieldTypeGroup::kCreditCard);
+    ServerFieldType trigger_field_type) const {
+  DCHECK(GroupTypeOfServerFieldType(trigger_field_type) ==
+         FieldTypeGroup::kCreditCard);
   const std::string& app_locale = personal_data_->app_locale();
 
   // If the focused field is a card number field.
-  if (type.GetStorableType() == CREDIT_CARD_NUMBER) {
+  if (trigger_field_type == CREDIT_CARD_NUMBER) {
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
-    return {Suggestion::Text(credit_card.GetInfo(
-        AutofillType(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR), app_locale))};
+    return {Suggestion::Text(
+        credit_card.GetInfo(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, app_locale))};
 #else
     return {Suggestion::Text(
         ShouldSplitCardNameAndLastFourDigits()
-            ? credit_card.GetInfo(
-                  AutofillType(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR), app_locale)
+            ? credit_card.GetInfo(CREDIT_CARD_EXP_DATE_2_DIGIT_YEAR, app_locale)
             : credit_card.DescriptiveExpiration(app_locale))};
 #endif  // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
   }
@@ -1332,9 +1339,9 @@
     if (credit_card.HasNonEmptyValidNickname())
       return {Suggestion::Text(nickname)};
 
-    if (type.GetStorableType() != CREDIT_CARD_NAME_FULL) {
-      return {Suggestion::Text(credit_card.GetInfo(
-          AutofillType(CREDIT_CARD_NAME_FULL), app_locale))};
+    if (trigger_field_type != CREDIT_CARD_NAME_FULL) {
+      return {Suggestion::Text(
+          credit_card.GetInfo(CREDIT_CARD_NAME_FULL, app_locale))};
     }
     return {};
   }
@@ -1381,7 +1388,7 @@
 void AutofillSuggestionGenerator::AdjustVirtualCardSuggestionContent(
     Suggestion& suggestion,
     const CreditCard& credit_card,
-    const AutofillType& type) const {
+    ServerFieldType trigger_field_type) const {
   if (credit_card.record_type() == CreditCard::RecordType::kLocalCard) {
     const CreditCard* server_duplicate_card =
         personal_data_->GetServerCardForLocalCard(&credit_card);
@@ -1432,13 +1439,13 @@
       suggestion.minor_text.value = suggestion.main_text.value;
       suggestion.main_text.value = VIRTUAL_CARD_LABEL;
     }
-    if (type.GetStorableType() == CREDIT_CARD_NUMBER) {
+    if (trigger_field_type == CREDIT_CARD_NUMBER) {
       // The expiration date is not shown for the card number field, so it is
       // removed.
       suggestion.labels = {};
     }
   } else {  // Desktop/Android dropdown.
-    if (type.GetStorableType() == CREDIT_CARD_NUMBER) {
+    if (trigger_field_type == CREDIT_CARD_NUMBER) {
       // If the focused field is a credit card number field, reset all labels
       // and populate only the virtual card text.
       suggestion.labels = {{Suggestion::Text(VIRTUAL_CARD_LABEL)}};
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.h b/components/autofill/core/browser/autofill_suggestion_generator.h
index 46f52c35..b5ddf6f 100644
--- a/components/autofill/core/browser/autofill_suggestion_generator.h
+++ b/components/autofill/core/browser/autofill_suggestion_generator.h
@@ -29,7 +29,6 @@
 
 class AutofillClient;
 class AutofillOfferData;
-class AutofillType;
 class CreditCard;
 struct FormFieldData;
 class Iban;
@@ -68,7 +67,7 @@
   std::vector<Suggestion> GetSuggestionsForProfiles(
       const ServerFieldTypeSet& field_types,
       const FormFieldData& triggering_field,
-      AutofillType triggering_field_type,
+      ServerFieldType triggering_field_type,
       absl::optional<ServerFieldTypeSet> last_targeted_fields,
       AutofillSuggestionTriggerSource trigger_source);
 
@@ -77,7 +76,7 @@
   // profiles to matching with `field_contents`, and deduplicating based on
   // `field_types`, which are the relevant types for the current suggestion.
   std::vector<const AutofillProfile*> GetProfilesToSuggest(
-      const AutofillType& type,
+      ServerFieldType trigger_field_type,
       const std::u16string& field_contents,
       bool field_is_autofilled,
       const ServerFieldTypeSet& field_types);
@@ -91,18 +90,18 @@
       const std::vector<const AutofillProfile*>& profiles,
       const ServerFieldTypeSet& field_types,
       absl::optional<ServerFieldTypeSet> last_targeted_fields,
-      const AutofillType& trigger_field_type,
+      ServerFieldType trigger_field_type,
       uint64_t trigger_field_max_length);
 
-  // Generates suggestions for all available credit cards based on the `type`
-  // and the value of `field`. `should_display_gpay_logo` will be set to true if
-  // there are no credit card suggestions, or all suggestions come from Payments
-  // server. `with_offer` is set to true if ANY card has card-linked offers.
-  // `metadata_logging_context` contains card metadata related information used
-  // for metrics logging.
+  // Generates suggestions for all available credit cards based on the
+  // `trigger_field_type` and the value of `field`. `should_display_gpay_logo`
+  // will be set to true if there are no credit card suggestions, or all
+  // suggestions come from Payments server. `with_offer` is set to true if ANY
+  // card has card-linked offers. `metadata_logging_context` contains card
+  // metadata related information used for metrics logging.
   std::vector<Suggestion> GetSuggestionsForCreditCards(
       const FormFieldData& field,
-      const AutofillType& type,
+      ServerFieldType trigger_field_type,
       bool& should_display_gpay_logo,
       bool& with_offer,
       autofill_metrics::CardMetadataLoggingContext& metadata_logging_context);
@@ -168,13 +167,12 @@
       const std::vector<FieldFillingSkipReason>& skip_reasons);
 
  protected:
-  // Creates a suggestion for the given `credit_card`. `type` denotes the
-  // AutofillType of the field that is focused when the query is triggered.
-  // `virtual_card_option` suggests whether the suggestion is a virtual card
-  // option. `card_linked_offer_available` indicates whether a card-linked offer
-  // is attached to the `credit_card`.
+  // Creates a suggestion for the given `credit_card`. `virtual_card_option`
+  // suggests whether the suggestion is a virtual card option.
+  // `card_linked_offer_available` indicates whether a card-linked offer is
+  // attached to the `credit_card`.
   Suggestion CreateCreditCardSuggestion(const CreditCard& credit_card,
-                                        const AutofillType& type,
+                                        ServerFieldType trigger_field_type,
                                         bool virtual_card_option,
                                         bool card_linked_offer_available) const;
 
@@ -186,7 +184,7 @@
   // of the field on which the user is currently focused.
   std::vector<const AutofillProfile*> DeduplicatedProfilesForSuggestions(
       const std::vector<const AutofillProfile*>& matched_profiles,
-      const AutofillType& trigger_field_type,
+      ServerFieldType trigger_field_type,
       const ServerFieldTypeSet& field_types,
       const AutofillProfileComparator& comparator);
 
@@ -195,7 +193,7 @@
   // `kMaxSuggestedProfilesCount` are returned.
   std::vector<const AutofillProfile*> GetPrefixMatchedProfiles(
       const std::vector<AutofillProfile*>& profiles,
-      const AutofillType& trigger_field_type,
+      ServerFieldType trigger_field_type,
       const std::u16string& raw_field_contents,
       const std::u16string& field_contents_canon,
       bool field_is_autofilled);
@@ -208,8 +206,9 @@
 
   // In addition to just getting the values out of the profile, this function
   // handles type-specific formatting.
-  std::u16string GetProfileSuggestionMainText(const AutofillProfile* profile,
-                                              const AutofillType& type);
+  std::u16string GetProfileSuggestionMainText(
+      const AutofillProfile* profile,
+      ServerFieldType trigger_field_type);
 
   // Creates nested/child suggestions for `suggestion` with the `profile`
   // information. Uses `trigger_field_type_group` to define what group filling
@@ -224,26 +223,28 @@
       Suggestion& suggestion);
 
   // Return the texts shown as the first line of the suggestion, based on the
-  // `credit_card` and the focused field `type`. The first index in the pair
+  // `credit_card` and the `trigger_field_type`. The first index in the pair
   // represents the main text, and the second index represents the minor text.
   // The minor text can be empty, in which case the main text should be rendered
   // as the entire first line. If the minor text is not empty, they should be
   // combined. This splitting is implemented for situations where the first part
   // of the first line of the suggestion should be truncated.
   std::pair<Suggestion::Text, Suggestion::Text>
-  GetSuggestionMainTextAndMinorTextForCard(const CreditCard& credit_card,
-                                           const AutofillType& type) const;
+  GetSuggestionMainTextAndMinorTextForCard(
+      const CreditCard& credit_card,
+      ServerFieldType trigger_field_type) const;
 
   // Return the labels to be shown in the suggestion. Note this does not account
   // for virtual cards or card-linked offers.
   std::vector<Suggestion::Text> GetSuggestionLabelsForCard(
       const CreditCard& credit_card,
-      const AutofillType& type) const;
+      ServerFieldType trigger_field_type) const;
 
-  // Adjust the content of |suggestion| if it is a virtual card suggestion.
-  void AdjustVirtualCardSuggestionContent(Suggestion& suggestion,
-                                          const CreditCard& credit_card,
-                                          const AutofillType& type) const;
+  // Adjust the content of `suggestion` if it is a virtual card suggestion.
+  void AdjustVirtualCardSuggestionContent(
+      Suggestion& suggestion,
+      const CreditCard& credit_card,
+      ServerFieldType trigger_field_type) const;
 
   // Set the URL for the card art image to be shown in the `suggestion`.
   void SetCardArtURL(Suggestion& suggestion,
diff --git a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
index 1fd96852..6f3c21c5 100644
--- a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
+++ b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
@@ -17,7 +17,6 @@
 #include "components/autofill/core/browser/autofill_granular_filling_utils.h"
 #include "components/autofill/core/browser/autofill_suggestion_generator.h"
 #include "components/autofill/core/browser/autofill_test_utils.h"
-#include "components/autofill/core/browser/autofill_type.h"
 #include "components/autofill/core/browser/data_model/autofill_profile.h"
 #include "components/autofill/core/browser/data_model/autofill_wallet_usage_data.h"
 #include "components/autofill/core/browser/data_model/credit_card.h"
@@ -91,11 +90,12 @@
 
   Suggestion CreateCreditCardSuggestion(
       const CreditCard& credit_card,
-      const AutofillType& type,
+      ServerFieldType trigger_field_type,
       bool virtual_card_option,
       bool card_linked_offer_available) const {
     return AutofillSuggestionGenerator::CreateCreditCardSuggestion(
-        credit_card, type, virtual_card_option, card_linked_offer_available);
+        credit_card, trigger_field_type, virtual_card_option,
+        card_linked_offer_available);
   }
 };
 
@@ -215,8 +215,8 @@
   ASSERT_EQ(personal_data()->GetProfilesToSuggest().size(), 2u);
 
   std::vector<const AutofillProfile*> profiles =
-      suggestion_generator()->GetProfilesToSuggest(AutofillType(EMAIL_ADDRESS),
-                                                   u"Test@", false, {});
+      suggestion_generator()->GetProfilesToSuggest(EMAIL_ADDRESS, u"Test@",
+                                                   false, {});
 
   ASSERT_EQ(profiles.size(), 1u);
   EXPECT_EQ(*profiles[0], profile_1);
@@ -254,8 +254,8 @@
   // Simulate a form with street address, city and state.
   ServerFieldTypeSet types = {ADDRESS_HOME_CITY, ADDRESS_HOME_STATE};
   std::vector<const AutofillProfile*> profiles =
-      suggestion_generator()->GetProfilesToSuggest(
-          AutofillType(ADDRESS_HOME_STREET_ADDRESS), u"123", false, types);
+      suggestion_generator()->GetProfilesToSuggest(ADDRESS_HOME_STREET_ADDRESS,
+                                                   u"123", false, types);
   ASSERT_EQ(2U, profiles.size());
   EXPECT_EQ(profiles[0]->GetRawInfo(ADDRESS_HOME_STATE), u"CA");
   EXPECT_EQ(profiles[1]->GetRawInfo(ADDRESS_HOME_STATE), u"TX");
@@ -278,8 +278,8 @@
   }
 
   std::vector<const AutofillProfile*> suggested_profiles =
-      suggestion_generator()->GetProfilesToSuggest(AutofillType(NAME_FIRST),
-                                                   u"Ma", false, {});
+      suggestion_generator()->GetProfilesToSuggest(NAME_FIRST, u"Ma", false,
+                                                   {});
 
   ASSERT_EQ(2 * AutofillSuggestionGenerator::kMaxUniqueSuggestedProfilesCount,
             personal_data()->GetProfiles().size());
@@ -321,8 +321,8 @@
   personal_data()->AddProfile(profile);
 
   std::vector<const AutofillProfile*> suggested_profiles =
-      suggestion_generator()->GetProfilesToSuggest(AutofillType(NAME_FIRST),
-                                                   u"Ma", false, {});
+      suggestion_generator()->GetProfilesToSuggest(NAME_FIRST, u"Ma", false,
+                                                   {});
 
   ASSERT_EQ(AutofillSuggestionGenerator::kMaxSuggestedProfilesCount + 1,
             personal_data()->GetProfiles().size());
@@ -364,8 +364,8 @@
   personal_data()->AddProfile(profile2);
 
   std::vector<const AutofillProfile*> suggested_profiles =
-      suggestion_generator()->GetProfilesToSuggest(AutofillType(NAME_FIRST),
-                                                   u"Ma", false, {});
+      suggestion_generator()->GetProfilesToSuggest(NAME_FIRST, u"Ma", false,
+                                                   {});
   ASSERT_EQ(3U, suggested_profiles.size());
   EXPECT_EQ(suggested_profiles[0]->GetRawInfo(NAME_FIRST), u"Marion1");
   EXPECT_EQ(suggested_profiles[1]->GetRawInfo(NAME_FIRST), u"Marion2");
@@ -399,8 +399,8 @@
 
   // Verify that all the profiles are suggested.
   std::vector<const AutofillProfile*> suggested_profiles =
-      suggestion_generator()->GetProfilesToSuggest(AutofillType(NAME_FIRST),
-                                                   std::u16string(), false, {});
+      suggestion_generator()->GetProfilesToSuggest(NAME_FIRST, std::u16string(),
+                                                   false, {});
   EXPECT_EQ(3U, suggested_profiles.size());
 }
 
@@ -421,21 +421,21 @@
   {
     std::vector<const AutofillProfile*> suggested_profiles =
         suggestion_generator()->GetProfilesToSuggest(
-            AutofillType(NAME_FULL), std::u16string(), false,
+            NAME_FULL, std::u16string(), false,
             {NAME_FULL, PHONE_HOME_WHOLE_NUMBER});
     EXPECT_EQ(2U, suggested_profiles.size());
   }
   {
     std::vector<const AutofillProfile*> suggested_profiles =
         suggestion_generator()->GetProfilesToSuggest(
-            AutofillType(NAME_FULL), std::u16string(), false,
+            NAME_FULL, std::u16string(), false,
             {NAME_FULL, PHONE_HOME_COUNTRY_CODE, PHONE_HOME_CITY_AND_NUMBER});
     EXPECT_EQ(2U, suggested_profiles.size());
   }
   {
     std::vector<const AutofillProfile*> suggested_profiles =
         suggestion_generator()->GetProfilesToSuggest(
-            AutofillType(NAME_FULL), std::u16string(), false,
+            NAME_FULL, std::u16string(), false,
             {NAME_FULL, PHONE_HOME_COUNTRY_CODE, PHONE_HOME_CITY_CODE,
              PHONE_HOME_NUMBER});
     EXPECT_EQ(2U, suggested_profiles.size());
@@ -443,7 +443,7 @@
   {
     std::vector<const AutofillProfile*> suggested_profiles =
         suggestion_generator()->GetProfilesToSuggest(
-            AutofillType(NAME_FULL), std::u16string(), false,
+            NAME_FULL, std::u16string(), false,
             {NAME_FULL, PHONE_HOME_COUNTRY_CODE, PHONE_HOME_CITY_CODE});
     EXPECT_EQ(1U, suggested_profiles.size());
   }
@@ -474,8 +474,7 @@
   {
     std::vector<const AutofillProfile*> suggested_profiles =
         suggestion_generator()->GetProfilesToSuggest(
-            AutofillType(ADDRESS_HOME_STREET_ADDRESS), std::u16string(), false,
-            {});
+            ADDRESS_HOME_STREET_ADDRESS, std::u16string(), false, {});
     EXPECT_EQ(1U, suggested_profiles.size());
   }
 
@@ -483,7 +482,7 @@
   {
     std::vector<const AutofillProfile*> suggested_profiles =
         suggestion_generator()->GetProfilesToSuggest(
-            AutofillType(ADDRESS_HOME_STREET_ADDRESS), u"--", false, {});
+            ADDRESS_HOME_STREET_ADDRESS, u"--", false, {});
     EXPECT_EQ(1U, suggested_profiles.size());
   }
 
@@ -491,7 +490,7 @@
   {
     std::vector<const AutofillProfile*> suggested_profiles =
         suggestion_generator()->GetProfilesToSuggest(
-            AutofillType(ADDRESS_HOME_STREET_ADDRESS), u"123", false, {});
+            ADDRESS_HOME_STREET_ADDRESS, u"123", false, {});
     ASSERT_EQ(1U, suggested_profiles.size());
     EXPECT_EQ(u"Marion1", suggested_profiles[0]->GetRawInfo(NAME_FIRST));
   }
@@ -500,7 +499,7 @@
   {
     std::vector<const AutofillProfile*> suggested_profiles =
         suggestion_generator()->GetProfilesToSuggest(
-            AutofillType(ADDRESS_HOME_STREET_ADDRESS), u"456", false, {});
+            ADDRESS_HOME_STREET_ADDRESS, u"456", false, {});
     EXPECT_EQ(1U, suggested_profiles.size());
     EXPECT_EQ(u"Marion2", suggested_profiles[0]->GetRawInfo(NAME_FIRST));
   }
@@ -517,7 +516,7 @@
 
   std::vector<const AutofillProfile*> profiles_to_suggest =
       suggestion_generator()->GetProfilesToSuggest(
-          AutofillType(NAME_FIRST), u"", /*field_is_autofilled=*/false, {});
+          NAME_FIRST, u"", /*field_is_autofilled=*/false, {});
 
   ASSERT_EQ(1U, profiles_to_suggest.size());
 }
@@ -542,7 +541,7 @@
 
   std::vector<const AutofillProfile*> profiles_to_suggest =
       suggestion_generator()->GetProfilesToSuggest(
-          AutofillType(NAME_FIRST), u"", /*field_is_autofilled=*/false,
+          NAME_FIRST, u"", /*field_is_autofilled=*/false,
           {NAME_FIRST, NAME_LAST});
 
   EXPECT_EQ(3U, profiles_to_suggest.size());
@@ -565,8 +564,7 @@
 
   std::vector<const AutofillProfile*> profiles_to_suggest =
       suggestion_generator()->GetProfilesToSuggest(
-          AutofillType(NAME_FULL), u"", /*field_is_autofilled=*/false,
-          {NAME_FULL});
+          NAME_FULL, u"", /*field_is_autofilled=*/false, {NAME_FULL});
 
   ASSERT_EQ(AutofillSuggestionGenerator::kMaxUniqueSuggestedProfilesCount,
             profiles_to_suggest.size());
@@ -580,7 +578,7 @@
 TEST_F(AutofillSuggestionGeneratorTest,
        GetProfilesToSuggest_EmptyMatchingProfiles) {
   ASSERT_EQ(0U, suggestion_generator()
-                    ->GetProfilesToSuggest(AutofillType(NAME_FIRST), u"",
+                    ->GetProfilesToSuggest(NAME_FIRST, u"",
                                            /*field_is_autofilled=*/false, {})
                     .size());
 }
@@ -605,8 +603,7 @@
 
   std::vector<const AutofillProfile*> profiles_to_suggest =
       suggestion_generator()->GetProfilesToSuggest(
-          AutofillType(NAME_FULL), u"", /*field_is_autofilled=*/false,
-          {NAME_FULL});
+          NAME_FULL, u"", /*field_is_autofilled=*/false, {NAME_FULL});
 
   ASSERT_EQ(1u, profiles_to_suggest.size());
   EXPECT_EQ(profile_1.guid(), profiles_to_suggest[0]->guid());
@@ -626,7 +623,7 @@
 
   std::vector<const AutofillProfile*> profiles_to_suggest =
       suggestion_generator()->GetProfilesToSuggest(
-          AutofillType(NAME_FIRST), u"Mar", /*field_is_autofilled=*/false, {});
+          NAME_FIRST, u"Mar", /*field_is_autofilled=*/false, {});
 
   ASSERT_EQ(1U, profiles_to_suggest.size());
   EXPECT_EQ(marion_profile.guid(), profiles_to_suggest[0]->guid());
@@ -640,7 +637,7 @@
 
   std::vector<const AutofillProfile*> profiles_to_suggest =
       suggestion_generator()->GetProfilesToSuggest(
-          AutofillType(NAME_FIRST), u"Mar", /*field_is_autofilled=*/false, {});
+          NAME_FIRST, u"Mar", /*field_is_autofilled=*/false, {});
 
   ASSERT_TRUE(profiles_to_suggest.empty());
 }
@@ -649,7 +646,7 @@
        GetProfilesToSuggest_EmptyProfilesInput) {
   std::vector<const AutofillProfile*> profiles_to_suggest =
       suggestion_generator()->GetProfilesToSuggest(
-          AutofillType(NAME_FIRST), u"Mar", /*field_is_autofilled=*/false, {});
+          NAME_FIRST, u"Mar", /*field_is_autofilled=*/false, {});
 
   ASSERT_TRUE(profiles_to_suggest.empty());
 }
@@ -679,7 +676,7 @@
   base::HistogramTester histogram_tester;
   std::vector<const AutofillProfile*> profiles_to_suggest =
       suggestion_generator()->GetProfilesToSuggest(
-          AutofillType(NAME_FULL), u"",
+          NAME_FULL, u"",
           /*field_is_autofilled=*/false, {NAME_FULL});
 
   // Validate that we get the expected filtered profiles and histograms.
@@ -702,8 +699,7 @@
   std::vector<Suggestion> suggestions =
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, {ADDRESS_HOME_STREET_ADDRESS},
-          /*last_targeted_fields=*/absl::nullopt,
-          AutofillType(ADDRESS_HOME_STREET_ADDRESS),
+          /*last_targeted_fields=*/absl::nullopt, ADDRESS_HOME_STREET_ADDRESS,
           /*trigger_field_max_length=*/0);
   ASSERT_FALSE(suggestions.empty());
   EXPECT_EQ(u"123 Zoo St., Second Line, Third line, unit 5",
@@ -725,8 +721,7 @@
   std::vector<Suggestion> suggestions =
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, {PHONE_HOME_WHOLE_NUMBER},
-          /*last_targeted_fields=*/absl::nullopt,
-          AutofillType(PHONE_HOME_WHOLE_NUMBER),
+          /*last_targeted_fields=*/absl::nullopt, PHONE_HOME_WHOLE_NUMBER,
           /*trigger_field_max_length=*/0);
   ASSERT_FALSE(suggestions.empty());
   EXPECT_EQ(u"12345678910", suggestions[0].main_text.value);
@@ -749,7 +744,7 @@
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile},
           {NAME_FIRST, NAME_LAST, EMAIL_ADDRESS, PHONE_HOME_WHOLE_NUMBER},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(NAME_FIRST),
+          /*last_targeted_fields=*/absl::nullopt, NAME_FIRST,
           /*trigger_field_max_length=*/0),
       ElementsAre(testing::Field(
           &Suggestion::main_text,
@@ -775,7 +770,7 @@
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile},
           {NAME_FIRST, NAME_LAST, EMAIL_ADDRESS, PHONE_HOME_WHOLE_NUMBER},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(NAME_FIRST),
+          /*last_targeted_fields=*/absl::nullopt, NAME_FIRST,
           /*trigger_field_max_length=*/0),
       ElementsAre(AllOf(
           testing::Field(&Suggestion::labels,
@@ -797,18 +792,17 @@
   scoped_features.InitAndEnableFeature(
       features::kAutofillUseImprovedLabelDisambiguation);
 
-  EXPECT_THAT(
-      suggestion_generator()->CreateSuggestionsFromProfiles(
-          {&profile},
-          {NAME_FULL, ADDRESS_HOME_STREET_ADDRESS, ADDRESS_HOME_CITY,
-           ADDRESS_HOME_STATE, ADDRESS_HOME_ZIP},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(NAME_FULL),
-          /*trigger_field_max_length=*/0),
-      ElementsAre(
-          AllOf(testing::Field(&Suggestion::labels,
-                               ConstructLabelLineMatrix(
-                                   {u"401 Merrimack St, Lowell, MA 01852"})),
-                testing::Field(&Suggestion::icon, kAddressEntryIcon))));
+  EXPECT_THAT(suggestion_generator()->CreateSuggestionsFromProfiles(
+                  {&profile},
+                  {NAME_FULL, ADDRESS_HOME_STREET_ADDRESS, ADDRESS_HOME_CITY,
+                   ADDRESS_HOME_STATE, ADDRESS_HOME_ZIP},
+                  /*last_targeted_fields=*/absl::nullopt, NAME_FULL,
+                  /*trigger_field_max_length=*/0),
+              ElementsAre(AllOf(
+                  testing::Field(&Suggestion::labels,
+                                 ConstructLabelLineMatrix(
+                                     {u"401 Merrimack St, Lowell, MA 01852"})),
+                  testing::Field(&Suggestion::icon, kAddressEntryIcon))));
 }
 #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
 
@@ -828,7 +822,7 @@
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile},
           {NAME_FULL, ADDRESS_HOME_STREET_ADDRESS, PHONE_HOME_WHOLE_NUMBER},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(NAME_FULL),
+          /*last_targeted_fields=*/absl::nullopt, NAME_FULL,
           /*trigger_field_max_length=*/0),
       ElementsAre(
           AllOf(testing::Field(&Suggestion::labels,
@@ -853,7 +847,7 @@
   EXPECT_THAT(
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, {NAME_FULL, ADDRESS_HOME_STREET_ADDRESS, EMAIL_ADDRESS},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(NAME_FULL),
+          /*last_targeted_fields=*/absl::nullopt, NAME_FULL,
           /*trigger_field_max_length=*/0),
       ElementsAre(AllOf(
           testing::Field(&Suggestion::labels,
@@ -880,7 +874,7 @@
           {&profile},
           {NAME_FULL, ADDRESS_HOME_STREET_ADDRESS, EMAIL_ADDRESS,
            PHONE_HOME_WHOLE_NUMBER},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(NAME_FULL),
+          /*last_targeted_fields=*/absl::nullopt, NAME_FULL,
           /*trigger_field_max_length=*/0),
       ElementsAre(
           AllOf(testing::Field(&Suggestion::labels,
@@ -914,7 +908,7 @@
           {&profile1, &profile2},
           {NAME_FULL, ADDRESS_HOME_STREET_ADDRESS, EMAIL_ADDRESS,
            PHONE_HOME_WHOLE_NUMBER},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(NAME_FULL),
+          /*last_targeted_fields=*/absl::nullopt, NAME_FULL,
           /*trigger_field_max_length=*/0),
       ElementsAre(
           AllOf(testing::Field(&Suggestion::labels,
@@ -954,7 +948,7 @@
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile1, &profile2},
           {NAME_FIRST, NAME_LAST, EMAIL_ADDRESS, PHONE_HOME_WHOLE_NUMBER},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(EMAIL_ADDRESS),
+          /*last_targeted_fields=*/absl::nullopt, EMAIL_ADDRESS,
           /*trigger_field_max_length=*/0),
       ElementsAre(
           AllOf(testing::Field(&Suggestion::labels,
@@ -972,7 +966,7 @@
           {&profile1, &profile2},
           {NAME_FULL, ADDRESS_HOME_STREET_ADDRESS, ADDRESS_HOME_CITY,
            EMAIL_ADDRESS, PHONE_HOME_WHOLE_NUMBER},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(EMAIL_ADDRESS),
+          /*last_targeted_fields=*/absl::nullopt, EMAIL_ADDRESS,
           /*trigger_field_max_length=*/0),
       ElementsAre(
           AllOf(testing::Field(&Suggestion::labels,
@@ -1010,7 +1004,7 @@
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile1, &profile2},
           {NAME_FIRST, NAME_LAST, EMAIL_ADDRESS, PHONE_HOME_WHOLE_NUMBER},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(EMAIL_ADDRESS),
+          /*last_targeted_fields=*/absl::nullopt, EMAIL_ADDRESS,
           /*trigger_field_max_length=*/0),
       ElementsAre(
           AllOf(testing::Field(&Suggestion::labels,
@@ -1030,7 +1024,7 @@
           {&profile1, &profile2},
           {NAME_FULL, ADDRESS_HOME_STREET_ADDRESS, ADDRESS_HOME_CITY,
            EMAIL_ADDRESS, PHONE_HOME_WHOLE_NUMBER},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(EMAIL_ADDRESS),
+          /*last_targeted_fields=*/absl::nullopt, EMAIL_ADDRESS,
           /*trigger_field_max_length=*/0),
       ElementsAre(
           AllOf(
@@ -1061,8 +1055,7 @@
   std::vector<Suggestion> suggestions =
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, /*field_types=*/{NAME_FIRST},
-          /*last_targeted_fields=*/kAllServerFieldTypes,
-          AutofillType(NAME_FIRST),
+          /*last_targeted_fields=*/kAllServerFieldTypes, NAME_FIRST,
           /*trigger_field_max_length=*/0);
 
   ASSERT_EQ(1U, suggestions.size());
@@ -1128,7 +1121,7 @@
   std::vector<Suggestion> suggestions =
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, /*field_types=*/{NAME_FIRST},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(NAME_FIRST),
+          /*last_targeted_fields=*/absl::nullopt, NAME_FIRST,
           /*trigger_field_max_length=*/0);
 
   // Suggestions should have two levels of children, The address line 1 (sixth
@@ -1163,8 +1156,7 @@
   std::vector<Suggestion> suggestions =
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, /*field_types=*/{NAME_LAST},
-          absl::optional<ServerFieldTypeSet>({NAME_LAST}),
-          AutofillType(NAME_FIRST),
+          absl::optional<ServerFieldTypeSet>({NAME_LAST}), NAME_FIRST,
           /*trigger_field_max_length=*/0);
 
   EXPECT_EQ(suggestions[0].popup_item_id, PopupItemId::kFieldByFieldFilling);
@@ -1180,7 +1172,7 @@
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, /*field_types=*/{NAME_FIRST},
           absl::optional<ServerFieldTypeSet>(GetAddressFieldsForGroupFilling()),
-          AutofillType(NAME_FIRST),
+          NAME_FIRST,
           /*trigger_field_max_length=*/0);
 
   EXPECT_EQ(suggestions[0].popup_item_id, PopupItemId::kFillFullName);
@@ -1196,8 +1188,7 @@
   std::vector<Suggestion> suggestions =
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, /*field_types=*/{NAME_FIRST},
-          absl::optional<ServerFieldTypeSet>(kAllServerFieldTypes),
-          AutofillType(NAME_FIRST),
+          absl::optional<ServerFieldTypeSet>(kAllServerFieldTypes), NAME_FIRST,
           /*trigger_field_max_length=*/0);
 
   EXPECT_EQ(suggestions[0].popup_item_id, PopupItemId::kAddressEntry);
@@ -1215,7 +1206,7 @@
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, /*field_types=*/{CREDIT_CARD_TYPE},
           absl::optional<ServerFieldTypeSet>(kAllServerFieldTypes),
-          AutofillType(CREDIT_CARD_TYPE),
+          CREDIT_CARD_TYPE,
           /*trigger_field_max_length=*/0);
 
   EXPECT_EQ(suggestions[0].popup_item_id, PopupItemId::kAddressEntry);
@@ -1235,7 +1226,7 @@
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, {PHONE_HOME_WHOLE_NUMBER},
           /*last_targeted_fields=*/kAllServerFieldTypes,
-          AutofillType(PHONE_HOME_WHOLE_NUMBER),
+          PHONE_HOME_WHOLE_NUMBER,
           /*trigger_field_max_length=*/0);
 
   // The child suggestions should be:
@@ -1268,8 +1259,7 @@
   std::vector<Suggestion> suggestions =
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, /*field_types=*/{ADDRESS_HOME_LINE1},
-          /*last_targeted_fields=*/kAllServerFieldTypes,
-          AutofillType(ADDRESS_HOME_LINE1),
+          /*last_targeted_fields=*/kAllServerFieldTypes, ADDRESS_HOME_LINE1,
           /*trigger_field_max_length=*/0);
 
   // The child suggestions should be:
@@ -1312,8 +1302,7 @@
   std::vector<Suggestion> suggestions =
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, /*field_types=*/{ADDRESS_HOME_LINE1},
-          /*last_targeted_fields=*/absl::nullopt,
-          AutofillType(ADDRESS_HOME_LINE1),
+          /*last_targeted_fields=*/absl::nullopt, ADDRESS_HOME_LINE1,
           /*trigger_field_max_length=*/0);
   ASSERT_EQ(1u, suggestions.size());
   ASSERT_LE(3u, suggestions[0].children.size());
@@ -1344,7 +1333,7 @@
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profiles[0], &profiles[1], &profiles[2]},
           {NAME_FULL, ADDRESS_HOME_STREET_ADDRESS},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(NAME_FULL),
+          /*last_targeted_fields=*/absl::nullopt, NAME_FULL,
           /*trigger_field_max_length=*/0);
 
   // Suggestions are sorted from highest to lowest rank, so check that
@@ -1385,7 +1374,7 @@
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile_1, &profile_2, &profile_3},
           {NAME_FIRST, ADDRESS_HOME_STREET_ADDRESS},
-          /*last_targeted_fields=*/absl::nullopt, AutofillType(NAME_FIRST),
+          /*last_targeted_fields=*/absl::nullopt, NAME_FIRST,
           /*trigger_field_max_length=*/0);
 
   EXPECT_THAT(
@@ -1421,8 +1410,7 @@
   std::vector<Suggestion> suggestions =
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, {ADDRESS_HOME_STREET_NAME, ADDRESS_HOME_STREET_ADDRESS},
-          /*last_targeted_fields=*/absl::nullopt,
-          AutofillType(ADDRESS_HOME_STREET_ADDRESS),
+          /*last_targeted_fields=*/absl::nullopt, ADDRESS_HOME_STREET_ADDRESS,
           /*trigger_field_max_length=*/0);
 
   EXPECT_THAT(suggestions,
@@ -1447,8 +1435,7 @@
       suggestion_generator()->CreateSuggestionsFromProfiles(
           {&profile}, /*field_types=*/{ADDRESS_HOME_LINE1},
           /*last_targeted_fields=*/
-          absl::optional<ServerFieldTypeSet>({NAME_FIRST}),
-          AutofillType(ADDRESS_HOME_LINE1),
+          absl::optional<ServerFieldTypeSet>({NAME_FIRST}), ADDRESS_HOME_LINE1,
           /*trigger_field_max_length=*/0);
 
   EXPECT_TRUE(base::ranges::any_of(suggestions[0].children, [](auto child) {
@@ -1475,7 +1462,7 @@
   // Expect that regular suggestions filter.
   EXPECT_EQ(suggestion_generator()
                 ->GetSuggestionsForProfiles(
-                    {NAME_FIRST}, triggering_field, AutofillType(NAME_FIRST),
+                    {NAME_FIRST}, triggering_field, NAME_FIRST,
                     /*last_targeted_fields=*/absl::nullopt,
                     AutofillSuggestionTriggerSource::kFormControlElementClicked)
                 .size(),
@@ -1483,7 +1470,7 @@
   // But manual fallback suggestions do not.
   EXPECT_EQ(suggestion_generator()
                 ->GetSuggestionsForProfiles(
-                    {NAME_FIRST}, triggering_field, AutofillType(NAME_FIRST),
+                    {NAME_FIRST}, triggering_field, NAME_FIRST,
                     /*last_targeted_fields=*/absl::nullopt,
                     AutofillSuggestionTriggerSource::
                         kManualFallbackForAutocompleteUnrecognized)
@@ -1726,8 +1713,8 @@
   bool with_offer;
   autofill_metrics::CardMetadataLoggingContext metadata_logging_context;
   auto suggestions = suggestion_generator()->GetSuggestionsForCreditCards(
-      FormFieldData(), AutofillType(CREDIT_CARD_NUMBER),
-      should_display_gpay_logo, with_offer, metadata_logging_context);
+      FormFieldData(), CREDIT_CARD_NUMBER, should_display_gpay_logo, with_offer,
+      metadata_logging_context);
 
   EXPECT_TRUE(with_offer);
   ASSERT_EQ(suggestions.size(), 3U);
@@ -1781,8 +1768,8 @@
     bool with_offer;
     autofill_metrics::CardMetadataLoggingContext metadata_logging_context;
     auto suggestions = suggestion_generator()->GetSuggestionsForCreditCards(
-        FormFieldData(), AutofillType(CREDIT_CARD_NUMBER),
-        should_display_gpay_logo, with_offer, metadata_logging_context);
+        FormFieldData(), CREDIT_CARD_NUMBER, should_display_gpay_logo,
+        with_offer, metadata_logging_context);
 
     EXPECT_EQ(suggestions.size(), 2U);
     EXPECT_TRUE(should_display_gpay_logo);
@@ -1806,8 +1793,8 @@
     bool with_offer;
     autofill_metrics::CardMetadataLoggingContext metadata_logging_context;
     auto suggestions = suggestion_generator()->GetSuggestionsForCreditCards(
-        FormFieldData(), AutofillType(CREDIT_CARD_NUMBER),
-        should_display_gpay_logo, with_offer, metadata_logging_context);
+        FormFieldData(), CREDIT_CARD_NUMBER, should_display_gpay_logo,
+        with_offer, metadata_logging_context);
 
     EXPECT_EQ(suggestions.size(), 2U);
     EXPECT_FALSE(should_display_gpay_logo);
@@ -1833,8 +1820,8 @@
     bool with_offer;
     autofill_metrics::CardMetadataLoggingContext metadata_logging_context;
     auto suggestions = suggestion_generator()->GetSuggestionsForCreditCards(
-        FormFieldData(), AutofillType(CREDIT_CARD_NUMBER),
-        should_display_gpay_logo, with_offer, metadata_logging_context);
+        FormFieldData(), CREDIT_CARD_NUMBER, should_display_gpay_logo,
+        with_offer, metadata_logging_context);
 
     EXPECT_EQ(suggestions.size(), 1U);
     EXPECT_TRUE(should_display_gpay_logo);
@@ -1848,8 +1835,8 @@
     bool with_offer;
     autofill_metrics::CardMetadataLoggingContext metadata_logging_context;
     auto suggestions = suggestion_generator()->GetSuggestionsForCreditCards(
-        FormFieldData(), AutofillType(CREDIT_CARD_NUMBER),
-        should_display_gpay_logo, with_offer, metadata_logging_context);
+        FormFieldData(), CREDIT_CARD_NUMBER, should_display_gpay_logo,
+        with_offer, metadata_logging_context);
 
     EXPECT_TRUE(suggestions.empty());
     EXPECT_TRUE(should_display_gpay_logo);
@@ -2179,7 +2166,7 @@
   // Name field suggestion for virtual cards.
   Suggestion virtual_card_name_field_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card, AutofillType(CREDIT_CARD_NAME_FULL),
+          server_card, CREDIT_CARD_NAME_FULL,
           /*virtual_card_option=*/true,
           /*card_linked_offer_available=*/false);
 
@@ -2245,7 +2232,7 @@
   // Card number field suggestion for virtual cards.
   Suggestion virtual_card_number_field_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card, AutofillType(CREDIT_CARD_NUMBER),
+          server_card, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/true,
           /*card_linked_offer_available=*/false);
 
@@ -2296,7 +2283,7 @@
   // Name field suggestion for non-virtual cards.
   Suggestion real_card_name_field_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card, AutofillType(CREDIT_CARD_NAME_FULL),
+          server_card, CREDIT_CARD_NAME_FULL,
           /*virtual_card_option=*/false,
           /*card_linked_offer_available=*/false);
 
@@ -2341,7 +2328,7 @@
   // Card number field suggestion for non-virtual cards.
   Suggestion real_card_number_field_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card, AutofillType(CREDIT_CARD_NUMBER),
+          server_card, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/false,
           /*card_linked_offer_available=*/false);
 
@@ -2388,7 +2375,7 @@
   autofill_metrics::CardMetadataLoggingContext metadata_logging_context;
   const std::vector<Suggestion> suggestions =
       suggestion_generator()->GetSuggestionsForCreditCards(
-          FormFieldData(), AutofillType(CREDIT_CARD_VERIFICATION_CODE),
+          FormFieldData(), CREDIT_CARD_VERIFICATION_CODE,
           should_display_gpay_logo, with_offer, metadata_logging_context);
 
   // Both local card and server card suggestion should be shown when CVC field
@@ -2413,7 +2400,7 @@
   autofill_metrics::CardMetadataLoggingContext metadata_logging_context;
   const std::vector<Suggestion> suggestions =
       suggestion_generator()->GetSuggestionsForCreditCards(
-          FormFieldData(), AutofillType(CREDIT_CARD_VERIFICATION_CODE),
+          FormFieldData(), CREDIT_CARD_VERIFICATION_CODE,
           should_display_gpay_logo, with_offer, metadata_logging_context);
 
   // Only 1 suggestion should be shown when CVC field is focused.
@@ -2437,7 +2424,7 @@
   autofill_metrics::CardMetadataLoggingContext metadata_logging_context;
   const std::vector<Suggestion> suggestions =
       suggestion_generator()->GetSuggestionsForCreditCards(
-          FormFieldData(), AutofillType(CREDIT_CARD_VERIFICATION_CODE),
+          FormFieldData(), CREDIT_CARD_VERIFICATION_CODE,
           should_display_gpay_logo, with_offer, metadata_logging_context);
 
   // Both FPAN and VCN suggestion should be shown when CVC field is focused.
@@ -2465,7 +2452,7 @@
   autofill_metrics::CardMetadataLoggingContext metadata_logging_context;
   const std::vector<Suggestion> suggestions =
       suggestion_generator()->GetSuggestionsForCreditCards(
-          FormFieldData(), AutofillType(CREDIT_CARD_VERIFICATION_CODE),
+          FormFieldData(), CREDIT_CARD_VERIFICATION_CODE,
           should_display_gpay_logo, with_offer, metadata_logging_context);
 
   // Both FPAN and VCN suggestion should be shown when CVC field is focused.
@@ -2511,7 +2498,7 @@
   // Name field suggestion.
   Suggestion card_name_field_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card, AutofillType(CREDIT_CARD_NAME_FULL),
+          server_card, CREDIT_CARD_NAME_FULL,
           /*virtual_card_option=*/false,
           /*card_linked_offer_available=*/false);
 
@@ -2524,7 +2511,7 @@
   // Card number field suggestion.
   Suggestion card_number_field_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card, AutofillType(CREDIT_CARD_NUMBER),
+          server_card, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/false,
           /*card_linked_offer_available=*/false);
 
@@ -2577,7 +2564,7 @@
 
   Suggestion virtual_card_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card, AutofillType(CREDIT_CARD_NUMBER),
+          server_card, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/true,
           /*card_linked_offer_available=*/false);
 
@@ -2591,7 +2578,7 @@
 
   Suggestion real_card_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card, AutofillType(CREDIT_CARD_NUMBER),
+          server_card, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/false,
           /*card_linked_offer_available=*/false);
 
@@ -2610,7 +2597,7 @@
 
   Suggestion real_card_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          local_card, AutofillType(CREDIT_CARD_NUMBER),
+          local_card, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/false,
           /*card_linked_offer_available=*/false);
 
@@ -2639,7 +2626,7 @@
 
   Suggestion virtual_card_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          local_card, AutofillType(CREDIT_CARD_NUMBER),
+          local_card, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/true,
           /*card_linked_offer_available=*/false);
 
@@ -2653,7 +2640,7 @@
 
   Suggestion real_card_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          local_card, AutofillType(CREDIT_CARD_NUMBER),
+          local_card, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/false,
           /*card_linked_offer_available=*/false);
 
@@ -2681,8 +2668,8 @@
     bool with_offer;
     autofill_metrics::CardMetadataLoggingContext metadata_logging_context;
     suggestion_generator()->GetSuggestionsForCreditCards(
-        FormFieldData(), AutofillType(CREDIT_CARD_NUMBER),
-        should_display_gpay_logo, with_offer, metadata_logging_context);
+        FormFieldData(), CREDIT_CARD_NUMBER, should_display_gpay_logo,
+        with_offer, metadata_logging_context);
 
     EXPECT_FALSE(metadata_logging_context.card_metadata_available);
     EXPECT_FALSE(metadata_logging_context.card_product_description_shown);
@@ -2711,8 +2698,8 @@
     bool with_offer;
     autofill_metrics::CardMetadataLoggingContext metadata_logging_context;
     suggestion_generator()->GetSuggestionsForCreditCards(
-        FormFieldData(), AutofillType(CREDIT_CARD_NUMBER),
-        should_display_gpay_logo, with_offer, metadata_logging_context);
+        FormFieldData(), CREDIT_CARD_NUMBER, should_display_gpay_logo,
+        with_offer, metadata_logging_context);
 
     EXPECT_TRUE(metadata_logging_context.card_metadata_available);
     EXPECT_EQ(metadata_logging_context.card_product_description_shown,
@@ -2745,7 +2732,7 @@
 
   Suggestion virtual_card_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card, AutofillType(CREDIT_CARD_NUMBER),
+          server_card, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/true,
           /*card_linked_offer_available=*/false);
 
@@ -2757,7 +2744,7 @@
 
   Suggestion real_card_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card, AutofillType(CREDIT_CARD_NUMBER),
+          server_card, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/false,
           /*card_linked_offer_available=*/false);
 
@@ -2815,7 +2802,7 @@
 
   Suggestion virtual_card_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card1, AutofillType(CREDIT_CARD_NUMBER),
+          server_card1, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/true,
           /*card_linked_offer_available=*/true);
 
@@ -2828,7 +2815,7 @@
 
   Suggestion real_card_suggestion =
       suggestion_generator()->CreateCreditCardSuggestion(
-          server_card1, AutofillType(CREDIT_CARD_NUMBER),
+          server_card1, CREDIT_CARD_NUMBER,
           /*virtual_card_option=*/false,
           /*card_linked_offer_available=*/true);
 
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc
index 228a069f..c6fc3a5 100644
--- a/components/autofill/core/browser/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -714,8 +714,8 @@
   DCHECK_EQ(FieldTypeGroup::kCreditCard, type.group());
 
   bool should_display_gpay_logo = false;
-  auto cards =
-      GetCreditCardSuggestions(field_data, type, should_display_gpay_logo);
+  auto cards = GetCreditCardSuggestions(field_data, type.GetStorableType(),
+                                        should_display_gpay_logo);
   DCHECK(!cards.empty());
   external_delegate_->OnSuggestionsReturned(
       field_data.global_id(), cards,
@@ -2858,7 +2858,7 @@
                 last_address_fields_to_fill_for_section
                     ? GetTargetServerFieldsForTypeAndLastTargetedFields(
                           *last_address_fields_to_fill_for_section,
-                          autofill_field.Type())
+                          autofill_field.Type().GetStorableType())
                     : kAllServerFieldTypes,
                 /*optional_type_groups_originally_filled=*/nullptr,
                 /*skip_unrecognized_autocomplete_fields=*/trigger_source !=
@@ -2875,13 +2875,13 @@
     }
   }
   return suggestion_generator_->GetSuggestionsForProfiles(
-      field_types, field, autofill_field.Type(),
+      field_types, field, autofill_field.Type().GetStorableType(),
       last_address_fields_to_fill_for_section, trigger_source);
 }
 
 std::vector<Suggestion> BrowserAutofillManager::GetCreditCardSuggestions(
     const FormFieldData& field,
-    const AutofillType& type,
+    ServerFieldType trigger_field_type,
     bool& should_display_gpay_logo) const {
   credit_card_form_event_logger_->OnDidPollSuggestions(
       field, signin_state_for_metrics_);
@@ -2890,7 +2890,7 @@
   bool with_offer = false;
   autofill_metrics::CardMetadataLoggingContext context;
   if (!IsInAutofillSuggestionsDisabledExperiment()) {
-    if ((type.GetStorableType() == CREDIT_CARD_STANDALONE_VERIFICATION_CODE) &&
+    if (trigger_field_type == CREDIT_CARD_STANDALONE_VERIFICATION_CODE &&
         !four_digit_combinations_in_dom_.empty()) {
       base::flat_map<std::string, VirtualCardUsageData::VirtualCardLastFour>
           virtual_card_guid_to_last_four_map =
@@ -2904,7 +2904,8 @@
       }
     } else {
       suggestions = suggestion_generator_->GetSuggestionsForCreditCards(
-          field, type, should_display_gpay_logo, with_offer, context);
+          field, trigger_field_type, should_display_gpay_logo, with_offer,
+          context);
     }
   }
 
@@ -3561,9 +3562,9 @@
 
   if (context->is_filling_credit_card) {
     // Credit cards suggestions don't depend the `trigger_source`.
-    *suggestions =
-        GetCreditCardSuggestions(field, context->focused_field->Type(),
-                                 context->should_display_gpay_logo);
+    *suggestions = GetCreditCardSuggestions(
+        field, context->focused_field->Type().GetStorableType(),
+        context->should_display_gpay_logo);
   } else {
     // Profile suggestions fill ac=unrecognized fields only when triggered
     // through manual fallbacks. As such, suggestion labels differ depending on
diff --git a/components/autofill/core/browser/browser_autofill_manager.h b/components/autofill/core/browser/browser_autofill_manager.h
index a985b31..0162a1e 100644
--- a/components/autofill/core/browser/browser_autofill_manager.h
+++ b/components/autofill/core/browser/browser_autofill_manager.h
@@ -65,7 +65,6 @@
 class AutofillClient;
 class AutofillSuggestionGenerator;
 class AutofillProfile;
-class AutofillType;
 class CreditCard;
 
 struct FormData;
@@ -564,13 +563,14 @@
       const AutofillField& autofill_field,
       AutofillSuggestionTriggerSource trigger_source) const;
 
-  // Returns a list of values from the stored credit cards that match |type| and
-  // the value of |field| and returns the labels of the matching credit cards.
-  // |should_display_gpay_logo| will be set to true if there is no credit card
-  // suggestions or all suggestions come from Payments server.
+  // Returns a list of values from the stored credit cards that match
+  // `trigger_field_type` and the value of `field` and returns the labels of the
+  // matching credit cards. `should_display_gpay_logo` will be set to true if
+  // there is no credit card suggestions or all suggestions come from Payments
+  // server.
   std::vector<Suggestion> GetCreditCardSuggestions(
       const FormFieldData& field,
-      const AutofillType& type,
+      ServerFieldType trigger_field_type,
       bool& should_display_gpay_logo) const;
 
   // Returns a mapping of credit card guid values to virtual card last fours for
diff --git a/components/global_media_controls/public/media_session_notification_item.cc b/components/global_media_controls/public/media_session_notification_item.cc
index d551802e..89dc38b 100644
--- a/components/global_media_controls/public/media_session_notification_item.cc
+++ b/components/global_media_controls/public/media_session_notification_item.cc
@@ -371,16 +371,20 @@
 }
 
 bool MediaSessionNotificationItem::ShouldShowNotification() const {
-  // We do not show the media notification if it is not controllable or it
-  // already has a presentation of another cast media notification.
+  // Hide the media notification if it is not controllable or the notification
+  // title is missing.
   if (!session_info_ || !session_info_->is_controllable ||
-      session_info_->has_presentation) {
+      session_metadata_.title.empty()) {
     return false;
   }
 
-  // If we do not have a title then we should hide the notification.
-  if (session_metadata_.title.empty())
+  // Hide the media notification if there exists a cast media notification item
+  // for the Cast presentation. However, show the media notification if the
+  // presentation is for a Remote Playback media source.
+  if (session_info_->has_presentation &&
+      !GetRemotePlaybackStarted(session_info_)) {
     return false;
+  }
 
   return true;
 }
diff --git a/components/global_media_controls/public/media_session_notification_item.h b/components/global_media_controls/public/media_session_notification_item.h
index fb98270..4d37a0f 100644
--- a/components/global_media_controls/public/media_session_notification_item.h
+++ b/components/global_media_controls/public/media_session_notification_item.h
@@ -153,6 +153,8 @@
                            GetSessionMetadata);
   FRIEND_TEST_ALL_PREFIXES(MediaSessionNotificationItemTest,
                            GetMediaSessionActions);
+  FRIEND_TEST_ALL_PREFIXES(MediaSessionNotificationItemTest,
+                           ShouldShowNotification);
 
   media_session::MediaMetadata GetSessionMetadata() const;
   base::flat_set<media_session::mojom::MediaSessionAction>
diff --git a/components/global_media_controls/public/media_session_notification_item_unittest.cc b/components/global_media_controls/public/media_session_notification_item_unittest.cc
index a24b0cc..e796a9ff 100644
--- a/components/global_media_controls/public/media_session_notification_item_unittest.cc
+++ b/components/global_media_controls/public/media_session_notification_item_unittest.cc
@@ -510,4 +510,35 @@
   EXPECT_EQ(source_id(), *item().GetSourceId());
 }
 
+TEST_F(MediaSessionNotificationItemTest, ShouldShowNotification) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(media::kMediaRemotingWithoutFullscreen);
+
+  media_session::MediaMetadata metadata;
+  metadata.title = u"title";
+  item().MediaSessionMetadataChanged(metadata);
+
+  // Hide uncontrollable sessions.
+  auto session_info = media_session::mojom::MediaSessionInfo::New();
+  item().MediaSessionInfoChanged(mojo::Clone(session_info));
+  EXPECT_FALSE(item().ShouldShowNotification());
+  session_info->is_controllable = true;
+  item().MediaSessionInfoChanged(mojo::Clone(session_info));
+  EXPECT_TRUE(item().ShouldShowNotification());
+
+  // Hide sessions with Cast presentation.
+  session_info->has_presentation = true;
+  item().MediaSessionInfoChanged(mojo::Clone(session_info));
+  EXPECT_FALSE(item().ShouldShowNotification());
+
+  // Show sessions with Remote Playback presentation.
+  session_info->remote_playback_metadata =
+      media_session::mojom::RemotePlaybackMetadata::New(
+          "video_codec", "audio_codec", /* remote_playback_disabled */ false,
+          /* remote_playback_started */ true, "device_friendly_name",
+          /* is_encrypted_media */ false);
+  item().MediaSessionInfoChanged(mojo::Clone(session_info));
+  EXPECT_TRUE(item().ShouldShowNotification());
+}
+
 }  // namespace global_media_controls
diff --git a/components/media_router/browser/presentation/presentation_service_delegate_impl.cc b/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
index 5aae3732..d49337b6 100644
--- a/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
+++ b/components/media_router/browser/presentation/presentation_service_delegate_impl.cc
@@ -735,6 +735,7 @@
 
 void PresentationServiceDelegateImpl::NotifyMediaRoutesChanged() {
   auto routes = GetMediaRoutes();
+
   for (auto& presentation_observer : presentation_observers_)
     presentation_observer.OnPresentationsChanged(!routes.empty());
 }
diff --git a/components/media_router/common/media_source.cc b/components/media_router/common/media_source.cc
index 1514fa3..b9cd52c8 100644
--- a/components/media_router/common/media_source.cc
+++ b/components/media_router/common/media_source.cc
@@ -213,4 +213,18 @@
   return id_.substr(0, length);
 }
 
+void MediaSource::AppendTabIdToRemotePlaybackUrlQuery(int tab_id) {
+  if (url_.is_empty()) {
+    return;
+  }
+
+  GURL::Replacements replacements;
+  std::string tab_id_query = base::StringPrintf("tab_id=%d", tab_id);
+  std::string new_query =
+      (url_.has_query() ? url_.query() + "&" : "") + tab_id_query;
+  replacements.SetQueryStr(new_query);
+  url_ = url_.ReplaceComponents(replacements);
+  id_ = url_.spec();
+}
+
 }  // namespace media_router
diff --git a/components/media_router/common/media_source.h b/components/media_router/common/media_source.h
index e6a26894..44db1070 100644
--- a/components/media_router/common/media_source.h
+++ b/components/media_router/common/media_source.h
@@ -155,6 +155,15 @@
   // Returns a shortened copy of the media source ID suitable for logging.
   std::string TruncateForLogging(size_t max_length) const;
 
+  // Append the "&tab_id=xxx" string to the presentation url. The `tab_id` is
+  // used for MediaDialogView to associate the local media session notification
+  // with a Reote Playback MediaRoute so that users can control Remote Playback
+  // session from GMC.
+  // TODO(crrev.com/c/1491212): remove the `tab_id` field from the MediaSource
+  // and use the MVC model in GMC to handle Remote Playback UI presentation
+  // logic.
+  void AppendTabIdToRemotePlaybackUrlQuery(int tab_id);
+
  private:
   MediaSource::Id id_;
   GURL url_;
diff --git a/components/safe_browsing/content/browser/ui_manager.cc b/components/safe_browsing/content/browser/ui_manager.cc
index 956d724..63ba7a9 100644
--- a/components/safe_browsing/content/browser/ui_manager.cc
+++ b/components/safe_browsing/content/browser/ui_manager.cc
@@ -24,6 +24,7 @@
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
+#include "content/public/browser/disallow_activation_reason.h"
 #include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/navigation_entry.h"
 #include "content/public/browser/notification_service.h"
@@ -124,16 +125,35 @@
 
   // Whether we have a FrameTreeNode id or a RenderFrameHost id depends on
   // whether SB was triggered for a frame navigation or a document's subresource
-  // load respectively. We consider both cases here.
+  // load respectively. We consider both cases here. Also, we need to cancel
+  // corresponding prerenders for both case.
   const content::GlobalRenderFrameHostId rfh_id(resource.render_process_id,
                                                 resource.render_frame_id);
   content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(rfh_id);
-  const bool is_prerender =
-      web_contents->IsPrerenderedFrame(resource.frame_tree_node_id) ||
-      (rfh && rfh->GetLifecycleState() ==
-                  content::RenderFrameHost::LifecycleState::kPrerendering);
 
-  if (is_prerender) {
+  // Handle subresource load in prerendered pages.
+  if (rfh && rfh->GetLifecycleState() ==
+                 content::RenderFrameHost::LifecycleState::kPrerendering) {
+    // Cancel prerenders directly when its subresource or its subframe’s
+    // subresource is unsafe.
+    bool is_inactive = rfh->IsInactiveAndDisallowActivation(
+        content::DisallowActivationReasonId::kSafeBrowsingUnsafeSubresource);
+    CHECK(is_inactive);
+
+    resource.DispatchCallback(FROM_HERE, false /*proceed*/,
+                              false /*showed_interstitial*/);
+    return;
+  }
+
+  // Handle main frame or its sub frame navigation in prerendered pages.
+  // TODO(crbug.com/1445438): For latter case, the cancellation of prerender is
+  // currently done by canceling them with BLOCKED_BY_CLIENT in loader
+  // throttle, because current implementation of Prerender cancels
+  // prerenders when the navigation of prerender's subframes (not only the
+  // main frame) are canceled with BLOCKED_BY_CLIENT, as the TODO comment
+  // below also mentions. We plan to change the cancellation way from using
+  // BLOCKED_BY_CLIENT as the subresource load case.
+  if (web_contents->IsPrerenderedFrame(resource.frame_tree_node_id)) {
     // TODO(mcnee): If we were to indicate that this does not show an
     // interstitial, the loader throttle would cancel with ERR_ABORTED to
     // suppress an error page, instead of blocking using ERR_BLOCKED_BY_CLIENT.
diff --git a/components/segmentation_platform/embedder/default_model/ios_module_ranker.cc b/components/segmentation_platform/embedder/default_model/ios_module_ranker.cc
index 40a0212b..087b28ad 100644
--- a/components/segmentation_platform/embedder/default_model/ios_module_ranker.cc
+++ b/components/segmentation_platform/embedder/default_model/ios_module_ranker.cc
@@ -222,6 +222,16 @@
         kEnumValueForParcelTracking.size()),
 };
 
+float TransformFreshness(float freshness_score, float freshness_threshold) {
+  float new_freshness_score = 0.0;
+  if (freshness_score >= 0.0 and freshness_score <= freshness_threshold) {
+    new_freshness_score = 1.0;
+  } else if (freshness_score == -1.0) {
+    new_freshness_score = 0.0;
+  }
+  return new_freshness_score;
+}
+
 }  // namespace
 
 // static
@@ -287,15 +297,60 @@
     return;
   }
 
-  // TODO(ritikagup) : Add logic.
+  // Most Visited Tiles score calculation.
+  float mvt_weights[3] = {3.0, -0.3, 1.5};
+  float mvt_engagement = inputs[6];
+  float mvt_impression = inputs[7];
+  float mvt_freshness = TransformFreshness(inputs[30], 1.0);
+  float mvt_score = mvt_weights[0] * mvt_engagement +
+                    mvt_weights[1] * mvt_impression +
+                    mvt_weights[2] * mvt_freshness;
+
+  // Shortcuts score calculation.
+  float shortcuts_weights[3] = {1.5, -1.0, 2.0};
+  float shortcuts_engagement = inputs[8];
+  float shortcuts_impression = inputs[9];
+  float shortcuts_freshness = TransformFreshness(inputs[31], 1.0);
+  float shortcuts_score = shortcuts_weights[0] * shortcuts_engagement +
+                          shortcuts_weights[1] * shortcuts_impression +
+                          shortcuts_weights[2] * shortcuts_freshness;
+
+  // Safety Check score calculation.
+  float safety_check_weights[3] = {4.0, -12.0, 6.0};
+  float safety_check_engagement = inputs[10];
+  float safety_check_impression = inputs[11];
+  float safety_check_freshness = TransformFreshness(inputs[32], 3.0);
+  float safety_check_score = safety_check_weights[0] * safety_check_engagement +
+                             safety_check_weights[1] * safety_check_impression +
+                             safety_check_weights[2] * safety_check_freshness;
+
+  // Tab Resumption score calculation.
+  float tab_resumption_weights[3] = {1.5, -0.5, 0.0};
+  float tab_resumption_engagement = inputs[24];
+  float tab_resumption_impression = inputs[25];
+  float tab_resumption_freshness = TransformFreshness(inputs[33], 1.0);
+  float tab_resumption_score =
+      tab_resumption_weights[0] * tab_resumption_engagement +
+      tab_resumption_weights[1] * tab_resumption_impression +
+      tab_resumption_weights[2] * tab_resumption_freshness;
+
+  // Parcel Tracking score calculation.
+  float parcel_tracking_weights[3] = {6.0, -6.0, 6.0};
+  float parcel_tracking_engagement = inputs[28];
+  float parcel_tracking_impression = inputs[29];
+  float parcel_tracking_freshness = TransformFreshness(inputs[34], 3.0);
+  float parcel_tracking_score =
+      parcel_tracking_weights[0] * parcel_tracking_engagement +
+      parcel_tracking_weights[1] * parcel_tracking_impression +
+      parcel_tracking_weights[2] * parcel_tracking_freshness;
 
   ModelProvider::Response response(kIosModuleLabels.size(), 0);
   // Default ranking
-  response[0] = 5;  // Most Visited Tiles
-  response[1] = 4;  // Shortcuts
-  response[2] = 3;  // Safety Check
-  response[3] = 2;  // Tab resumption
-  response[4] = 1;  // Parcel Tracking
+  response[0] = mvt_score;              // Most Visited Tiles
+  response[1] = shortcuts_score;        // Shortcuts
+  response[2] = safety_check_score;     // Safety Check
+  response[3] = tab_resumption_score;   // Tab resumption
+  response[4] = parcel_tracking_score;  // Parcel Tracking
 
   base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
       FROM_HERE, base::BindOnce(std::move(callback), response));
diff --git a/components/segmentation_platform/embedder/default_model/ios_module_ranker_unittest.cc b/components/segmentation_platform/embedder/default_model/ios_module_ranker_unittest.cc
index 439a51f9..674d954 100644
--- a/components/segmentation_platform/embedder/default_model/ios_module_ranker_unittest.cc
+++ b/components/segmentation_platform/embedder/default_model/ios_module_ranker_unittest.cc
@@ -24,16 +24,71 @@
   ExpectInitAndFetchModel();
 }
 
-TEST_F(IosModuleRankerTest, ExecuteModelWithInput) {
+TEST_F(IosModuleRankerTest, ExecuteModelWithInputForDefaultOrder) {
   ExpectInitAndFetchModel();
   ASSERT_TRUE(fetched_metadata_);
 
   EXPECT_FALSE(ExecuteWithInput(/*inputs=*/{}));
 
   std::vector<float> input(35, 0);
-
+  input[30] = -1;  // mvt_freshness
+  input[31] = -1;  // shortcuts_freshness
+  input[32] = -1;  // safety_check_freshness
+  input[33] = -1;  // tab_resumption_freshness
+  input[34] = -1;  // parcel_tracking_freshness
   ExpectClassifierResults(input, {kMostVisitedTiles, kShortcuts, kSafetyCheck,
                                   kTabResumption, kParcelTracking});
 }
 
+TEST_F(IosModuleRankerTest, ExecuteModelWithInputForAllModules) {
+  ExpectInitAndFetchModel();
+  ASSERT_TRUE(fetched_metadata_);
+
+  EXPECT_FALSE(ExecuteWithInput(/*inputs=*/{}));
+
+  std::vector<float> input(35, 0);
+  input[6] = 3.0;    // mvt_engagement
+  input[7] = 11.0;   // mvt_impression
+  input[8] = 4.0;    // shortcuts_engagement
+  input[9] = 2.0;    // shortcuts_impression
+  input[10] = 1.0;   // safety_check_engagement
+  input[11] = 1.0;   // safety_check_impression
+  input[24] = 3.0;   // tab_resumption_engagement
+  input[25] = 11.0;  // tab_resumption_impression
+  input[28] = 3.0;   // parcel_tracking_engagement
+  input[29] = 11.0;  // parcel_tracking_impression
+
+  input[30] = -1;  // mvt_freshness
+  input[31] = -1;  // shortcuts_freshness
+  input[32] = -1;  // safety_check_freshness
+  input[33] = -1;  // tab_resumption_freshness
+  input[34] = -1;  // parcel_tracking_freshness
+  ExpectClassifierResults(input, {kMostVisitedTiles, kShortcuts, kTabResumption,
+                                  kSafetyCheck, kParcelTracking});
+}
+
+TEST_F(IosModuleRankerTest, ExecuteModelWithFreshnessInputOnly) {
+  ExpectInitAndFetchModel();
+  ASSERT_TRUE(fetched_metadata_);
+
+  EXPECT_FALSE(ExecuteWithInput(/*inputs=*/{}));
+
+  std::vector<float> input(35, 0);
+  input[30] = 0;  // mvt_freshness
+  input[31] = 0;  // shortcuts_freshness
+  input[32] = 0;  // safety_check_freshness
+  input[33] = 0;  // tab_resumption_freshness
+  input[34] = 0;  // parcel_tracking_freshness
+  ExpectClassifierResults(input, {kSafetyCheck, kParcelTracking, kShortcuts,
+                                  kMostVisitedTiles, kTabResumption});
+
+  input[30] = 1;  // mvt_freshness
+  input[31] = 1;  // shortcuts_freshness
+  input[32] = 2;  // safety_check_freshness
+  input[33] = 2;  // tab_resumption_freshness
+  input[34] = 1;  // parcel_tracking_freshness
+  ExpectClassifierResults(input, {kSafetyCheck, kParcelTracking, kShortcuts,
+                                  kMostVisitedTiles, kTabResumption});
+}
+
 }  // namespace segmentation_platform
diff --git a/components/viz/service/display_embedder/skia_render_copy_results.cc b/components/viz/service/display_embedder/skia_render_copy_results.cc
index a0071459..a0af150c 100644
--- a/components/viz/service/display_embedder/skia_render_copy_results.cc
+++ b/components/viz/service/display_embedder/skia_render_copy_results.cc
@@ -344,7 +344,8 @@
         mailbox_holders,
     const gfx::ColorSpace& color_space,
     bool is_multiplane)
-    : request_(std::move(request)),
+    : impl_on_gpu_(impl_on_gpu),
+      request_(std::move(request)),
       result_rect_(result_rect),
       mailbox_holders_(mailbox_holders),
       color_space_(color_space),
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate.cc b/content/browser/attribution_reporting/attribution_storage_delegate.cc
index 7b6ab87..76527c0 100644
--- a/content/browser/attribution_reporting/attribution_storage_delegate.cc
+++ b/content/browser/attribution_reporting/attribution_storage_delegate.cc
@@ -114,15 +114,6 @@
   return config_.destination_rate_limit;
 }
 
-uint64_t AttributionStorageDelegate::SanitizeTriggerData(
-    uint64_t trigger_data,
-    SourceType source_type) const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  const uint64_t cardinality = TriggerDataCardinality(source_type);
-  return trigger_data % cardinality;
-}
-
 uint64_t AttributionStorageDelegate::TriggerDataCardinality(
     SourceType source_type) const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate.h b/content/browser/attribution_reporting/attribution_storage_delegate.h
index 07174c6..8c6963b 100644
--- a/content/browser/attribution_reporting/attribution_storage_delegate.h
+++ b/content/browser/attribution_reporting/attribution_storage_delegate.h
@@ -198,9 +198,8 @@
 
   AttributionConfig::DestinationRateLimit GetDestinationRateLimit() const;
 
-  // Sanitizes `trigger_data` according to the data limits for `source_type`.
-  uint64_t SanitizeTriggerData(uint64_t trigger_data,
-                               attribution_reporting::mojom::SourceType) const;
+  uint64_t TriggerDataCardinality(
+      attribution_reporting::mojom::SourceType) const;
 
   // Returns zero or more null aggregatable reports for the given trigger.
   virtual std::vector<NullAggregatableReport> GetNullAggregatableReports(
@@ -209,9 +208,6 @@
       absl::optional<base::Time> attributed_source_time) const = 0;
 
  protected:
-  uint64_t TriggerDataCardinality(
-      attribution_reporting::mojom::SourceType) const;
-
   AttributionConfig config_ GUARDED_BY_CONTEXT(sequence_checker_);
 
   SEQUENCE_CHECKER(sequence_checker_);
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc b/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc
index 646a7dc..ac3b4db 100644
--- a/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc
+++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc
@@ -414,27 +414,6 @@
   }
 }
 
-TEST(AttributionStorageDelegateImplTest, SanitizeTriggerData) {
-  const struct {
-    SourceType source_type;
-    uint64_t trigger_data;
-    uint64_t expected;
-  } kTestCases[] = {
-      {SourceType::kNavigation, 7, 7},  //
-      {SourceType::kNavigation, 8, 0},  //
-      {SourceType::kNavigation, 9, 1},  //
-      {SourceType::kEvent, 1, 1},       //
-      {SourceType::kEvent, 2, 0},       //
-      {SourceType::kEvent, 3, 1},       //
-  };
-
-  for (const auto& test_case : kTestCases) {
-    EXPECT_EQ(test_case.expected,
-              AttributionStorageDelegateImpl().SanitizeTriggerData(
-                  test_case.trigger_data, test_case.source_type));
-  }
-}
-
 class AttributionStorageDelegateImplTestFeatureConfigured
     : public testing::Test {
  public:
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc
index 69ea12cea..7ad77175 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.cc
+++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -909,8 +909,8 @@
   if (attribution_logic == StoredSource::AttributionLogic::kFalsely) {
     for (const auto& fake_report : *randomized_response_data.response()) {
       DCHECK_EQ(fake_report.trigger_data,
-                delegate_->SanitizeTriggerData(fake_report.trigger_data,
-                                               common_info.source_type()));
+                SanitizeTriggerData(fake_report.trigger_data,
+                                    common_info.source_type()));
 
       DCHECK_LT(source_time, fake_report.trigger_time);
       DCHECK_LT(fake_report.trigger_time, fake_report.report_time);
@@ -1557,7 +1557,7 @@
       /*initial_report_time=*/report_time, delegate_->NewReportID(),
       /*failed_send_attempts=*/0,
       AttributionReport::EventLevelData(
-          delegate_->SanitizeTriggerData(event_trigger->data, source_type),
+          SanitizeTriggerData(event_trigger->data, source_type),
           event_trigger->priority, source));
 
   dedup_key = event_trigger->dedup_key;
@@ -3307,4 +3307,11 @@
   delegate_ = std::move(delegate);
 }
 
+uint64_t AttributionStorageSql::SanitizeTriggerData(uint64_t trigger_data,
+                                                    SourceType source_type) {
+  uint64_t cardinality = delegate_->TriggerDataCardinality(source_type);
+  CHECK_NE(cardinality, 0u);
+  return trigger_data % cardinality;
+}
+
 }  // namespace content
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.h b/content/browser/attribution_reporting/attribution_storage_sql.h
index e7639b6..4570416f 100644
--- a/content/browser/attribution_reporting/attribution_storage_sql.h
+++ b/content/browser/attribution_reporting/attribution_storage_sql.h
@@ -364,6 +364,10 @@
                                      const AttributionTrigger&)
       VALID_CONTEXT_REQUIRED(sequence_checker_);
 
+  uint64_t SanitizeTriggerData(uint64_t trigger_data,
+                               attribution_reporting::mojom::SourceType)
+      VALID_CONTEXT_REQUIRED(sequence_checker_);
+
   // If set, database errors will not crash the client when run in debug mode.
   bool ignore_errors_for_testing_ = false;
 
diff --git a/content/browser/devtools/protocol/input_handler.cc b/content/browser/devtools/protocol/input_handler.cc
index 7ff8a05..2526788 100644
--- a/content/browser/devtools/protocol/input_handler.cc
+++ b/content/browser/devtools/protocol/input_handler.cc
@@ -259,19 +259,23 @@
 
 std::string ValidatePointerEventProperties(double force,
                                            double tangential_pressure,
-                                           int tilt_x,
-                                           int tilt_y,
+                                           double tilt_x,
+                                           double tilt_y,
                                            int twist) {
-  if (force < 0 || force > 1)
-    return "'force' should be in the range of  [0,1]";
-  if (tangential_pressure < -1 || tangential_pressure > 1)
-    return "'tangential_pressure' should be in the range of  [-1,1]";
-  if (tilt_x < -90 || tilt_x > 90)
-    return "'tilt_x' should be in the range of  [-90,90]";
-  if (tilt_y < -90 || tilt_y > 90)
-    return "'tilt_y' should be in the range of  [-90,90]";
+  if (force < 0.0f || force > 1.0f) {
+    return "'force' should be in the range of [0,1]";
+  }
+  if (tangential_pressure < -1.0f || tangential_pressure > 1.0f) {
+    return "'tangential_pressure' should be in the range of [-1,1]";
+  }
+  if (tilt_x < -90.0f || tilt_x > 90.0f) {
+    return "'tilt_x' should be in the range of [-90,90]";
+  }
+  if (tilt_y < -90.0f || tilt_y > 90.0f) {
+    return "'tilt_y' should be in the range of [-90,90]";
+  }
   if (twist < 0 || twist > 359)
-    return "'twist' should be in the range of  [0,359]";
+    return "'twist' should be in the range of [0,359]";
   return "";
 }
 
@@ -381,8 +385,8 @@
                     Maybe<int> click_count,
                     Maybe<double> force,
                     Maybe<double> tangential_pressure,
-                    Maybe<int> tilt_x,
-                    Maybe<int> tilt_y,
+                    Maybe<double> tilt_x,
+                    Maybe<double> tilt_y,
                     Maybe<int> twist,
                     Maybe<double> delta_x,
                     Maybe<double> delta_y,
@@ -499,16 +503,16 @@
       with_id++;
     }
     std::string message = ValidatePointerEventProperties(
-        point->GetForce(1.0), point->GetTangentialPressure(0),
-        point->GetTiltX(0), point->GetTiltY(0), point->GetTwist(0));
+        point->GetForce(1.0f), point->GetTangentialPressure(0.0f),
+        point->GetTiltX(0.0f), point->GetTiltY(0.0f), point->GetTwist(0));
     if (!message.empty()) {
       return base::unexpected(Response::InvalidParams(message));
     }
     points[id].id = id;
-    points[id].radius_x = point->GetRadiusX(1.0);
-    points[id].radius_y = point->GetRadiusY(1.0);
-    points[id].rotation_angle = point->GetRotationAngle(0.0);
-    points[id].force = point->GetForce(1.0);
+    points[id].radius_x = point->GetRadiusX(1.0f);
+    points[id].radius_y = point->GetRadiusY(1.0f);
+    points[id].rotation_angle = point->GetRotationAngle(0.0f);
+    points[id].force = point->GetForce(1.0f);
     points[id].pointer_type = blink::WebPointerProperties::PointerType::kTouch;
     points[id].SetPositionInWidget(
         CssPixelsToPointF(point->GetX(), point->GetY(), scale_factor));
@@ -1283,8 +1287,8 @@
     Maybe<int> click_count,
     Maybe<double> force,
     Maybe<double> tangential_pressure,
-    Maybe<int> tilt_x,
-    Maybe<int> tilt_y,
+    Maybe<double> tilt_x,
+    Maybe<double> tilt_y,
     Maybe<int> twist,
     Maybe<double> delta_x,
     Maybe<double> delta_y,
@@ -1757,8 +1761,8 @@
     SyntheticPointerActionParams action_params =
         PrepareSyntheticPointerActionParams(
             action_type, id, point->GetX(), point->GetY(), event_modifiers,
-            point->GetRadiusX(1.0), point->GetRadiusY(1.0),
-            point->GetRotationAngle(0.0), point->GetForce(1.0));
+            point->GetRadiusX(1.0f), point->GetRadiusY(1.0f),
+            point->GetRotationAngle(0.0f), point->GetForce(1.0f));
     param_list.push_back(action_params);
     original = gfx::PointF(point->GetX(), point->GetY());
     current_pointer_ids.insert(id);
diff --git a/content/browser/devtools/protocol/input_handler.h b/content/browser/devtools/protocol/input_handler.h
index bed985c..4d65b96 100644
--- a/content/browser/devtools/protocol/input_handler.h
+++ b/content/browser/devtools/protocol/input_handler.h
@@ -114,8 +114,8 @@
       Maybe<int> click_count,
       Maybe<double> force,
       Maybe<double> tangential_pressure,
-      Maybe<int> tilt_x,
-      Maybe<int> tilt_y,
+      Maybe<double> tilt_x,
+      Maybe<double> tilt_y,
       Maybe<int> twist,
       Maybe<double> delta_x,
       Maybe<double> delta_y,
diff --git a/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl.cc b/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl.cc
index 3de42632..2afbe3e 100644
--- a/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl.cc
+++ b/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl.cc
@@ -9,7 +9,8 @@
 #include "base/time/time.h"
 #include "base/types/pass_key.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "storage/browser/file_system/file_system_util.h"
+#include "storage/browser/file_system/file_observers.h"
+#include "storage/browser/file_system/task_runner_bound_observer_list.h"
 #include "storage/browser/quota/quota_client_type.h"
 #include "storage/browser/quota/quota_manager_proxy.h"
 
@@ -120,4 +121,13 @@
   std::move(callback).Run(capacity_delta);
 }
 
+void FileSystemAccessCapacityAllocationHostImpl::OnContentsModified() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  if (const storage::ChangeObserverList* change_observers =
+          manager_->context()->GetChangeObservers(url_.type())) {
+    change_observers->Notify(&storage::FileChangeObserver::OnModifyFile, url_);
+  }
+}
+
 }  // namespace content
diff --git a/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl.h b/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl.h
index a04d3ff4..d134015 100644
--- a/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl.h
+++ b/content/browser/file_system_access/file_system_access_capacity_allocation_host_impl.h
@@ -62,6 +62,7 @@
   // blink::mojom::FileSystemAccessCapacityAllocationHost:
   void RequestCapacityChange(int64_t capacity_delta,
                              RequestCapacityChangeCallback callback) override;
+  void OnContentsModified() override;
 
   // Returns the the total space allocated for the file whose capacity is
   // managed through this host. Initially, this is the file's size.
diff --git a/content/browser/file_system_access/file_system_access_observer_browsertest.cc b/content/browser/file_system_access/file_system_access_observer_browsertest.cc
index 8f3ee88..57c80d73 100644
--- a/content/browser/file_system_access/file_system_access_observer_browsertest.cc
+++ b/content/browser/file_system_access/file_system_access_observer_browsertest.cc
@@ -255,6 +255,115 @@
                      "observer.disconnect(); })()"));
 }
 
+IN_PROC_BROWSER_TEST_F(FileSystemAccessObserveWithFlagBrowserTest,
+                       ObserveSyncAccessHandleWrite) {
+  const GURL& test_url =
+      embedded_test_server()->GetURL("/run_async_code_on_worker.html");
+  NavigateToURLBlockUntilNavigationsComplete(shell(), test_url,
+                                             /*number_of_navigations=*/1);
+  const std::string script =
+      // clang-format off
+      R"(runOnWorkerAndWaitForResult(`)"
+         CREATE_PROMISE_AND_RESOLVERS
+         START_OBSERVING_FILE(TestFileSystemType::kBucket)
+         "const accessHandle = await file.createSyncAccessHandle();"
+         "const writeBuffer = new TextEncoder().encode('contents');"
+         "accessHandle.write(writeBuffer);"
+         SET_CHANGE_TIMEOUT
+         "accessHandle.close();"
+      R"(`);)";
+  // clang-format on
+  auto records = EvalJs(shell(), script).ExtractList();
+  ASSERT_THAT(records.GetList(), testing::Not(testing::IsEmpty()));
+  EXPECT_THAT(*records.GetList().front().GetDict().FindString("type"),
+              testing::StrEq("modified"));
+}
+
+IN_PROC_BROWSER_TEST_F(FileSystemAccessObserveWithFlagBrowserTest,
+                       ObserveSyncAccessHandleMultipleWrites) {
+  const GURL& test_url =
+      embedded_test_server()->GetURL("/run_async_code_on_worker.html");
+  NavigateToURLBlockUntilNavigationsComplete(shell(), test_url,
+                                             /*number_of_navigations=*/1);
+  const std::string script =
+      // clang-format off
+      R"(runOnWorkerAndWaitForResult(`)"
+         CREATE_PROMISE_AND_RESOLVERS
+         "let timesCallbackFired = 0;"
+         "let serializedRecords = [];"
+         "async function onChange(records, observer) {"
+         "  timesCallbackFired++;"
+         "  for (const record of records) {"
+         "    let info = {};"
+         "    info.type = record.type;"
+         "    serializedRecords.push(info);"
+         "  }"
+         "  if (timesCallbackFired >= 3) {"  // Expect three events.
+         "    promiseResolve(serializedRecords);"
+         "  }"
+         "}"
+         START_OBSERVING_FILE(TestFileSystemType::kBucket)
+         "const accessHandle = await file.createSyncAccessHandle();"
+         "const writeBuffer = new TextEncoder().encode('contents');"
+         "accessHandle.write(writeBuffer);"
+         "accessHandle.write(writeBuffer);"
+         "accessHandle.write(writeBuffer);"  // Write thrice.
+         SET_CHANGE_TIMEOUT
+         "accessHandle.close();"
+      R"(`);)";
+  // clang-format on
+  auto records = EvalJs(shell(), script).ExtractList();
+  ASSERT_THAT(records.GetList(), testing::SizeIs(3));
+  EXPECT_THAT(*records.GetList().front().GetDict().FindString("type"),
+              testing::StrEq("modified"));
+}
+
+IN_PROC_BROWSER_TEST_F(FileSystemAccessObserveWithFlagBrowserTest,
+                       ObserveSyncAccessHandleTruncate) {
+  const GURL& test_url =
+      embedded_test_server()->GetURL("/run_async_code_on_worker.html");
+  NavigateToURLBlockUntilNavigationsComplete(shell(), test_url,
+                                             /*number_of_navigations=*/1);
+  const std::string script =
+      // clang-format off
+      R"(runOnWorkerAndWaitForResult(`)"
+         CREATE_PROMISE_AND_RESOLVERS
+         START_OBSERVING_FILE(TestFileSystemType::kBucket)
+         "const accessHandle = await file.createSyncAccessHandle();"
+         "accessHandle.truncate(20);"
+         SET_CHANGE_TIMEOUT
+         "accessHandle.close();"
+      R"(`);)";
+  // clang-format on
+  auto records = EvalJs(shell(), script).ExtractList();
+  ASSERT_THAT(records.GetList(), testing::Not(testing::IsEmpty()));
+  EXPECT_THAT(*records.GetList().front().GetDict().FindString("type"),
+              testing::StrEq("modified"));
+}
+
+IN_PROC_BROWSER_TEST_F(FileSystemAccessObserveWithFlagBrowserTest,
+                       DoNotObserveSyncAccessHandleWithNoChanges) {
+  const GURL& test_url =
+      embedded_test_server()->GetURL("/run_async_code_on_worker.html");
+  NavigateToURLBlockUntilNavigationsComplete(shell(), test_url,
+                                             /*number_of_navigations=*/1);
+  const std::string script =
+      // clang-format off
+      R"(runOnWorkerAndWaitForResult(`)"
+         CREATE_PROMISE_AND_RESOLVERS
+         START_OBSERVING_FILE(TestFileSystemType::kBucket)
+         "const accessHandle = await file.createSyncAccessHandle();"
+         "const readBuffer = new Uint8Array(24);"
+         "accessHandle.read(readBuffer);"
+         "accessHandle.flush();"
+         "accessHandle.close();"
+         SET_CHANGE_TIMEOUT
+      R"(`);)";
+  // clang-format on
+  auto records = EvalJs(shell(), script).ExtractList();
+  EXPECT_THAT(records.GetList(), testing::IsEmpty());
+}
+
 class FileSystemAccessObserverBrowserTest
     : public FileSystemAccessObserverBrowserTestBase,
       public testing::WithParamInterface<TestFileSystemType> {
diff --git a/content/browser/preloading/prefetch/no_vary_search_helper.cc b/content/browser/preloading/prefetch/no_vary_search_helper.cc
index e58b0df..6477600 100644
--- a/content/browser/preloading/prefetch/no_vary_search_helper.cc
+++ b/content/browser/preloading/prefetch/no_vary_search_helper.cc
@@ -4,92 +4,18 @@
 
 #include "content/browser/preloading/prefetch/no_vary_search_helper.h"
 
-#include <map>
 #include <utility>
-#include <vector>
 
-#include "base/feature_list.h"
-#include "content/browser/preloading/prefetch/prefetch_container.h"
 #include "content/public/browser/render_frame_host.h"
-#include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/no_vary_search_header_parser.h"
-#include "services/network/public/mojom/no_vary_search.mojom.h"
 #include "services/network/public/mojom/url_response_head.mojom.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/mojom/devtools/console_message.mojom.h"
-#include "url/gurl.h"
 #include "url/origin.h"
 
 namespace content {
 
 namespace no_vary_search {
 
-namespace {
-
-// Indicates whether `IterateCandidates` should continue or finish after
-// `callback` is called.
-enum class IterateCandidateResult { kContinue, kFinish };
-
-// Call `callback` on every `PrefetchContainer`s that can match with `url` via
-// No-Vary-Search:
-// - Has a URL with the same non-ref/query part as `url`,
-// - Has `NoVarySearchData`, AND
-// - `AreEquivalent()` is true or `check_are_equivalent` is false.
-// Note that if `PrefetchContainer` doesn't have a valid `NoVarySearchData`, it
-// is ignored even if its URL is exactly the same as `url`.
-void IterateCandidates(
-    const GURL& url,
-    const std::map<GURL, base::WeakPtr<PrefetchContainer>>& prefetches,
-    base::RepeatingCallback<
-        IterateCandidateResult(base::WeakPtr<PrefetchContainer>)> callback,
-    bool check_are_equivalent = true) {
-  DCHECK(
-      base::FeatureList::IsEnabled(network::features::kPrefetchNoVarySearch));
-
-  GURL::Replacements replacements;
-  replacements.ClearRef();
-  replacements.ClearQuery();
-  GURL url_with_no_query = url.ReplaceComponents(replacements);
-
-  // `std::map<GURL, ...>` is sorted by lexicographical string order of
-  // the normalized URLs (`GURL::spec_`, i.e. `possibly_invalid_spec()`).
-  // For a URL like `https://example.com/index.html?query#ref`, the
-  // `lower_bound` call will get the first URL starting with
-  // `https://example.com/index.html` (if any), and iterating by `++it` will get
-  // the URLs starting with `https://example.com/index.html` in lexicographical
-  // order until the URL without the `https://example.com/index.html` prefix is
-  // encountered.
-  for (auto it = prefetches.lower_bound(url_with_no_query);
-       it != prefetches.end() && it->first.possibly_invalid_spec().starts_with(
-                                     url_with_no_query.possibly_invalid_spec());
-       ++it) {
-    if (!it->second) {
-      continue;
-    }
-
-    if (!it->second->GetNoVarySearchData()) {
-      continue;
-    }
-    // The URLs starting with `https://example.com/index.html` don't necessarily
-    // have the same non-ref/query parts. See
-    // `NoVarySearchHelperTest.DoNotPrefixMatch` unit tests for concrete
-    // examples.
-    if (it->first.ReplaceComponents(replacements) != url_with_no_query) {
-      continue;
-    }
-    if (check_are_equivalent &&
-        !it->second->GetNoVarySearchData()->AreEquivalent(url, it->first)) {
-      continue;
-    }
-
-    if (callback.Run(it->second) == IterateCandidateResult::kFinish) {
-      break;
-    }
-  }
-}
-
-}  // namespace
-
 // static
 net::HttpNoVarySearchData ParseHttpNoVarySearchDataFromMojom(
     const network::mojom::NoVarySearchPtr& no_vary_search_ptr) {
@@ -149,47 +75,6 @@
   rfh.AddMessageToConsole(error_level, error_message.value());
 }
 
-base::WeakPtr<PrefetchContainer> MatchUrl(
-    const GURL& url,
-    const std::map<GURL, base::WeakPtr<PrefetchContainer>>& prefetches) {
-  base::WeakPtr<PrefetchContainer> result = nullptr;
-  IterateCandidates(
-      url, prefetches,
-      base::BindRepeating(
-          [](base::WeakPtr<PrefetchContainer>* result,
-             base::WeakPtr<PrefetchContainer> prefetch_container) {
-            // TODO(crbug.com/1449360): Revisit which PrefetchContainer to
-            // return when there are multiple candidates. Currently we return
-            // the first PrefetchContainer in URL lexicographic order.
-            *result = std::move(prefetch_container);
-            return IterateCandidateResult::kFinish;
-          },
-          base::Unretained(&result)));
-  return result;
-}
-
-std::vector<std::pair<GURL, base::WeakPtr<PrefetchContainer>>>
-GetAllForUrlWithoutRefAndQueryForTesting(
-    const GURL& url,
-    const std::map<GURL, base::WeakPtr<PrefetchContainer>>& prefetches) {
-  std::vector<std::pair<GURL, base::WeakPtr<PrefetchContainer>>> result;
-
-  IterateCandidates(
-      url, prefetches,
-      base::BindRepeating(
-          [](std::vector<std::pair<GURL, base::WeakPtr<PrefetchContainer>>>*
-                 result,
-             base::WeakPtr<PrefetchContainer> prefetch_container) {
-            result->emplace_back(prefetch_container->GetURL(),
-                                 prefetch_container);
-            return IterateCandidateResult::kContinue;
-          },
-          base::Unretained(&result)),
-      false /* check_are_equivalent */
-  );
-  return result;
-}
-
 }  // namespace no_vary_search
 
 }  // namespace content
diff --git a/content/browser/preloading/prefetch/no_vary_search_helper.h b/content/browser/preloading/prefetch/no_vary_search_helper.h
index 7962dcf..1ed09ec 100644
--- a/content/browser/preloading/prefetch/no_vary_search_helper.h
+++ b/content/browser/preloading/prefetch/no_vary_search_helper.h
@@ -9,19 +9,20 @@
 #include <memory>
 #include <vector>
 
+#include "base/feature_list.h"
+#include "content/browser/preloading/prefetch/prefetch_container.h"
 #include "content/common/content_export.h"
 #include "net/http/http_no_vary_search_data.h"
+#include "services/network/public/cpp/features.h"
 #include "services/network/public/mojom/no_vary_search.mojom.h"
-#include "third_party/abseil-cpp/absl/types/optional.h"
+#include "url/gurl.h"
 
-class GURL;
 namespace network::mojom {
 class URLResponseHead;
 }  // namespace network::mojom
 
 namespace content {
 
-class PrefetchContainer;
 class RenderFrameHost;
 
 // Helpers to keep track of prefetched URLs that have No-Vary-Search
@@ -39,11 +40,113 @@
 CONTENT_EXPORT void SetNoVarySearchData(
     base::WeakPtr<PrefetchContainer> prefetch_container);
 
+// Indicates whether `IterateCandidates` should continue or finish after
+// `callback` is called.
+enum class IterateCandidateResult { kContinue, kFinish };
+
+// Call `callback` on every `PrefetchContainer`s that can match with `url` via
+// No-Vary-Search:
+// - Has a URL with the same non-ref/query part as `url`,
+// - Has `NoVarySearchData`, AND
+// - `AreEquivalent()` is true or `check_are_equivalent` is false.
+// Note that if `PrefetchContainer` doesn't have a valid `NoVarySearchData`, it
+// is ignored even if its URL is exactly the same as `url`.
+inline void IterateCandidates(
+    const GURL& url,
+    const std::map<GURL, base::WeakPtr<PrefetchContainer>>& prefetches,
+    base::RepeatingCallback<
+        IterateCandidateResult(base::WeakPtr<PrefetchContainer>)> callback,
+    bool check_are_equivalent = true) {
+  DCHECK(
+      base::FeatureList::IsEnabled(network::features::kPrefetchNoVarySearch));
+
+  GURL::Replacements replacements;
+  replacements.ClearRef();
+  replacements.ClearQuery();
+  GURL url_with_no_query = url.ReplaceComponents(replacements);
+
+  // `std::map<GURL, ...>` is sorted by lexicographical string order of
+  // the normalized URLs (`GURL::spec_`, i.e. `possibly_invalid_spec()`).
+  // For a URL like `https://example.com/index.html?query#ref`, the
+  // `lower_bound` call will get the first URL starting with
+  // `https://example.com/index.html` (if any), and iterating by `++it` will get
+  // the URLs starting with `https://example.com/index.html` in lexicographical
+  // order until the URL without the `https://example.com/index.html` prefix is
+  // encountered.
+  for (auto it = prefetches.lower_bound(url_with_no_query);
+       it != prefetches.end() && it->first.possibly_invalid_spec().starts_with(
+                                     url_with_no_query.possibly_invalid_spec());
+       ++it) {
+    if (!it->second) {
+      continue;
+    }
+
+    if (!it->second->GetNoVarySearchData()) {
+      continue;
+    }
+    // The URLs starting with `https://example.com/index.html` don't necessarily
+    // have the same non-ref/query parts. See
+    // `NoVarySearchHelperTest.DoNotPrefixMatch` unit tests for concrete
+    // examples.
+    if (it->first.ReplaceComponents(replacements) != url_with_no_query) {
+      continue;
+    }
+    if (check_are_equivalent &&
+        !it->second->GetNoVarySearchData()->AreEquivalent(url, it->first)) {
+      continue;
+    }
+
+    if (callback.Run(it->second) == IterateCandidateResult::kFinish) {
+      break;
+    }
+  }
+}
+
 // Get a PrefetchContainer from `prefetches` that can serve `url` according to
 // No-Vary-Search information.
-CONTENT_EXPORT base::WeakPtr<PrefetchContainer> MatchUrl(
+inline base::WeakPtr<PrefetchContainer> MatchUrl(
     const GURL& url,
-    const std::map<GURL, base::WeakPtr<PrefetchContainer>>& prefetches);
+    const std::map<GURL, base::WeakPtr<PrefetchContainer>>& prefetches) {
+  base::WeakPtr<PrefetchContainer> result = nullptr;
+  IterateCandidates(
+      url, prefetches,
+      base::BindRepeating(
+          [](base::WeakPtr<PrefetchContainer>* result,
+             base::WeakPtr<PrefetchContainer> prefetch_container) {
+            // TODO(crbug.com/1449360): Revisit which PrefetchContainer to
+            // return when there are multiple candidates. Currently we return
+            // the first PrefetchContainer in URL lexicographic order.
+            *result = std::move(prefetch_container);
+            return IterateCandidateResult::kFinish;
+          },
+          base::Unretained(&result)));
+  return result;
+}
+
+// Return the (URL,PrefetchContainer) pairs for a specific Url without
+// query and reference. Allow as input urls with query and/or reference
+// for ease of use (remove query/reference during lookup).
+inline std::vector<std::pair<GURL, base::WeakPtr<PrefetchContainer>>>
+GetAllForUrlWithoutRefAndQueryForTesting(
+    const GURL& url,
+    const std::map<GURL, base::WeakPtr<PrefetchContainer>>& prefetches) {
+  std::vector<std::pair<GURL, base::WeakPtr<PrefetchContainer>>> result;
+
+  IterateCandidates(
+      url, prefetches,
+      base::BindRepeating(
+          [](std::vector<std::pair<GURL, base::WeakPtr<PrefetchContainer>>>*
+                 result,
+             base::WeakPtr<PrefetchContainer> prefetch_container) {
+            result->emplace_back(prefetch_container->GetURL(),
+                                 prefetch_container);
+            return IterateCandidateResult::kContinue;
+          },
+          base::Unretained(&result)),
+      false /* check_are_equivalent */
+  );
+  return result;
+}
 
 // Send No-Vary-Search parsing errors in DevTools console.
 // The method will test if there are errors/warning that the developer
@@ -52,14 +155,6 @@
                               const network::mojom::URLResponseHead& head,
                               RenderFrameHost& rfh);
 
-// Return the (URL,PrefetchContainer) pairs for a specific Url without
-// query and reference. Allow as input urls with query and/or reference
-// for ease of use (remove query/reference during lookup).
-CONTENT_EXPORT std::vector<std::pair<GURL, base::WeakPtr<PrefetchContainer>>>
-GetAllForUrlWithoutRefAndQueryForTesting(
-    const GURL& url,
-    const std::map<GURL, base::WeakPtr<PrefetchContainer>>& prefetches);
-
 // Parse No-Vary-Search from mojom structure received from network service.
 net::HttpNoVarySearchData ParseHttpNoVarySearchDataFromMojom(
     const network::mojom::NoVarySearchPtr& no_vary_search_ptr);
diff --git a/content/browser/preloading/prefetch/prefetch_container.cc b/content/browser/preloading/prefetch/prefetch_container.cc
index c8493d897..122e6c66 100644
--- a/content/browser/preloading/prefetch/prefetch_container.cc
+++ b/content/browser/preloading/prefetch/prefetch_container.cc
@@ -1173,7 +1173,14 @@
 std::ostream& operator<<(std::ostream& ostream,
                          const PrefetchContainer& prefetch_container) {
   return ostream << "PrefetchContainer[" << &prefetch_container
-                 << ", URL=" << prefetch_container.GetURL() << "]";
+                 << ", Key=" << prefetch_container.GetPrefetchContainerKey()
+                 << "]";
+}
+
+std::ostream& operator<<(std::ostream& ostream,
+                         const PrefetchContainer::Key& prefetch_key) {
+  return ostream << "(" << prefetch_key.first << ", " << prefetch_key.second
+                 << ")";
 }
 
 CONTENT_EXPORT std::ostream& operator<<(
diff --git a/content/browser/preloading/prefetch/prefetch_container.h b/content/browser/preloading/prefetch/prefetch_container.h
index c375ada..2b4cf14 100644
--- a/content/browser/preloading/prefetch/prefetch_container.h
+++ b/content/browser/preloading/prefetch/prefetch_container.h
@@ -595,6 +595,10 @@
 
 CONTENT_EXPORT std::ostream& operator<<(
     std::ostream& ostream,
+    const PrefetchContainer::Key& prefetch_key);
+
+CONTENT_EXPORT std::ostream& operator<<(
+    std::ostream& ostream,
     PrefetchContainer::ServableState servable_state);
 
 }  // namespace content
diff --git a/content/browser/preloading/prefetch/prefetch_service.cc b/content/browser/preloading/prefetch/prefetch_service.cc
index 261ec059..ce261ec2 100644
--- a/content/browser/preloading/prefetch/prefetch_service.cc
+++ b/content/browser/preloading/prefetch/prefetch_service.cc
@@ -1505,8 +1505,7 @@
 std::vector<PrefetchContainer*> PrefetchService::FindPrefetchContainerToServe(
     const PrefetchContainer::Key& key) {
   std::vector<PrefetchContainer*> matches;
-  DVLOG(1) << "PrefetchService::FindPrefetchContainerToServe("
-           << "(" << key.first << ", " << key.second << "))";
+  DVLOG(1) << "PrefetchService::FindPrefetchContainerToServe(" << key << ")";
   // Search for an exact match first. If one is found and not deleted, produce
   // it.
   auto it = prefetches_ready_to_serve_.find(key);
diff --git a/content/browser/preloading/prerender/prerender_browsertest.cc b/content/browser/preloading/prerender/prerender_browsertest.cc
index dee7059..bd1765fe 100644
--- a/content/browser/preloading/prerender/prerender_browsertest.cc
+++ b/content/browser/preloading/prerender/prerender_browsertest.cc
@@ -1369,35 +1369,6 @@
       PrerenderFinalStatus::kNavigationBadHttpStatus);
 }
 
-// Tests that prerender will be cancelled if client blocks resource loading.
-IN_PROC_BROWSER_TEST_F(PrerenderBrowserTest, ResourceLoadIsBlocked) {
-  GURL initial_url = GetUrl("/empty.html");
-  GURL prerendering_url = GetUrl("/page_with_image.html");
-  GURL image_resource_url(GetUrl("/blank.jpg"));
-
-  // Intercept resource loading and block it.
-  std::unique_ptr<URLLoaderInterceptor> url_interceptor =
-      URLLoaderInterceptor::SetupRequestFailForURL(image_resource_url,
-                                                   net::ERR_BLOCKED_BY_CLIENT);
-
-  // Navigate to an initial page.
-  ASSERT_TRUE(NavigateToURL(shell(), initial_url));
-  test::PrerenderHostObserver host_observer(*web_contents_impl(),
-                                            prerendering_url);
-
-  // Start a prerender and it should fail due to kResourceLoadBlockedByClient.
-  AddPrerenderAsync(prerendering_url);
-  host_observer.WaitForDestroyed();
-
-  ExpectFinalStatusForSpeculationRule(
-      PrerenderFinalStatus::kResourceLoadBlockedByClient);
-
-  histogram_tester().ExpectUniqueSample(
-      "Prerender.Experimental.ResourceLoadingBlockedByClientByType."
-      "SpeculationRule",
-      network::mojom::RequestDestination::kImage, 1);
-}
-
 namespace {
 
 // Tests that an iframe navigation whose response has either 204 or 205 doesn't
diff --git a/content/browser/preloading/prerender/prerender_host_registry.cc b/content/browser/preloading/prerender/prerender_host_registry.cc
index 6add2e4f..00132723 100644
--- a/content/browser/preloading/prerender/prerender_host_registry.cc
+++ b/content/browser/preloading/prerender/prerender_host_registry.cc
@@ -1439,36 +1439,6 @@
   }
 }
 
-void PrerenderHostRegistry::ResourceLoadComplete(
-    RenderFrameHost* render_frame_host,
-    const GlobalRequestID& request_id,
-    const blink::mojom::ResourceLoadInfo& resource_load_info) {
-  CHECK(render_frame_host);
-
-  if (render_frame_host->GetLifecycleState() !=
-      RenderFrameHost::LifecycleState::kPrerendering) {
-    return;
-  }
-
-  // This function only handles ERR_BLOCKED_BY_CLIENT error for now.
-  if (resource_load_info.net_error != net::Error::ERR_BLOCKED_BY_CLIENT) {
-    return;
-  }
-
-  // Cancel the corresponding prerender if the resource load is blocked.
-  for (auto& [host_id, host] : prerender_host_by_frame_tree_node_id_) {
-    if (&render_frame_host->GetPage() !=
-        &host->GetPrerenderedMainFrameHost()->GetPage()) {
-      continue;
-    }
-    RecordBlockedByClientResourceType(resource_load_info.request_destination,
-                                      host->trigger_type(),
-                                      host->embedder_histogram_suffix());
-    CancelHost(host_id, PrerenderFinalStatus::kResourceLoadBlockedByClient);
-    break;
-  }
-}
-
 void PrerenderHostRegistry::PrimaryMainFrameRenderProcessGone(
     base::TerminationStatus status) {
   CancelAllHosts(
diff --git a/content/browser/preloading/prerender/prerender_host_registry.h b/content/browser/preloading/prerender/prerender_host_registry.h
index 5c5a5280..e801a80 100644
--- a/content/browser/preloading/prerender/prerender_host_registry.h
+++ b/content/browser/preloading/prerender/prerender_host_registry.h
@@ -255,10 +255,6 @@
   void DidStartNavigation(NavigationHandle* navigation_handle) override;
   void DidFinishNavigation(NavigationHandle* navigation_handle) override;
   void OnVisibilityChanged(Visibility visibility) override;
-  void ResourceLoadComplete(
-      RenderFrameHost* render_frame_host,
-      const GlobalRequestID& request_id,
-      const blink::mojom::ResourceLoadInfo& resource_load_info) override;
   void PrimaryMainFrameRenderProcessGone(
       base::TerminationStatus status) override;
 
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
index 644feb9..ec90ece 100644
--- a/content/browser/service_worker/service_worker_version.cc
+++ b/content/browser/service_worker/service_worker_version.cc
@@ -2324,6 +2324,8 @@
 
   params->ukm_source_id = ukm_source_id_;
 
+  params->storage_key = key_;
+
   // policy_container_host could be null for registration restored from old DB
   if (policy_container_host_) {
     params->policy_container =
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc
index fdba85d..5a2967c 100644
--- a/content/browser/web_contents/web_contents_view_aura.cc
+++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -774,9 +774,13 @@
     drop_data->file_system_files = file_system_files;
 
   if (data.GetPickledData(ui::ClipboardFormatType::WebCustomDataType(),
-                          &pickle))
-    ui::ReadCustomDataIntoMap(pickle.data(), pickle.size(),
-                              &drop_data->custom_data);
+                          &pickle)) {
+    if (absl::optional<std::unordered_map<std::u16string, std::u16string>>
+            maybe_custom_data = ui::ReadCustomDataIntoMap(pickle);
+        maybe_custom_data) {
+      drop_data->custom_data = std::move(*maybe_custom_data);
+    }
+  }
 }
 
 void WebContentsViewAura::EndDrag(
diff --git a/content/browser/web_contents/web_drag_dest_mac.mm b/content/browser/web_contents/web_drag_dest_mac.mm
index a48f079..f0d5f3d 100644
--- a/content/browser/web_contents/web_drag_dest_mac.mm
+++ b/content/browser/web_contents/web_drag_dest_mac.mm
@@ -7,6 +7,7 @@
 #include <AppKit/AppKit.h>
 #import <Carbon/Carbon.h>
 
+#include "base/containers/span.h"
 #include "base/memory/raw_ptr.h"
 #include "base/ranges/algorithm.h"
 #include "base/strings/sys_string_conversions.h"
@@ -466,8 +467,13 @@
   // Get custom MIME data.
   if ([types containsObject:ui::kUTTypeChromiumWebCustomData]) {
     NSData* customData = [pboard dataForType:ui::kUTTypeChromiumWebCustomData];
-    ui::ReadCustomDataIntoMap(customData.bytes, customData.length,
-                              &drop_data.custom_data);
+    if (absl::optional<std::unordered_map<std::u16string, std::u16string>>
+            maybe_custom_data = ui::ReadCustomDataIntoMap(
+                base::span(reinterpret_cast<const uint8_t*>([customData bytes]),
+                           [customData length]));
+        maybe_custom_data) {
+      drop_data.custom_data = std::move(*maybe_custom_data);
+    }
   }
 
   return drop_data;
diff --git a/content/public/browser/disallow_activation_reason.h b/content/public/browser/disallow_activation_reason.h
index a6e8de8..6600d760 100644
--- a/content/public/browser/disallow_activation_reason.h
+++ b/content/public/browser/disallow_activation_reason.h
@@ -59,6 +59,7 @@
   kIndexedDBEvent = 35,
   kIndexedDBTransactionIsAcquiringLocks = 36,
   kIndexedDBTransactionIsBlockingOthers = 37,
+  kSafeBrowsingUnsafeSubresource = 38,
   // New entries go above here. New entries should be added to
   // tools/metrics/histograms/enums.xml .
   kMinEmbedderDisallowActivationReason = 2 << 16,
diff --git a/content/renderer/accessibility/ax_tree_snapshotter_impl.cc b/content/renderer/accessibility/ax_tree_snapshotter_impl.cc
index 224539f8..5266fa6 100644
--- a/content/renderer/accessibility/ax_tree_snapshotter_impl.cc
+++ b/content/renderer/accessibility/ax_tree_snapshotter_impl.cc
@@ -35,6 +35,10 @@
 AXTreeSnapshotterImpl::AXTreeSnapshotterImpl(RenderFrameImpl* render_frame,
                                              ui::AXMode ax_mode)
     : render_frame_(render_frame) {
+  // Do not generate inline textboxes, which are expensive to create and just
+  // present extra noise to snapshot consumers.
+  ax_mode.set_mode(ui::AXMode::kInlineTextBoxes, false);
+
   DCHECK(render_frame->GetWebFrame());
   blink::WebDocument document_ = render_frame->GetWebFrame()->GetDocument();
   context_ = std::make_unique<WebAXContext>(document_, ax_mode);
diff --git a/content/renderer/accessibility/render_accessibility_impl.cc b/content/renderer/accessibility/render_accessibility_impl.cc
index fdb7354..a8ffdb8c 100644
--- a/content/renderer/accessibility/render_accessibility_impl.cc
+++ b/content/renderer/accessibility/render_accessibility_impl.cc
@@ -246,18 +246,6 @@
   SetAccessibilityCrashKey(mode);
 
   // Initialize features based on the accessibility mode.
-#if !BUILDFLAG(IS_ANDROID)
-  // Inline text boxes can be enabled globally on all except Android.
-  // On Android they can be requested for just a specific node.
-  WebView* web_view = render_frame_->GetWebView();
-  DCHECK(web_view);
-  WebSettings* settings = web_view->GetSettings();
-  DCHECK(settings);
-  // TODO(accessibility) Remove inline text box setting and just use the AXMode.
-  bool use_inline_textboxes = mode.has_mode(ui::AXMode::kInlineTextBoxes);
-  settings->SetInlineTextBoxAccessibilityEnabled(use_inline_textboxes);
-#endif  // !BUILDFLAG(IS_ANDROID)
-
   StartOrStopLabelingImages(old_mode, mode);
 
   if (ax_context_) {
diff --git a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc
index 90c4771..d8a7aaea 100644
--- a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc
+++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc
@@ -108,7 +108,8 @@
       std::move(params->subresource_loader_factories),
       std::move(params->subresource_loader_updater),
       params->script_url_to_skip_throttling, initiator_thread_task_runner_,
-      params->service_worker_route_id, cors_exempt_header_list_);
+      params->service_worker_route_id, cors_exempt_header_list_,
+      params->storage_key);
   // Record UMA to indicate StartWorker is received on renderer.
   StartWorkerHistogramEnum metric =
       params->is_installed ? StartWorkerHistogramEnum::RECEIVED_ON_INSTALLED
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc
index 2e7a0f12..1a0ee01 100644
--- a/content/renderer/service_worker/service_worker_context_client.cc
+++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -39,6 +39,7 @@
 #include "services/network/public/cpp/wrapper_shared_url_loader_factory.h"
 #include "third_party/blink/public/common/messaging/message_port_channel.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
+#include "third_party/blink/public/common/storage_key/storage_key.h"
 #include "third_party/blink/public/mojom/blob/blob.mojom.h"
 #include "third_party/blink/public/mojom/browser_interface_broker.mojom.h"
 #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom.h"
@@ -120,7 +121,8 @@
     const GURL& script_url_to_skip_throttling,
     scoped_refptr<base::SingleThreadTaskRunner> initiator_thread_task_runner,
     int32_t service_worker_route_id,
-    const std::vector<std::string>& cors_exempt_header_list)
+    const std::vector<std::string>& cors_exempt_header_list,
+    const blink::StorageKey& storage_key)
     : service_worker_version_id_(service_worker_version_id),
       service_worker_scope_(service_worker_scope),
       script_url_(script_url),
@@ -139,7 +141,8 @@
       owner_(owner),
       start_timing_(std::move(start_timing)),
       service_worker_route_id_(service_worker_route_id),
-      cors_exempt_header_list_(cors_exempt_header_list) {
+      cors_exempt_header_list_(cors_exempt_header_list),
+      storage_key_(storage_key) {
   DCHECK(initiator_thread_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(owner_);
   DCHECK(subresource_loaders);
@@ -447,7 +450,7 @@
           ->CreateWebSocketHandshakeThrottleProvider(),
       std::move(preference_watcher_receiver_),
       std::move(pending_subresource_loader_updater_),
-      web_cors_exempt_header_list);
+      web_cors_exempt_header_list, storage_key_.IsThirdPartyContext());
 }
 
 void ServiceWorkerContextClient::OnNavigationPreloadResponse(
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h
index 8b3953d..d71a89f 100644
--- a/content/renderer/service_worker/service_worker_context_client.h
+++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -27,6 +27,7 @@
 #include "services/service_manager/public/cpp/binder_registry.h"
 #include "services/service_manager/public/mojom/interface_provider.mojom.h"
 #include "third_party/blink/public/common/service_worker/service_worker_status_code.h"
+#include "third_party/blink/public/common/storage_key/storage_key.h"
 #include "third_party/blink/public/mojom/background_fetch/background_fetch.mojom-forward.h"
 #include "third_party/blink/public/mojom/payments/payment_app.mojom-forward.h"
 #include "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom-forward.h"
@@ -117,7 +118,8 @@
       const GURL& script_url_to_skip_throttling,
       scoped_refptr<base::SingleThreadTaskRunner> initiator_thread_task_runner,
       int32_t service_worker_route_id,
-      const std::vector<std::string>& cors_exempt_header_list);
+      const std::vector<std::string>& cors_exempt_header_list,
+      const blink::StorageKey& storage_key);
 
   ServiceWorkerContextClient(const ServiceWorkerContextClient&) = delete;
   ServiceWorkerContextClient& operator=(const ServiceWorkerContextClient&) =
@@ -303,6 +305,8 @@
   std::vector<std::string> cors_exempt_header_list_;
 
   base::TimeTicks top_level_script_loading_start_time_ = base::TimeTicks::Now();
+
+  blink::StorageKey storage_key_;
 };
 
 }  // namespace content
diff --git a/content/test/data/accessibility/html/input-time-with-popup-open-expected-blink.txt b/content/test/data/accessibility/html/input-time-with-popup-open-expected-blink.txt
index 82321a78..ab85855 100644
--- a/content/test/data/accessibility/html/input-time-with-popup-open-expected-blink.txt
+++ b/content/test/data/accessibility/html/input-time-with-popup-open-expected-blink.txt
@@ -37,293 +37,437 @@
 ++++++++++++++++++++listBox name='Hours' activedescendantId=listBoxOption
 ++++++++++++++++++++++listBoxOption name='01' selected=true
 ++++++++++++++++++++++++staticText name='01'
+++++++++++++++++++++++++++inlineTextBox name='01'
 ++++++++++++++++++++++listBoxOption name='02' selected=false
 ++++++++++++++++++++++++staticText name='02'
+++++++++++++++++++++++++++inlineTextBox name='02'
 ++++++++++++++++++++++listBoxOption name='03' selected=false
 ++++++++++++++++++++++++staticText name='03'
+++++++++++++++++++++++++++inlineTextBox name='03'
 ++++++++++++++++++++++listBoxOption name='04' selected=false
 ++++++++++++++++++++++++staticText name='04'
+++++++++++++++++++++++++++inlineTextBox name='04'
 ++++++++++++++++++++++listBoxOption name='05' selected=false
 ++++++++++++++++++++++++staticText name='05'
+++++++++++++++++++++++++++inlineTextBox name='05'
 ++++++++++++++++++++++listBoxOption name='06' selected=false
 ++++++++++++++++++++++++staticText name='06'
+++++++++++++++++++++++++++inlineTextBox name='06'
 ++++++++++++++++++++++listBoxOption name='07' selected=false
 ++++++++++++++++++++++++staticText name='07'
+++++++++++++++++++++++++++inlineTextBox name='07'
 ++++++++++++++++++++++listBoxOption name='08' selected=false
 ++++++++++++++++++++++++staticText name='08'
+++++++++++++++++++++++++++inlineTextBox name='08'
 ++++++++++++++++++++++listBoxOption name='09' selected=false
 ++++++++++++++++++++++++staticText name='09'
+++++++++++++++++++++++++++inlineTextBox name='09'
 ++++++++++++++++++++++listBoxOption name='10' selected=false
 ++++++++++++++++++++++++staticText name='10'
+++++++++++++++++++++++++++inlineTextBox name='10'
 ++++++++++++++++++++++listBoxOption name='11' selected=false
 ++++++++++++++++++++++++staticText name='11'
+++++++++++++++++++++++++++inlineTextBox name='11'
 ++++++++++++++++++++++listBoxOption name='12' selected=false
 ++++++++++++++++++++++++staticText name='12'
+++++++++++++++++++++++++++inlineTextBox name='12'
 ++++++++++++++++++++listBox name='Minutes' activedescendantId=listBoxOption
 ++++++++++++++++++++++listBoxOption name='01' selected=false
 ++++++++++++++++++++++++staticText name='01'
+++++++++++++++++++++++++++inlineTextBox name='01'
 ++++++++++++++++++++++listBoxOption name='02' selected=false
 ++++++++++++++++++++++++staticText name='02'
+++++++++++++++++++++++++++inlineTextBox name='02'
 ++++++++++++++++++++++listBoxOption name='03' selected=false
 ++++++++++++++++++++++++staticText name='03'
+++++++++++++++++++++++++++inlineTextBox name='03'
 ++++++++++++++++++++++listBoxOption name='04' selected=false
 ++++++++++++++++++++++++staticText name='04'
+++++++++++++++++++++++++++inlineTextBox name='04'
 ++++++++++++++++++++++listBoxOption name='05' selected=false
 ++++++++++++++++++++++++staticText name='05'
+++++++++++++++++++++++++++inlineTextBox name='05'
 ++++++++++++++++++++++listBoxOption name='06' selected=false
 ++++++++++++++++++++++++staticText name='06'
+++++++++++++++++++++++++++inlineTextBox name='06'
 ++++++++++++++++++++++listBoxOption name='07' selected=false
 ++++++++++++++++++++++++staticText name='07'
+++++++++++++++++++++++++++inlineTextBox name='07'
 ++++++++++++++++++++++listBoxOption name='08' selected=false
 ++++++++++++++++++++++++staticText name='08'
+++++++++++++++++++++++++++inlineTextBox name='08'
 ++++++++++++++++++++++listBoxOption name='09' selected=false
 ++++++++++++++++++++++++staticText name='09'
+++++++++++++++++++++++++++inlineTextBox name='09'
 ++++++++++++++++++++++listBoxOption name='10' selected=false
 ++++++++++++++++++++++++staticText name='10'
+++++++++++++++++++++++++++inlineTextBox name='10'
 ++++++++++++++++++++++listBoxOption name='11' selected=false
 ++++++++++++++++++++++++staticText name='11'
+++++++++++++++++++++++++++inlineTextBox name='11'
 ++++++++++++++++++++++listBoxOption name='12' selected=false
 ++++++++++++++++++++++++staticText name='12'
+++++++++++++++++++++++++++inlineTextBox name='12'
 ++++++++++++++++++++++listBoxOption name='13' selected=false
 ++++++++++++++++++++++++staticText name='13'
+++++++++++++++++++++++++++inlineTextBox name='13'
 ++++++++++++++++++++++listBoxOption name='14' selected=false
 ++++++++++++++++++++++++staticText name='14'
+++++++++++++++++++++++++++inlineTextBox name='14'
 ++++++++++++++++++++++listBoxOption name='15' selected=false
 ++++++++++++++++++++++++staticText name='15'
+++++++++++++++++++++++++++inlineTextBox name='15'
 ++++++++++++++++++++++listBoxOption name='16' selected=false
 ++++++++++++++++++++++++staticText name='16'
+++++++++++++++++++++++++++inlineTextBox name='16'
 ++++++++++++++++++++++listBoxOption name='17' selected=false
 ++++++++++++++++++++++++staticText name='17'
+++++++++++++++++++++++++++inlineTextBox name='17'
 ++++++++++++++++++++++listBoxOption name='18' selected=false
 ++++++++++++++++++++++++staticText name='18'
+++++++++++++++++++++++++++inlineTextBox name='18'
 ++++++++++++++++++++++listBoxOption name='19' selected=false
 ++++++++++++++++++++++++staticText name='19'
+++++++++++++++++++++++++++inlineTextBox name='19'
 ++++++++++++++++++++++listBoxOption name='20' selected=false
 ++++++++++++++++++++++++staticText name='20'
+++++++++++++++++++++++++++inlineTextBox name='20'
 ++++++++++++++++++++++listBoxOption name='21' selected=false
 ++++++++++++++++++++++++staticText name='21'
+++++++++++++++++++++++++++inlineTextBox name='21'
 ++++++++++++++++++++++listBoxOption name='22' selected=false
 ++++++++++++++++++++++++staticText name='22'
+++++++++++++++++++++++++++inlineTextBox name='22'
 ++++++++++++++++++++++listBoxOption name='23' selected=false
 ++++++++++++++++++++++++staticText name='23'
+++++++++++++++++++++++++++inlineTextBox name='23'
 ++++++++++++++++++++++listBoxOption name='24' selected=false
 ++++++++++++++++++++++++staticText name='24'
+++++++++++++++++++++++++++inlineTextBox name='24'
 ++++++++++++++++++++++listBoxOption name='25' selected=false
 ++++++++++++++++++++++++staticText name='25'
+++++++++++++++++++++++++++inlineTextBox name='25'
 ++++++++++++++++++++++listBoxOption name='26' selected=false
 ++++++++++++++++++++++++staticText name='26'
+++++++++++++++++++++++++++inlineTextBox name='26'
 ++++++++++++++++++++++listBoxOption name='27' selected=false
 ++++++++++++++++++++++++staticText name='27'
+++++++++++++++++++++++++++inlineTextBox name='27'
 ++++++++++++++++++++++listBoxOption name='28' selected=false
 ++++++++++++++++++++++++staticText name='28'
+++++++++++++++++++++++++++inlineTextBox name='28'
 ++++++++++++++++++++++listBoxOption name='29' selected=false
 ++++++++++++++++++++++++staticText name='29'
+++++++++++++++++++++++++++inlineTextBox name='29'
 ++++++++++++++++++++++listBoxOption name='30' selected=false
 ++++++++++++++++++++++++staticText name='30'
+++++++++++++++++++++++++++inlineTextBox name='30'
 ++++++++++++++++++++++listBoxOption name='31' selected=false
 ++++++++++++++++++++++++staticText name='31'
+++++++++++++++++++++++++++inlineTextBox name='31'
 ++++++++++++++++++++++listBoxOption name='32' selected=false
 ++++++++++++++++++++++++staticText name='32'
+++++++++++++++++++++++++++inlineTextBox name='32'
 ++++++++++++++++++++++listBoxOption name='33' selected=false
 ++++++++++++++++++++++++staticText name='33'
+++++++++++++++++++++++++++inlineTextBox name='33'
 ++++++++++++++++++++++listBoxOption name='34' selected=false
 ++++++++++++++++++++++++staticText name='34'
+++++++++++++++++++++++++++inlineTextBox name='34'
 ++++++++++++++++++++++listBoxOption name='35' selected=false
 ++++++++++++++++++++++++staticText name='35'
+++++++++++++++++++++++++++inlineTextBox name='35'
 ++++++++++++++++++++++listBoxOption name='36' selected=false
 ++++++++++++++++++++++++staticText name='36'
+++++++++++++++++++++++++++inlineTextBox name='36'
 ++++++++++++++++++++++listBoxOption name='37' selected=false
 ++++++++++++++++++++++++staticText name='37'
+++++++++++++++++++++++++++inlineTextBox name='37'
 ++++++++++++++++++++++listBoxOption name='38' selected=false
 ++++++++++++++++++++++++staticText name='38'
+++++++++++++++++++++++++++inlineTextBox name='38'
 ++++++++++++++++++++++listBoxOption name='39' selected=false
 ++++++++++++++++++++++++staticText name='39'
+++++++++++++++++++++++++++inlineTextBox name='39'
 ++++++++++++++++++++++listBoxOption name='40' selected=false
 ++++++++++++++++++++++++staticText name='40'
+++++++++++++++++++++++++++inlineTextBox name='40'
 ++++++++++++++++++++++listBoxOption name='41' selected=false
 ++++++++++++++++++++++++staticText name='41'
+++++++++++++++++++++++++++inlineTextBox name='41'
 ++++++++++++++++++++++listBoxOption name='42' selected=false
 ++++++++++++++++++++++++staticText name='42'
+++++++++++++++++++++++++++inlineTextBox name='42'
 ++++++++++++++++++++++listBoxOption name='43' selected=false
 ++++++++++++++++++++++++staticText name='43'
+++++++++++++++++++++++++++inlineTextBox name='43'
 ++++++++++++++++++++++listBoxOption name='44' selected=false
 ++++++++++++++++++++++++staticText name='44'
+++++++++++++++++++++++++++inlineTextBox name='44'
 ++++++++++++++++++++++listBoxOption name='45' selected=false
 ++++++++++++++++++++++++staticText name='45'
+++++++++++++++++++++++++++inlineTextBox name='45'
 ++++++++++++++++++++++listBoxOption name='46' selected=false
 ++++++++++++++++++++++++staticText name='46'
+++++++++++++++++++++++++++inlineTextBox name='46'
 ++++++++++++++++++++++listBoxOption name='47' selected=false
 ++++++++++++++++++++++++staticText name='47'
+++++++++++++++++++++++++++inlineTextBox name='47'
 ++++++++++++++++++++++listBoxOption name='48' selected=false
 ++++++++++++++++++++++++staticText name='48'
+++++++++++++++++++++++++++inlineTextBox name='48'
 ++++++++++++++++++++++listBoxOption name='49' selected=false
 ++++++++++++++++++++++++staticText name='49'
+++++++++++++++++++++++++++inlineTextBox name='49'
 ++++++++++++++++++++++listBoxOption name='50' selected=true
 ++++++++++++++++++++++++staticText name='50'
+++++++++++++++++++++++++++inlineTextBox name='50'
 ++++++++++++++++++++++listBoxOption name='51' selected=false
 ++++++++++++++++++++++++staticText name='51'
+++++++++++++++++++++++++++inlineTextBox name='51'
 ++++++++++++++++++++++listBoxOption name='52' selected=false
 ++++++++++++++++++++++++staticText name='52'
+++++++++++++++++++++++++++inlineTextBox name='52'
 ++++++++++++++++++++++listBoxOption name='53' selected=false
 ++++++++++++++++++++++++staticText name='53'
+++++++++++++++++++++++++++inlineTextBox name='53'
 ++++++++++++++++++++++listBoxOption name='54' selected=false
 ++++++++++++++++++++++++staticText name='54'
+++++++++++++++++++++++++++inlineTextBox name='54'
 ++++++++++++++++++++++listBoxOption name='55' selected=false
 ++++++++++++++++++++++++staticText name='55'
+++++++++++++++++++++++++++inlineTextBox name='55'
 ++++++++++++++++++++++listBoxOption name='56' selected=false
 ++++++++++++++++++++++++staticText name='56'
+++++++++++++++++++++++++++inlineTextBox name='56'
 ++++++++++++++++++++++listBoxOption name='57' selected=false
 ++++++++++++++++++++++++staticText name='57'
+++++++++++++++++++++++++++inlineTextBox name='57'
 ++++++++++++++++++++++listBoxOption name='58' selected=false
 ++++++++++++++++++++++++staticText name='58'
+++++++++++++++++++++++++++inlineTextBox name='58'
 ++++++++++++++++++++++listBoxOption name='59' selected=false
 ++++++++++++++++++++++++staticText name='59'
+++++++++++++++++++++++++++inlineTextBox name='59'
 ++++++++++++++++++++++listBoxOption name='00' selected=false
 ++++++++++++++++++++++++staticText name='00'
+++++++++++++++++++++++++++inlineTextBox name='00'
 ++++++++++++++++++++listBox name='Seconds' activedescendantId=listBoxOption
 ++++++++++++++++++++++listBoxOption name='01' selected=false
 ++++++++++++++++++++++++staticText name='01'
+++++++++++++++++++++++++++inlineTextBox name='01'
 ++++++++++++++++++++++listBoxOption name='02' selected=true
 ++++++++++++++++++++++++staticText name='02'
+++++++++++++++++++++++++++inlineTextBox name='02'
 ++++++++++++++++++++++listBoxOption name='03' selected=false
 ++++++++++++++++++++++++staticText name='03'
+++++++++++++++++++++++++++inlineTextBox name='03'
 ++++++++++++++++++++++listBoxOption name='04' selected=false
 ++++++++++++++++++++++++staticText name='04'
+++++++++++++++++++++++++++inlineTextBox name='04'
 ++++++++++++++++++++++listBoxOption name='05' selected=false
 ++++++++++++++++++++++++staticText name='05'
+++++++++++++++++++++++++++inlineTextBox name='05'
 ++++++++++++++++++++++listBoxOption name='06' selected=false
 ++++++++++++++++++++++++staticText name='06'
+++++++++++++++++++++++++++inlineTextBox name='06'
 ++++++++++++++++++++++listBoxOption name='07' selected=false
 ++++++++++++++++++++++++staticText name='07'
+++++++++++++++++++++++++++inlineTextBox name='07'
 ++++++++++++++++++++++listBoxOption name='08' selected=false
 ++++++++++++++++++++++++staticText name='08'
+++++++++++++++++++++++++++inlineTextBox name='08'
 ++++++++++++++++++++++listBoxOption name='09' selected=false
 ++++++++++++++++++++++++staticText name='09'
+++++++++++++++++++++++++++inlineTextBox name='09'
 ++++++++++++++++++++++listBoxOption name='10' selected=false
 ++++++++++++++++++++++++staticText name='10'
+++++++++++++++++++++++++++inlineTextBox name='10'
 ++++++++++++++++++++++listBoxOption name='11' selected=false
 ++++++++++++++++++++++++staticText name='11'
+++++++++++++++++++++++++++inlineTextBox name='11'
 ++++++++++++++++++++++listBoxOption name='12' selected=false
 ++++++++++++++++++++++++staticText name='12'
+++++++++++++++++++++++++++inlineTextBox name='12'
 ++++++++++++++++++++++listBoxOption name='13' selected=false
 ++++++++++++++++++++++++staticText name='13'
+++++++++++++++++++++++++++inlineTextBox name='13'
 ++++++++++++++++++++++listBoxOption name='14' selected=false
 ++++++++++++++++++++++++staticText name='14'
+++++++++++++++++++++++++++inlineTextBox name='14'
 ++++++++++++++++++++++listBoxOption name='15' selected=false
 ++++++++++++++++++++++++staticText name='15'
+++++++++++++++++++++++++++inlineTextBox name='15'
 ++++++++++++++++++++++listBoxOption name='16' selected=false
 ++++++++++++++++++++++++staticText name='16'
+++++++++++++++++++++++++++inlineTextBox name='16'
 ++++++++++++++++++++++listBoxOption name='17' selected=false
 ++++++++++++++++++++++++staticText name='17'
+++++++++++++++++++++++++++inlineTextBox name='17'
 ++++++++++++++++++++++listBoxOption name='18' selected=false
 ++++++++++++++++++++++++staticText name='18'
+++++++++++++++++++++++++++inlineTextBox name='18'
 ++++++++++++++++++++++listBoxOption name='19' selected=false
 ++++++++++++++++++++++++staticText name='19'
+++++++++++++++++++++++++++inlineTextBox name='19'
 ++++++++++++++++++++++listBoxOption name='20' selected=false
 ++++++++++++++++++++++++staticText name='20'
+++++++++++++++++++++++++++inlineTextBox name='20'
 ++++++++++++++++++++++listBoxOption name='21' selected=false
 ++++++++++++++++++++++++staticText name='21'
+++++++++++++++++++++++++++inlineTextBox name='21'
 ++++++++++++++++++++++listBoxOption name='22' selected=false
 ++++++++++++++++++++++++staticText name='22'
+++++++++++++++++++++++++++inlineTextBox name='22'
 ++++++++++++++++++++++listBoxOption name='23' selected=false
 ++++++++++++++++++++++++staticText name='23'
+++++++++++++++++++++++++++inlineTextBox name='23'
 ++++++++++++++++++++++listBoxOption name='24' selected=false
 ++++++++++++++++++++++++staticText name='24'
+++++++++++++++++++++++++++inlineTextBox name='24'
 ++++++++++++++++++++++listBoxOption name='25' selected=false
 ++++++++++++++++++++++++staticText name='25'
+++++++++++++++++++++++++++inlineTextBox name='25'
 ++++++++++++++++++++++listBoxOption name='26' selected=false
 ++++++++++++++++++++++++staticText name='26'
+++++++++++++++++++++++++++inlineTextBox name='26'
 ++++++++++++++++++++++listBoxOption name='27' selected=false
 ++++++++++++++++++++++++staticText name='27'
+++++++++++++++++++++++++++inlineTextBox name='27'
 ++++++++++++++++++++++listBoxOption name='28' selected=false
 ++++++++++++++++++++++++staticText name='28'
+++++++++++++++++++++++++++inlineTextBox name='28'
 ++++++++++++++++++++++listBoxOption name='29' selected=false
 ++++++++++++++++++++++++staticText name='29'
+++++++++++++++++++++++++++inlineTextBox name='29'
 ++++++++++++++++++++++listBoxOption name='30' selected=false
 ++++++++++++++++++++++++staticText name='30'
+++++++++++++++++++++++++++inlineTextBox name='30'
 ++++++++++++++++++++++listBoxOption name='31' selected=false
 ++++++++++++++++++++++++staticText name='31'
+++++++++++++++++++++++++++inlineTextBox name='31'
 ++++++++++++++++++++++listBoxOption name='32' selected=false
 ++++++++++++++++++++++++staticText name='32'
+++++++++++++++++++++++++++inlineTextBox name='32'
 ++++++++++++++++++++++listBoxOption name='33' selected=false
 ++++++++++++++++++++++++staticText name='33'
+++++++++++++++++++++++++++inlineTextBox name='33'
 ++++++++++++++++++++++listBoxOption name='34' selected=false
 ++++++++++++++++++++++++staticText name='34'
+++++++++++++++++++++++++++inlineTextBox name='34'
 ++++++++++++++++++++++listBoxOption name='35' selected=false
 ++++++++++++++++++++++++staticText name='35'
+++++++++++++++++++++++++++inlineTextBox name='35'
 ++++++++++++++++++++++listBoxOption name='36' selected=false
 ++++++++++++++++++++++++staticText name='36'
+++++++++++++++++++++++++++inlineTextBox name='36'
 ++++++++++++++++++++++listBoxOption name='37' selected=false
 ++++++++++++++++++++++++staticText name='37'
+++++++++++++++++++++++++++inlineTextBox name='37'
 ++++++++++++++++++++++listBoxOption name='38' selected=false
 ++++++++++++++++++++++++staticText name='38'
+++++++++++++++++++++++++++inlineTextBox name='38'
 ++++++++++++++++++++++listBoxOption name='39' selected=false
 ++++++++++++++++++++++++staticText name='39'
+++++++++++++++++++++++++++inlineTextBox name='39'
 ++++++++++++++++++++++listBoxOption name='40' selected=false
 ++++++++++++++++++++++++staticText name='40'
+++++++++++++++++++++++++++inlineTextBox name='40'
 ++++++++++++++++++++++listBoxOption name='41' selected=false
 ++++++++++++++++++++++++staticText name='41'
+++++++++++++++++++++++++++inlineTextBox name='41'
 ++++++++++++++++++++++listBoxOption name='42' selected=false
 ++++++++++++++++++++++++staticText name='42'
+++++++++++++++++++++++++++inlineTextBox name='42'
 ++++++++++++++++++++++listBoxOption name='43' selected=false
 ++++++++++++++++++++++++staticText name='43'
+++++++++++++++++++++++++++inlineTextBox name='43'
 ++++++++++++++++++++++listBoxOption name='44' selected=false
 ++++++++++++++++++++++++staticText name='44'
+++++++++++++++++++++++++++inlineTextBox name='44'
 ++++++++++++++++++++++listBoxOption name='45' selected=false
 ++++++++++++++++++++++++staticText name='45'
+++++++++++++++++++++++++++inlineTextBox name='45'
 ++++++++++++++++++++++listBoxOption name='46' selected=false
 ++++++++++++++++++++++++staticText name='46'
+++++++++++++++++++++++++++inlineTextBox name='46'
 ++++++++++++++++++++++listBoxOption name='47' selected=false
 ++++++++++++++++++++++++staticText name='47'
+++++++++++++++++++++++++++inlineTextBox name='47'
 ++++++++++++++++++++++listBoxOption name='48' selected=false
 ++++++++++++++++++++++++staticText name='48'
+++++++++++++++++++++++++++inlineTextBox name='48'
 ++++++++++++++++++++++listBoxOption name='49' selected=false
 ++++++++++++++++++++++++staticText name='49'
+++++++++++++++++++++++++++inlineTextBox name='49'
 ++++++++++++++++++++++listBoxOption name='50' selected=false
 ++++++++++++++++++++++++staticText name='50'
+++++++++++++++++++++++++++inlineTextBox name='50'
 ++++++++++++++++++++++listBoxOption name='51' selected=false
 ++++++++++++++++++++++++staticText name='51'
+++++++++++++++++++++++++++inlineTextBox name='51'
 ++++++++++++++++++++++listBoxOption name='52' selected=false
 ++++++++++++++++++++++++staticText name='52'
+++++++++++++++++++++++++++inlineTextBox name='52'
 ++++++++++++++++++++++listBoxOption name='53' selected=false
 ++++++++++++++++++++++++staticText name='53'
+++++++++++++++++++++++++++inlineTextBox name='53'
 ++++++++++++++++++++++listBoxOption name='54' selected=false
 ++++++++++++++++++++++++staticText name='54'
+++++++++++++++++++++++++++inlineTextBox name='54'
 ++++++++++++++++++++++listBoxOption name='55' selected=false
 ++++++++++++++++++++++++staticText name='55'
+++++++++++++++++++++++++++inlineTextBox name='55'
 ++++++++++++++++++++++listBoxOption name='56' selected=false
 ++++++++++++++++++++++++staticText name='56'
+++++++++++++++++++++++++++inlineTextBox name='56'
 ++++++++++++++++++++++listBoxOption name='57' selected=false
 ++++++++++++++++++++++++staticText name='57'
+++++++++++++++++++++++++++inlineTextBox name='57'
 ++++++++++++++++++++++listBoxOption name='58' selected=false
 ++++++++++++++++++++++++staticText name='58'
+++++++++++++++++++++++++++inlineTextBox name='58'
 ++++++++++++++++++++++listBoxOption name='59' selected=false
 ++++++++++++++++++++++++staticText name='59'
+++++++++++++++++++++++++++inlineTextBox name='59'
 ++++++++++++++++++++++listBoxOption name='00' selected=false
 ++++++++++++++++++++++++staticText name='00'
+++++++++++++++++++++++++++inlineTextBox name='00'
 ++++++++++++++++++++listBox name='Milliseconds' activedescendantId=listBoxOption
 ++++++++++++++++++++++listBoxOption name='100' selected=false
 ++++++++++++++++++++++++staticText name='100'
+++++++++++++++++++++++++++inlineTextBox name='100'
 ++++++++++++++++++++++listBoxOption name='200' selected=false
 ++++++++++++++++++++++++staticText name='200'
+++++++++++++++++++++++++++inlineTextBox name='200'
 ++++++++++++++++++++++listBoxOption name='300' selected=false
 ++++++++++++++++++++++++staticText name='300'
+++++++++++++++++++++++++++inlineTextBox name='300'
 ++++++++++++++++++++++listBoxOption name='400' selected=false
 ++++++++++++++++++++++++staticText name='400'
+++++++++++++++++++++++++++inlineTextBox name='400'
 ++++++++++++++++++++++listBoxOption name='500' selected=false
 ++++++++++++++++++++++++staticText name='500'
+++++++++++++++++++++++++++inlineTextBox name='500'
 ++++++++++++++++++++++listBoxOption name='600' selected=false
 ++++++++++++++++++++++++staticText name='600'
+++++++++++++++++++++++++++inlineTextBox name='600'
 ++++++++++++++++++++++listBoxOption name='700' selected=false
 ++++++++++++++++++++++++staticText name='700'
+++++++++++++++++++++++++++inlineTextBox name='700'
 ++++++++++++++++++++++listBoxOption name='800' selected=false
 ++++++++++++++++++++++++staticText name='800'
+++++++++++++++++++++++++++inlineTextBox name='800'
 ++++++++++++++++++++++listBoxOption name='922' selected=true
 ++++++++++++++++++++++++staticText name='922'
+++++++++++++++++++++++++++inlineTextBox name='922'
 ++++++++++++++++++++++listBoxOption name='000' selected=false
 ++++++++++++++++++++++++staticText name='000'
+++++++++++++++++++++++++++inlineTextBox name='000'
 ++++++++++++++++++++listBox name='AM/PM' activedescendantId=listBoxOption
 ++++++++++++++++++++++listBoxOption name='PM' selected=true
 ++++++++++++++++++++++++staticText name='PM'
+++++++++++++++++++++++++++inlineTextBox name='PM'
 ++++++++++++++++++++++listBoxOption name='AM' selected=false
-++++++++++++++++++++++++staticText name='AM'
\ No newline at end of file
+++++++++++++++++++++++++staticText name='AM'
+++++++++++++++++++++++++++inlineTextBox name='AM'
\ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-time-with-popup-open-expected-fuchsia.txt b/content/test/data/accessibility/html/input-time-with-popup-open-expected-fuchsia.txt
index 5d68a5e..c6d60245 100644
--- a/content/test/data/accessibility/html/input-time-with-popup-open-expected-fuchsia.txt
+++ b/content/test/data/accessibility/html/input-time-with-popup-open-expected-fuchsia.txt
@@ -37,293 +37,437 @@
 ++++++++++++++++++++UNKNOWN focusable label='Hours' actions='{DEFAULT}'
 ++++++++++++++++++++++UNKNOWN focusable has_input_focus selected label='01' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='01' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='01'
 ++++++++++++++++++++++UNKNOWN focusable label='02' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='02' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='02'
 ++++++++++++++++++++++UNKNOWN focusable label='03' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='03' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='03'
 ++++++++++++++++++++++UNKNOWN focusable label='04' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='04' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='04'
 ++++++++++++++++++++++UNKNOWN focusable label='05' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='05' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='05'
 ++++++++++++++++++++++UNKNOWN focusable label='06' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='06' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='06'
 ++++++++++++++++++++++UNKNOWN focusable label='07' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='07' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='07'
 ++++++++++++++++++++++UNKNOWN focusable label='08' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='08' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='08'
 ++++++++++++++++++++++UNKNOWN focusable label='09' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='09' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='09'
 ++++++++++++++++++++++UNKNOWN focusable label='10' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='10' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='10'
 ++++++++++++++++++++++UNKNOWN focusable label='11' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='11' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='11'
 ++++++++++++++++++++++UNKNOWN focusable label='12' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='12' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='12'
 ++++++++++++++++++++UNKNOWN focusable label='Minutes' actions='{DEFAULT}'
 ++++++++++++++++++++++UNKNOWN focusable label='01' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='01' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='01'
 ++++++++++++++++++++++UNKNOWN focusable label='02' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='02' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='02'
 ++++++++++++++++++++++UNKNOWN focusable label='03' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='03' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='03'
 ++++++++++++++++++++++UNKNOWN focusable label='04' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='04' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='04'
 ++++++++++++++++++++++UNKNOWN focusable label='05' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='05' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='05'
 ++++++++++++++++++++++UNKNOWN focusable label='06' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='06' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='06'
 ++++++++++++++++++++++UNKNOWN focusable label='07' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='07' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='07'
 ++++++++++++++++++++++UNKNOWN focusable label='08' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='08' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='08'
 ++++++++++++++++++++++UNKNOWN focusable label='09' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='09' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='09'
 ++++++++++++++++++++++UNKNOWN focusable label='10' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='10' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='10'
 ++++++++++++++++++++++UNKNOWN focusable label='11' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='11' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='11'
 ++++++++++++++++++++++UNKNOWN focusable label='12' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='12' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='12'
 ++++++++++++++++++++++UNKNOWN focusable label='13' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='13' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='13'
 ++++++++++++++++++++++UNKNOWN focusable label='14' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='14' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='14'
 ++++++++++++++++++++++UNKNOWN focusable label='15' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='15' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='15'
 ++++++++++++++++++++++UNKNOWN focusable label='16' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='16' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='16'
 ++++++++++++++++++++++UNKNOWN focusable label='17' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='17' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='17'
 ++++++++++++++++++++++UNKNOWN focusable label='18' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='18' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='18'
 ++++++++++++++++++++++UNKNOWN focusable label='19' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='19' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='19'
 ++++++++++++++++++++++UNKNOWN focusable label='20' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='20' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='20'
 ++++++++++++++++++++++UNKNOWN focusable label='21' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='21' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='21'
 ++++++++++++++++++++++UNKNOWN focusable label='22' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='22' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='22'
 ++++++++++++++++++++++UNKNOWN focusable label='23' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='23' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='23'
 ++++++++++++++++++++++UNKNOWN focusable label='24' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='24' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='24'
 ++++++++++++++++++++++UNKNOWN focusable label='25' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='25' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='25'
 ++++++++++++++++++++++UNKNOWN focusable label='26' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='26' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='26'
 ++++++++++++++++++++++UNKNOWN focusable label='27' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='27' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='27'
 ++++++++++++++++++++++UNKNOWN focusable label='28' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='28' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='28'
 ++++++++++++++++++++++UNKNOWN focusable label='29' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='29' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='29'
 ++++++++++++++++++++++UNKNOWN focusable label='30' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='30' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='30'
 ++++++++++++++++++++++UNKNOWN focusable label='31' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='31' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='31'
 ++++++++++++++++++++++UNKNOWN focusable label='32' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='32' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='32'
 ++++++++++++++++++++++UNKNOWN focusable label='33' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='33' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='33'
 ++++++++++++++++++++++UNKNOWN focusable label='34' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='34' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='34'
 ++++++++++++++++++++++UNKNOWN focusable label='35' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='35' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='35'
 ++++++++++++++++++++++UNKNOWN focusable label='36' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='36' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='36'
 ++++++++++++++++++++++UNKNOWN focusable label='37' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='37' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='37'
 ++++++++++++++++++++++UNKNOWN focusable label='38' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='38' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='38'
 ++++++++++++++++++++++UNKNOWN focusable label='39' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='39' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='39'
 ++++++++++++++++++++++UNKNOWN focusable label='40' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='40' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='40'
 ++++++++++++++++++++++UNKNOWN focusable label='41' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='41' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='41'
 ++++++++++++++++++++++UNKNOWN focusable label='42' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='42' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='42'
 ++++++++++++++++++++++UNKNOWN focusable label='43' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='43' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='43'
 ++++++++++++++++++++++UNKNOWN focusable label='44' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='44' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='44'
 ++++++++++++++++++++++UNKNOWN focusable label='45' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='45' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='45'
 ++++++++++++++++++++++UNKNOWN focusable label='46' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='46' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='46'
 ++++++++++++++++++++++UNKNOWN focusable label='47' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='47' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='47'
 ++++++++++++++++++++++UNKNOWN focusable label='48' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='48' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='48'
 ++++++++++++++++++++++UNKNOWN focusable label='49' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='49' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='49'
 ++++++++++++++++++++++UNKNOWN focusable selected label='50' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='50' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='50'
 ++++++++++++++++++++++UNKNOWN focusable label='51' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='51' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='51'
 ++++++++++++++++++++++UNKNOWN focusable label='52' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='52' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='52'
 ++++++++++++++++++++++UNKNOWN focusable label='53' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='53' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='53'
 ++++++++++++++++++++++UNKNOWN focusable label='54' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='54' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='54'
 ++++++++++++++++++++++UNKNOWN focusable label='55' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='55' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='55'
 ++++++++++++++++++++++UNKNOWN focusable label='56' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='56' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='56'
 ++++++++++++++++++++++UNKNOWN focusable label='57' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='57' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='57'
 ++++++++++++++++++++++UNKNOWN focusable label='58' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='58' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='58'
 ++++++++++++++++++++++UNKNOWN focusable label='59' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='59' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='59'
 ++++++++++++++++++++++UNKNOWN focusable label='00' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='00' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='00'
 ++++++++++++++++++++UNKNOWN focusable label='Seconds' actions='{DEFAULT}'
 ++++++++++++++++++++++UNKNOWN focusable label='01' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='01' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='01'
 ++++++++++++++++++++++UNKNOWN focusable selected label='02' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='02' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='02'
 ++++++++++++++++++++++UNKNOWN focusable label='03' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='03' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='03'
 ++++++++++++++++++++++UNKNOWN focusable label='04' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='04' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='04'
 ++++++++++++++++++++++UNKNOWN focusable label='05' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='05' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='05'
 ++++++++++++++++++++++UNKNOWN focusable label='06' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='06' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='06'
 ++++++++++++++++++++++UNKNOWN focusable label='07' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='07' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='07'
 ++++++++++++++++++++++UNKNOWN focusable label='08' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='08' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='08'
 ++++++++++++++++++++++UNKNOWN focusable label='09' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='09' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='09'
 ++++++++++++++++++++++UNKNOWN focusable label='10' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='10' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='10'
 ++++++++++++++++++++++UNKNOWN focusable label='11' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='11' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='11'
 ++++++++++++++++++++++UNKNOWN focusable label='12' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='12' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='12'
 ++++++++++++++++++++++UNKNOWN focusable label='13' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='13' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='13'
 ++++++++++++++++++++++UNKNOWN focusable label='14' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='14' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='14'
 ++++++++++++++++++++++UNKNOWN focusable label='15' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='15' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='15'
 ++++++++++++++++++++++UNKNOWN focusable label='16' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='16' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='16'
 ++++++++++++++++++++++UNKNOWN focusable label='17' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='17' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='17'
 ++++++++++++++++++++++UNKNOWN focusable label='18' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='18' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='18'
 ++++++++++++++++++++++UNKNOWN focusable label='19' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='19' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='19'
 ++++++++++++++++++++++UNKNOWN focusable label='20' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='20' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='20'
 ++++++++++++++++++++++UNKNOWN focusable label='21' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='21' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='21'
 ++++++++++++++++++++++UNKNOWN focusable label='22' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='22' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='22'
 ++++++++++++++++++++++UNKNOWN focusable label='23' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='23' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='23'
 ++++++++++++++++++++++UNKNOWN focusable label='24' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='24' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='24'
 ++++++++++++++++++++++UNKNOWN focusable label='25' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='25' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='25'
 ++++++++++++++++++++++UNKNOWN focusable label='26' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='26' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='26'
 ++++++++++++++++++++++UNKNOWN focusable label='27' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='27' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='27'
 ++++++++++++++++++++++UNKNOWN focusable label='28' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='28' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='28'
 ++++++++++++++++++++++UNKNOWN focusable label='29' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='29' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='29'
 ++++++++++++++++++++++UNKNOWN focusable label='30' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='30' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='30'
 ++++++++++++++++++++++UNKNOWN focusable label='31' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='31' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='31'
 ++++++++++++++++++++++UNKNOWN focusable label='32' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='32' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='32'
 ++++++++++++++++++++++UNKNOWN focusable label='33' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='33' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='33'
 ++++++++++++++++++++++UNKNOWN focusable label='34' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='34' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='34'
 ++++++++++++++++++++++UNKNOWN focusable label='35' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='35' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='35'
 ++++++++++++++++++++++UNKNOWN focusable label='36' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='36' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='36'
 ++++++++++++++++++++++UNKNOWN focusable label='37' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='37' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='37'
 ++++++++++++++++++++++UNKNOWN focusable label='38' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='38' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='38'
 ++++++++++++++++++++++UNKNOWN focusable label='39' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='39' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='39'
 ++++++++++++++++++++++UNKNOWN focusable label='40' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='40' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='40'
 ++++++++++++++++++++++UNKNOWN focusable label='41' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='41' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='41'
 ++++++++++++++++++++++UNKNOWN focusable label='42' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='42' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='42'
 ++++++++++++++++++++++UNKNOWN focusable label='43' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='43' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='43'
 ++++++++++++++++++++++UNKNOWN focusable label='44' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='44' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='44'
 ++++++++++++++++++++++UNKNOWN focusable label='45' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='45' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='45'
 ++++++++++++++++++++++UNKNOWN focusable label='46' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='46' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='46'
 ++++++++++++++++++++++UNKNOWN focusable label='47' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='47' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='47'
 ++++++++++++++++++++++UNKNOWN focusable label='48' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='48' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='48'
 ++++++++++++++++++++++UNKNOWN focusable label='49' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='49' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='49'
 ++++++++++++++++++++++UNKNOWN focusable label='50' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='50' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='50'
 ++++++++++++++++++++++UNKNOWN focusable label='51' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='51' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='51'
 ++++++++++++++++++++++UNKNOWN focusable label='52' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='52' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='52'
 ++++++++++++++++++++++UNKNOWN focusable label='53' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='53' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='53'
 ++++++++++++++++++++++UNKNOWN focusable label='54' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='54' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='54'
 ++++++++++++++++++++++UNKNOWN focusable label='55' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='55' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='55'
 ++++++++++++++++++++++UNKNOWN focusable label='56' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='56' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='56'
 ++++++++++++++++++++++UNKNOWN focusable label='57' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='57' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='57'
 ++++++++++++++++++++++UNKNOWN focusable label='58' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='58' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='58'
 ++++++++++++++++++++++UNKNOWN focusable label='59' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='59' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='59'
 ++++++++++++++++++++++UNKNOWN focusable label='00' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='00' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='00'
 ++++++++++++++++++++UNKNOWN focusable label='Milliseconds' actions='{DEFAULT}'
 ++++++++++++++++++++++UNKNOWN focusable label='100' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='100' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='100'
 ++++++++++++++++++++++UNKNOWN focusable label='200' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='200' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='200'
 ++++++++++++++++++++++UNKNOWN focusable label='300' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='300' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='300'
 ++++++++++++++++++++++UNKNOWN focusable label='400' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='400' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='400'
 ++++++++++++++++++++++UNKNOWN focusable label='500' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='500' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='500'
 ++++++++++++++++++++++UNKNOWN focusable label='600' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='600' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='600'
 ++++++++++++++++++++++UNKNOWN focusable label='700' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='700' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='700'
 ++++++++++++++++++++++UNKNOWN focusable label='800' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='800' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='800'
 ++++++++++++++++++++++UNKNOWN focusable selected label='922' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='922' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='922'
 ++++++++++++++++++++++UNKNOWN focusable label='000' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='000' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='000'
 ++++++++++++++++++++UNKNOWN focusable label='AM/PM' actions='{DEFAULT}'
 ++++++++++++++++++++++UNKNOWN focusable selected label='PM' actions='{DEFAULT}'
 ++++++++++++++++++++++++STATIC_TEXT label='PM' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='PM'
 ++++++++++++++++++++++UNKNOWN focusable label='AM' actions='{DEFAULT}'
-++++++++++++++++++++++++STATIC_TEXT label='AM' actions='{DEFAULT}'
\ No newline at end of file
+++++++++++++++++++++++++STATIC_TEXT label='AM' actions='{DEFAULT}'
+++++++++++++++++++++++++++UNKNOWN label='AM'
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index f3560257..4a8b255 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -285,11 +285,8 @@
 crbug.com/1353952 [ chromeos cros-chrome chromeos-board-amd64-generic ] Pixel_WebGLContextRestored [ Skip ]
 crbug.com/1353952 [ chromeos cros-chrome chromeos-board-kevin ] Pixel_WebGLContextRestored [ Skip ]
 
-# Flakes on Nexus 5X due to timeout. Revert to RetryOnFailure once we have the Pixel tests
-# switched to using a heartbeat mechanism. crbug.com/1472852
-crbug.com/1488026 [ android android-chromium android-nexus-5x ] Pixel_Video_MP4 [ Skip ]
-crbug.com/1488026 [ android android-chromium android-nexus-5x ] Pixel_Video_MP4_FourColors_Aspect_4x3 [ Skip ]
-crbug.com/1488026 [ android android-chromium android-nexus-5x ] Pixel_Video_MP4_FourColors_Rot_180 [ Skip ]
+# Flakily causes subsequent tests to fail.
+crbug.com/1488026 [ android android-chromium android-nexus-5x ] Pixel_Video_HEVC [ Skip ]
 
 ###################
 # Failures/Flakes #
diff --git a/content/web_test/renderer/accessibility_controller.cc b/content/web_test/renderer/accessibility_controller.cc
index 39160ee..d7b011dd 100644
--- a/content/web_test/renderer/accessibility_controller.cc
+++ b/content/web_test/renderer/accessibility_controller.cc
@@ -176,7 +176,6 @@
                                                       ui::kAXModeComplete);
   elements_ = std::make_unique<WebAXObjectProxyList>(
       frame->GetAgentGroupScheduler()->Isolate(), *ax_context_);
-  frame->View()->GetSettings()->SetInlineTextBoxAccessibilityEnabled(true);
 
   AccessibilityControllerBindings::Install(weak_factory_.GetWeakPtr(), frame);
 }
diff --git a/docs/security/faq.md b/docs/security/faq.md
index bab143c65..d1a8f2f 100644
--- a/docs/security/faq.md
+++ b/docs/security/faq.md
@@ -227,6 +227,21 @@
 it. You can see if a Safe Browsing check happened by opening
 chrome://safe-browsing before starting the download.
 
+<a name="TOC-what-about-dangerous-file-types-not-listed-in-the-file-type-policy-"></a>
+### What about dangerous file types not listed in the file type policy?
+
+The [file type
+policy](https://source.chromium.org/chromium/chromium/src/+/main:components/safe_browsing/content/resources/download_file_types.asciipb?q=download_file_types.asciipb%20-f:%2Fgen%2F&ss=chromium)
+controls some details of which security checks to enable for a given file
+extension. Most importantly, it controls whether we contact Safe Browsing about
+a download, and whether we show a warning for all downloads of that file type.
+Starting in M74, the default for unknown file types has been to contact Safe
+Browsing. This prevents large-scale abuse from a previously unknown file type.
+Starting in M105, showing a warning for all downloads of an extension became
+reserved for exceptionally dangerous file types that can compromise a user
+without any user interaction with the file (e.g. DLL hijacking). If you discover
+a new file type that meets that condition, we’d like to hear about it.
+
 <a name="TOC-I-can-download-a-file-with-an-unsafe-extension-but-a-different-extension-or-file-type-is-shown-to-the-user-"></a>
 ### I can download a file with an unsafe extension but a different extension or file type is shown to the user - is this a security bug?
 <a name="TOC-Extensions-for-downloaded-files-are-not-shown-in-a-file-dialog-"></a>
@@ -943,4 +958,3 @@
 depend upon architectural changes (e.g. breaking API changes); because the
 security improvement is a significant new feature; or because the security
 improvement is the removal of a broken feature.
-
diff --git a/extensions/browser/api/user_scripts/user_scripts_api.cc b/extensions/browser/api/user_scripts/user_scripts_api.cc
index 5a2b94d..3b17c14a 100644
--- a/extensions/browser/api/user_scripts/user_scripts_api.cc
+++ b/extensions/browser/api/user_scripts/user_scripts_api.cc
@@ -7,7 +7,6 @@
 #include <vector>
 
 #include "base/functional/bind.h"
-#include "base/notreached.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/types/optional_util.h"
 #include "extensions/browser/api/scripting/scripting_constants.h"
@@ -18,7 +17,6 @@
 #include "extensions/browser/user_script_manager.h"
 #include "extensions/common/api/extension_types.h"
 #include "extensions/common/api/user_scripts.h"
-#include "extensions/common/mojom/execution_world.mojom-shared.h"
 #include "extensions/common/user_script.h"
 #include "extensions/common/utils/content_script_utils.h"
 #include "extensions/common/utils/extension_types_utils.h"
@@ -35,30 +33,6 @@
 constexpr char kMatchesMissingError[] =
     "User script with ID '*' must specify 'matches'.";
 
-mojom::ExecutionWorld ConvertExecutionWorld(
-    api::user_scripts::ExecutionWorld world) {
-  switch (world) {
-    // Execution world defaults to `kUserScript` when it's not provided.
-    case api::user_scripts::EXECUTION_WORLD_NONE:
-    case api::user_scripts::EXECUTION_WORLD_USER_SCRIPT:
-      return mojom::ExecutionWorld::kUserScript;
-    case api::user_scripts::EXECUTION_WORLD_MAIN:
-      return mojom::ExecutionWorld::kMain;
-  }
-}
-
-api::user_scripts::ExecutionWorld ConvertExecutionWorldForAPI(
-    mojom::ExecutionWorld world) {
-  switch (world) {
-    case mojom::ExecutionWorld::kUserScript:
-      return api::user_scripts::EXECUTION_WORLD_USER_SCRIPT;
-    case mojom::ExecutionWorld::kMain:
-      return api::user_scripts::EXECUTION_WORLD_MAIN;
-    case mojom::ExecutionWorld::kIsolated:
-      NOTREACHED_NORETURN() << "ISOLATED worlds are not supported in this API.";
-  }
-}
-
 std::unique_ptr<UserScript> ParseUserScript(
     const Extension& extension,
     const api::user_scripts::RegisteredUserScript& user_script,
@@ -124,8 +98,6 @@
     }
   }
 
-  result->set_execution_world(ConvertExecutionWorld(user_script.world));
-
   return result;
 }
 
@@ -165,8 +137,6 @@
     }
   }
 
-  script_info.world = ConvertExecutionWorldForAPI(script.execution_world());
-
   return script_info;
 }
 
@@ -432,10 +402,6 @@
     original_script.js = std::move(new_script.js);
   }
 
-  if (new_script.world) {
-    original_script.world = std::move(new_script.world);
-  }
-
   std::unique_ptr<UserScript> parsed_script =
       ParseUserScript(*extension(), original_script, parse_error);
   return parsed_script;
diff --git a/extensions/common/api/extension_types.json b/extensions/common/api/extension_types.json
index cb56cae9..8bf9a724 100644
--- a/extensions/common/api/extension_types.json
+++ b/extensions/common/api/extension_types.json
@@ -120,12 +120,8 @@
         "id": "ExecutionWorld",
         "type": "string",
         "nodoc": true,
-        "enum": [
-          "ISOLATED",
-          "MAIN",
-          "USER_SCRIPT"
-        ],
-        "description": "The JavaScript world for a script to execute within. Can either be an isolated world unique to this extension, the main world of the DOM which is shared with the page's JavaScript, or a user scripts world that is only available for scripts registered with the User Scripts API."
+        "enum": ["ISOLATED", "MAIN"],
+        "description": "The JavaScript world for a script to execute within. Can either be an isolated world, unique to this extension, or the main world of the DOM which is shared with the page's JavaScript."
       }
     ]
   }
diff --git a/extensions/common/api/user_scripts.idl b/extensions/common/api/user_scripts.idl
index ee9a9d56..12f1111 100644
--- a/extensions/common/api/user_scripts.idl
+++ b/extensions/common/api/user_scripts.idl
@@ -5,16 +5,6 @@
 // Use the <code>userScripts</code> API to execute user scripts in the User
 // Scripts context.
 namespace userScripts {
-  // The JavaScript world for a user script to execute within.
-  enum ExecutionWorld {
-    // Specifies the execution environment of the DOM, which is the execution
-    // environment shared with the host page's JavaScript.
-    MAIN,
-    // Specifies the execution enviroment that is specific to user scripts and
-    // is exempt from the page's CSP.
-    USER_SCRIPT
-  };
-
   // The source of the script to inject.
   dictionary ScriptSource {
     // A string containing the JavaScript code to inject. Exactly one of
@@ -62,9 +52,6 @@
     // Specifies when JavaScript files are injected into the web page. The
     // preferred and default value is <code>document_idle</code>.
     extensionTypes.RunAt? runAt;
-    // The JavaScript execution environment to run the script in. The default is
-    // <code>`USER_SCRIPT`</code>.
-    ExecutionWorld? world;
   };
 
   // An object used to filter user scripts for ${ref:getScripts}.
diff --git a/extensions/common/utils/extension_types_utils.cc b/extensions/common/utils/extension_types_utils.cc
index ddad44e4..e485ad0c 100644
--- a/extensions/common/utils/extension_types_utils.cc
+++ b/extensions/common/utils/extension_types_utils.cc
@@ -3,8 +3,6 @@
 // found in the LICENSE file.
 
 #include "extensions/common/utils/extension_types_utils.h"
-#include "extensions/common/api/extension_types.h"
-#include "extensions/common/mojom/execution_world.mojom-shared.h"
 
 namespace extensions {
 
@@ -53,9 +51,6 @@
       break;  // Default to mojom::ExecutionWorld::kIsolated.
     case api::extension_types::ExecutionWorld::kMain:
       execution_world = mojom::ExecutionWorld::kMain;
-      break;
-    case api::extension_types::ExecutionWorld::kUserScript:
-      execution_world = mojom::ExecutionWorld::kUserScript;
   }
 
   return execution_world;
@@ -69,7 +64,7 @@
     case mojom::ExecutionWorld::kMain:
       return api::extension_types::ExecutionWorld::kMain;
     case mojom::ExecutionWorld::kUserScript:
-      return api::extension_types::ExecutionWorld::kUserScript;
+      NOTREACHED() << "UserScript worlds are not supported in this API.";
   }
 
   NOTREACHED();
diff --git a/infra/config/generated/builders/ci/android-nougat-x86-rel/properties.json b/infra/config/generated/builders/ci/android-nougat-x86-rel/properties.json
deleted file mode 100644
index 70d160e..0000000
--- a/infra/config/generated/builders/ci/android-nougat-x86-rel/properties.json
+++ /dev/null
@@ -1,69 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-nougat-x86-rel",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "x86_builder_mb"
-              },
-              "legacy_chromium_config": {
-                "build_config": "Release",
-                "config": "android",
-                "target_bits": 32,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android",
-                  "enable_wpr_tests"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-nougat-x86-rel",
-          "project": "chromium"
-        }
-      ],
-      "mirroring_builder_group_and_names": [
-        {
-          "builder": "android-nougat-x86-rel",
-          "group": "tryserver.chromium.android"
-        }
-      ]
-    }
-  },
-  "$build/reclient": {
-    "instance": "rbe-chromium-trusted",
-    "jobs": 500,
-    "metrics_project": "chromium-reclient-metrics",
-    "scandeps_server": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "chromium.android",
-  "recipe": "chromium",
-  "sheriff_rotations": [
-    "android"
-  ]
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-nougat-x86-rel/shadow-properties.json b/infra/config/generated/builders/ci/android-nougat-x86-rel/shadow-properties.json
deleted file mode 100644
index 2997dff..0000000
--- a/infra/config/generated/builders/ci/android-nougat-x86-rel/shadow-properties.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "$build/reclient": {
-    "instance": "rbe-chromium-untrusted",
-    "jobs": 500,
-    "metrics_project": "chromium-reclient-metrics",
-    "scandeps_server": true
-  }
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json b/infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json
deleted file mode 100644
index 66d7259..0000000
--- a/infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-nougat-x86-rel",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "x86_builder_mb"
-              },
-              "legacy_chromium_config": {
-                "build_config": "Release",
-                "config": "android",
-                "target_bits": 32,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android",
-                  "enable_wpr_tests"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-nougat-x86-rel",
-          "project": "chromium"
-        }
-      ]
-    }
-  },
-  "$build/code_coverage": {
-    "coverage_test_types": [
-      "unit",
-      "overall"
-    ],
-    "use_java_coverage": true
-  },
-  "$build/reclient": {
-    "instance": "rbe-chromium-untrusted",
-    "jobs": 500,
-    "metrics_project": "chromium-reclient-metrics",
-    "scandeps_server": true
-  },
-  "$build/siso": {
-    "configs": [
-      "builder"
-    ],
-    "enable_cloud_profiler": true,
-    "enable_cloud_trace": true,
-    "experiments": [],
-    "project": "rbe-chromium-untrusted"
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.android",
-  "recipe": "chromium/compilator"
-}
\ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-nougat-x86-rel/properties.json b/infra/config/generated/builders/try/android-nougat-x86-rel/properties.json
deleted file mode 100644
index a236995..0000000
--- a/infra/config/generated/builders/try/android-nougat-x86-rel/properties.json
+++ /dev/null
@@ -1,65 +0,0 @@
-{
-  "$build/chromium_orchestrator": {
-    "compilator": "android-nougat-x86-rel-compilator",
-    "compilator_watcher_git_revision": "e6d08be3fd589d4f222dae5d18dbc972e6117b23"
-  },
-  "$build/chromium_tests_builder_config": {
-    "builder_config": {
-      "builder_db": {
-        "entries": [
-          {
-            "builder_id": {
-              "bucket": "ci",
-              "builder": "android-nougat-x86-rel",
-              "project": "chromium"
-            },
-            "builder_spec": {
-              "build_gs_bucket": "chromium-android-archive",
-              "builder_group": "chromium.android",
-              "execution_mode": "COMPILE_AND_TEST",
-              "legacy_android_config": {
-                "config": "x86_builder_mb"
-              },
-              "legacy_chromium_config": {
-                "build_config": "Release",
-                "config": "android",
-                "target_bits": 32,
-                "target_platform": "android"
-              },
-              "legacy_gclient_config": {
-                "apply_configs": [
-                  "android",
-                  "enable_wpr_tests"
-                ],
-                "config": "chromium"
-              }
-            }
-          }
-        ]
-      },
-      "builder_ids": [
-        {
-          "bucket": "ci",
-          "builder": "android-nougat-x86-rel",
-          "project": "chromium"
-        }
-      ]
-    }
-  },
-  "$build/code_coverage": {
-    "coverage_test_types": [
-      "unit",
-      "overall"
-    ],
-    "use_java_coverage": true
-  },
-  "$recipe_engine/resultdb/test_presentation": {
-    "column_keys": [],
-    "grouping_keys": [
-      "status",
-      "v.test_suite"
-    ]
-  },
-  "builder_group": "tryserver.chromium.android",
-  "recipe": "chromium/orchestrator"
-}
\ No newline at end of file
diff --git a/infra/config/generated/health-specs/health-specs.json b/infra/config/generated/health-specs/health-specs.json
index 9c0f735..a3f0ff32 100644
--- a/infra/config/generated/health-specs/health-specs.json
+++ b/infra/config/generated/health-specs/health-specs.json
@@ -567,9 +567,6 @@
       "android-cronet-x86-rel": {
         "_default": "_default"
       },
-      "android-nougat-x86-rel": {
-        "_default": "_default"
-      },
       "android-official": {
         "_default": "_default"
       },
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg
index 7a035e0..b38cf00 100644
--- a/infra/config/generated/luci/commit-queue.cfg
+++ b/infra/config/generated/luci/commit-queue.cfg
@@ -828,14 +828,6 @@
         includable_only: true
       }
       builders {
-        name: "chromium/try/android-nougat-x86-rel"
-        includable_only: true
-      }
-      builders {
-        name: "chromium/try/android-nougat-x86-rel-compilator"
-        includable_only: true
-      }
-      builders {
         name: "chromium/try/android-official"
         includable_only: true
       }
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 6d4699f..64c9507 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -31809,102 +31809,6 @@
       }
     }
     builders {
-      name: "android-nougat-x86-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builderless:1"
-      dimensions: "cores:8"
-      dimensions: "cpu:x86-64"
-      dimensions: "free_space:standard"
-      dimensions: "os:Ubuntu-22.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/android-nougat-x86-rel/properties.json",'
-        '    "shadow_properties_file": "infra/config/generated/builders/ci/android-nougat-x86-rel/shadow-properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "chromium.android",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium",'
-        '  "sheriff_rotations": ['
-        '    "android"'
-        '  ]'
-        '}'
-      execution_timeout_secs: 14400
-      build_numbers: YES
-      service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
-      experiments {
-        key: "chromium_swarming.expose_merge_script_failures"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "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://[^/]*_wpt_tests/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-rel\">android-nougat-x86-rel</a></li></ul>"
-      shadow_builder_adjustments {
-        service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-        pool: "luci.chromium.try"
-        dimensions: "free_space:"
-        dimensions: "pool:luci.chromium.try"
-      }
-      contact_team_email: "clank-engprod@google.com"
-    }
-    builders {
       name: "android-official"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builder:android-official"
@@ -67470,191 +67374,6 @@
       description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-pie-x86-rel\">android-pie-x86-rel</a></li></ul>"
     }
     builders {
-      name: "android-nougat-x86-rel"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builder:android-nougat-x86-rel"
-      dimensions: "cores:4"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.try"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/android-nougat-x86-rel/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium/orchestrator"'
-        '}'
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      grace_period {
-        seconds: 120
-      }
-      build_numbers: YES
-      service_account: "chromium-orchestrator@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage {
-        value: 5
-      }
-      experiments {
-        key: "chromium.add_one_test_shard"
-        value: 10
-      }
-      experiments {
-        key: "chromium_swarming.expose_merge_script_failures"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-nougat-x86-rel\">android-nougat-x86-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-rel-compilator\">android-nougat-x86-rel-compilator</a>."
-    }
-    builders {
-      name: "android-nougat-x86-rel-compilator"
-      swarming_host: "chromium-swarm.appspot.com"
-      dimensions: "builder:android-nougat-x86-rel-compilator"
-      dimensions: "cores:64"
-      dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-22.04"
-      dimensions: "pool:luci.chromium.try"
-      dimensions: "ssd:1"
-      exe {
-        cipd_package: "infra/chromium/bootstrapper/${platform}"
-        cipd_version: "latest"
-        cmd: "bootstrapper"
-      }
-      properties:
-        '{'
-        '  "$bootstrap/exe": {'
-        '    "exe": {'
-        '      "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",'
-        '      "cipd_version": "refs/heads/main",'
-        '      "cmd": ['
-        '        "luciexe"'
-        '      ]'
-        '    }'
-        '  },'
-        '  "$bootstrap/properties": {'
-        '    "properties_file": "infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json",'
-        '    "top_level_project": {'
-        '      "ref": "refs/heads/main",'
-        '      "repo": {'
-        '        "host": "chromium.googlesource.com",'
-        '        "project": "chromium/src"'
-        '      }'
-        '    }'
-        '  },'
-        '  "builder_group": "tryserver.chromium.android",'
-        '  "led_builder_is_bootstrapped": true,'
-        '  "recipe": "chromium/compilator"'
-        '}'
-      execution_timeout_secs: 14400
-      expiration_secs: 7200
-      grace_period {
-        seconds: 120
-      }
-      build_numbers: YES
-      service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
-      task_template_canary_percentage {
-        value: 5
-      }
-      experiments {
-        key: "chromium_swarming.expose_merge_script_failures"
-        value: 100
-      }
-      experiments {
-        key: "luci.recipes.use_python3"
-        value: 100
-      }
-      resultdb {
-        enable: true
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "try_test_results"
-          test_results {}
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "gpu_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+"
-            }
-          }
-        }
-        bq_exports {
-          project: "chrome-luci-data"
-          dataset: "chromium"
-          table: "blink_web_tests_try_test_results"
-          test_results {
-            predicate {
-              test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)"
-            }
-          }
-        }
-        history_options {
-          use_invocation_timestamp: true
-        }
-      }
-      description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-rel\">android-nougat-x86-rel</a>."
-    }
-    builders {
       name: "android-official"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
@@ -82099,7 +81818,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-nvidia\">linux-angle-chromium-nvidia</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-builder\">linux-angle-chromium-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-intel\">linux-angle-chromium-intel</a></li></ul>"
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-builder\">linux-angle-chromium-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-intel\">linux-angle-chromium-intel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-nvidia\">linux-angle-chromium-nvidia</a></li></ul>"
     }
     builders {
       name: "linux-annotator-rel"
diff --git a/infra/config/generated/luci/luci-analysis-dev.cfg b/infra/config/generated/luci/luci-analysis-dev.cfg
index ffba9fc..fb147f1 100644
--- a/infra/config/generated/luci/luci-analysis-dev.cfg
+++ b/infra/config/generated/luci/luci-analysis-dev.cfg
@@ -107,6 +107,73 @@
   display_prefix: "crbug.com"
 }
 
+bug_management {
+  policies {
+    id: "exonerations"
+    owners: "kimstephanie@google.com"
+    owners: "chrome-browser-infra-team@google.com"
+    human_readable_name: "test variant(s) are being exonerated (ignored) in presubmit"
+    priority: P2
+    metrics {
+      metric_id: "critical-failures-exonerated"
+      activation_threshold {
+        three_day: 75
+      }
+      deactivation_threshold {
+        seven_day: 1
+      }
+    }
+    explanation {
+      problem_html: "Test variant(s) in this cluster are being exonerated (ignored) in presubmit because they are too flaky or failing to gate new code changes."
+      action_html: "<ul><li>View the exonerations tab to see the test variant(s) still being exonerated.</li><li>View the recent failures tab to see example failures for those test variant(s).</li><li>If the failure cannot be fixed in a timely way, consider disabling the test.</ul>"
+    }
+    bug_template {
+      comment_template: "Test variant(s) in this cluster are being exonerated (ignored) in presubmit because they are too flaky or failing to gate new code changes."
+    }
+  }
+  policies {
+    id: "builds-failed-due-to-flaky-tests"
+    owners: "kuanhuang@google.com"
+    owners: "chrome-browser-engprod@google.com"
+    human_readable_name: "many gardened builders are failing"
+    priority: P1
+    metrics {
+      metric_id: "builds-failed-due-to-flaky-tests"
+      activation_threshold {
+        one_day: 10
+        seven_day: 20
+      }
+      deactivation_threshold {
+        seven_day: 1
+      }
+    }
+    explanation {
+      problem_html: "This cluster is making a large number of gardened builders fail."
+      action_html: "Please consider the following strategies to mitigate the impact from these issues which are rated in order of resolution preference:<ol><li>Resolve the underlying test issue</li><li>Move the flaky test from critical builders to FYI builder</li><li>Disable test (least desirable as it reduces test coverage) and add a Test-Disabled label to the bug.</li></ol>"
+    }
+    bug_template{
+      comment_template: "This bug been identified as part of Chrome's flake reduction initiative. Resolution of this issue is critical because it has a large impact on the stability of Chrome CI/CQ. Resolving these issues will be essential to meet Chrome’s flake reduction goals.\n\nThis bug has led to a large number of gardened builds failing in the last 7 days.\n\nPlease consider the following strategies to mitigate the impact from this issue which are rated in order of resolution preference:\n1. Resolve the underlying test issue.\n2. Move the flaky test from Critical Builders to FYI Builder\n3. Disable test (least desirable as it reduces test coverage) and add a Test-Disabled label to this issue. The disabled tests might continue running in reviver builders (go/test-reviver), see config [1] for a list of supported builders.\n\nhttp://go/resolve-chrome-top-flakes provides more information on the tools available for resolving flaky tests.\n\nWhen investigating this failure, you may identify this bug is too broad (encompasses multiple different issues) or too narrow (only captures one part of a larger issue). If this applies, you can combine issues[2]  or split issues[3].\n\nLinks:\n[1] https://source.chromium.org/chromium/chromium/src/+/main:infra/config/subprojects/reviver/reviver.star\n[2] https://luci-analysis.appspot.com/help#combining-issues\n[3] https://luci-analysis.appspot.com/help#splitting-issues"
+      monorail {
+        labels: "Top-Flakes"
+        labels: "Test-Flaky"
+      }
+    }
+  }
+  default_bug_system: MONORAIL
+  monorail {
+    project: "chromium"
+    default_field_values {
+      # Type field.
+      field_id: 10
+      value: "Bug"
+    }
+    priority_field_id: 11
+    monorail_hostname: "monorail-staging.appspot.com"
+    display_prefix: "crbug.com"
+    file_without_restrict_view_google: true
+  }
+}
+
 realms {
   name: "ci"
   test_variant_analysis {
diff --git a/infra/config/generated/luci/luci-analysis.cfg b/infra/config/generated/luci/luci-analysis.cfg
index 8cbae83..80105145 100644
--- a/infra/config/generated/luci/luci-analysis.cfg
+++ b/infra/config/generated/luci/luci-analysis.cfg
@@ -108,6 +108,73 @@
   file_without_restrict_view_google: true
 }
 
+bug_management {
+  policies {
+    id: "exonerations"
+    owners: "kimstephanie@google.com"
+    owners: "chrome-browser-infra-team@google.com"
+    human_readable_name: "test variant(s) are being exonerated (ignored) in presubmit"
+    priority: P2
+    metrics {
+      metric_id: "critical-failures-exonerated"
+      activation_threshold {
+        three_day: 75
+      }
+      deactivation_threshold {
+        seven_day: 1
+      }
+    }
+    explanation {
+      problem_html: "Test variant(s) in this cluster are being exonerated (ignored) in presubmit because they are too flaky or failing to gate new code changes."
+      action_html: "<ul><li>View the exonerations tab to see the test variant(s) still being exonerated.</li><li>View the recent failures tab to see example failures for those test variant(s).</li><li>If the failure cannot be fixed in a timely way, consider disabling the test.</ul>"
+    }
+    bug_template {
+      comment_template: "Test variant(s) in this cluster are being exonerated (ignored) in presubmit because they are too flaky or failing to gate new code changes."
+    }
+  }
+  policies {
+    id: "builds-failed-due-to-flaky-tests"
+    owners: "kuanhuang@google.com"
+    owners: "chrome-browser-engprod@google.com"
+    human_readable_name: "many gardened builders are failing"
+    priority: P1
+    metrics {
+      metric_id: "builds-failed-due-to-flaky-tests"
+      activation_threshold {
+        one_day: 10
+        seven_day: 20
+      }
+      deactivation_threshold {
+        seven_day: 1
+      }
+    }
+    explanation {
+      problem_html: "This cluster is making a large number of gardened builders fail."
+      action_html: "Please consider the following strategies to mitigate the impact from these issues which are rated in order of resolution preference:<ol><li>Resolve the underlying test issue</li><li>Move the flaky test from critical builders to FYI builder</li><li>Disable test (least desirable as it reduces test coverage) and add a Test-Disabled label to the bug.</li></ol>"
+    }
+    bug_template{
+      comment_template: "This bug been identified as part of Chrome's flake reduction initiative. Resolution of this issue is critical because it has a large impact on the stability of Chrome CI/CQ. Resolving these issues will be essential to meet Chrome’s flake reduction goals.\n\nThis bug has led to a large number of gardened builds failing in the last 7 days.\n\nPlease consider the following strategies to mitigate the impact from this issue which are rated in order of resolution preference:\n1. Resolve the underlying test issue.\n2. Move the flaky test from Critical Builders to FYI Builder\n3. Disable test (least desirable as it reduces test coverage) and add a Test-Disabled label to this issue. The disabled tests might continue running in reviver builders (go/test-reviver), see config [1] for a list of supported builders.\n\nhttp://go/resolve-chrome-top-flakes provides more information on the tools available for resolving flaky tests.\n\nWhen investigating this failure, you may identify this bug is too broad (encompasses multiple different issues) or too narrow (only captures one part of a larger issue). If this applies, you can combine issues[2]  or split issues[3].\n\nLinks:\n[1] https://source.chromium.org/chromium/chromium/src/+/main:infra/config/subprojects/reviver/reviver.star\n[2] https://luci-analysis.appspot.com/help#combining-issues\n[3] https://luci-analysis.appspot.com/help#splitting-issues"
+      monorail {
+        labels: "Top-Flakes"
+        labels: "Test-Flaky"
+      }
+    }
+  }
+  default_bug_system: MONORAIL
+  monorail {
+    project: "chromium"
+    default_field_values {
+      # Type field.
+      field_id: 10
+      value: "Bug"
+    }
+    priority_field_id: 11
+    monorail_hostname: "bugs.chromium.org"
+    display_prefix: "crbug.com"
+    file_without_restrict_view_google: true
+  }
+}
+
 realms {
   name: "ci"
   test_variant_analysis {
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index 19c13b2..973e821 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -3070,12 +3070,6 @@
     name: "buildbucket/luci.chromium.try/android-cronet-x86-dbg-lollipop-tests"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-nougat-x86-rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-nougat-x86-rel-compilator"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-pie-arm64-dbg"
   }
   builders {
@@ -5155,11 +5149,6 @@
     short_name: "12"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/android-nougat-x86-rel"
-    category: "on_cq|x86"
-    short_name: "N"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/android-oreo-x86-rel"
     category: "on_cq|x86"
     short_name: "O"
@@ -17560,12 +17549,6 @@
     name: "buildbucket/luci.chromium.try/android-inverse-fieldtrials-pie-x86-fyi-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-nougat-x86-rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-nougat-x86-rel-compilator"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-official"
   }
   builders {
@@ -18969,12 +18952,6 @@
     name: "buildbucket/luci.chromium.try/android-inverse-fieldtrials-pie-x86-fyi-rel"
   }
   builders {
-    name: "buildbucket/luci.chromium.try/android-nougat-x86-rel"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.try/android-nougat-x86-rel-compilator"
-  }
-  builders {
     name: "buildbucket/luci.chromium.try/android-oreo-arm64-dbg"
   }
   builders {
diff --git a/infra/config/generated/luci/luci-notify.cfg b/infra/config/generated/luci/luci-notify.cfg
index 69d7393..5dfc7db6 100644
--- a/infra/config/generated/luci/luci-notify.cfg
+++ b/infra/config/generated/luci/luci-notify.cfg
@@ -2371,25 +2371,6 @@
   }
   builders {
     bucket: "ci"
-    name: "android-nougat-x86-rel"
-    repository: "https://chromium.googlesource.com/chromium/src"
-  }
-  tree_closers {
-    tree_status_host: "chromium-status.appspot.com"
-    failed_step_regexp: "\\b(bot_update|compile|gclient runhooks|runhooks|update|\\w*nocompile_test)\\b"
-  }
-}
-notifiers {
-  notifications {
-    on_occurrence: FAILURE
-    failed_step_regexp: "\\b(bot_update|compile|gclient runhooks|runhooks|update|\\w*nocompile_test)\\b"
-    email {
-      rotation_urls: "https://chrome-ops-rotation-proxy.appspot.com/current/oncallator:chrome-build-sheriff"
-    }
-    template: "tree_closure_email_template"
-  }
-  builders {
-    bucket: "ci"
     name: "android-oreo-x86-rel"
     repository: "https://chromium.googlesource.com/chromium/src"
   }
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg
index a24160d..83f6a1d 100644
--- a/infra/config/generated/luci/luci-scheduler.cfg
+++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -3741,15 +3741,6 @@
   }
 }
 job {
-  id: "android-nougat-x86-rel"
-  realm: "ci"
-  buildbucket {
-    server: "cr-buildbucket.appspot.com"
-    bucket: "ci"
-    builder: "android-nougat-x86-rel"
-  }
-}
-job {
   id: "android-official"
   realm: "ci"
   buildbucket {
@@ -6490,7 +6481,6 @@
   triggers: "android-cronet-x86-dbg"
   triggers: "android-cronet-x86-rel"
   triggers: "android-fieldtrial-rel"
-  triggers: "android-nougat-x86-rel"
   triggers: "android-official"
   triggers: "android-oreo-x86-rel"
   triggers: "android-pie-arm64-rel"
diff --git a/infra/config/generated/sheriff-rotations/android.txt b/infra/config/generated/sheriff-rotations/android.txt
index cbdceb8..82a54f4 100644
--- a/infra/config/generated/sheriff-rotations/android.txt
+++ b/infra/config/generated/sheriff-rotations/android.txt
@@ -18,7 +18,6 @@
 ci/android-androidx-packager
 ci/android-bfcache-rel
 ci/android-binary-size-generator
-ci/android-nougat-x86-rel
 ci/android-oreo-x86-rel
 ci/android-pie-arm64-dbg
 ci/android-pie-arm64-rel
diff --git a/infra/config/generated/testing/test_suites.pyl b/infra/config/generated/testing/test_suites.pyl
index 0c19674f..bb445e8 100644
--- a/infra/config/generated/testing/test_suites.pyl
+++ b/infra/config/generated/testing/test_suites.pyl
@@ -4043,7 +4043,6 @@
     'lacros_device_or_vm_gtests': {
       'aura_unittests': {},
       'cc_unittests': {},
-      'interactive_ui_tests': {},
       'ozone_unittests': {},
       'vaapi_unittest': {
         'args': [
@@ -5770,7 +5769,14 @@
       'vr_platform_specific_chromium_gtests',
     ],
 
-    'android_nougat_emulator_gtests': [
+    'android_nougat_gtests': [
+      'android_ar_gtests',
+      'android_ddready_vr_gtests',
+      'android_monochrome_smoke_tests',
+      'android_smoke_tests',
+    ],
+
+    'android_oreo_emulator_gtests': [
       'android_emulator_specific_chrome_public_tests',
       'android_monochrome_smoke_tests',
       'android_smoke_tests',
@@ -5784,13 +5790,6 @@
       'webview_ui_instrumentation_tests',
     ],
 
-    'android_nougat_gtests': [
-      'android_ar_gtests',
-      'android_ddready_vr_gtests',
-      'android_monochrome_smoke_tests',
-      'android_smoke_tests',
-    ],
-
     'android_oreo_gtests': [
       'android_ar_gtests',
       'android_ddready_vr_gtests',
@@ -6599,7 +6598,7 @@
       'network_service_fyi_gtests',
     ],
 
-    'nougat_isolated_scripts': [
+    'oreo_isolated_scripts': [
       'android_isolated_scripts',
       'chromium_junit_tests_scripts',
       'components_perftests_isolated_scripts',
diff --git a/infra/config/generated/testing/variants.pyl b/infra/config/generated/testing/variants.pyl
index 21ebfb9..02c30e7 100644
--- a/infra/config/generated/testing/variants.pyl
+++ b/infra/config/generated/testing/variants.pyl
@@ -86,16 +86,16 @@
   },
   'LACROS_VERSION_SKEW_DEV': {
     'identifier': 'Lacros version skew testing ash dev',
-    'description': 'Run with ash-chrome version 119.0.6036.0',
+    'description': 'Run with ash-chrome version 119.0.6045.10',
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome',
     ],
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v119.0.6036.0',
-          'revision': 'version:119.0.6036.0',
+          'location': 'lacros_version_skew_tests_v119.0.6045.10',
+          'revision': 'version:119.0.6045.10',
         },
       ],
     },
diff --git a/infra/config/lib/builder_health_indicators.star b/infra/config/lib/builder_health_indicators.star
index 5776a91..41b42722 100644
--- a/infra/config/lib/builder_health_indicators.star
+++ b/infra/config/lib/builder_health_indicators.star
@@ -547,8 +547,6 @@
         "android-deterministic-rel",
         "android-fieldtrial-rel",
         "android-inverse-fieldtrials-pie-x86-fyi-rel",
-        "android-nougat-x86-rel",
-        "android-nougat-x86-rel-compilator",
         "android-official",
         "android-oreo-arm64-dbg",
         "android-oreo-x86-rel",
diff --git a/infra/config/luci-analysis-dev.cfg b/infra/config/luci-analysis-dev.cfg
index ffba9fc..fb147f1 100644
--- a/infra/config/luci-analysis-dev.cfg
+++ b/infra/config/luci-analysis-dev.cfg
@@ -107,6 +107,73 @@
   display_prefix: "crbug.com"
 }
 
+bug_management {
+  policies {
+    id: "exonerations"
+    owners: "kimstephanie@google.com"
+    owners: "chrome-browser-infra-team@google.com"
+    human_readable_name: "test variant(s) are being exonerated (ignored) in presubmit"
+    priority: P2
+    metrics {
+      metric_id: "critical-failures-exonerated"
+      activation_threshold {
+        three_day: 75
+      }
+      deactivation_threshold {
+        seven_day: 1
+      }
+    }
+    explanation {
+      problem_html: "Test variant(s) in this cluster are being exonerated (ignored) in presubmit because they are too flaky or failing to gate new code changes."
+      action_html: "<ul><li>View the exonerations tab to see the test variant(s) still being exonerated.</li><li>View the recent failures tab to see example failures for those test variant(s).</li><li>If the failure cannot be fixed in a timely way, consider disabling the test.</ul>"
+    }
+    bug_template {
+      comment_template: "Test variant(s) in this cluster are being exonerated (ignored) in presubmit because they are too flaky or failing to gate new code changes."
+    }
+  }
+  policies {
+    id: "builds-failed-due-to-flaky-tests"
+    owners: "kuanhuang@google.com"
+    owners: "chrome-browser-engprod@google.com"
+    human_readable_name: "many gardened builders are failing"
+    priority: P1
+    metrics {
+      metric_id: "builds-failed-due-to-flaky-tests"
+      activation_threshold {
+        one_day: 10
+        seven_day: 20
+      }
+      deactivation_threshold {
+        seven_day: 1
+      }
+    }
+    explanation {
+      problem_html: "This cluster is making a large number of gardened builders fail."
+      action_html: "Please consider the following strategies to mitigate the impact from these issues which are rated in order of resolution preference:<ol><li>Resolve the underlying test issue</li><li>Move the flaky test from critical builders to FYI builder</li><li>Disable test (least desirable as it reduces test coverage) and add a Test-Disabled label to the bug.</li></ol>"
+    }
+    bug_template{
+      comment_template: "This bug been identified as part of Chrome's flake reduction initiative. Resolution of this issue is critical because it has a large impact on the stability of Chrome CI/CQ. Resolving these issues will be essential to meet Chrome’s flake reduction goals.\n\nThis bug has led to a large number of gardened builds failing in the last 7 days.\n\nPlease consider the following strategies to mitigate the impact from this issue which are rated in order of resolution preference:\n1. Resolve the underlying test issue.\n2. Move the flaky test from Critical Builders to FYI Builder\n3. Disable test (least desirable as it reduces test coverage) and add a Test-Disabled label to this issue. The disabled tests might continue running in reviver builders (go/test-reviver), see config [1] for a list of supported builders.\n\nhttp://go/resolve-chrome-top-flakes provides more information on the tools available for resolving flaky tests.\n\nWhen investigating this failure, you may identify this bug is too broad (encompasses multiple different issues) or too narrow (only captures one part of a larger issue). If this applies, you can combine issues[2]  or split issues[3].\n\nLinks:\n[1] https://source.chromium.org/chromium/chromium/src/+/main:infra/config/subprojects/reviver/reviver.star\n[2] https://luci-analysis.appspot.com/help#combining-issues\n[3] https://luci-analysis.appspot.com/help#splitting-issues"
+      monorail {
+        labels: "Top-Flakes"
+        labels: "Test-Flaky"
+      }
+    }
+  }
+  default_bug_system: MONORAIL
+  monorail {
+    project: "chromium"
+    default_field_values {
+      # Type field.
+      field_id: 10
+      value: "Bug"
+    }
+    priority_field_id: 11
+    monorail_hostname: "monorail-staging.appspot.com"
+    display_prefix: "crbug.com"
+    file_without_restrict_view_google: true
+  }
+}
+
 realms {
   name: "ci"
   test_variant_analysis {
diff --git a/infra/config/luci-analysis.cfg b/infra/config/luci-analysis.cfg
index 8cbae83..80105145 100644
--- a/infra/config/luci-analysis.cfg
+++ b/infra/config/luci-analysis.cfg
@@ -108,6 +108,73 @@
   file_without_restrict_view_google: true
 }
 
+bug_management {
+  policies {
+    id: "exonerations"
+    owners: "kimstephanie@google.com"
+    owners: "chrome-browser-infra-team@google.com"
+    human_readable_name: "test variant(s) are being exonerated (ignored) in presubmit"
+    priority: P2
+    metrics {
+      metric_id: "critical-failures-exonerated"
+      activation_threshold {
+        three_day: 75
+      }
+      deactivation_threshold {
+        seven_day: 1
+      }
+    }
+    explanation {
+      problem_html: "Test variant(s) in this cluster are being exonerated (ignored) in presubmit because they are too flaky or failing to gate new code changes."
+      action_html: "<ul><li>View the exonerations tab to see the test variant(s) still being exonerated.</li><li>View the recent failures tab to see example failures for those test variant(s).</li><li>If the failure cannot be fixed in a timely way, consider disabling the test.</ul>"
+    }
+    bug_template {
+      comment_template: "Test variant(s) in this cluster are being exonerated (ignored) in presubmit because they are too flaky or failing to gate new code changes."
+    }
+  }
+  policies {
+    id: "builds-failed-due-to-flaky-tests"
+    owners: "kuanhuang@google.com"
+    owners: "chrome-browser-engprod@google.com"
+    human_readable_name: "many gardened builders are failing"
+    priority: P1
+    metrics {
+      metric_id: "builds-failed-due-to-flaky-tests"
+      activation_threshold {
+        one_day: 10
+        seven_day: 20
+      }
+      deactivation_threshold {
+        seven_day: 1
+      }
+    }
+    explanation {
+      problem_html: "This cluster is making a large number of gardened builders fail."
+      action_html: "Please consider the following strategies to mitigate the impact from these issues which are rated in order of resolution preference:<ol><li>Resolve the underlying test issue</li><li>Move the flaky test from critical builders to FYI builder</li><li>Disable test (least desirable as it reduces test coverage) and add a Test-Disabled label to the bug.</li></ol>"
+    }
+    bug_template{
+      comment_template: "This bug been identified as part of Chrome's flake reduction initiative. Resolution of this issue is critical because it has a large impact on the stability of Chrome CI/CQ. Resolving these issues will be essential to meet Chrome’s flake reduction goals.\n\nThis bug has led to a large number of gardened builds failing in the last 7 days.\n\nPlease consider the following strategies to mitigate the impact from this issue which are rated in order of resolution preference:\n1. Resolve the underlying test issue.\n2. Move the flaky test from Critical Builders to FYI Builder\n3. Disable test (least desirable as it reduces test coverage) and add a Test-Disabled label to this issue. The disabled tests might continue running in reviver builders (go/test-reviver), see config [1] for a list of supported builders.\n\nhttp://go/resolve-chrome-top-flakes provides more information on the tools available for resolving flaky tests.\n\nWhen investigating this failure, you may identify this bug is too broad (encompasses multiple different issues) or too narrow (only captures one part of a larger issue). If this applies, you can combine issues[2]  or split issues[3].\n\nLinks:\n[1] https://source.chromium.org/chromium/chromium/src/+/main:infra/config/subprojects/reviver/reviver.star\n[2] https://luci-analysis.appspot.com/help#combining-issues\n[3] https://luci-analysis.appspot.com/help#splitting-issues"
+      monorail {
+        labels: "Top-Flakes"
+        labels: "Test-Flaky"
+      }
+    }
+  }
+  default_bug_system: MONORAIL
+  monorail {
+    project: "chromium"
+    default_field_values {
+      # Type field.
+      field_id: 10
+      value: "Bug"
+    }
+    priority_field_id: 11
+    monorail_hostname: "bugs.chromium.org"
+    display_prefix: "crbug.com"
+    file_without_restrict_view_google: true
+  }
+}
+
 realms {
   name: "ci"
   test_variant_analysis {
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star
index 43d22f2..0c68df0 100644
--- a/infra/config/subprojects/chromium/ci/chromium.android.star
+++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -1439,34 +1439,6 @@
 )
 
 ci.builder(
-    name = "android-nougat-x86-rel",
-    branch_selector = branches.selector.ANDROID_BRANCHES,
-    builder_spec = builder_config.builder_spec(
-        gclient_config = builder_config.gclient_config(
-            config = "chromium",
-            apply_configs = ["android", "enable_wpr_tests"],
-        ),
-        chromium_config = builder_config.chromium_config(
-            config = "android",
-            build_config = builder_config.build_config.RELEASE,
-            target_bits = 32,
-            target_platform = builder_config.target_platform.ANDROID,
-        ),
-        android_config = builder_config.android_config(
-            config = "x86_builder_mb",
-        ),
-        build_gs_bucket = "chromium-android-archive",
-    ),
-    tree_closing = True,
-    console_view_entry = consoles.console_view_entry(
-        category = "on_cq|x86",
-        short_name = "N",
-    ),
-    contact_team_email = "clank-engprod@google.com",
-    execution_timeout = 4 * time.hour,
-)
-
-ci.builder(
     name = "android-oreo-x86-rel",
     branch_selector = branches.selector.ANDROID_BRANCHES,
     builder_spec = builder_config.builder_spec(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
index 7d37925..90f6488 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -468,34 +468,6 @@
     use_java_coverage = True,
 )
 
-# TODO(crbug.com/1487812): Remove the builder once all builds finish.
-try_.orchestrator_builder(
-    name = "android-nougat-x86-rel",
-    branch_selector = branches.selector.ANDROID_BRANCHES,
-    mirrors = [
-        "ci/android-nougat-x86-rel",
-    ],
-    compilator = "android-nougat-x86-rel-compilator",
-    coverage_test_types = ["unit", "overall"],
-    experiments = {
-        "chromium.add_one_test_shard": 10,
-    },
-    main_list_view = "try",
-    # tryjob = try_.job(),
-    # TODO(crbug.com/1372179): Use orchestrator pool once overloaded test pools
-    # are addressed
-    # use_orchestrator_pool = True,
-    use_java_coverage = True,
-)
-
-try_.compilator_builder(
-    name = "android-nougat-x86-rel-compilator",
-    branch_selector = branches.selector.ANDROID_BRANCHES,
-    cores = 64 if settings.is_main else 32,
-    main_list_view = "try",
-    siso_enabled = True,
-)
-
 try_.builder(
     name = "android-oreo-arm64-dbg",
     branch_selector = branches.selector.ANDROID_BRANCHES,
diff --git a/infra/config/targets/basic_suites.star b/infra/config/targets/basic_suites.star
index 1afdf8a..4acb707 100644
--- a/infra/config/targets/basic_suites.star
+++ b/infra/config/targets/basic_suites.star
@@ -4730,7 +4730,6 @@
     tests = {
         "aura_unittests": None,
         "cc_unittests": None,
-        "interactive_ui_tests": None,
         "ozone_unittests": None,
         "vaapi_unittest": targets.legacy_test_config(
             args = [
diff --git a/infra/config/targets/compound_suites.star b/infra/config/targets/compound_suites.star
index d167a58d..3b75aa8 100644
--- a/infra/config/targets/compound_suites.star
+++ b/infra/config/targets/compound_suites.star
@@ -42,7 +42,17 @@
 )
 
 targets.legacy_compound_suite(
-    name = "android_nougat_emulator_gtests",
+    name = "android_nougat_gtests",
+    basic_suites = [
+        "android_ar_gtests",
+        "android_ddready_vr_gtests",
+        "android_monochrome_smoke_tests",
+        "android_smoke_tests",
+    ],
+)
+
+targets.legacy_compound_suite(
+    name = "android_oreo_emulator_gtests",
     basic_suites = [
         "android_emulator_specific_chrome_public_tests",
         "android_monochrome_smoke_tests",
@@ -59,16 +69,6 @@
 )
 
 targets.legacy_compound_suite(
-    name = "android_nougat_gtests",
-    basic_suites = [
-        "android_ar_gtests",
-        "android_ddready_vr_gtests",
-        "android_monochrome_smoke_tests",
-        "android_smoke_tests",
-    ],
-)
-
-targets.legacy_compound_suite(
     name = "android_oreo_gtests",
     basic_suites = [
         "android_ar_gtests",
@@ -1301,7 +1301,7 @@
 )
 
 targets.legacy_compound_suite(
-    name = "nougat_isolated_scripts",
+    name = "oreo_isolated_scripts",
     basic_suites = [
         "android_isolated_scripts",
         "chromium_junit_tests_scripts",
diff --git a/infra/config/targets/lacros-version-skew-variants.json b/infra/config/targets/lacros-version-skew-variants.json
index 8175b2f..16a29a4c 100644
--- a/infra/config/targets/lacros-version-skew-variants.json
+++ b/infra/config/targets/lacros-version-skew-variants.json
@@ -17,16 +17,16 @@
   },
   "LACROS_VERSION_SKEW_DEV": {
     "args": [
-      "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+      "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
     ],
-    "description": "Run with ash-chrome version 119.0.6036.0",
+    "description": "Run with ash-chrome version 119.0.6045.10",
     "identifier": "Lacros version skew testing ash dev",
     "swarming": {
       "cipd_packages": [
         {
           "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-          "location": "lacros_version_skew_tests_v119.0.6036.0",
-          "revision": "version:119.0.6036.0"
+          "location": "lacros_version_skew_tests_v119.0.6045.10",
+          "revision": "version:119.0.6045.10"
         }
       ]
     }
diff --git a/internal b/internal
index a5014cf..b37dac9 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit a5014cf1296cc48d048dc5d99a0d57f0b194538c
+Subproject commit b37dac90c174d29f67069741bb087a6047481e65
diff --git a/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.mm b/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.mm
index 21389b74..819592ca 100644
--- a/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.mm
+++ b/ios/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.mm
@@ -120,11 +120,11 @@
 
   auto input_context =
       base::MakeRefCounted<segmentation_platform::InputContext>();
-  int mvt_freshness_impression_count = 0;
-  int shortcuts_freshness_impression_count = 0;
-  int safety_check_freshness_impression_count = 0;
-  int tab_resumption_freshness_impression_count = 0;
-  int parcel_tracking_freshness_impression_count = 0;
+  int mvt_freshness_impression_count = -1;
+  int shortcuts_freshness_impression_count = -1;
+  int safety_check_freshness_impression_count = -1;
+  int tab_resumption_freshness_impression_count = -1;
+  int parcel_tracking_freshness_impression_count = -1;
   input_context->metadata_args.emplace(
       segmentation_platform::kMostVisitedTilesFreshness,
       segmentation_platform::processing::ProcessedValue::FromFloat(
diff --git a/ios_internal b/ios_internal
index c8752752..72a45e8 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit c87527527121f2dc3dd815a4299cda43dc926b29
+Subproject commit 72a45e87af568c2e2ed006aca80c54dc795e99da
diff --git a/media/base/test_helpers.cc b/media/base/test_helpers.cc
index 2ba4536..87ae54e 100644
--- a/media/base/test_helpers.cc
+++ b/media/base/test_helpers.cc
@@ -488,6 +488,27 @@
   return mismatched_encrypted_buffer;
 }
 
+scoped_refptr<DecoderBuffer> CreateFakeEncryptedBuffer() {
+  const int buffer_size = 16;  // Need a non-empty buffer;
+  scoped_refptr<DecoderBuffer> buffer(
+      base::MakeRefCounted<DecoderBuffer>(buffer_size));
+
+  const uint8_t kFakeKeyId[] = {0x4b, 0x65, 0x79, 0x20, 0x49, 0x44};
+  const uint8_t kFakeIv[DecryptConfig::kDecryptionKeySize] = {0};
+  buffer->set_decrypt_config(DecryptConfig::CreateCencConfig(
+      std::string(reinterpret_cast<const char*>(kFakeKeyId),
+                  std::size(kFakeKeyId)),
+      std::string(reinterpret_cast<const char*>(kFakeIv), std::size(kFakeIv)),
+      std::vector<SubsampleEntry>()));
+  return buffer;
+}
+
+scoped_refptr<DecoderBuffer> CreateClearBuffer() {
+  const int buffer_size = 16;  // Need a non-empty buffer;
+  auto buffer = base::MakeRefCounted<DecoderBuffer>(buffer_size);
+  return buffer;
+}
+
 bool VerifyFakeVideoBufferForTest(const DecoderBuffer& buffer,
                                   const VideoDecoderConfig& config) {
   // Check if the input |buffer| matches the |config|.
diff --git a/media/base/test_helpers.h b/media/base/test_helpers.h
index 553e5d61..b008cdb 100644
--- a/media/base/test_helpers.h
+++ b/media/base/test_helpers.h
@@ -233,6 +233,12 @@
 // out and do not continue to decode or decrypt if subsamples do not match.
 scoped_refptr<DecoderBuffer> CreateMismatchedBufferForTest();
 
+// Create fake encrypted buffer for testing purposes.
+scoped_refptr<DecoderBuffer> CreateFakeEncryptedBuffer();
+
+// Create fake clear buffer for testing purposes.
+scoped_refptr<DecoderBuffer> CreateClearBuffer();
+
 // Verify if a fake video DecoderBuffer is valid.
 bool VerifyFakeVideoBufferForTest(const DecoderBuffer& buffer,
                                   const VideoDecoderConfig& config);
diff --git a/media/filters/audio_decoder_unittest.cc b/media/filters/audio_decoder_unittest.cc
index a7b25336..78eb40b 100644
--- a/media/filters/audio_decoder_unittest.cc
+++ b/media/filters/audio_decoder_unittest.cc
@@ -683,12 +683,20 @@
   EXPECT_TRUE(last_decode_status().is_ok());
 }
 
-TEST_P(AudioDecoderTest, DecodeMismatchedSubsamples) {
+TEST_P(AudioDecoderTest, MismatchedSubsampleBuffer) {
   ASSERT_NO_FATAL_FAILURE(Initialize());
   DecodeBuffer(CreateMismatchedBufferForTest());
   EXPECT_TRUE(!last_decode_status().is_ok());
 }
 
+// The AudioDecoders do not support encrypted buffers since they were
+// initialized without cdm_context.
+TEST_P(AudioDecoderTest, EncryptedBuffer) {
+  ASSERT_NO_FATAL_FAILURE(Initialize());
+  DecodeBuffer(CreateFakeEncryptedBuffer());
+  EXPECT_TRUE(!last_decode_status().is_ok());
+}
+
 TEST_P(AudioDecoderTest, Reset) {
   ASSERT_NO_FATAL_FAILURE(Initialize());
   Reset();
diff --git a/media/filters/decrypting_audio_decoder_unittest.cc b/media/filters/decrypting_audio_decoder_unittest.cc
index 335a7ae..af06390 100644
--- a/media/filters/decrypting_audio_decoder_unittest.cc
+++ b/media/filters/decrypting_audio_decoder_unittest.cc
@@ -39,23 +39,8 @@
 // Make sure the kFakeAudioFrameSize is a valid frame size for all audio decoder
 // configs used in this test.
 const int kFakeAudioFrameSize = 48;
-const uint8_t kFakeKeyId[] = {0x4b, 0x65, 0x79, 0x20, 0x49, 0x44};
-const uint8_t kFakeIv[DecryptConfig::kDecryptionKeySize] = {0};
 const int kDecodingDelay = 3;
 
-// Create a fake non-empty encrypted buffer.
-static scoped_refptr<DecoderBuffer> CreateFakeEncryptedBuffer() {
-  const int buffer_size = 16;  // Need a non-empty buffer;
-  scoped_refptr<DecoderBuffer> buffer(
-      base::MakeRefCounted<DecoderBuffer>(buffer_size));
-  buffer->set_decrypt_config(DecryptConfig::CreateCencConfig(
-      std::string(reinterpret_cast<const char*>(kFakeKeyId),
-                  std::size(kFakeKeyId)),
-      std::string(reinterpret_cast<const char*>(kFakeIv), std::size(kFakeIv)),
-      std::vector<SubsampleEntry>()));
-  return buffer;
-}
-
 class DecryptingAudioDecoderTest : public testing::Test {
  public:
   DecryptingAudioDecoderTest()
diff --git a/media/filters/decrypting_demuxer_stream.cc b/media/filters/decrypting_demuxer_stream.cc
index e923620..dee07ab 100644
--- a/media/filters/decrypting_demuxer_stream.cc
+++ b/media/filters/decrypting_demuxer_stream.cc
@@ -272,14 +272,11 @@
     return;
   }
 
-  if (HasClearLead()) {
-    if (pending_buffer_to_decrypt_->decrypt_config()->encryption_scheme() !=
-            EncryptionScheme::kUnencrypted &&
-        !switched_clear_to_encrypted_) {
-      MEDIA_LOG(INFO, media_log_)
-          << "Stream switched from clear to encrypted buffers.";
-      switched_clear_to_encrypted_ = true;
-    }
+  if (HasClearLead() && !switched_clear_to_encrypted_ &&
+      pending_buffer_to_decrypt_->is_encrypted()) {
+    MEDIA_LOG(INFO, media_log_)
+        << "First switch from clear to encrypted buffers.";
+    switched_clear_to_encrypted_ = true;
   }
 
   decryptor_->Decrypt(GetDecryptorStreamType(), pending_buffer_to_decrypt_,
diff --git a/media/filters/decrypting_video_decoder_unittest.cc b/media/filters/decrypting_video_decoder_unittest.cc
index e23a7e6..c99d65a 100644
--- a/media/filters/decrypting_video_decoder_unittest.cc
+++ b/media/filters/decrypting_video_decoder_unittest.cc
@@ -34,28 +34,8 @@
 
 namespace media {
 
-const uint8_t kFakeKeyId[] = {0x4b, 0x65, 0x79, 0x20, 0x49, 0x44};
-const uint8_t kFakeIv[DecryptConfig::kDecryptionKeySize] = {0};
 const int kDecodingDelay = 3;
 
-// Create a fake non-empty encrypted buffer.
-static scoped_refptr<DecoderBuffer> CreateFakeEncryptedBuffer() {
-  const int buffer_size = 16;  // Need a non-empty buffer;
-  auto buffer = base::MakeRefCounted<DecoderBuffer>(buffer_size);
-  buffer->set_decrypt_config(DecryptConfig::CreateCencConfig(
-      std::string(reinterpret_cast<const char*>(kFakeKeyId),
-                  std::size(kFakeKeyId)),
-      std::string(reinterpret_cast<const char*>(kFakeIv), std::size(kFakeIv)),
-      {}));
-  return buffer;
-}
-
-static scoped_refptr<DecoderBuffer> CreateClearBuffer() {
-  const int buffer_size = 16;  // Need a non-empty buffer;
-  auto buffer = base::MakeRefCounted<DecoderBuffer>(buffer_size);
-  return buffer;
-}
-
 class DecryptingVideoDecoderTest : public testing::Test {
  public:
   DecryptingVideoDecoderTest()
diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc
index 66e9be9..0bc4128 100644
--- a/media/filters/ffmpeg_audio_decoder.cc
+++ b/media/filters/ffmpeg_audio_decoder.cc
@@ -158,9 +158,7 @@
     return;
   }
 
-  if (!buffer.end_of_stream() && buffer.decrypt_config() &&
-      buffer.decrypt_config()->encryption_scheme() !=
-          EncryptionScheme::kUnencrypted) {
+  if (!buffer.end_of_stream() && buffer.is_encrypted()) {
     DLOG(ERROR) << "Encrypted buffer not supported";
     std::move(decode_cb).Run(DecoderStatus::Codes::kUnsupportedEncryptionMode);
     return;
diff --git a/media/filters/mac/audio_toolbox_audio_decoder.cc b/media/filters/mac/audio_toolbox_audio_decoder.cc
index 83944fe4..10d261d 100644
--- a/media/filters/mac/audio_toolbox_audio_decoder.cc
+++ b/media/filters/mac/audio_toolbox_audio_decoder.cc
@@ -149,9 +149,7 @@
     return;
   }
 
-  if (!buffer->end_of_stream() && buffer->decrypt_config() &&
-      buffer->decrypt_config()->encryption_scheme() !=
-          EncryptionScheme::kUnencrypted) {
+  if (!buffer->end_of_stream() && buffer->is_encrypted()) {
     DLOG(ERROR) << "Encrypted buffer not supported";
     std::move(decode_cb_bound)
         .Run(DecoderStatus::Codes::kUnsupportedEncryptionMode);
diff --git a/media/filters/win/media_foundation_audio_decoder.cc b/media/filters/win/media_foundation_audio_decoder.cc
index c8f75d8..3013f51 100644
--- a/media/filters/win/media_foundation_audio_decoder.cc
+++ b/media/filters/win/media_foundation_audio_decoder.cc
@@ -207,9 +207,7 @@
     }
   }
 
-  if (buffer->decrypt_config() &&
-      buffer->decrypt_config()->encryption_scheme() !=
-          EncryptionScheme::kUnencrypted) {
+  if (buffer->is_encrypted()) {
     DLOG(ERROR) << "Encrypted buffer not supported";
     std::move(decode_cb_bound)
         .Run(DecoderStatus::Codes::kUnsupportedEncryptionMode);
diff --git a/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn
index 25526fa..a3f30ea 100644
--- a/media/gpu/v4l2/BUILD.gn
+++ b/media/gpu/v4l2/BUILD.gn
@@ -20,6 +20,8 @@
     "legacy/v4l2_video_decode_accelerator.h",
     "stateless/device.cc",
     "stateless/device.h",
+    "stateless/queue.cc",
+    "stateless/queue.h",
     "stateless/stateless_decode_surface_handler.h",
     "stateless/stateless_device.cc",
     "stateless/stateless_device.h",
diff --git a/media/gpu/v4l2/stateless/device.cc b/media/gpu/v4l2/stateless/device.cc
index a436227..3e6f1e5 100644
--- a/media/gpu/v4l2/stateless/device.cc
+++ b/media/gpu/v4l2/stateless/device.cc
@@ -10,7 +10,6 @@
 #include "build/build_config.h"
 #if BUILDFLAG(IS_CHROMEOS)
 #include <linux/media/av1-ctrls.h>
-#include <linux/media/vp9-ctrls-upstream.h>
 #endif
 
 #include <fcntl.h>
@@ -111,6 +110,30 @@
   return pix_fmts;
 }
 
+// VIDIOC_S_FMT
+bool Device::SetInputFormat(VideoCodec codec,
+                            gfx::Size resolution,
+                            size_t encoded_buffer_size) {
+  const uint32_t pix_fmt = VideoCodecToV4L2PixFmt(codec);
+  struct v4l2_format format;
+  memset(&format, 0, sizeof(format));
+  format.type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE;
+  format.fmt.pix_mp.pixelformat = pix_fmt;
+  format.fmt.pix_mp.width = resolution.width();
+  format.fmt.pix_mp.height = resolution.height();
+  format.fmt.pix_mp.num_planes = 1;
+  format.fmt.pix_mp.plane_fmt[0].sizeimage = encoded_buffer_size;
+
+  if (IoctlDevice(VIDIOC_S_FMT, &format) != kIoctlOk ||
+      format.fmt.pix_mp.pixelformat != pix_fmt) {
+    DVLOGF(1) << "Failed to set format fourcc: " << FourccToString(pix_fmt);
+
+    return false;
+  }
+
+  return true;
+}
+
 // VIDIOC_ENUM_FRAMESIZES
 std::pair<gfx::Size, gfx::Size> Device::GetFrameResolutionRange(
     VideoCodec codec) {
diff --git a/media/gpu/v4l2/stateless/device.h b/media/gpu/v4l2/stateless/device.h
index 827a991c..deca4fa 100644
--- a/media/gpu/v4l2/stateless/device.h
+++ b/media/gpu/v4l2/stateless/device.h
@@ -18,6 +18,9 @@
 
 namespace media {
 
+enum class BufferType { kCompressedData, kRawFrames, kInvalid };
+enum class MemoryType { kMemoryMapped, kDmaBuf, kInvalid };
+
 // Encapsulates the v4l2 subsystem and prevents <linux/videodev2.h> from
 // being included elsewhere with the possible exception of the codec specific
 // delegates. This keeps all of the v4l2 driver specific structures in one
@@ -32,7 +35,14 @@
   // These are all of the compressed formats that the driver will accept.
   std::set<VideoCodec> EnumerateInputFormats();
 
-  // VIDIOC_ENUM_FRAMESIZES
+  // Configures the driver to the requested |codec|, |resolution|, and
+  // |encoded_buffer_size| using the VIDIOC_S_FMT ioctl.
+  bool SetInputFormat(VideoCodec codec,
+                      gfx::Size resolution,
+                      size_t encoded_buffer_size);
+
+  // Query the driver for the smallest and largest uncompressed frame sizes that
+  // are supported using the VIDIOC_ENUM_FRAMESIZES ioctl.
   std::pair<gfx::Size, gfx::Size> GetFrameResolutionRange(VideoCodec codec);
 
   // Uses the VIDIOC_QUERYCTRL and VIDIOC_QUERYMENU ioctls to list the
diff --git a/media/gpu/v4l2/stateless/queue.cc b/media/gpu/v4l2/stateless/queue.cc
new file mode 100644
index 0000000..eb432a09
--- /dev/null
+++ b/media/gpu/v4l2/stateless/queue.cc
@@ -0,0 +1,71 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "media/gpu/v4l2/stateless/queue.h"
+
+#include "base/containers/contains.h"
+#include "media/gpu/macros.h"
+
+namespace {
+// See http://crbug.com/255116.
+constexpr int k1080pArea = 1920 * 1088;
+// Input bitstream buffer size for up to 1080p streams.
+constexpr size_t kInputBufferMaxSizeFor1080p = 1024 * 1024;
+// Input bitstream buffer size for up to 4k streams.
+constexpr size_t kInputBufferMaxSizeFor4k = 4 * kInputBufferMaxSizeFor1080p;
+// The number of planes for a compressed buffer is always 1.
+constexpr uint32_t kNumberInputPlanes = 1;
+}  // namespace
+
+namespace media {
+
+BaseQueue::BaseQueue(scoped_refptr<StatelessDevice> device,
+                     BufferType buffer_type,
+                     MemoryType memory_type)
+    : device_(std::move(device)),
+      buffer_type_(buffer_type),
+      memory_type_(memory_type) {}
+
+BaseQueue::~BaseQueue() {
+  DVLOGF(4);
+}
+
+// static
+std::unique_ptr<InputQueue> InputQueue::Create(
+    scoped_refptr<StatelessDevice> device,
+    const VideoCodec codec,
+    const gfx::Size resolution) {
+  CHECK(device);
+  std::unique_ptr<InputQueue> queue =
+      std::make_unique<InputQueue>(device, codec);
+
+  if (!queue->SetupFormat(resolution)) {
+    return nullptr;
+  }
+
+  return queue;
+}
+
+InputQueue::InputQueue(scoped_refptr<StatelessDevice> device, VideoCodec codec)
+    : BaseQueue(device, BufferType::kCompressedData, MemoryType::kMemoryMapped),
+      codec_(codec) {}
+
+bool InputQueue::SetupFormat(const gfx::Size resolution) {
+  DVLOGF(4);
+  CHECK(device_);
+
+  const auto range = device_->GetFrameResolutionRange(codec_);
+
+  size_t encoded_buffer_size = range.second.GetArea() > k1080pArea
+                                   ? kInputBufferMaxSizeFor4k
+                                   : kInputBufferMaxSizeFor1080p;
+  if (!device_->SetInputFormat(codec_, resolution, encoded_buffer_size)) {
+    return false;
+  }
+
+  num_planes_ = kNumberInputPlanes;
+  return true;
+}
+
+}  // namespace media
diff --git a/media/gpu/v4l2/stateless/queue.h b/media/gpu/v4l2/stateless/queue.h
new file mode 100644
index 0000000..9f096995
--- /dev/null
+++ b/media/gpu/v4l2/stateless/queue.h
@@ -0,0 +1,50 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MEDIA_GPU_V4L2_STATELESS_QUEUE_H_
+#define MEDIA_GPU_V4L2_STATELESS_QUEUE_H_
+
+#include "media/base/video_codecs.h"
+#include "media/gpu/chromeos/fourcc.h"
+#include "media/gpu/media_gpu_export.h"
+#include "media/gpu/v4l2/stateless/stateless_device.h"
+
+namespace media {
+
+// V4L2 has two similar queues. Capitalized OUTPUT (for compressed frames)
+// and CAPTURE (for uncompressed frames) are the designation that the V4L2
+// framework uses. As these are counterintuitive for video decoding this class
+// encapsulates the compressed frames into |InputQueue| and uncompressed frames
+// into |OutputQueue|.
+class MEDIA_GPU_EXPORT BaseQueue {
+ public:
+  BaseQueue(scoped_refptr<StatelessDevice> device,
+            BufferType buffer_type,
+            MemoryType memory_type);
+  BaseQueue& operator=(const BaseQueue&);
+  ~BaseQueue();
+
+  scoped_refptr<StatelessDevice> device_;
+  const BufferType buffer_type_;
+  const MemoryType memory_type_;
+  uint32_t num_planes_;
+};
+
+class MEDIA_GPU_EXPORT InputQueue : public BaseQueue {
+ public:
+  static std::unique_ptr<InputQueue> Create(
+      scoped_refptr<StatelessDevice> device,
+      const VideoCodec codec,
+      const gfx::Size resolution);
+
+  InputQueue(scoped_refptr<StatelessDevice> device, VideoCodec codec);
+
+ private:
+  bool SetupFormat(const gfx::Size resolution);
+
+  VideoCodec codec_;
+};
+
+}  // namespace media
+#endif  // MEDIA_GPU_V4L2_STATELESS_QUEUE_H_
diff --git a/media/gpu/v4l2/stateless/v4l2_stateless_video_decoder.cc b/media/gpu/v4l2/stateless/v4l2_stateless_video_decoder.cc
index 3838ed76..9f35c6f 100644
--- a/media/gpu/v4l2/stateless/v4l2_stateless_video_decoder.cc
+++ b/media/gpu/v4l2/stateless/v4l2_stateless_video_decoder.cc
@@ -193,6 +193,18 @@
   return true;
 }
 
+bool V4L2StatelessVideoDecoder::CreateInputQueue(VideoCodecProfile profile,
+                                                 const gfx::Size resolution) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(decoder_sequence_checker_);
+  DVLOGF(4);
+  DCHECK(!input_queue_);
+
+  const VideoCodec codec = VideoCodecProfileToVideoCodec(profile);
+  input_queue_ = InputQueue::Create(device_, codec, resolution);
+
+  return !!input_queue_;
+}
+
 void V4L2StatelessVideoDecoder::ProcessCompressedBuffer(
     scoped_refptr<DecoderBuffer> compressed_buffer,
     VideoDecoder::DecodeCB decode_cb,
@@ -222,7 +234,14 @@
       switch (decode_result) {
         case AcceleratedVideoDecoder::kConfigChange:
           VLOGF(2) << "AcceleratedVideoDecoder::kConfigChange";
-          NOTIMPLEMENTED();
+          if (!CreateInputQueue(decoder_->GetProfile(),
+                                decoder_->GetPicSize())) {
+            std::move(decode_cb).Run(
+                DecoderStatus::Codes::kPlatformDecodeFailure);
+            VLOGF(1) << "Unable to create an input queue for "
+                     << GetProfileName(decoder_->GetProfile())
+                     << " of resolution " << decoder_->GetPicSize().ToString();
+          }
           break;
         case AcceleratedVideoDecoder::kColorSpaceChange:
           VLOGF(2) << "AcceleratedVideoDecoder::kColorSpaceChange";
diff --git a/media/gpu/v4l2/stateless/v4l2_stateless_video_decoder.h b/media/gpu/v4l2/stateless/v4l2_stateless_video_decoder.h
index 2b647b25..d6bca15 100644
--- a/media/gpu/v4l2/stateless/v4l2_stateless_video_decoder.h
+++ b/media/gpu/v4l2/stateless/v4l2_stateless_video_decoder.h
@@ -18,6 +18,7 @@
 #include "media/base/waiting.h"
 #include "media/gpu/accelerated_video_decoder.h"
 #include "media/gpu/chromeos/video_decoder_pipeline.h"
+#include "media/gpu/v4l2/stateless/queue.h"
 #include "media/gpu/v4l2/stateless/stateless_decode_surface_handler.h"
 #include "media/gpu/v4l2/stateless/stateless_device.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
@@ -76,6 +77,11 @@
   // the |decoder_| member variable.
   bool CreateDecoder(VideoCodecProfile profile, VideoColorSpace color_space);
 
+  // Create a queue of buffers for compressed frames to go into. V4L2 needs
+  // to know |profile| and |resolution| in order to know if the queue
+  // can be created.
+  bool CreateInputQueue(VideoCodecProfile profile, const gfx::Size resolution);
+
   // Process the data in the |compressed_buffer| using the |decoder_|.
   void ProcessCompressedBuffer(scoped_refptr<DecoderBuffer> compressed_buffer,
                                VideoDecoder::DecodeCB decode_cb,
@@ -92,6 +98,8 @@
   // Video decoder used to parse stream headers by software.
   std::unique_ptr<AcceleratedVideoDecoder> decoder_;
 
+  std::unique_ptr<InputQueue> input_queue_;
+
   // Int32 safe ID generator, starting at 0. Generated IDs are used to uniquely
   // identify a Decode() request for stateless backends. BitstreamID is just
   // a "phantom type" (see StrongAlias), essentially just a name.
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
index 2767423..43c647f 100644
--- a/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
+++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifier.java
@@ -95,8 +95,8 @@
 
     /**
      * Returns NetID of device's current default connected network used for
-     * communication. Only available on Lollipop and newer releases and when
-     * auto-detection has been enabled, returns NetId.INVALID otherwise.
+     * communication. Only available when auto-detection has been enabled,
+     * returns NetId.INVALID otherwise.
      */
     @CalledByNative
     public long getCurrentDefaultNetId() {
@@ -108,8 +108,7 @@
      * networks and ConnectionTypes. Array elements are a repeated sequence of:
      *   NetID of network
      *   ConnectionType of network
-     * Only available on Lollipop and newer releases and when auto-detection has
-     * been enabled.
+     * Only available when auto-detection has been enabled.
      */
     @CalledByNative
     public long[] getCurrentNetworksAndTypes() {
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
index dee5d4f..b4e9829f 100644
--- a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
+++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
@@ -231,10 +231,6 @@
             // If |networkInfo| is BLOCKED, but the app is in the foreground, then it's likely that
             // Android hasn't finished updating the network access permissions as BLOCKED is only
             // meant for apps in the background.  See https://crbug.com/677365 for more details.
-            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
-                // https://crbug.com/677365 primarily affects only Lollipop and higher versions.
-                return null;
-            }
 
             if (networkInfo.getDetailedState() != NetworkInfo.DetailedState.BLOCKED) {
                 // Network state is not blocked which implies that network access is
@@ -302,7 +298,6 @@
         /**
          * Fetches NetworkInfo for |network|. Does not account for underlying VPNs; see
          * getNetworkInfo(Network) for a method that does.
-         * Only callable on Lollipop and newer releases.
          */
         NetworkInfo getRawNetworkInfo(Network network) {
             try {
@@ -319,7 +314,6 @@
 
         /**
          * Fetches NetworkInfo for |network|.
-         * Only callable on Lollipop and newer releases.
          */
         NetworkInfo getNetworkInfo(Network network) {
             NetworkInfo networkInfo = getRawNetworkInfo(network);
@@ -334,7 +328,6 @@
 
         /**
          * Returns connection type for |network|.
-         * Only callable on Lollipop and newer releases.
          */
         @ConnectionType
         int getConnectionType(Network network) {
@@ -349,7 +342,6 @@
          * Returns all connected networks. This may include networks that aren't useful
          * to Chrome (e.g. MMS, IMS, FOTA etc) or aren't accessible to Chrome (e.g. a VPN for
          * another user); use {@link getAllNetworks} for a filtered list.
-         * Only callable on Lollipop and newer releases.
          */
         @VisibleForTesting
         protected Network[] getAllNetworksUnfiltered() {
@@ -408,7 +400,6 @@
         /**
          * Registers networkCallback to receive notifications about networks
          * that satisfy networkRequest.
-         * Only callable on Lollipop and newer releases.
          */
         void registerNetworkCallback(
                 NetworkRequest networkRequest, NetworkCallback networkCallback, Handler handler) {
@@ -437,7 +428,6 @@
 
         /**
          * Unregisters networkCallback from receiving notifications.
-         * Only callable on Lollipop and newer releases.
          */
         void unregisterNetworkCallback(NetworkCallback networkCallback) {
             mConnectivityManager.unregisterNetworkCallback(networkCallback);
@@ -445,7 +435,6 @@
 
         /**
          * Returns the current default {@link Network}, or {@code null} if disconnected.
-         * Only callable on Lollipop and newer releases.
          */
         Network getDefaultNetwork() {
             Network defaultNetwork = null;
@@ -1010,17 +999,13 @@
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
             mWifiManagerDelegate = new WifiManagerDelegate(ContextUtils.getApplicationContext());
         }
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-            mNetworkCallback = new MyNetworkCallback();
-            mNetworkRequest = new NetworkRequest.Builder()
-                                      .addCapability(NET_CAPABILITY_INTERNET)
-                                      // Need to hear about VPNs too.
-                                      .removeCapability(NET_CAPABILITY_NOT_VPN)
-                                      .build();
-        } else {
-            mNetworkCallback = null;
-            mNetworkRequest = null;
-        }
+        mNetworkCallback = new MyNetworkCallback();
+        mNetworkRequest = new NetworkRequest.Builder()
+                                  .addCapability(NET_CAPABILITY_INTERNET)
+                                  // Need to hear about VPNs too.
+                                  .removeCapability(NET_CAPABILITY_NOT_VPN)
+                                  .build();
+
         // Use AndroidRDefaultNetworkCallback to fix Android R issue crbug.com/1120144.
         // This NetworkCallback could be used on O+ (where onCapabilitiesChanged and
         // onLinkProperties callbacks are guaranteed to be called after onAvailable)
@@ -1195,7 +1180,6 @@
 
     /**
      * Returns all connected networks that are useful and accessible to Chrome.
-     * Only callable on Lollipop and newer releases.
      * @param ignoreNetwork ignore this network as if it is not connected.
      */
     private static Network[] getAllNetworksFiltered(
@@ -1229,7 +1213,6 @@
 
     /**
      * Returns all connected networks that are useful and accessible to Chrome.
-     * Only callable on Lollipop and newer releases.
      */
     public Network[] getNetworksForTesting() {
         return getAllNetworksFiltered(mConnectivityManagerDelegate, null);
@@ -1241,13 +1224,9 @@
      * Array elements are a repeated sequence of:
      *   NetID of network
      *   ConnectionType of network
-     * Only available on Lollipop and newer releases and when auto-detection has
-     * been enabled.
+     * Only available when auto-detection has been enabled.
      */
     public long[] getNetworksAndTypes() {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
-            return new long[0];
-        }
         final Network networks[] = getAllNetworksFiltered(mConnectivityManagerDelegate, null);
         final long networksAndTypes[] = new long[networks.length * 2];
         int index = 0;
@@ -1261,20 +1240,16 @@
     /**
      * Returns the device's current default connected network used for
      * communication.
-     * Only implemented on Lollipop and newer releases, returns null when not implemented.
+     * Returns null when not implemented.
      */
     public Network getDefaultNetwork() {
-        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
-            return null;
-        }
         return mConnectivityManagerDelegate.getDefaultNetwork();
     }
 
     /**
      * Returns NetID of device's current default connected network used for
      * communication.
-     * Only implemented on Lollipop and newer releases, returns NetId.INVALID
-     * when not implemented.
+     * Returns NetId.INVALID when not implemented.
      */
     public long getDefaultNetId() {
         Network network = getDefaultNetwork();
@@ -1381,7 +1356,9 @@
 
     /**
      * Extracts NetID of Network on Lollipop and NetworkHandle (which is munged NetID) on
-     * Marshmallow and newer releases. Only available on Lollipop and newer releases.
+     * Marshmallow and newer releases.
+     * TODO(crbug.com/1489183): Rename networkToNetId to something meaningful and update
+     * javadoc comment.
      */
     public static long networkToNetId(Network network) {
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
diff --git a/net/base/features.cc b/net/base/features.cc
index beecc9a..875ecc6a 100644
--- a/net/base/features.cc
+++ b/net/base/features.cc
@@ -75,6 +75,24 @@
              "UseAlternativePortForGloballyReachableCheck",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+const base::FeatureParam<IPv6ReachabilityOverride>::Option
+    ipv6_reachability_override_options[] = {
+        {IPv6ReachabilityOverride::kReachable, "reachable"},
+        {IPv6ReachabilityOverride::kUniqueLocalAddressReachable,
+         "unique_local_address"},
+        {IPv6ReachabilityOverride::kPubliclyRoutable, "publicly_routable"},
+};
+
+const base::FeatureParam<IPv6ReachabilityOverride>
+    kIPv6ReachabilityOverrideParam{&kEnableIPv6ReachabilityOverride,
+                                   "IPv6ReachabilityOverride",
+                                   IPv6ReachabilityOverride::kReachable,
+                                   &ipv6_reachability_override_options};
+
+BASE_FEATURE(kEnableIPv6ReachabilityOverride,
+             "EnableIPv6ReachabilityOverride",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 BASE_FEATURE(kSHA1ServerSignature,
              "SHA1ServerSignature",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/net/base/features.h b/net/base/features.h
index 0ed91388..7f57700 100644
--- a/net/base/features.h
+++ b/net/base/features.h
@@ -95,6 +95,20 @@
     kAlternativePortForGloballyReachableCheck;
 NET_EXPORT BASE_DECLARE_FEATURE(kUseAlternativePortForGloballyReachableCheck);
 
+enum class IPv6ReachabilityOverride {
+  // Reachable when the system has at least one valid address.
+  kReachable,
+  // Reachable when the system has a unique local address.
+  kUniqueLocalAddressReachable,
+  // Reachable when the system has a publicly routable address.
+  kPubliclyRoutable,
+};
+NET_EXPORT extern const base::FeatureParam<IPv6ReachabilityOverride>
+    kIPv6ReachabilityOverrideParam;
+// If enabled, overrides IPv6 reachability probe results based on the system's
+// IP addresses.
+NET_EXPORT BASE_DECLARE_FEATURE(kEnableIPv6ReachabilityOverride);
+
 // If enabled allows the use of SHA-1 by the server for signatures
 // in the TLS handshake.
 NET_EXPORT BASE_DECLARE_FEATURE(kSHA1ServerSignature);
diff --git a/net/base/ip_address.cc b/net/base/ip_address.cc
index 2877ad0..49934db 100644
--- a/net/base/ip_address.cc
+++ b/net/base/ip_address.cc
@@ -316,6 +316,11 @@
   return false;
 }
 
+bool IPAddress::IsUniqueLocalIPv6() const {
+  // [fc00::]/7
+  return IsIPv6() && ((ip_address_[0] & 0xFE) == 0xFC);
+}
+
 bool IPAddress::AssignFromIPLiteral(base::StringPiece ip_literal) {
   bool success = ParseIPLiteralToBytes(ip_literal, &ip_address_);
   if (!success)
diff --git a/net/base/ip_address.h b/net/base/ip_address.h
index d82af9be..c347480 100644
--- a/net/base/ip_address.h
+++ b/net/base/ip_address.h
@@ -185,6 +185,9 @@
   // ::ffff:169.254.0.0/112 (IPv4 mapped IPv6 link-local).
   bool IsLinkLocal() const;
 
+  // Returns true if `ip_address_` is a unique local IPv6 address (fc00::/7).
+  bool IsUniqueLocalIPv6() const;
+
   // The size in bytes of |ip_address_|.
   size_t size() const { return ip_address_.size(); }
 
diff --git a/net/base/ip_address_unittest.cc b/net/base/ip_address_unittest.cc
index 560c6cd..047c0b0c 100644
--- a/net/base/ip_address_unittest.cc
+++ b/net/base/ip_address_unittest.cc
@@ -681,6 +681,32 @@
   }
 }
 
+TEST(IPAddressTest, IsUniqueLocalIPv6) {
+  const char* kPositive[] = {
+      "fc00::1",
+      "fc80::1",
+      "fd00::1",
+  };
+
+  for (const char* literal : kPositive) {
+    IPAddress ip_address;
+    ASSERT_TRUE(ip_address.AssignFromIPLiteral(literal));
+    EXPECT_TRUE(ip_address.IsUniqueLocalIPv6()) << literal;
+  }
+
+  const char* kNegative[] = {
+      "fe00::1",
+      "ff00::1",
+      "252.0.0.1",
+  };
+
+  for (const char* literal : kNegative) {
+    IPAddress ip_address;
+    ASSERT_TRUE(ip_address.AssignFromIPLiteral(literal));
+    EXPECT_FALSE(ip_address.IsUniqueLocalIPv6()) << literal;
+  }
+}
+
 // Tests extraction of the NAT64 translation prefix.
 TEST(IPAddressTest, ExtractPref64FromIpv4onlyArpaAAAA) {
   // Well Known Prefix 64:ff9b::/96.
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc
index 7c2a44a7..171fd9e 100644
--- a/net/dns/host_resolver_manager.cc
+++ b/net/dns/host_resolver_manager.cc
@@ -30,6 +30,7 @@
 #include "base/functional/callback.h"
 #include "base/functional/callback_helpers.h"
 #include "base/functional/identity.h"
+#include "base/location.h"
 #include "base/logging.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
@@ -501,6 +502,51 @@
   return features::kAlternativePortForGloballyReachableCheck.Get();
 }
 
+bool IsIPv6AddressReachable(const IPAddress& address) {
+  if (!address.IsIPv6()) {
+    return false;
+  }
+  if (address.IsLoopback()) {
+    return false;
+  }
+  if (address.IsIPv4MappedIPv6()) {
+    return false;
+  }
+
+  switch (features::kIPv6ReachabilityOverrideParam.Get()) {
+    case features::IPv6ReachabilityOverride::kReachable:
+      return true;
+    case features::IPv6ReachabilityOverride::kUniqueLocalAddressReachable:
+      return address.IsUniqueLocalIPv6();
+    case features::IPv6ReachabilityOverride::kPubliclyRoutable:
+      return address.IsPubliclyRoutable();
+  }
+}
+
+bool NetworkInterfaceListHasReachableIPv6Address(
+    const NetworkInterfaceList& interfaces) {
+  for (const auto& interface : interfaces) {
+    if (IsIPv6AddressReachable(interface.address)) {
+      return true;
+    }
+  }
+  return false;
+}
+
+bool SystemHasReachableIPv6Address() {
+  CHECK(
+      base::FeatureList::IsEnabled(features::kEnableIPv6ReachabilityOverride));
+
+  NetworkInterfaceList interfaces;
+  GetNetworkList(&interfaces, EXCLUDE_HOST_SCOPE_VIRTUAL_INTERFACES);
+  return NetworkInterfaceListHasReachableIPv6Address(interfaces);
+}
+
+absl::optional<NetworkInterfaceList>& NetworkInterfaceListForTesting() {
+  static base::NoDestructor<absl::optional<NetworkInterfaceList>> interfaces;
+  return *interfaces;
+}
+
 }  // namespace
 
 //-----------------------------------------------------------------------------
@@ -2979,6 +3025,7 @@
   if (system_dns_config_notifier_)
     system_dns_config_notifier_->AddObserver(this);
   EnsureSystemHostResolverCallReady();
+  MaybeCheckIPv6ReachabilityOverride();
 
   auto connection_type =
       IsBoundToNetwork()
@@ -3184,6 +3231,12 @@
   max_queued_jobs_ = value;
 }
 
+// static
+void HostResolverManager::SetNetworkListForTesting(
+    NetworkInterfaceList interfaces) {
+  NetworkInterfaceListForTesting() = std::move(interfaces);  // IN-TEST
+}
+
 void HostResolverManager::SetHaveOnlyLoopbackAddresses(bool result) {
   if (result) {
     additional_resolver_flags_ |= HOST_RESOLVER_LOOPBACK_ONLY;
@@ -3842,7 +3895,8 @@
   // resolution based on a probe. Prior logic ensures that this is an automatic
   // query, so the code requesting the resolution should be amenable to
   // receiving an IPv6 resolution.
-  if (!use_local_ipv6 && !is_ip && !last_ipv6_probe_result_) {
+  if (!use_local_ipv6 && !is_ip && !last_ipv6_probe_result_ &&
+      !ipv6_reachability_override_) {
     *out_effective_flags |= HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6;
     effective_types.Remove(DnsQueryType::AAAA);
   }
@@ -4004,6 +4058,39 @@
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
+void HostResolverManager::MaybeCheckIPv6ReachabilityOverride() {
+  if (!base::FeatureList::IsEnabled(
+          features::kEnableIPv6ReachabilityOverride)) {
+    return;
+  }
+
+  // NetworkInterfaceListForTesting() can only be called from the main thread.
+  if (NetworkInterfaceListForTesting().has_value()) {
+    NetworkInterfaceList interfaces =
+        *NetworkInterfaceListForTesting();  // IN-TEST
+    base::SequencedTaskRunner::GetCurrentDefault()->PostTaskAndReplyWithResult(
+        FROM_HERE,
+        base::BindOnce(&NetworkInterfaceListHasReachableIPv6Address,
+                       interfaces),
+        base::BindOnce(&HostResolverManager::SetIPv6ReachabilityOverride,
+                       weak_ptr_factory_.GetWeakPtr()));
+    return;
+  }
+
+  base::ThreadPool::PostTaskAndReplyWithResult(
+      FROM_HERE,
+      {base::MayBlock(), base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN},
+      base::BindOnce(&SystemHasReachableIPv6Address),
+      base::BindOnce(&HostResolverManager::SetIPv6ReachabilityOverride,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void HostResolverManager::SetIPv6ReachabilityOverride(bool reachable) {
+  CHECK(
+      base::FeatureList::IsEnabled(features::kEnableIPv6ReachabilityOverride));
+  ipv6_reachability_override_ = reachable;
+}
+
 void HostResolverManager::RemoveAllJobs(const ResolveContext* context) {
   for (auto it = jobs_.begin(); it != jobs_.end();) {
     const JobKey& key = it->first;
@@ -4099,6 +4186,7 @@
     BUILDFLAG(IS_FUCHSIA)
   RunLoopbackProbeJob();
 #endif
+  MaybeCheckIPv6ReachabilityOverride();
   AbortJobsWithoutTargetNetwork(true /* in_progress_only */);
   // `this` may be deleted inside AbortJobsWithoutTargetNetwork().
 }
diff --git a/net/dns/host_resolver_manager.h b/net/dns/host_resolver_manager.h
index 8975d646..3d3048e2 100644
--- a/net/dns/host_resolver_manager.h
+++ b/net/dns/host_resolver_manager.h
@@ -267,6 +267,8 @@
                       handles::NetworkHandle target_network,
                       NetLog* net_log);
 
+  static void SetNetworkListForTesting(NetworkInterfaceList interfaces);
+
  protected:
   // Callback from HaveOnlyLoopbackAddresses probe.
   void SetHaveOnlyLoopbackAddresses(bool result);
@@ -464,6 +466,9 @@
   // Asynchronously checks if only loopback IPs are available.
   virtual void RunLoopbackProbeJob();
 
+  void MaybeCheckIPv6ReachabilityOverride();
+  void SetIPv6ReachabilityOverride(bool reachable);
+
   // Records the result in cache if cache is present.
   void CacheResult(HostCache* cache,
                    const HostCache::Key& key,
@@ -561,6 +566,9 @@
   bool last_ipv6_probe_result_ = true;
   bool probing_ipv6_ = false;
 
+  // When true, query AAAA even when the globally reachable check failed.
+  bool ipv6_reachability_override_ = false;
+
   // Any resolver flags that should be added to a request by default.
   HostResolverFlags additional_resolver_flags_ = 0;
 
diff --git a/net/dns/host_resolver_manager_unittest.cc b/net/dns/host_resolver_manager_unittest.cc
index 0450482..1172e401 100644
--- a/net/dns/host_resolver_manager_unittest.cc
+++ b/net/dns/host_resolver_manager_unittest.cc
@@ -53,6 +53,8 @@
 #include "net/base/mock_network_change_notifier.h"
 #include "net/base/net_errors.h"
 #include "net/base/network_anonymization_key.h"
+#include "net/base/network_change_notifier.h"
+#include "net/base/network_interfaces.h"
 #include "net/base/schemeful_site.h"
 #include "net/dns/dns_client.h"
 #include "net/dns/dns_config.h"
@@ -545,6 +547,12 @@
   return **it;
 }
 
+NetworkInterface NetworkInterfaceFromIpLiteral(base::StringPiece ip_literal) {
+  NetworkInterface interface;
+  interface.address = *IPAddress::FromIPLiteral(ip_literal);
+  return interface;
+}
+
 }  // namespace
 
 class HostResolverManagerTest : public TestWithTaskEnvironment {
@@ -14302,4 +14310,169 @@
   IPv4AddressLiteralInIPv6OnlyNetworkBadAddressTest(false);
 }
 
+class HostResolverManagerIPv6ReachabilityOverrideTest
+    : public HostResolverManagerDnsTest,
+      public testing::WithParamInterface<features::IPv6ReachabilityOverride> {
+ public:
+  static constexpr const char kTargetHost[] = "host.test";
+
+  HostResolverManagerIPv6ReachabilityOverrideTest() {
+    std::map<std::string, std::string> field_trial_params;
+    switch (GetParam()) {
+      case features::IPv6ReachabilityOverride::kReachable:
+        field_trial_params["IPv6ReachabilityOverride"] = "reachable";
+        break;
+      case features::IPv6ReachabilityOverride::kUniqueLocalAddressReachable:
+        field_trial_params["IPv6ReachabilityOverride"] = "unique_local_address";
+        break;
+      case features::IPv6ReachabilityOverride::kPubliclyRoutable:
+        field_trial_params["IPv6ReachabilityOverride"] = "publicly_routable";
+        break;
+    }
+    feature_list_.InitAndEnableFeatureWithParameters(
+        features::kEnableIPv6ReachabilityOverride,
+        std::move(field_trial_params));
+  }
+
+ protected:
+  void SetUp() override {
+    HostResolverManagerDnsTest::SetUp();
+
+    // Make the global reachiability probe failed.
+    CreateResolverWithLimitsAndParams(kMaxJobs, DefaultParams(proc_),
+                                      /*ipv6_reachable=*/false,
+                                      /*check_ipv6_on_wifi=*/true);
+    ChangeDnsConfig(CreateValidDnsConfig());
+
+    // At this point we have two tasks for the IPv6ReachabilityOverride check
+    // in the thread pool. One is created by HostResolverManagerDnsTest::Setup()
+    // and the other is created by ChangeDnsConfig(). Wait for these tasks to
+    // make sure that these tasks don't override the result after
+    // SetNetworkInterfaces() calls in test cases.
+    RunUntilIdle();
+
+    // This rule is used when only A record is queried.
+    proc_->AddRule(kTargetHost, ADDRESS_FAMILY_IPV4, "192.0.2.1",
+                   HOST_RESOLVER_DEFAULT_FAMILY_SET_DUE_TO_NO_IPV6);
+    // This rule is used when A and AAAA records are queried.
+    proc_->AddRule(kTargetHost, ADDRESS_FAMILY_UNSPECIFIED,
+                   "192.0.2.1,2001:db8::1");
+  }
+
+  void SetNetworkInterfaces(NetworkInterfaceList interfaces) {
+    HostResolverManager::SetNetworkListForTesting(std::move(interfaces));
+    NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
+    RunUntilIdle();
+  }
+
+  ResolveHostResponseHelper CreateRequest() {
+    proc_->SignalMultiple(1u);
+    return ResolveHostResponseHelper(resolver_->CreateRequest(
+        url::SchemeHostPort(url::kHttpScheme, kTargetHost, 80),
+        NetworkAnonymizationKey(), NetLogWithSource(), absl::nullopt,
+        resolve_context_.get(), resolve_context_->host_cache()));
+  }
+
+  void ExpectResponseHasIPv4AddressOnly(ResolveHostResponseHelper& response) {
+    EXPECT_THAT(response.result_error(), IsOk());
+    EXPECT_THAT(response.request()->GetAddressResults()->endpoints(),
+                testing::UnorderedElementsAre(CreateExpected("192.0.2.1", 80)));
+  }
+
+  void ExpectResponseHasIPv4AndIPv6Addresses(
+      ResolveHostResponseHelper& response) {
+    EXPECT_THAT(response.result_error(), IsOk());
+    EXPECT_THAT(
+        response.request()->GetAddressResults()->endpoints(),
+        testing::UnorderedElementsAre(CreateExpected("192.0.2.1", 80),
+                                      CreateExpected("2001:db8::1", 80)));
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    HostResolverManagerIPv6ReachabilityOverrideTest,
+    ::testing::Values(
+        features::IPv6ReachabilityOverride::kReachable,
+        features::IPv6ReachabilityOverride::kUniqueLocalAddressReachable,
+        features::IPv6ReachabilityOverride::kPubliclyRoutable));
+
+TEST_P(HostResolverManagerIPv6ReachabilityOverrideTest, Loopback) {
+  SetNetworkInterfaces({NetworkInterfaceFromIpLiteral("192.168.1.42"),
+                        NetworkInterfaceFromIpLiteral("::1")});
+
+  ResolveHostResponseHelper response = CreateRequest();
+
+  ExpectResponseHasIPv4AddressOnly(response);
+}
+
+TEST_P(HostResolverManagerIPv6ReachabilityOverrideTest, IPv4MappedIPv6) {
+  SetNetworkInterfaces({NetworkInterfaceFromIpLiteral("192.168.1.42"),
+                        NetworkInterfaceFromIpLiteral("::ffff:192.0.2.2")});
+
+  ResolveHostResponseHelper response = CreateRequest();
+
+  ExpectResponseHasIPv4AddressOnly(response);
+}
+
+TEST_P(HostResolverManagerIPv6ReachabilityOverrideTest, LinkLocal) {
+  SetNetworkInterfaces({NetworkInterfaceFromIpLiteral("192.168.1.42"),
+                        NetworkInterfaceFromIpLiteral("fe80::5")});
+
+  ResolveHostResponseHelper response = CreateRequest();
+
+  switch (GetParam()) {
+    case features::IPv6ReachabilityOverride::kReachable:
+      ExpectResponseHasIPv4AndIPv6Addresses(response);
+      break;
+    case features::IPv6ReachabilityOverride::kUniqueLocalAddressReachable:
+      ExpectResponseHasIPv4AddressOnly(response);
+      break;
+    case features::IPv6ReachabilityOverride::kPubliclyRoutable:
+      ExpectResponseHasIPv4AddressOnly(response);
+      break;
+  }
+}
+
+TEST_P(HostResolverManagerIPv6ReachabilityOverrideTest, UniqueLocal) {
+  SetNetworkInterfaces({NetworkInterfaceFromIpLiteral("192.168.1.42"),
+                        NetworkInterfaceFromIpLiteral("fc00::5")});
+
+  ResolveHostResponseHelper response = CreateRequest();
+
+  switch (GetParam()) {
+    case features::IPv6ReachabilityOverride::kReachable:
+      ExpectResponseHasIPv4AndIPv6Addresses(response);
+      break;
+    case features::IPv6ReachabilityOverride::kUniqueLocalAddressReachable:
+      ExpectResponseHasIPv4AndIPv6Addresses(response);
+      break;
+    case features::IPv6ReachabilityOverride::kPubliclyRoutable:
+      ExpectResponseHasIPv4AddressOnly(response);
+      break;
+  }
+}
+
+TEST_P(HostResolverManagerIPv6ReachabilityOverrideTest, PubliclyRoutable) {
+  SetNetworkInterfaces({NetworkInterfaceFromIpLiteral("192.168.1.42"),
+                        NetworkInterfaceFromIpLiteral("2000::5")});
+
+  ResolveHostResponseHelper response = CreateRequest();
+
+  switch (GetParam()) {
+    case features::IPv6ReachabilityOverride::kReachable:
+      ExpectResponseHasIPv4AndIPv6Addresses(response);
+      break;
+    case features::IPv6ReachabilityOverride::kUniqueLocalAddressReachable:
+      ExpectResponseHasIPv4AddressOnly(response);
+      break;
+    case features::IPv6ReachabilityOverride::kPubliclyRoutable:
+      ExpectResponseHasIPv4AndIPv6Addresses(response);
+      break;
+  }
+}
+
 }  // namespace net
diff --git a/net/quic/bidirectional_stream_quic_impl_unittest.cc b/net/quic/bidirectional_stream_quic_impl_unittest.cc
index fb5e8a2..ebef403a 100644
--- a/net/quic/bidirectional_stream_quic_impl_unittest.cc
+++ b/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -535,7 +535,6 @@
         /*cert_verify_flags=*/0, quic::test::DefaultQuicConfig(),
         std::make_unique<TestQuicCryptoClientConfigHandle>(&crypto_config_),
         dns_start, dns_end,
-        std::make_unique<quic::QuicClientPushPromiseIndex>(),
         base::DefaultTickClock::GetInstance(),
         base::SingleThreadTaskRunner::GetCurrentDefault().get(),
         /*socket_performance_watcher=*/nullptr, HostResolverEndpointResult(),
diff --git a/net/quic/dedicated_web_transport_http3_client.cc b/net/quic/dedicated_web_transport_http3_client.cc
index 16cf1f5..ed09ab8 100644
--- a/net/quic/dedicated_web_transport_http3_client.cc
+++ b/net/quic/dedicated_web_transport_http3_client.cc
@@ -189,14 +189,13 @@
       quic::QuicConnection* connection,
       const quic::QuicServerId& server_id,
       quic::QuicCryptoClientConfig* crypto_config,
-      quic::QuicClientPushPromiseIndex* push_promise_index,
       DedicatedWebTransportHttp3Client* client)
       : quic::QuicSpdyClientSession(config,
                                     supported_versions,
                                     connection,
                                     server_id,
                                     crypto_config,
-                                    push_promise_index),
+                                    /*push_promise_index=*/nullptr),
         client_(client) {}
 
   bool OnSettingsFrame(const quic::SettingsFrame& frame) override {
@@ -610,7 +609,7 @@
       InitializeQuicConfig(*quic_context_->params()), supported_versions_,
       connection.release(),
       quic::QuicServerId(url_.host(), url_.EffectiveIntPort()), &crypto_config_,
-      &push_promise_index_, this);
+      this);
   if (!original_supported_versions_.empty()) {
     session_->set_client_original_supported_versions(
         original_supported_versions_);
diff --git a/net/quic/dedicated_web_transport_http3_client.h b/net/quic/dedicated_web_transport_http3_client.h
index 5574f3bf..44605eb 100644
--- a/net/quic/dedicated_web_transport_http3_client.h
+++ b/net/quic/dedicated_web_transport_http3_client.h
@@ -22,7 +22,6 @@
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h"
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/web_transport_fingerprint_proof_verifier.h"
 #include "net/third_party/quiche/src/quiche/quic/core/deterministic_connection_id_generator.h"
-#include "net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.h"
 #include "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_config.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_connection_id.h"
@@ -182,7 +181,6 @@
   raw_ptr<quic::WebTransportSession> web_transport_session_ = nullptr;
   std::unique_ptr<QuicChromiumPacketReader> packet_reader_;
   std::unique_ptr<QuicEventLogger> event_logger_;
-  quic::QuicClientPushPromiseIndex push_promise_index_;
   quic::DeterministicConnectionIdGenerator connection_id_generator_{
       quic::kQuicDefaultConnectionIdLength};
 
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc
index 2775029a..643685c6 100644
--- a/net/quic/quic_chromium_client_session.cc
+++ b/net/quic/quic_chromium_client_session.cc
@@ -886,7 +886,6 @@
     std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config,
     base::TimeTicks dns_resolution_start_time,
     base::TimeTicks dns_resolution_end_time,
-    std::unique_ptr<quic::QuicClientPushPromiseIndex> push_promise_index,
     const base::TickClock* tick_clock,
     base::SequencedTaskRunner* task_runner,
     std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
@@ -894,7 +893,7 @@
     NetLog* net_log)
     : quic::QuicSpdyClientSessionBase(connection,
                                       /*visitor=*/nullptr,
-                                      push_promise_index.get(),
+                                      /*push_promise_index=*/nullptr,
                                       config,
                                       connection->supported_versions()),
       session_key_(session_key),
@@ -930,7 +929,6 @@
           std::move(socket_performance_watcher),
           net_log_)),
       http3_logger_(std::make_unique<QuicHttp3Logger>(net_log_)),
-      push_promise_index_(std::move(push_promise_index)),
       path_validation_writer_delegate_(this, task_runner_),
       ech_config_list_(endpoint_result.metadata.ech_config_list) {
   default_network_ = default_network;
@@ -967,15 +965,6 @@
 }
 
 QuicChromiumClientSession::~QuicChromiumClientSession() {
-  // This is referenced by the parent class's destructor, so have to delete it
-  // asynchronously, unfortunately. Don't use DeleteSoon, since that leaks if
-  // the task is not run, which is often the case in tests.
-  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-      FROM_HERE,
-      base::BindOnce([](std::unique_ptr<quic::QuicClientPushPromiseIndex>
-                            push_promise_index) {},
-                     std::move(push_promise_index_)));
-
   DCHECK(callback_.is_null());
 
   for (auto& observer : connectivity_observer_list_)
diff --git a/net/quic/quic_chromium_client_session.h b/net/quic/quic_chromium_client_session.h
index d8aa422..f2b3329 100644
--- a/net/quic/quic_chromium_client_session.h
+++ b/net/quic/quic_chromium_client_session.h
@@ -45,7 +45,6 @@
 #include "net/socket/socket_performance_watcher.h"
 #include "net/spdy/http2_priority_dependencies.h"
 #include "net/spdy/multiplexed_session.h"
-#include "net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.h"
 #include "net/third_party/quiche/src/quiche/quic/core/http/quic_spdy_client_session_base.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_crypto_client_stream.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_packet_writer.h"
@@ -336,7 +335,6 @@
     quic::QuicServerId server_id_;
     quic::ParsedQuicVersion quic_version_;
     LoadTimingInfo::ConnectTiming connect_timing_;
-    raw_ptr<quic::QuicClientPushPromiseIndex> push_promise_index_;
 
     bool was_ever_used_ = false;
   };
@@ -583,7 +581,6 @@
       std::unique_ptr<QuicCryptoClientConfigHandle> crypto_config,
       base::TimeTicks dns_resolution_start_time,
       base::TimeTicks dns_resolution_end_time,
-      std::unique_ptr<quic::QuicClientPushPromiseIndex> push_promise_index,
       const base::TickClock* tick_clock,
       base::SequencedTaskRunner* task_runner,
       std::unique_ptr<SocketPerformanceWatcher> socket_performance_watcher,
@@ -1112,8 +1109,6 @@
   quic::KeyUpdateReason last_key_update_reason_ =
       quic::KeyUpdateReason::kInvalid;
 
-  std::unique_ptr<quic::QuicClientPushPromiseIndex> push_promise_index_;
-
   QuicChromiumPathValidationWriterDelegate path_validation_writer_delegate_;
 
   // Map of origin to Accept-CH header field values received via ALPS.
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc
index 367ebe82..637e3a3 100644
--- a/net/quic/quic_chromium_client_session_test.cc
+++ b/net/quic/quic_chromium_client_session_test.cc
@@ -56,7 +56,6 @@
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/crypto_protocol.h"
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_decrypter.h"
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_encrypter.h"
-#include "net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_connection_id.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_packet_writer.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_tag.h"
@@ -66,7 +65,6 @@
 #include "net/third_party/quiche/src/quiche/quic/test_tools/crypto_test_utils.h"
 #include "net/third_party/quiche/src/quiche/quic/test_tools/mock_connection_id_generator.h"
 #include "net/third_party/quiche/src/quiche/quic/test_tools/qpack/qpack_test_utils.h"
-#include "net/third_party/quiche/src/quiche/quic/test_tools/quic_client_promised_info_peer.h"
 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_connection_peer.h"
 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_session_peer.h"
 #include "net/third_party/quiche/src/quiche/quic/test_tools/quic_stream_peer.h"
@@ -186,7 +184,6 @@
         /*cert_verify_flags=*/0, config_,
         std::make_unique<TestQuicCryptoClientConfigHandle>(&crypto_config_),
         base::TimeTicks::Now(), base::TimeTicks::Now(),
-        std::make_unique<quic::QuicClientPushPromiseIndex>(),
         base::DefaultTickClock::GetInstance(),
         base::SingleThreadTaskRunner::GetCurrentDefault().get(),
         /*socket_performance_watcher=*/nullptr, HostResolverEndpointResult(),
diff --git a/net/quic/quic_chromium_client_stream_test.cc b/net/quic/quic_chromium_client_stream_test.cc
index db019f3..6fb88aa 100644
--- a/net/quic/quic_chromium_client_stream_test.cc
+++ b/net/quic/quic_chromium_client_stream_test.cc
@@ -39,8 +39,7 @@
 
 class MockQuicClientSessionBase : public quic::QuicSpdyClientSessionBase {
  public:
-  explicit MockQuicClientSessionBase(quic::QuicConnection* connection,
-                                     quic::QuicClientPushPromiseIndex* index);
+  explicit MockQuicClientSessionBase(quic::QuicConnection* connection);
 
   MockQuicClientSessionBase(const MockQuicClientSessionBase&) = delete;
   MockQuicClientSessionBase& operator=(const MockQuicClientSessionBase&) =
@@ -138,11 +137,10 @@
 };
 
 MockQuicClientSessionBase::MockQuicClientSessionBase(
-    quic::QuicConnection* connection,
-    quic::QuicClientPushPromiseIndex* push_promise_index)
+    quic::QuicConnection* connection)
     : quic::QuicSpdyClientSessionBase(connection,
                                       /*visitor=*/nullptr,
-                                      push_promise_index,
+                                      /*push_promise_index=*/nullptr,
                                       quic::test::DefaultQuicConfig(),
                                       connection->supported_versions()) {
   crypto_stream_ = std::make_unique<quic::test::MockQuicCryptoStream>(this);
@@ -162,11 +160,10 @@
         crypto_config_(
             quic::test::crypto_test_utils::ProofVerifierForTesting()),
         session_(new quic::test::MockQuicConnection(
-                     &helper_,
-                     &alarm_factory_,
-                     quic::Perspective::IS_CLIENT,
-                     quic::test::SupportedVersions(version_)),
-                 &push_promise_index_) {
+            &helper_,
+            &alarm_factory_,
+            quic::Perspective::IS_CLIENT,
+            quic::test::SupportedVersions(version_))) {
     quic::test::QuicConfigPeer::SetReceivedInitialSessionFlowControlWindow(
         session_.config(), quic::kMinimumFlowControlSendWindow);
     quic::test::QuicConfigPeer::
@@ -288,7 +285,6 @@
   raw_ptr<QuicChromiumClientStream> stream_;
   spdy::Http2HeaderBlock headers_;
   spdy::Http2HeaderBlock trailers_;
-  quic::QuicClientPushPromiseIndex push_promise_index_;
 };
 
 INSTANTIATE_TEST_SUITE_P(Version,
diff --git a/net/quic/quic_http_stream.cc b/net/quic/quic_http_stream.cc
index 62b074b..e26c1163 100644
--- a/net/quic/quic_http_stream.cc
+++ b/net/quic/quic_http_stream.cc
@@ -25,7 +25,6 @@
 #include "net/quic/quic_http_utils.h"
 #include "net/spdy/spdy_http_utils.h"
 #include "net/ssl/ssl_info.h"
-#include "net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.h"
 #include "net/third_party/quiche/src/quiche/quic/core/http/spdy_utils.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_stream_sequencer.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_utils.h"
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc
index 15fbcf2..6fe15328 100644
--- a/net/quic/quic_http_stream_test.cc
+++ b/net/quic/quic_http_stream_test.cc
@@ -423,7 +423,6 @@
         /*cert_verify_flags=*/0, quic::test::DefaultQuicConfig(),
         std::make_unique<TestQuicCryptoClientConfigHandle>(&crypto_config_),
         dns_start, dns_end,
-        std::make_unique<quic::QuicClientPushPromiseIndex>(),
         base::DefaultTickClock::GetInstance(),
         base::SingleThreadTaskRunner::GetCurrentDefault().get(),
         /*socket_performance_watcher=*/nullptr, HostResolverEndpointResult(),
diff --git a/net/quic/quic_proxy_client_socket_unittest.cc b/net/quic/quic_proxy_client_socket_unittest.cc
index ed8a416..48c89fb0 100644
--- a/net/quic/quic_proxy_client_socket_unittest.cc
+++ b/net/quic/quic_proxy_client_socket_unittest.cc
@@ -257,7 +257,6 @@
         /*cert_verify_flags=*/0, quic::test::DefaultQuicConfig(),
         std::make_unique<TestQuicCryptoClientConfigHandle>(&crypto_config_),
         dns_start, dns_end,
-        std::make_unique<quic::QuicClientPushPromiseIndex>(),
         base::DefaultTickClock::GetInstance(),
         base::SingleThreadTaskRunner::GetCurrentDefault().get(),
         /*socket_performance_watcher=*/nullptr, HostResolverEndpointResult(),
diff --git a/net/quic/quic_stream_factory.cc b/net/quic/quic_stream_factory.cc
index b009d7f..deebc81 100644
--- a/net/quic/quic_stream_factory.cc
+++ b/net/quic/quic_stream_factory.cc
@@ -64,7 +64,6 @@
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/proof_verifier.h"
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_client_session_cache.h"
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_random.h"
-#include "net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_clock.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_connection.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_utils.h"
@@ -2024,9 +2023,8 @@
       params_.max_migrations_to_non_default_network_on_path_degrading,
       yield_after_packets_, yield_after_duration_, cert_verify_flags, config,
       std::move(crypto_config_handle), dns_resolution_start_time,
-      dns_resolution_end_time,
-      std::make_unique<quic::QuicClientPushPromiseIndex>(), tick_clock_,
-      task_runner_, std::move(socket_performance_watcher), endpoint_result,
+      dns_resolution_end_time, tick_clock_, task_runner_,
+      std::move(socket_performance_watcher), endpoint_result,
       net_log.net_log());
 
   all_sessions_[*session] = key;  // owning pointer
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc
index de42d80..aee92b2 100644
--- a/net/quic/quic_stream_factory_test.cc
+++ b/net/quic/quic_stream_factory_test.cc
@@ -76,7 +76,6 @@
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h"
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_decrypter.h"
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_encrypter.h"
-#include "net/third_party/quiche/src/quiche/quic/core/http/quic_client_promised_info.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_constants.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_utils.h"
 #include "net/third_party/quiche/src/quiche/quic/platform/api/quic_test.h"
diff --git a/net/third_party/quiche/BUILD.gn b/net/third_party/quiche/BUILD.gn
index 401c666..9f73be7b 100644
--- a/net/third_party/quiche/BUILD.gn
+++ b/net/third_party/quiche/BUILD.gn
@@ -567,7 +567,6 @@
     "src/quiche/quic/core/http/http_decoder_test.cc",
     "src/quiche/quic/core/http/http_encoder_test.cc",
     "src/quiche/quic/core/http/http_frames_test.cc",
-    "src/quiche/quic/core/http/quic_client_push_promise_index_test.cc",
     "src/quiche/quic/core/http/quic_header_list_test.cc",
     "src/quiche/quic/core/http/quic_headers_stream_test.cc",
     "src/quiche/quic/core/http/quic_receive_control_stream_test.cc",
diff --git a/net/third_party/quiche/src b/net/third_party/quiche/src
index 2099de51..9ac03b9 160000
--- a/net/third_party/quiche/src
+++ b/net/third_party/quiche/src
@@ -1 +1 @@
-Subproject commit 2099de51b06228550510fb7656205fdcc10d8e4c
+Subproject commit 9ac03b9396507cc1275d2605f5a92ad4b196f64e
diff --git a/net/websockets/websocket_basic_stream_adapters_test.cc b/net/websockets/websocket_basic_stream_adapters_test.cc
index 7806096..30f001e 100644
--- a/net/websockets/websocket_basic_stream_adapters_test.cc
+++ b/net/websockets/websocket_basic_stream_adapters_test.cc
@@ -79,7 +79,6 @@
 #include "net/third_party/quiche/src/quiche/common/simple_buffer_allocator.h"
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h"
 #include "net/third_party/quiche/src/quiche/quic/core/http/http_encoder.h"
-#include "net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.h"
 #include "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_connection.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_connection_id.h"
@@ -1290,7 +1289,6 @@
         /*cert_verify_flags=*/0, quic::test::DefaultQuicConfig(),
         std::make_unique<TestQuicCryptoClientConfigHandle>(&crypto_config_),
         dns_start, dns_end,
-        std::make_unique<quic::QuicClientPushPromiseIndex>(),
         base::DefaultTickClock::GetInstance(),
         base::SingleThreadTaskRunner::GetCurrentDefault().get(),
         /*socket_performance_watcher=*/nullptr, HostResolverEndpointResult(),
diff --git a/net/websockets/websocket_handshake_stream_create_helper_test.cc b/net/websockets/websocket_handshake_stream_create_helper_test.cc
index bbac6c06..648db9d 100644
--- a/net/websockets/websocket_handshake_stream_create_helper_test.cc
+++ b/net/websockets/websocket_handshake_stream_create_helper_test.cc
@@ -69,7 +69,6 @@
 #include "net/test/test_with_task_environment.h"
 #include "net/third_party/quiche/src/quiche/common/platform/api/quiche_flags.h"
 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h"
-#include "net/third_party/quiche/src/quiche/quic/core/http/quic_client_push_promise_index.h"
 #include "net/third_party/quiche/src/quiche/quic/core/qpack/qpack_decoder.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_connection.h"
 #include "net/third_party/quiche/src/quiche/quic/core/quic_connection_id.h"
@@ -496,7 +495,6 @@
             /*cert_verify_flags=*/0, quic::test::DefaultQuicConfig(),
             std::make_unique<TestQuicCryptoClientConfigHandle>(&crypto_config),
             dns_start, dns_end,
-            std::make_unique<quic::QuicClientPushPromiseIndex>(),
             base::DefaultTickClock::GetInstance(),
             base::SingleThreadTaskRunner::GetCurrentDefault().get(),
             /*socket_performance_watcher=*/nullptr,
diff --git a/services/webnn/dml/command_recorder.cc b/services/webnn/dml/command_recorder.cc
index fe267448..4618388a 100644
--- a/services/webnn/dml/command_recorder.cc
+++ b/services/webnn/dml/command_recorder.cc
@@ -177,16 +177,9 @@
   // So create a descriptor heap with at least 1 descriptor.
   const uint32_t num_descriptors_in_heap =
       std::max(1u, initialization_binding_properties.RequiredDescriptorCount);
-  D3D12_DESCRIPTOR_HEAP_DESC descriptor_heap_desc{
-      .Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV,
-      .NumDescriptors = num_descriptors_in_heap,
-      .Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE};
-  {
-    TRACE_EVENT1("gpu", "ID3D12Device::CreateDescriptorHeap", "NumDescriptors",
-                 descriptor_heap_desc.NumDescriptors);
-    RETURN_IF_FAILED(d3d12_device_->CreateDescriptorHeap(
-        &descriptor_heap_desc, IID_PPV_ARGS(&descriptor_heap)));
-  }
+  RETURN_IF_FAILED(CreateDescriptorHeap(
+      num_descriptors_in_heap, L"WebNN_Descriptor_Heap_For_Initialization",
+      descriptor_heap));
 
   ID3D12DescriptorHeap* descriptor_heaps[] = {descriptor_heap.Get()};
   command_list_->SetDescriptorHeaps(/* NumDescriptorHeaps */ 1,
@@ -289,9 +282,11 @@
 
 HRESULT CommandRecorder::ExecuteOperator(
     ComPtr<IDMLCompiledOperator> compiled_operator,
+    ComPtr<ID3D12DescriptorHeap> descriptor_heap,
     base::span<const DML_BINDING_DESC> input_bindings,
     base::span<const DML_BINDING_DESC> output_bindings,
-    const absl::optional<DML_BINDING_DESC>& persistent_resource_binding) {
+    const absl::optional<DML_BINDING_DESC>& persistent_resource_binding,
+    const absl::optional<DML_BINDING_DESC>& temporary_resource_binding) {
   TRACE_EVENT0("gpu", "dml::CommandRecorder::ExecuteOperator");
   CHECK(is_open_);
   CHECK(compiled_operator);
@@ -299,21 +294,6 @@
   DML_BINDING_PROPERTIES execution_binding_properties =
       compiled_operator->GetBindingProperties();
 
-  // TODO(crbug.com/1455278): Consider maintaining a descriptors pool for better
-  // resource reuse.
-  ComPtr<ID3D12DescriptorHeap> descriptor_heap;
-  CHECK_GT(execution_binding_properties.RequiredDescriptorCount, 0u);
-  D3D12_DESCRIPTOR_HEAP_DESC descriptor_heap_desc{
-      .Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV,
-      .NumDescriptors = execution_binding_properties.RequiredDescriptorCount,
-      .Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE};
-  {
-    TRACE_EVENT1("gpu", "ID3D12Device::CreateDescriptorHeap", "NumDescriptors",
-                 descriptor_heap_desc.NumDescriptors);
-    RETURN_IF_FAILED(d3d12_device_->CreateDescriptorHeap(
-        &descriptor_heap_desc, IID_PPV_ARGS(&descriptor_heap)));
-  }
-
   ID3D12DescriptorHeap* descriptor_heaps[] = {descriptor_heap.Get()};
   command_list_->SetDescriptorHeaps(/* NumDescriptorHeaps */ 1,
                                     descriptor_heaps);
@@ -334,20 +314,18 @@
   // Create and bind the temporary resource if the operator execution requires.
   auto temp_resource_size = execution_binding_properties.TemporaryResourceSize;
   if (temp_resource_size > 0) {
-    ComPtr<ID3D12Resource> temp_resource;
-    RETURN_IF_FAILED(CreateDefaultBuffer(
-        temp_resource_size, L"WebNN_Temporary_Buffer_For_Execution",
-        temp_resource));
-    DML_BUFFER_BINDING temp_buffer_binding{.Buffer = temp_resource.Get(),
-                                           .Offset = 0,
-                                           .SizeInBytes = temp_resource_size};
-    DML_BINDING_DESC temp_binding_desc{.Type = DML_BINDING_TYPE_BUFFER,
-                                       .Desc = &temp_buffer_binding};
-    binding_table->BindTemporaryResource(&temp_binding_desc);
+    CHECK_EQ(temporary_resource_binding.has_value(), true);
+    CHECK_EQ(temporary_resource_binding.value().Type, DML_BINDING_TYPE_BUFFER);
+    binding_table->BindTemporaryResource(&temporary_resource_binding.value());
 
     // The temporary resource should be kept alive until the operator has been
     // executed on the GPU.
-    command_resources_.push_back(std::move(temp_resource));
+    ID3D12Resource* temporary_resource =
+        static_cast<const DML_BUFFER_BINDING*>(
+            temporary_resource_binding.value().Desc)
+            ->Buffer;
+    CHECK_NE(temporary_resource, nullptr);
+    command_resources_.push_back(temporary_resource);
   }
 
   // The persistent resource should be bound if the operator execution requires.
@@ -471,4 +449,26 @@
   return S_OK;
 }
 
+HRESULT CommandRecorder::CreateDescriptorHeap(
+    uint32_t num_descriptors,
+    const wchar_t* name_for_debugging,
+    ComPtr<ID3D12DescriptorHeap>& descriptor_heap) {
+  TRACE_EVENT2("gpu", "dml::CommandRecorder::CreateDescriptorHeap",
+               "num_descriptors", num_descriptors, "name", name_for_debugging);
+  CHECK_GT(num_descriptors, 0u);
+  D3D12_DESCRIPTOR_HEAP_DESC descriptor_heap_desc{
+      .Type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV,
+      .NumDescriptors = num_descriptors,
+      .Flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE};
+  RETURN_IF_FAILED(d3d12_device_->CreateDescriptorHeap(
+      &descriptor_heap_desc, IID_PPV_ARGS(&descriptor_heap)));
+  CHECK(descriptor_heap.Get());
+  descriptor_heap_desc = descriptor_heap->GetDesc();
+  CHECK_EQ(descriptor_heap_desc.NumDescriptors, num_descriptors);
+
+  CHECK_NE(name_for_debugging, nullptr);
+  CHECK_EQ(descriptor_heap->SetName(name_for_debugging), S_OK);
+  return S_OK;
+}
+
 }  // namespace webnn::dml
diff --git a/services/webnn/dml/command_recorder.h b/services/webnn/dml/command_recorder.h
index 7614342ca..04415e8 100644
--- a/services/webnn/dml/command_recorder.h
+++ b/services/webnn/dml/command_recorder.h
@@ -96,6 +96,10 @@
   // with different inputs. The caller should wait for the operator execution to
   // complete on the GPU before reading back the results.
   //
+  // The caller should create the descriptor heap large enough for the number of
+  // descriptors that the compiled operator needs and supply it via
+  // `descriptor_heap`.
+  //
   // The input and output resources are supplied by the caller via
   // `input_bindings` and `output_bindings`. The input and output resources will
   // be bound to the operator's binding table. The number of bindings should
@@ -107,16 +111,18 @@
   // should be initialized by `InitializeOperator()` and be supplied via
   // `persistent_resource_binding`.
   //
-  // This method will create necessary temporary resources for the operator
-  // execution.
+  // If the compiled operator also requires any temporary resources, they should
+  // be supplied via `temporary_resource_binding`.
   //
   // This method ensures that all the required GPU resources will be kept alive
   // until the operator execution has completed on the GPU.
   HRESULT ExecuteOperator(
       ComPtr<IDMLCompiledOperator> compiled_operator,
+      ComPtr<ID3D12DescriptorHeap> descriptor_heap,
       base::span<const DML_BINDING_DESC> input_bindings,
       base::span<const DML_BINDING_DESC> output_bindings,
-      const absl::optional<DML_BINDING_DESC>& persistent_resource_binding);
+      const absl::optional<DML_BINDING_DESC>& persistent_resource_binding,
+      const absl::optional<DML_BINDING_DESC>& temporary_resource_binding);
 
   // Create a resource with `size` bytes in
   // D3D12_RESOURCE_STATE_UNORDERED_ACCESS state from the default heap of the
@@ -139,6 +145,13 @@
                                const wchar_t* name_for_debugging,
                                ComPtr<ID3D12Resource>& resource);
 
+  // Create a descriptor heap with D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV type,
+  // D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE flag and large enough for the
+  // number of descriptors.
+  HRESULT CreateDescriptorHeap(uint32_t num_descriptors,
+                               const wchar_t* name_for_debugging,
+                               ComPtr<ID3D12DescriptorHeap>& descriptor_heap);
+
  private:
   CommandRecorder(scoped_refptr<CommandQueue> command_queue,
                   ComPtr<IDMLDevice> dml_device,
diff --git a/services/webnn/dml/command_recorder_test.cc b/services/webnn/dml/command_recorder_test.cc
index b7965beb..c00cbd2 100644
--- a/services/webnn/dml/command_recorder_test.cc
+++ b/services/webnn/dml/command_recorder_test.cc
@@ -257,9 +257,11 @@
       dml_operator.Get(), DML_EXECUTION_FLAG_NONE,
       IID_PPV_ARGS(&compiled_operator)));
 
-  // Relu operator should not require any persistent resources.
+  // Relu operator should not require any persistent or temporary resources.
   ASSERT_EQ(compiled_operator->GetBindingProperties().PersistentResourceSize,
             0u);
+  ASSERT_EQ(compiled_operator->GetBindingProperties().TemporaryResourceSize,
+            0u);
 
   // Initialize the operator.
   auto command_recorder = CommandRecorder::Create(adapter_->command_queue(),
@@ -277,6 +279,12 @@
   EXPECT_HRESULT_SUCCEEDED(adapter_->dml_device()->GetDeviceRemovedReason());
   EXPECT_HRESULT_SUCCEEDED(adapter_->d3d12_device()->GetDeviceRemovedReason());
 
+  // Create the descriptor heap for execution.
+  ComPtr<ID3D12DescriptorHeap> descriptor_heap;
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->CreateDescriptorHeap(
+      compiled_operator->GetBindingProperties().RequiredDescriptorCount,
+      L"Descriptor_Heap_For_Execution", descriptor_heap));
+
   // Create input and output resources that will be bound for operator for
   // execution.
   const uint64_t buffer_size = input_tensor_desc.GetTotalTensorSizeInBytes();
@@ -307,8 +315,8 @@
 
   // Execute the operator with input and output bindings.
   EXPECT_HRESULT_SUCCEEDED(command_recorder->ExecuteOperator(
-      std::move(compiled_operator), input_bindings, output_bindings,
-      absl::nullopt));
+      std::move(compiled_operator), descriptor_heap, input_bindings,
+      output_bindings, absl::nullopt, absl::nullopt));
 
   // Download the result from output resource.
   std::vector<float> result(buffer_size / sizeof(float));
@@ -340,9 +348,11 @@
       dml_operator.Get(), DML_EXECUTION_FLAG_NONE,
       IID_PPV_ARGS(&compiled_operator)));
 
-  // Relu operator should not require any persistent resources.
+  // Relu operator should not require any persistent or temporary resources.
   ASSERT_EQ(compiled_operator->GetBindingProperties().PersistentResourceSize,
             0u);
+  ASSERT_EQ(compiled_operator->GetBindingProperties().TemporaryResourceSize,
+            0u);
 
   // Initialize the operator.
   auto command_recorder = CommandRecorder::Create(adapter_->command_queue(),
@@ -360,6 +370,17 @@
   EXPECT_HRESULT_SUCCEEDED(adapter_->dml_device()->GetDeviceRemovedReason());
   EXPECT_HRESULT_SUCCEEDED(adapter_->d3d12_device()->GetDeviceRemovedReason());
 
+  // Create the descriptor heaps for two operator executions.
+  ComPtr<ID3D12DescriptorHeap> descriptor_heaps[2];
+  uint32_t num_descriptors =
+      compiled_operator->GetBindingProperties().RequiredDescriptorCount;
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->CreateDescriptorHeap(
+      num_descriptors, L"First_Descriptor_Heap_For_Execution",
+      descriptor_heaps[0]));
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->CreateDescriptorHeap(
+      num_descriptors, L"Second_Descriptor_Heap_For_Execution",
+      descriptor_heaps[1]));
+
   // Create input and output resources that will be bound for the two operator
   // executions.
   const uint64_t buffer_size = input_tensor_desc.GetTotalTensorSizeInBytes();
@@ -404,14 +425,16 @@
   Upload(command_recorder.get(), input_data.data(), buffer_size,
          input_buffers[0].Get());
   EXPECT_HRESULT_SUCCEEDED(command_recorder->ExecuteOperator(
-      compiled_operator, input_bindings[0], output_bindings[0], absl::nullopt));
+      compiled_operator, descriptor_heaps[0], input_bindings[0],
+      output_bindings[0], absl::nullopt, absl::nullopt));
 
   // Upload second input data and execute the operator again.
   input_data = {2.0, 1.0, -1.0, -2.0};
   Upload(command_recorder.get(), input_data.data(), buffer_size,
          input_buffers[1].Get());
   EXPECT_HRESULT_SUCCEEDED(command_recorder->ExecuteOperator(
-      compiled_operator, input_bindings[1], output_bindings[1], absl::nullopt));
+      compiled_operator, descriptor_heaps[1], input_bindings[1],
+      output_bindings[1], absl::nullopt, absl::nullopt));
 
   // Download result from output resources.
   ComPtr<ID3D12Resource> readback_buffers[2];
@@ -571,6 +594,9 @@
   DML_BINDING_DESC persistent_buffer_binding_desc{
       .Type = DML_BINDING_TYPE_BUFFER, .Desc = &persistent_buffer_binding};
 
+  // This Convolution operator doesn't need any temporary resource.
+  ASSERT_EQ(execution_binding_properties.TemporaryResourceSize, 0u);
+
   // Initialize the operator and bind the input and persistent resources to
   // the operator initializer.
   EXPECT_HRESULT_SUCCEEDED(command_recorder->InitializeOperator(
@@ -583,6 +609,12 @@
   EXPECT_HRESULT_SUCCEEDED(adapter_->dml_device()->GetDeviceRemovedReason());
   EXPECT_HRESULT_SUCCEEDED(adapter_->d3d12_device()->GetDeviceRemovedReason());
 
+  // Create the descriptor heap for operator execution.
+  ComPtr<ID3D12DescriptorHeap> descriptor_heap;
+  ASSERT_HRESULT_SUCCEEDED(command_recorder->CreateDescriptorHeap(
+      compiled_operator->GetBindingProperties().RequiredDescriptorCount,
+      L"Descriptor_Heap_For_Execution", descriptor_heap));
+
   // Create input and output resources that will be bound for operator for
   // execution.
   const uint64_t input_buffer_size =
@@ -623,8 +655,8 @@
 
   // Execute the operator with persistent, input and output bindings.
   EXPECT_HRESULT_SUCCEEDED(command_recorder->ExecuteOperator(
-      std::move(compiled_operator), input_bindings, output_bindings,
-      persistent_buffer_binding_desc));
+      std::move(compiled_operator), descriptor_heap, input_bindings,
+      output_bindings, persistent_buffer_binding_desc, absl::nullopt));
 
   // Download the result from output resource.
   std::vector<float> result(output_buffer_size / sizeof(float));
diff --git a/services/webnn/dml/graph_impl.cc b/services/webnn/dml/graph_impl.cc
index d624f09..304375f 100644
--- a/services/webnn/dml/graph_impl.cc
+++ b/services/webnn/dml/graph_impl.cc
@@ -18,6 +18,7 @@
 #include "mojo/public/cpp/bindings/self_owned_receiver.h"
 #include "services/webnn/dml/command_queue.h"
 #include "services/webnn/dml/command_recorder.h"
+#include "services/webnn/dml/error.h"
 #include "services/webnn/dml/graph_builder.h"
 #include "services/webnn/dml/tensor_desc.h"
 #include "services/webnn/dml/utils.h"
@@ -94,14 +95,6 @@
   }
 }
 
-// Record the total byte length of buffers and the D3D12_RANGE for each
-// buffer, all with the required alignment.
-template <typename Key>
-struct AlignedByteLength {
-  size_t total_byte_length = 0;
-  std::map<Key, D3D12_RANGE> key_to_d3d12_range_map;
-};
-
 // Calculate the total byte length of buffers and the D3D12_RANGE for each
 // buffer, all with the required alignment.
 template <typename Map>
@@ -140,50 +133,14 @@
 template <typename Key>
 absl::optional<std::map<Key, DML_BUFFER_BINDING>> UploadAndCreateBufferBinding(
     CommandRecorder* command_recorder,
-    const base::flat_map<Key, mojo_base::BigBuffer>& key_to_buffer_map) {
-  // Copy all array buffers of constants/inputs to an upload heap and create a
-  // committed resource which is mapped to the heap.
-  //
-  // Calculate the total byte length of constants/inputs array buffer to create
-  // an upload buffer which can be read by GPU.
-  std::map<Key, size_t> key_to_byte_length_map;
-  for (auto& [key, buffer] : key_to_buffer_map) {
-    key_to_byte_length_map[key] = buffer.size();
-  }
-
-  absl::optional<AlignedByteLength<Key>> aligned_byte_length =
-      CalculateAlignedByteLength(key_to_byte_length_map);
-  if (!aligned_byte_length) {
-    DLOG(ERROR) << "Failed to calculate the aligned byte length.";
-    return absl::nullopt;
-  }
-
-  // Create the upload heap that can be written by CPU and read from GPU,
-  // and create a resource to map the heap.
-  size_t total_byte_length = aligned_byte_length.value().total_byte_length;
-  ComPtr<ID3D12Resource> upload_buffer;
-  HRESULT hr = command_recorder->CreateUploadBuffer(
-      total_byte_length, L"WebNN_Upload_Buffer", upload_buffer);
-  if (FAILED(hr)) {
-    DLOG(ERROR) << "Failed to create upload buffer for inputs: "
-                << logging::SystemErrorCodeToString(hr);
-    return absl::nullopt;
-  }
-  // Create the default heap that only can be accessed by GPU not provide CPU
-  // access, and create a resource to map the heap.
-  ComPtr<ID3D12Resource> default_buffer;
-  hr = command_recorder->CreateDefaultBuffer(
-      total_byte_length, L"WebNN_Default_Input_Buffer", default_buffer);
-  if (FAILED(hr)) {
-    DLOG(ERROR) << "Failed to create default buffer for inputs: "
-                << logging::SystemErrorCodeToString(hr);
-    return absl::nullopt;
-  }
-
+    const base::flat_map<Key, mojo_base::BigBuffer>& key_to_buffer_map,
+    const AlignedByteLength<Key>& aligned_byte_length,
+    ComPtr<ID3D12Resource> upload_buffer,
+    ComPtr<ID3D12Resource> default_buffer) {
   // Map entire resource to copy the array buffer of constant/input one by one
   // with byte offset.
   void* mapped_upload_buffer = nullptr;
-  hr = upload_buffer->Map(0, nullptr, &mapped_upload_buffer);
+  HRESULT hr = upload_buffer->Map(0, nullptr, &mapped_upload_buffer);
   if (FAILED(hr)) {
     DLOG(ERROR) << "Failed to map upload buffer for inputs: "
                 << logging::SystemErrorCodeToString(hr);
@@ -193,7 +150,8 @@
   std::map<Key, DML_BUFFER_BINDING> key_to_buffer_binding_map;
   for (auto& [key, buffer] : key_to_buffer_map) {
     // Copy the input data to the upload heap with byte offset
-    auto& d3d12_range = aligned_byte_length.value().key_to_d3d12_range_map[key];
+    const auto& d3d12_range =
+        aligned_byte_length.key_to_d3d12_range_map.at(key);
     memcpy(static_cast<uint8_t*>(mapped_upload_buffer) + d3d12_range.Begin,
            buffer.data(), buffer.size());
     // Create the buffer binding for each constant/input and push back into the
@@ -207,7 +165,8 @@
   upload_buffer->Unmap(0, nullptr);
 
   UploadBufferWithBarrier(command_recorder, std::move(default_buffer),
-                          std::move(upload_buffer), total_byte_length);
+                          std::move(upload_buffer),
+                          aligned_byte_length.total_byte_length);
 
   return key_to_buffer_binding_map;
 }
@@ -949,16 +908,137 @@
 GraphImpl::GraphBufferBindingInfo& GraphImpl::GraphBufferBindingInfo::operator=(
     GraphBufferBindingInfo&&) = default;
 
+GraphImpl::ComputeResources::ComputeResources(
+    ComPtr<ID3D12DescriptorHeap> descriptor_heap,
+    AlignedByteLength<std::string> input_aligned_byte_length,
+    ComPtr<ID3D12Resource> upload_buffer,
+    ComPtr<ID3D12Resource> input_buffer,
+    AlignedByteLength<std::string> output_aligned_byte_length,
+    ComPtr<ID3D12Resource> output_buffer,
+    ComPtr<ID3D12Resource> readback_buffer,
+    uint64_t temporary_buffer_byte_length,
+    ComPtr<ID3D12Resource> temporary_resource)
+    : descriptor_heap(std::move(descriptor_heap)),
+      input_aligned_byte_length(std::move(input_aligned_byte_length)),
+      upload_buffer(std::move(upload_buffer)),
+      input_buffer(std::move(input_buffer)),
+      output_aligned_byte_length(std::move(output_aligned_byte_length)),
+      output_buffer(std::move(output_buffer)),
+      readback_buffer(std::move(readback_buffer)),
+      temporary_buffer(std::move(temporary_resource)) {
+  if (temporary_buffer_byte_length > 0) {
+    CHECK_NE(temporary_buffer.Get(), nullptr);
+    temporary_buffer_binding =
+        DML_BUFFER_BINDING{.Buffer = temporary_buffer.Get(),
+                           .Offset = 0,
+                           .SizeInBytes = temporary_buffer_byte_length};
+    temporary_buffer_binding_desc =
+        DML_BINDING_DESC{.Type = DML_BINDING_TYPE_BUFFER,
+                         .Desc = &temporary_buffer_binding.value()};
+  }
+}
+
+GraphImpl::ComputeResources::~ComputeResources() = default;
+
+// static
+std::unique_ptr<GraphImpl::ComputeResources>
+GraphImpl::AllocateComputeResources(
+    CommandRecorder* command_recorder,
+    IDMLCompiledOperator* compiled_operator,
+    const ComputeResourceInfo& compute_resource_info) {
+  TRACE_EVENT0("gpu", "GraphImpl::AllocateComputeResources");
+
+  // Create the descriptor heap.
+  DML_BINDING_PROPERTIES execution_binding_properties =
+      compiled_operator->GetBindingProperties();
+  ComPtr<ID3D12DescriptorHeap> descriptor_heap;
+  RETURN_NULL_IF_FAILED(command_recorder->CreateDescriptorHeap(
+      execution_binding_properties.RequiredDescriptorCount,
+      L"WebNN_Descriptor_Heap_For_Execution", descriptor_heap));
+
+  // Calculate the total byte length of input array buffers to create
+  // GPU input buffer and upload buffer, also records the aligned D3D12_RANGE
+  // for each input.
+  absl::optional<AlignedByteLength<std::string>> aligned_byte_length_of_inputs =
+      CalculateAlignedByteLength(
+          compute_resource_info.input_name_to_byte_length_map);
+  if (!aligned_byte_length_of_inputs) {
+    DLOG(ERROR) << "Failed to calculate the aligned byte length of inputs.";
+    return nullptr;
+  }
+
+  // Create the upload heap that can be written by CPU and read from GPU,
+  // and create a resource to map the heap.
+  size_t total_byte_length_of_inputs =
+      aligned_byte_length_of_inputs.value().total_byte_length;
+  ComPtr<ID3D12Resource> upload_buffer;
+  RETURN_NULL_IF_FAILED(command_recorder->CreateUploadBuffer(
+      total_byte_length_of_inputs, L"WebNN_Upload_Buffer_Inputs",
+      upload_buffer));
+
+  // Create the default heap that only can be accessed by GPU not provide CPU
+  // access, and create a resource to map the heap.
+  ComPtr<ID3D12Resource> input_buffer;
+  RETURN_NULL_IF_FAILED(command_recorder->CreateDefaultBuffer(
+      total_byte_length_of_inputs, L"WebNN_Default_Buffer_Inputs",
+      input_buffer));
+
+  // Calculate the total byte length of outputs array buffer to create
+  // an output buffer and readback buffer, also records the aligned D3D12_RANGE
+  // for each output.
+  absl::optional<AlignedByteLength<std::string>>
+      aligned_byte_length_of_outputs = CalculateAlignedByteLength(
+          compute_resource_info.output_name_to_byte_length_map);
+  if (!aligned_byte_length_of_outputs) {
+    DLOG(ERROR) << "Failed to calculate the aligned byte length of outputs.";
+    return nullptr;
+  }
+
+  // Create the output buffer which will be bound for the graph execution.
+  size_t total_byte_length_of_outputs =
+      aligned_byte_length_of_outputs.value().total_byte_length;
+  ComPtr<ID3D12Resource> output_buffer;
+  RETURN_NULL_IF_FAILED(command_recorder->CreateDefaultBuffer(
+      total_byte_length_of_outputs, L"WebNN_Default_Buffer_Outputs",
+      output_buffer));
+
+  // Create the readback buffer which will be read by CPU.
+  ComPtr<ID3D12Resource> readback_buffer;
+  RETURN_NULL_IF_FAILED(command_recorder->CreateReadbackBuffer(
+      total_byte_length_of_outputs, L"WebNN_ReadBack_Buffer_Outputs",
+      readback_buffer));
+
+  // Create and bind the temporary resource if the operator execution requires.
+  ComPtr<ID3D12Resource> temporary_buffer;
+  uint64_t temporary_buffer_byte_length =
+      execution_binding_properties.TemporaryResourceSize;
+  if (temporary_buffer_byte_length > 0) {
+    RETURN_NULL_IF_FAILED(command_recorder->CreateDefaultBuffer(
+        temporary_buffer_byte_length, L"WebNN_Temporary_Buffer_For_Execution",
+        temporary_buffer));
+  }
+
+  return base::WrapUnique(new ComputeResources(
+      std::move(descriptor_heap),
+      std::move(aligned_byte_length_of_inputs.value()),
+      std::move(upload_buffer), std::move(input_buffer),
+      std::move(aligned_byte_length_of_outputs.value()),
+      std::move(output_buffer), std::move(readback_buffer),
+      temporary_buffer_byte_length, std::move(temporary_buffer)));
+}
+
 GraphImpl::GraphImpl(std::unique_ptr<CommandRecorder> command_recorder,
                      ComPtr<ID3D12Resource> persistent_buffer,
                      ComPtr<IDMLCompiledOperator> compiled_operator,
                      ComputeResourceInfo compute_resource_info,
-                     GraphBufferBindingInfo graph_buffer_binding_info)
+                     GraphBufferBindingInfo graph_buffer_binding_info,
+                     std::unique_ptr<ComputeResources> compute_resources)
     : WebNNGraphImpl(std::move(compute_resource_info)),
       persistent_buffer_(std::move(persistent_buffer)),
       command_recorder_(std::move(command_recorder)),
       compiled_operator_(std::move(compiled_operator)),
-      graph_buffer_binding_info_(std::move(graph_buffer_binding_info)) {
+      graph_buffer_binding_info_(std::move(graph_buffer_binding_info)),
+      compute_resources_(std::move(compute_resources)) {
   command_queue_ = command_recorder_->GetCommandQueue();
   dml_device_ = command_recorder_->GetDMLDevice();
 
@@ -1030,8 +1110,57 @@
       graph_buffer_binding_info.input_buffer_binding_count,
       DML_BUFFER_BINDING{.Buffer = nullptr, .Offset = 0, .SizeInBytes = 0});
   if (!constant_id_to_buffer_map.empty()) {
+    std::map<uint64_t, size_t> constant_id_to_byte_length_map;
+    for (auto& [key, buffer] : constant_id_to_buffer_map) {
+      constant_id_to_byte_length_map[key] = buffer.size();
+    }
+
+    absl::optional<AlignedByteLength<uint64_t>>
+        aligned_byte_length_of_constants =
+            CalculateAlignedByteLength(constant_id_to_byte_length_map);
+    if (!aligned_byte_length_of_constants) {
+      DLOG(ERROR)
+          << "Failed to calculate the aligned byte length of constants.";
+      std::move(callback).Run(ToError<mojom::CreateGraphResult>(
+          mojom::Error::Code::kUnknownError,
+          "Failed to calculate the aligned byte length of constants."));
+      return;
+    }
+
+    // Create the upload heap that can be written by CPU and read from GPU,
+    // and create a resource to map the heap.
+    size_t total_byte_length_of_constants =
+        aligned_byte_length_of_constants.value().total_byte_length;
+    ComPtr<ID3D12Resource> upload_buffer;
+    hr = command_recorder->CreateUploadBuffer(total_byte_length_of_constants,
+                                              L"WebNN_Upload_Buffer_Constants",
+                                              upload_buffer);
+    if (FAILED(hr)) {
+      DLOG(ERROR) << "Failed to create upload buffer for constants: "
+                  << logging::SystemErrorCodeToString(hr);
+      std::move(callback).Run(ToError<mojom::CreateGraphResult>(
+          mojom::Error::Code::kUnknownError,
+          "Failed to create upload buffer for constants."));
+      return;
+    }
+    // Create the default heap that only can be accessed by GPU not provide CPU
+    // access, and create a resource to map the heap.
+    ComPtr<ID3D12Resource> default_buffer;
+    hr = command_recorder->CreateDefaultBuffer(
+        total_byte_length_of_constants, L"WebNN_Default_Buffer_Constants",
+        default_buffer);
+    if (FAILED(hr)) {
+      DLOG(ERROR) << "Failed to create default input buffer for constants: "
+                  << logging::SystemErrorCodeToString(hr);
+      std::move(callback).Run(ToError<mojom::CreateGraphResult>(
+          mojom::Error::Code::kUnknownError,
+          "Failed to create default input buffer for constants."));
+      return;
+    }
     auto constant_buffer_binding = UploadAndCreateBufferBinding<uint64_t>(
-        command_recorder.get(), constant_id_to_buffer_map);
+        command_recorder.get(), constant_id_to_buffer_map,
+        aligned_byte_length_of_constants.value(), std::move(upload_buffer),
+        std::move(default_buffer));
     if (!constant_buffer_binding) {
       DLOG(ERROR) << "Failed to upload constant weight data.";
       std::move(callback).Run(ToError<mojom::CreateGraphResult>(
@@ -1140,6 +1269,16 @@
     return;
   }
 
+  std::unique_ptr<ComputeResources> compute_resources =
+      AllocateComputeResources(command_recorder.get(), compiled_operator.Get(),
+                               compute_resource_info);
+  if (!compute_resources) {
+    std::move(callback).Run(ToError<mojom::CreateGraphResult>(
+        mojom::Error::Code::kUnknownError,
+        "Failed to allocate compute resource."));
+    return;
+  }
+
   scoped_refptr<CommandQueue> command_queue(
       command_recorder->GetCommandQueue());
   // The remote sent to the renderer.
@@ -1149,7 +1288,7 @@
       base::WrapUnique(new GraphImpl(
           std::move(command_recorder), std::move(persistent_buffer),
           std::move(compiled_operator), std::move(compute_resource_info),
-          std::move(graph_buffer_binding_info))),
+          std::move(graph_buffer_binding_info), std::move(compute_resources))),
       blink_remote.InitWithNewPipeAndPassReceiver());
   command_queue->ReleaseCompletedResources();
   std::move(callback).Run(
@@ -1327,9 +1466,27 @@
     return;
   }
 
+  // Use the existing compute resource if it is available, otherwise allocate a
+  // new one.
+  std::unique_ptr<ComputeResources> compute_resources =
+      std::move(compute_resources_);
+  if (!compute_resources) {
+    compute_resources = AllocateComputeResources(command_recorder_.get(),
+                                                 compiled_operator_.Get(),
+                                                 compute_resource_info());
+    if (!compute_resources) {
+      HandleComputationFailure("Failed to allocate compute resource.",
+                               std::move(callback));
+      return;
+    }
+  }
+  CHECK(compute_resources);
+
   // Create the input resource binding for graph execution.
   auto input_buffer_binding = UploadAndCreateBufferBinding<std::string>(
-      command_recorder_.get(), named_inputs);
+      command_recorder_.get(), named_inputs,
+      compute_resources->input_aligned_byte_length,
+      compute_resources->upload_buffer, compute_resources->input_buffer);
   if (!input_buffer_binding) {
     HandleComputationFailure(
         "Failed to upload and create the input buffer binding.",
@@ -1354,45 +1511,6 @@
                                                     &buffer_binding};
   }
 
-  // Calculate the total byte length of outputs array buffer to create
-  // an output buffer and readback buffer, also records the aligned D3D12_RANGE
-  // for each output.
-  // TODO(crbug.com/1480227): Allows to compute for some selected outputs
-  // instead of all outputs of the DML graph.
-  absl::optional<AlignedByteLength<std::string>>
-      aligned_byte_length_of_outputs = CalculateAlignedByteLength(
-          compute_resource_info().output_name_to_byte_length_map);
-  if (!aligned_byte_length_of_outputs) {
-    HandleComputationFailure(
-        "Failed to calculate the aligned byte length of outputs.",
-        std::move(callback));
-    return;
-  }
-
-  // Create the output buffer which will be bound for the graph execution.
-  size_t total_byte_length_of_outputs =
-      aligned_byte_length_of_outputs.value().total_byte_length;
-  ComPtr<ID3D12Resource> default_output_buffer;
-  hr = command_recorder_->CreateDefaultBuffer(total_byte_length_of_outputs,
-                                              L"WebNN_Default_Output_Buffer",
-                                              default_output_buffer);
-  if (FAILED(hr)) {
-    HandleComputationFailure("Failed to create the default output buffer.", hr,
-                             std::move(callback));
-    return;
-  }
-
-  // Create the readback buffer which will be read by CPU.
-  ComPtr<ID3D12Resource> readback_output_buffer;
-  hr = command_recorder_->CreateReadbackBuffer(total_byte_length_of_outputs,
-                                               L"WebNN_Readback_Output_Buffer",
-                                               readback_output_buffer);
-  if (FAILED(hr)) {
-    HandleComputationFailure("Failed to create the readback output buffer.", hr,
-                             std::move(callback));
-    return;
-  }
-
   // Create the output buffer bindings for the graph execution.
   size_t output_buffer_binding_count =
       graph_buffer_binding_info_.graph_output_name_to_index_map.size();
@@ -1402,13 +1520,12 @@
   std::vector<DML_BUFFER_BINDING> output_buffer_binding;
   output_buffer_binding.reserve(output_buffer_binding_count);
 
-  std::map<std::string, D3D12_RANGE> graph_output_name_to_d3d12_range_map =
-      std::move(aligned_byte_length_of_outputs.value().key_to_d3d12_range_map);
   for (auto& [name, graph_output_index] :
        graph_buffer_binding_info_.graph_output_name_to_index_map) {
-    auto& d3d12_range = graph_output_name_to_d3d12_range_map[name];
+    auto& d3d12_range = compute_resources->output_aligned_byte_length
+                            .key_to_d3d12_range_map[name];
     output_buffer_binding.push_back(
-        DML_BUFFER_BINDING{.Buffer = default_output_buffer.Get(),
+        DML_BUFFER_BINDING{.Buffer = compute_resources->output_buffer.Get(),
                            .Offset = d3d12_range.Begin,
                            .SizeInBytes = d3d12_range.End - d3d12_range.Begin});
     output_buffer_binding_desc[graph_output_index] = {
@@ -1417,8 +1534,10 @@
 
   // Execute the graph with input, output and persistent buffer bindings.
   hr = command_recorder_->ExecuteOperator(
-      compiled_operator_.Get(), input_buffer_binding_desc,
-      output_buffer_binding_desc, persistent_buffer_binding_desc_);
+      compiled_operator_.Get(), compute_resources->descriptor_heap,
+      input_buffer_binding_desc, output_buffer_binding_desc,
+      persistent_buffer_binding_desc_,
+      compute_resources->temporary_buffer_binding_desc);
   if (FAILED(hr)) {
     HandleComputationFailure("Failed to execute the operator.", hr,
                              std::move(callback));
@@ -1427,14 +1546,15 @@
 
   // Copy the output data from output buffer to readback buffer.
   D3D12_RESOURCE_BARRIER barriers[1];
-  barriers[0] = CreateTransitionBarrier(default_output_buffer.Get(),
+  barriers[0] = CreateTransitionBarrier(compute_resources->output_buffer.Get(),
                                         D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
                                         D3D12_RESOURCE_STATE_COPY_SOURCE);
   command_recorder_->ResourceBarrier(barriers);
-  command_recorder_->CopyBufferRegion(readback_output_buffer.Get(), 0,
-                                      default_output_buffer.Get(), 0,
-                                      total_byte_length_of_outputs);
-  barriers[0] = CreateTransitionBarrier(default_output_buffer.Get(),
+  command_recorder_->CopyBufferRegion(
+      compute_resources->readback_buffer.Get(), 0,
+      compute_resources->output_buffer.Get(), 0,
+      compute_resources->output_aligned_byte_length.total_byte_length);
+  barriers[0] = CreateTransitionBarrier(compute_resources->output_buffer.Get(),
                                         D3D12_RESOURCE_STATE_COPY_SOURCE,
                                         D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
   command_recorder_->ResourceBarrier(barriers);
@@ -1448,14 +1568,12 @@
 
   command_queue_->WaitAsync(base::BindOnce(
       &GraphImpl::OnComputationComplete, weak_factory_.GetWeakPtr(),
-      std::move(callback), std::move(readback_output_buffer),
-      std::move(graph_output_name_to_d3d12_range_map)));
+      std::move(callback), std::move(compute_resources)));
 }
 
 void GraphImpl::OnComputationComplete(
     mojom::WebNNGraph::ComputeCallback callback,
-    ComPtr<ID3D12Resource> readback_output_buffer,
-    std::map<std::string, D3D12_RANGE> graph_output_name_to_d3d12_range_map,
+    std::unique_ptr<ComputeResources> compute_resources,
     HRESULT hr) {
   TRACE_EVENT0("gpu", "dml::GraphImpl::OnComputationComplete");
   if (FAILED(hr)) {
@@ -1467,13 +1585,17 @@
   // Map entire buffer to readback the output data one by one with byte
   // offset.
   void* mapped_readback_output_buffer = nullptr;
-  hr = readback_output_buffer->Map(0, nullptr, &mapped_readback_output_buffer);
+  hr = compute_resources->readback_buffer->Map(0, nullptr,
+                                               &mapped_readback_output_buffer);
   if (FAILED(hr)) {
     HandleComputationFailure("Failed to map the readback output buffer.", hr,
                              std::move(callback));
     return;
   }
 
+  const std::map<std::string, D3D12_RANGE>&
+      graph_output_name_to_d3d12_range_map =
+          compute_resources->output_aligned_byte_length.key_to_d3d12_range_map;
   base::flat_map<std::string, mojo_base::BigBuffer> named_outputs;
   named_outputs.reserve(graph_output_name_to_d3d12_range_map.size());
   for (auto& [name, d3d12_range] : graph_output_name_to_d3d12_range_map) {
@@ -1483,7 +1605,14 @@
         compute_resource_info().output_name_to_byte_length_map.at(name)));
   }
 
-  readback_output_buffer->Unmap(0, nullptr);
+  compute_resources->readback_buffer->Unmap(0, nullptr);
+
+  // If there is an existing free compute resource, release this compute
+  // resource. Otherwise, recycle this compute resource for the next call.
+  if (!compute_resources_) {
+    compute_resources_ = std::move(compute_resources);
+  }
+
   command_queue_->ReleaseCompletedResources();
   std::move(callback).Run(ComputeResult::kOk, std::move(named_outputs));
 }
diff --git a/services/webnn/dml/graph_impl.h b/services/webnn/dml/graph_impl.h
index 8724634..f7194bf 100644
--- a/services/webnn/dml/graph_impl.h
+++ b/services/webnn/dml/graph_impl.h
@@ -22,10 +22,20 @@
 
 namespace webnn::dml {
 
+using Microsoft::WRL::ComPtr;
+
 class CommandQueue;
 class CommandRecorder;
 class GraphBuilder;
 
+// Record the total byte length of buffers and the D3D12_RANGE for each
+// buffer, all with the required alignment.
+template <typename Key>
+struct AlignedByteLength {
+  size_t total_byte_length = 0;
+  std::map<Key, D3D12_RANGE> key_to_d3d12_range_map;
+};
+
 // GraphImpl inherits WebNNGraphImpl to represent a DML graph implementation. It
 // is mainly responsible for building and compiling a DML graph from
 // mojom::GraphInfo via GraphBuilder, then initializing and executing the graph
@@ -39,7 +49,7 @@
   // instance will only be created and bound to the mojom receiver in
   // GraphImpl::OnInitializationComplete method.
   static void CreateAndBuild(scoped_refptr<CommandQueue> command_queue,
-                             Microsoft::WRL::ComPtr<IDMLDevice> dml_device,
+                             ComPtr<IDMLDevice> dml_device,
                              const mojom::GraphInfoPtr& graph_info,
                              mojom::WebNNContext::CreateGraphCallback callback);
 
@@ -75,18 +85,60 @@
     std::unordered_map<std::string, uint32_t> graph_output_name_to_index_map;
   };
 
+  // Contains the GPU resources for a graph execution, including the descriptor
+  // heap, upload buffer, input buffer, output buffer, read-back buffer and
+  // temporary buffer if the graph needs. These resources should be kept alive
+  // until the GPU has completed the execution. After that, the resources could
+  // be reused for next graph execution or be released.
+  struct ComputeResources {
+    ComputeResources(ComPtr<ID3D12DescriptorHeap> descriptor_heap,
+                     AlignedByteLength<std::string> input_aligned_byte_length,
+                     ComPtr<ID3D12Resource> upload_buffer,
+                     ComPtr<ID3D12Resource> input_buffer,
+                     AlignedByteLength<std::string> output_aligned_byte_length,
+                     ComPtr<ID3D12Resource> output_buffer,
+                     ComPtr<ID3D12Resource> readback_buffer,
+                     uint64_t temporary_buffer_byte_length,
+                     ComPtr<ID3D12Resource> temporary_buffer);
+    ~ComputeResources();
+    ComputeResources(const ComputeResources&) = delete;
+    ComputeResources& operator=(const ComputeResources&) = delete;
+    ComputeResources(ComputeResources&&) = delete;
+    ComputeResources& operator=(ComputeResources&&) = delete;
+
+    ComPtr<ID3D12DescriptorHeap> descriptor_heap;
+
+    AlignedByteLength<std::string> input_aligned_byte_length;
+    ComPtr<ID3D12Resource> upload_buffer;
+    ComPtr<ID3D12Resource> input_buffer;
+
+    AlignedByteLength<std::string> output_aligned_byte_length;
+    ComPtr<ID3D12Resource> output_buffer;
+    ComPtr<ID3D12Resource> readback_buffer;
+
+    ComPtr<ID3D12Resource> temporary_buffer;
+    absl::optional<DML_BUFFER_BINDING> temporary_buffer_binding;
+    absl::optional<DML_BINDING_DESC> temporary_buffer_binding_desc;
+  };
+
+  static std::unique_ptr<ComputeResources> AllocateComputeResources(
+      CommandRecorder* command_recorder,
+      IDMLCompiledOperator* compiled_operator,
+      const ComputeResourceInfo& compute_resource_info);
+
   GraphImpl(std::unique_ptr<CommandRecorder> command_recorder,
-            Microsoft::WRL::ComPtr<ID3D12Resource> persistent_buffer,
-            Microsoft::WRL::ComPtr<IDMLCompiledOperator> compiled_operator,
+            ComPtr<ID3D12Resource> persistent_buffer,
+            ComPtr<IDMLCompiledOperator> compiled_operator,
             ComputeResourceInfo compute_resource_info,
-            GraphBufferBindingInfo graph_buffer_binding_info);
+            GraphBufferBindingInfo graph_buffer_binding_info,
+            std::unique_ptr<ComputeResources> compute_resources);
 
   // The method compiles all DML operators into an IDMLCompiledOperator
   // which can be dispatched to GPU. Since IDMLDevice1::CompileGraph called in
   // this method may take long time to compile shaders (if not cached before),
   // this method should run on a background thread rather than the current GPU
   // main thread to avoid blocking.
-  static Microsoft::WRL::ComPtr<IDMLCompiledOperator> CompileOnBackgroundThread(
+  static ComPtr<IDMLCompiledOperator> CompileOnBackgroundThread(
       GraphBuilder graph_builder);
 
   // After the CompileOnBackgroundThread task is completed on a background
@@ -110,7 +162,7 @@
       std::unordered_map<uint64_t, uint32_t> constant_id_to_input_index_map,
       GraphBufferBindingInfo graph_buffer_binding_info,
       ComputeResourceInfo compute_resource_info,
-      Microsoft::WRL::ComPtr<IDMLCompiledOperator> compiled_operator);
+      ComPtr<IDMLCompiledOperator> compiled_operator);
 
   // Create the GraphImpl instance and bind it to the mojom::WebNNGraph
   // receiver, then run callback to send the pending remote to the
@@ -119,8 +171,8 @@
   // required by the graph.
   static void OnInitializationComplete(
       std::unique_ptr<CommandRecorder> command_recorder,
-      Microsoft::WRL::ComPtr<ID3D12Resource> persistent_buffer,
-      Microsoft::WRL::ComPtr<IDMLCompiledOperator> compiled_operator,
+      ComPtr<ID3D12Resource> persistent_buffer,
+      ComPtr<IDMLCompiledOperator> compiled_operator,
       ComputeResourceInfo compute_resource_info,
       GraphBufferBindingInfo graph_buffer_binding_info,
       mojom::WebNNContext::CreateGraphCallback callback,
@@ -134,8 +186,7 @@
   // which indicate the aligned offset for each output of the graph.
   void OnComputationComplete(
       mojom::WebNNGraph::ComputeCallback callback,
-      Microsoft::WRL::ComPtr<ID3D12Resource> readback_output_buffer,
-      std::map<std::string, D3D12_RANGE> graph_output_name_to_d3d12_range_map,
+      std::unique_ptr<ComputeResources> compute_resources,
       HRESULT hr);
 
   // If GraphImpl::ComputeImpl fails, report an error and release the command
@@ -165,16 +216,27 @@
   // GPU is completed and will be used for the following graph executions. It
   // could be nullptr which means it isn't required by the graph and won't need
   // to be bound for graph executions.
-  Microsoft::WRL::ComPtr<ID3D12Resource> persistent_buffer_;
+  ComPtr<ID3D12Resource> persistent_buffer_;
   absl::optional<DML_BUFFER_BINDING> persistent_buffer_binding_;
   absl::optional<DML_BINDING_DESC> persistent_buffer_binding_desc_;
   scoped_refptr<CommandQueue> command_queue_;
-  Microsoft::WRL::ComPtr<IDMLDevice> dml_device_;
+  ComPtr<IDMLDevice> dml_device_;
   std::unique_ptr<CommandRecorder> command_recorder_;
   // IDMLCompiledOperator represents a compiled and initialized DML graph to be
   // executed on GPU.
-  Microsoft::WRL::ComPtr<IDMLCompiledOperator> compiled_operator_;
+  ComPtr<IDMLCompiledOperator> compiled_operator_;
   GraphBufferBindingInfo graph_buffer_binding_info_;
+
+  // The compute resource is pre-allocated after graph initialization and
+  // recycled after graph execution has completed. It avoids the resource
+  // allocation overhead for the first execution and following executions when
+  // it is available. A graph execution takes its ownership during the execution
+  // and returns the ownership once the GPU has completed the execution. If it
+  // is unavailable, e.g., being taken by previous uncompleted execution, a
+  // graph execution will allocate a new one and release it after the execution
+  // is done.
+  std::unique_ptr<ComputeResources> compute_resources_;
+
   base::WeakPtrFactory<GraphImpl> weak_factory_{this};
 };
 
diff --git a/testing/buildbot/autoshard_exceptions.json b/testing/buildbot/autoshard_exceptions.json
index c672e94f..efccf35 100644
--- a/testing/buildbot/autoshard_exceptions.json
+++ b/testing/buildbot/autoshard_exceptions.json
@@ -43,36 +43,6 @@
                 },
                 "shards": "2"
             }
-        },
-        "android-nougat-x86-rel": {
-            "content_shell_test_apk": {
-                "debug": {
-                    "avg_num_builds_per_peak_hour": "86.0",
-                    "estimated_bot_hour_delta": "-3.2",
-                    "prev_avg_pending_time_sec": "13.6",
-                    "prev_p50_pending_time_sec": "0.0",
-                    "prev_p90_pending_time_sec": "42.0",
-                    "prev_percentile_duration_minutes": "12.68",
-                    "prev_shard_count": "6",
-                    "simulated_max_shard_duration": "15.22",
-                    "try_builder": "android-nougat-x86-rel"
-                },
-                "shards": "5"
-            },
-            "webview_instrumentation_test_apk": {
-                "debug": {
-                    "avg_num_builds_per_peak_hour": "86.0",
-                    "estimated_bot_hour_delta": "19.88",
-                    "prev_avg_pending_time_sec": "28.6",
-                    "prev_p50_pending_time_sec": "3.0",
-                    "prev_p90_pending_time_sec": "91.0",
-                    "prev_percentile_duration_minutes": "18.28",
-                    "prev_shard_count": "22",
-                    "simulated_max_shard_duration": "14.36",
-                    "try_builder": "android-nougat-x86-rel"
-                },
-                "shards": "28"
-            }
         }
     },
     "chromium.chromiumos": {
@@ -579,4 +549,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json
index 918cd44..dfbf7a4 100644
--- a/testing/buildbot/chromium.android.json
+++ b/testing/buildbot/chromium.android.json
@@ -25281,4800 +25281,6 @@
       }
     ]
   },
-  "android-nougat-x86-rel": {
-    "additional_compile_targets": [
-      "chrome_nocompile_tests"
-    ],
-    "gtest_tests": [
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "absl_hardening_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "absl_hardening_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "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/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "ci_only": true,
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "android_browsertests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 9
-        },
-        "test": "android_browsertests",
-        "test_id_prefix": "ninja://chrome/test:android_browsertests/"
-      },
-      {
-        "args": [
-          "--test-launcher-batch-limit=1",
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "ci_only": true,
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_sync_integration_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "android_sync_integration_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "android_sync_integration_tests",
-        "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "android_webview_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "android_webview_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "android_webview_unittests",
-        "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "-v",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "angle_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "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
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "base_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "base_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "base_unittests",
-        "test_id_prefix": "ninja://base:base_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "blink_common_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "blink_common_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "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/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "blink_heap_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "blink_heap_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "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/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.blink_platform_unittests.filter"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "blink_platform_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "blink_platform_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "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/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "boringssl_crypto_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "boringssl_crypto_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_crypto_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "boringssl_ssl_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "boringssl_ssl_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "boringssl_ssl_tests",
-        "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/"
-      },
-      {
-        "args": [
-          "--gtest_filter=-*UsingRealWebcam*",
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "capture_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "capture_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "capture_unittests",
-        "test_id_prefix": "ninja://media/capture:capture_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "cast_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "cast_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cast_unittests",
-        "test_id_prefix": "ninja://media/cast:cast_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "cc_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "cc_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "cc_unittests",
-        "test_id_prefix": "ninja://cc:cc_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_java_test_wpr_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_java_test_wpr_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_java_test_wpr_tests",
-        "test_id_prefix": "ninja://chrome/test/android:chrome_java_test_wpr_tests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_smoke_test"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_smoke_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_public_smoke_test",
-        "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/"
-      },
-      {
-        "args": [
-          "--gtest_filter=-org.chromium.chrome.browser.contextualsearch.ContextualSearchManagerTest.test*ExternalNavigationWithUserGesture*:org.chromium.shape_detection.*",
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--git-revision=${got_revision}",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_test_apk",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 75
-        },
-        "test": "chrome_public_test_apk",
-        "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/"
-      },
-      {
-        "args": [
-          "--gtest_filter=org.chromium.chrome.browser.contextualsearch.ContextualSearchManagerTest.test*ExternalNavigationWithUserGesture*:org.chromium.shape_detection.*",
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_test_apk_with_playstore"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_test_apk_with_playstore",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_public_test_apk",
-        "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--git-revision=${got_revision}"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "chrome_public_unit_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "chrome_public_unit_test_apk",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 4
-        },
-        "test": "chrome_public_unit_test_apk",
-        "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "components_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "components_browsertests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 4
-        },
-        "test": "components_browsertests",
-        "test_id_prefix": "ninja://components:components_browsertests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "components_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "components_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test": "components_unittests",
-        "test_id_prefix": "ninja://components:components_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.content_browsertests.filter"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "content_browsertests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "content_browsertests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 75
-        },
-        "test": "content_browsertests",
-        "test_id_prefix": "ninja://content/test:content_browsertests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.content_shell_test_apk.filter"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "content_shell_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "content_shell_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
-        },
-        "test": "content_shell_test_apk",
-        "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "content_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "content_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "content_unittests",
-        "test_id_prefix": "ninja://content/test:content_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "crashpad_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "crashpad_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crashpad_tests",
-        "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "crypto_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "crypto_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "crypto_unittests",
-        "test_id_prefix": "ninja://crypto:crypto_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "device_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "device_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "device_unittests",
-        "test_id_prefix": "ninja://device:device_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "display_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "display_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "display_unittests",
-        "test_id_prefix": "ninja://ui/display:display_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "ci_only": true,
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "env_chromium_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "env_chromium_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "env_chromium_unittests",
-        "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "events_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "events_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "events_unittests",
-        "test_id_prefix": "ninja://ui/events:events_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gcm_unit_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gcm_unit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gcm_unit_tests",
-        "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gfx_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gfx_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gfx_unittests",
-        "test_id_prefix": "ninja://ui/gfx:gfx_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gin_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gin_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gin_unittests",
-        "test_id_prefix": "ninja://gin:gin_unittests/"
-      },
-      {
-        "args": [
-          "--use-cmd-decoder=validating",
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n_o_p.gl_tests.filter"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gl_tests_validating"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gl_tests_validating",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_tests",
-        "test_id_prefix": "ninja://gpu:gl_tests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gl_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gl_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gl_unittests",
-        "test_id_prefix": "ninja://ui/gl:gl_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "google_apis_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "google_apis_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "google_apis_unittests",
-        "test_id_prefix": "ninja://google_apis:google_apis_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gpu_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gpu_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gpu_unittests",
-        "test_id_prefix": "ninja://gpu:gpu_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "gwp_asan_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "gwp_asan_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "gwp_asan_unittests",
-        "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ipc_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ipc_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ipc_tests",
-        "test_id_prefix": "ninja://ipc:ipc_tests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "latency_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "latency_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "latency_unittests",
-        "test_id_prefix": "ninja://ui/latency:latency_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "libjingle_xmpp_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "libjingle_xmpp_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "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/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "liburlpattern_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "liburlpattern_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "liburlpattern_unittests",
-        "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "media_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "media_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_unittests",
-        "test_id_prefix": "ninja://media:media_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "midi_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "midi_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "midi_unittests",
-        "test_id_prefix": "ninja://media/midi:midi_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "mojo_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "mojo_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_test_apk",
-        "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "mojo_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "mojo_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "mojo_unittests",
-        "test_id_prefix": "ninja://mojo:mojo_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "monochrome_public_bundle_smoke_test"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "monochrome_public_bundle_smoke_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "monochrome_public_bundle_smoke_test",
-        "test_id_prefix": "ninja://chrome/android:monochrome_public_bundle_smoke_test/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "monochrome_public_smoke_test"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "monochrome_public_smoke_test",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "monochrome_public_smoke_test",
-        "test_id_prefix": "ninja://chrome/android:monochrome_public_smoke_test/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "net_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "net_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "net_unittests",
-        "test_id_prefix": "ninja://net:net_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--gtest_filter=-ScopedDirTest.CloseOutOfScope"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "perfetto_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "perfetto_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "perfetto_unittests",
-        "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "sandbox_linux_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "sandbox_linux_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sandbox_linux_unittests",
-        "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--gtest_filter=-PacLibraryTest.ActualPacMyIpAddress*"
-        ],
-        "ci_only": true,
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "services_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "services_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 3
-        },
-        "test": "services_unittests",
-        "test_id_prefix": "ninja://services:services_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "shell_dialogs_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "shell_dialogs_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "shell_dialogs_unittests",
-        "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "skia_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "skia_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "skia_unittests",
-        "test_id_prefix": "ninja://skia:skia_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "sql_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "sql_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "sql_unittests",
-        "test_id_prefix": "ninja://sql:sql_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "storage_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "storage_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "storage_unittests",
-        "test_id_prefix": "ninja://storage:storage_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "system_webview_shell_layout_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "system_webview_shell_layout_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "system_webview_shell_layout_test_apk",
-        "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ui_android_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ui_android_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_android_unittests",
-        "test_id_prefix": "ninja://ui/android:ui_android_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ui_base_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ui_base_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_base_unittests",
-        "test_id_prefix": "ninja://ui/base:ui_base_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "ui_touch_selection_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "ui_touch_selection_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "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/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "unit_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "unit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "unit_tests",
-        "test_id_prefix": "ninja://chrome/test:unit_tests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "url_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "url_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "url_unittests",
-        "test_id_prefix": "ninja://url:url_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "viz_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "viz_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "viz_unittests",
-        "test_id_prefix": "ninja://components/viz:viz_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "webkit_unit_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "webkit_unit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 6
-        },
-        "test": "blink_unittests",
-        "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.webview_cts_tests.filter"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "webview_cts_tests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "webview_cts_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "cipd_packages": [
-            {
-              "cipd_package": "chromium/android_webview/tools/cts_archive",
-              "location": "android_webview/tools/cts_archive",
-              "revision": "akIIr4yAFQwo3j5WYo2PQvy6z8XI51UiwiikPYzI4tUC"
-            }
-          ],
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "webview_cts_tests",
-        "test_id_prefix": "ninja://android_webview/test:webview_cts_tests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "webview_instrumentation_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "webview_instrumentation_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 28
-        },
-        "test": "webview_instrumentation_test_apk",
-        "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "webview_ui_test_app_test_apk"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "webview_ui_test_app_test_apk",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "webview_ui_test_app_test_apk",
-        "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "wtf_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "wtf_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "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/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--gs-results-bucket=chromium-result-details",
-          "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--bucket",
-            "chromium-result-details",
-            "--test-name",
-            "zlib_unittests"
-          ],
-          "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
-        },
-        "name": "zlib_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "output_links": [
-            {
-              "link": [
-                "https://luci-logdog.appspot.com/v/?s",
-                "=android%2Fswarming%2Flogcats%2F",
-                "${TASK_ID}%2F%2B%2Funified_logcats"
-              ],
-              "name": "shard #${SHARD_INDEX} logcats"
-            }
-          ],
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "zlib_unittests",
-        "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/"
-      }
-    ],
-    "isolated_scripts": [
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "android_webview_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "android_webview_junit_tests",
-        "test_id_prefix": "ninja://android_webview/test:android_webview_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "base_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "base_junit_tests",
-        "test_id_prefix": "ninja://base:base_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "build_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "build_junit_tests",
-        "test_id_prefix": "ninja://build/android:build_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "chrome_java_test_pagecontroller_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_java_test_pagecontroller_junit_tests",
-        "test_id_prefix": "ninja://chrome/test/android:chrome_java_test_pagecontroller_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "chrome_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "chrome_junit_tests",
-        "test_id_prefix": "ninja://chrome/android:chrome_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "components_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "components_junit_tests",
-        "test_id_prefix": "ninja://components:components_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--gtest-benchmark-name=components_perftests",
-          "--use-persistent-shell",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "args": [
-            "--smoke-test-mode"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "name": "components_perftests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "components_perftests",
-        "test_id_prefix": "ninja://components:components_perftests/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "content_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "content_junit_tests",
-        "test_id_prefix": "ninja://content/public/android:content_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "device_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "device_junit_tests",
-        "test_id_prefix": "ninja://device:device_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "junit_unit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "junit_unit_tests",
-        "test_id_prefix": "ninja://testing/android/junit:junit_unit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "keyboard_accessory_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "keyboard_accessory_junit_tests",
-        "test_id_prefix": "ninja://chrome/android/features/keyboard_accessory:keyboard_accessory_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "media_base_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "media_base_junit_tests",
-        "test_id_prefix": "ninja://media/base/android:media_base_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "module_installer_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "module_installer_junit_tests",
-        "test_id_prefix": "ninja://components/module_installer/android:module_installer_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "monochrome_public_apk_checker",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_os_flavor": null,
-            "device_playstore_version": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "monochrome_public_apk_checker",
-        "test_id_prefix": "ninja://chrome/android/monochrome:monochrome_public_apk_checker/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "net_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "net_junit_tests",
-        "test_id_prefix": "ninja://net/android:net_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "paint_preview_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "paint_preview_junit_tests",
-        "test_id_prefix": "ninja://components/paint_preview/player/android:paint_preview_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "password_check_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "password_check_junit_tests",
-        "test_id_prefix": "ninja://chrome/browser/password_check/android:password_check_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "password_manager_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "password_manager_junit_tests",
-        "test_id_prefix": "ninja://chrome/browser/password_manager/android:password_manager_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "services_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "services_junit_tests",
-        "test_id_prefix": "ninja://services:services_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "BrowserMinidumpTest",
-          "--browser=android-chromium",
-          "-v",
-          "--passthrough",
-          "--retry-limit=2",
-          "--use-persistent-shell",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "ci_only": true,
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_chromium_minidump_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "telemetry_perf_unittests_android_chrome",
-        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests_android_chrome/"
-      },
-      {
-        "args": [
-          "BrowserMinidumpTest",
-          "--browser=android-chromium-monochrome",
-          "-v",
-          "--passthrough",
-          "--retry-limit=2",
-          "--use-persistent-shell",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "ci_only": true,
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_monochrome_minidump_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "telemetry_perf_unittests_android_monochrome",
-        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests_android_monochrome/"
-      },
-      {
-        "args": [
-          "--extra-browser-args=--enable-crashpad",
-          "--use-persistent-shell",
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb",
-          "--browser=android-chromium"
-        ],
-        "ci_only": true,
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "telemetry_perf_unittests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "4",
-            "cpu": "x86-64",
-            "device_os": null,
-            "device_type": null,
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests.avd"
-          },
-          "idempotent": false,
-          "named_caches": [
-            {
-              "name": "generic_android24",
-              "path": ".android_emulator/generic_android24"
-            }
-          ],
-          "optional_dimensions": {
-            "60": {
-              "caches": "generic_android24"
-            }
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 12
-        },
-        "test": "telemetry_perf_unittests_android_chrome",
-        "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests_android_chrome/"
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "touch_to_fill_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "touch_to_fill_junit_tests",
-        "test_id_prefix": "ninja://chrome/browser/touch_to_fill/android:touch_to_fill_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "ui_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "ui_junit_tests",
-        "test_id_prefix": "ninja://ui/android:ui_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webapk_client_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "webapk_client_junit_tests",
-        "test_id_prefix": "ninja://chrome/android/webapk/libs/client:webapk_client_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webapk_shell_apk_h2o_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "webapk_shell_apk_h2o_junit_tests",
-        "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_h2o_junit_tests/",
-        "use_isolated_scripts_api": true
-      },
-      {
-        "args": [
-          "--use-persistent-shell"
-        ],
-        "isolate_profile_data": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
-        },
-        "name": "webapk_shell_apk_junit_tests",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "swarming": {
-          "dimensions": {
-            "cores": "8",
-            "cpu": "x86-64",
-            "os": "Ubuntu-22.04",
-            "pool": "chromium.tests"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "webapk_shell_apk_junit_tests",
-        "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests/",
-        "use_isolated_scripts_api": true
-      }
-    ],
-    "scripts": [
-      {
-        "args": [
-          "--avd-config=../../tools/android/avd/proto/generic_android24.textpb"
-        ],
-        "isolate_profile_data": true,
-        "name": "check_network_annotations",
-        "resultdb": {
-          "enable": true,
-          "has_native_resultdb_integration": true
-        },
-        "script": "check_network_annotations.py"
-      }
-    ]
-  },
   "android-oreo-x86-rel": {
     "additional_compile_targets": [
       "chrome_nocompile_tests"
@@ -31995,7 +27201,7 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android26.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n_o_p.gl_tests.filter"
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o_p.gl_tests.filter"
         ],
         "isolate_profile_data": true,
         "merge": {
@@ -37721,7 +32927,7 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android28.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n_o_p.gl_tests.filter"
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o_p.gl_tests.filter"
         ],
         "merge": {
           "args": [
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 60d208b..e67be2f 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -1322,51 +1322,6 @@
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
-        "name": "interactive_ui_tests amd64-generic",
-        "swarming": {
-          "dimensions": {
-            "cpu": "x86-64",
-            "kvm": "1",
-            "os": "Ubuntu-22.04"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "interactive_ui_tests",
-        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "variant_id": "amd64-generic"
-      },
-      {
-        "args": [
-          "--board=eve",
-          "--flash"
-        ],
-        "ci_only": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "name": "interactive_ui_tests eve",
-        "swarming": {
-          "dimensions": {
-            "device_type": "eve",
-            "os": "ChromeOS"
-          },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "interactive_ui_tests",
-        "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/",
-        "trigger_script": {
-          "script": "//testing/trigger_scripts/chromeos_device_trigger.py"
-        },
-        "variant_id": "eve"
-      },
-      {
-        "args": [
-          "--board=amd64-generic",
-          "--use-vm"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
         "name": "lacros_all_tast_tests amd64-generic",
         "resultdb": {
           "enable": true,
@@ -5188,9 +5143,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -5200,8 +5155,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -5335,9 +5290,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -5347,8 +5302,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -5468,9 +5423,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -5480,8 +5435,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json
index 5ad3fb8..b386c489 100644
--- a/testing/buildbot/chromium.coverage.json
+++ b/testing/buildbot/chromium.coverage.json
@@ -3630,8 +3630,7 @@
           "--use-persistent-shell",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android26.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.blink_platform_unittests.filter"
+          "--avd-config=../../tools/android/avd/proto/generic_android26.textpb"
         ],
         "isolate_profile_data": true,
         "merge": {
@@ -4097,7 +4096,7 @@
           "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android26.textpb",
           "--git-revision=${got_revision}",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter"
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o.chrome_public_test_apk.filter"
         ],
         "isolate_profile_data": true,
         "merge": {
@@ -4225,7 +4224,8 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android26.textpb",
-          "--git-revision=${got_revision}"
+          "--git-revision=${got_revision}",
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o.chrome_public_unit_test_apk.filter"
         ],
         "isolate_profile_data": true,
         "merge": {
@@ -4405,7 +4405,7 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android26.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.content_browsertests.filter"
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o.content_browsertests.filter"
         ],
         "isolate_profile_data": true,
         "merge": {
@@ -4463,8 +4463,7 @@
           "--use-persistent-shell",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android26.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.content_shell_test_apk.filter"
+          "--avd-config=../../tools/android/avd/proto/generic_android26.textpb"
         ],
         "isolate_profile_data": true,
         "merge": {
@@ -5096,7 +5095,7 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android26.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n_o_p.gl_tests.filter"
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o_p.gl_tests.filter"
         ],
         "isolate_profile_data": true,
         "merge": {
@@ -6183,7 +6182,7 @@
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
           "--avd-config=../../tools/android/avd/proto/generic_android26.textpb",
-          "--gtest_filter=-PacLibraryTest.ActualPacMyIpAddress*"
+          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o.services_unittests.filter"
         ],
         "isolate_profile_data": true,
         "merge": {
@@ -6927,8 +6926,7 @@
           "--use-persistent-shell",
           "--gs-results-bucket=chromium-result-details",
           "--recover-devices",
-          "--avd-config=../../tools/android/avd/proto/generic_android26.textpb",
-          "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.webview_cts_tests.filter"
+          "--avd-config=../../tools/android/avd/proto/generic_android26.textpb"
         ],
         "isolate_profile_data": true,
         "merge": {
@@ -25480,9 +25478,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -25492,8 +25490,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -25627,9 +25625,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -25639,8 +25637,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -25760,9 +25758,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -25772,8 +25770,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -28259,9 +28257,12 @@
         "name": "extensions_browsertests",
         "swarming": {
           "dimensions": {
-            "os": "Windows-10-19045"
+            "os": "Windows-10-19045",
+            "pool": "chromium.tests.coverage",
+            "ssd": "1"
           },
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
+          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
+          "shards": 2
         },
         "test": "extensions_browsertests",
         "test_id_prefix": "ninja://extensions:extensions_browsertests/"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index a348bb5b..7b269d21 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -43601,9 +43601,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -43612,8 +43612,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -43748,9 +43748,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -43759,8 +43759,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -43881,9 +43881,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -43892,8 +43892,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -45205,9 +45205,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -45216,8 +45216,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -45352,9 +45352,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -45363,8 +45363,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -45485,9 +45485,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -45496,8 +45496,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -46194,9 +46194,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -46205,8 +46205,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 2fa1eeb..23459d7 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -16396,12 +16396,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -16411,8 +16411,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -16563,12 +16563,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -16578,8 +16578,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
@@ -16711,12 +16711,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 119.0.6036.0",
+        "description": "Run with ash-chrome version 119.0.6045.10",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -16726,8 +16726,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v119.0.6036.0",
-              "revision": "version:119.0.6036.0"
+              "location": "lacros_version_skew_tests_v119.0.6045.10",
+              "revision": "version:119.0.6045.10"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn
index 876c7add..434d1a79 100644
--- a/testing/buildbot/filters/BUILD.gn
+++ b/testing/buildbot/filters/BUILD.gn
@@ -40,7 +40,7 @@
 source_set("blink_platform_unittests") {
   testonly = true
 
-  data = [ "//testing/buildbot/filters/android.emulator_n.blink_platform_unittests.filter" ]
+  data = []
 }
 
 source_set("blink_web_tests_filter") {
@@ -92,7 +92,6 @@
     "//testing/buildbot/filters/android.emulator_12.chrome_public_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_12l.chrome_public_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_13.chrome_public_test_apk.filter",
-    "//testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_o.chrome_public_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_p.chrome_public_test_apk.filter",
   ]
@@ -105,7 +104,6 @@
     "//testing/buildbot/filters/android.emulator_12.chrome_public_unit_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_12l.chrome_public_unit_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_13.chrome_public_unit_test_apk.filter",
-    "//testing/buildbot/filters/android.emulator_n.chrome_public_unit_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_o.chrome_public_unit_test_apk.filter",
   ]
 }
@@ -127,7 +125,6 @@
   testonly = true
 
   data = [
-    "//testing/buildbot/filters/android.emulator_n.components_unittests.filter",
     "//testing/buildbot/filters/linux-lacros.components_unittests.filter",
     "//testing/buildbot/filters/rust.components_unittests.filter",
   ]
@@ -142,7 +139,6 @@
     "//testing/buildbot/filters/android.emulator_12.content_browsertests.filter",
     "//testing/buildbot/filters/android.emulator_12l_13.content_browsertests.filter",
     "//testing/buildbot/filters/android.emulator_12.oop_network_service_content_browsertests.filter",
-    "//testing/buildbot/filters/android.emulator_n.content_browsertests.filter",
     "//testing/buildbot/filters/android.emulator_o.content_browsertests.filter",
     "//testing/buildbot/filters/android.emulator_p.content_browsertests.filter",
     "//testing/buildbot/filters/android.pie_arm64.content_browsertests_coverage.filter",
@@ -176,7 +172,6 @@
     "//testing/buildbot/filters/android.emulator_12.content_shell_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_12l.content_shell_test_apk.filter",
     "//testing/buildbot/filters/android.emulator_13.content_shell_test_apk.filter",
-    "//testing/buildbot/filters/android.emulator_n.content_shell_test_apk.filter",
   ]
 }
 
@@ -184,7 +179,6 @@
   testonly = true
 
   data = [
-    "//testing/buildbot/filters/android.emulator_n.content_unittests.filter",
     "//testing/buildbot/filters/fuchsia.lsan.content_unittests.filter",
     "//testing/buildbot/filters/webrtc.content_unittests.filter",
   ]
@@ -290,7 +284,7 @@
     "//testing/buildbot/filters/android.arm64_proguard_rel.gl_tests.filter",
     "//testing/buildbot/filters/android.emulator_11.gl_tests.filter",
     "//testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter",
-    "//testing/buildbot/filters/android.emulator_n_o_p.gl_tests.filter",
+    "//testing/buildbot/filters/android.emulator_o_p.gl_tests.filter",
     "//testing/buildbot/filters/android.pie_arm64_rel.gl_tests.filter",
     "//testing/buildbot/filters/android.pie_tot.gl_tests.filter",
     "//testing/buildbot/filters/android.samsung_a13.gl_tests.filter",
@@ -394,8 +388,7 @@
 source_set("webview_cts_tests_filters") {
   testonly = true
 
-  data =
-      [ "//testing/buildbot/filters/android.emulator.webview_cts_tests.filter" ]
+  data = []
 }
 
 source_set("webview_instrumentation_test_apk_filters") {
diff --git a/testing/buildbot/filters/android.emulator.webview_cts_tests.filter b/testing/buildbot/filters/android.emulator.webview_cts_tests.filter
deleted file mode 100644
index 2a63921..0000000
--- a/testing/buildbot/filters/android.emulator.webview_cts_tests.filter
+++ /dev/null
@@ -1,2 +0,0 @@
-# crbug.com/1343008
--android.assist.cts.WebViewTest.testWebView
diff --git a/testing/buildbot/filters/android.emulator_n.blink_platform_unittests.filter b/testing/buildbot/filters/android.emulator_n.blink_platform_unittests.filter
deleted file mode 100644
index da67c4f..0000000
--- a/testing/buildbot/filters/android.emulator_n.blink_platform_unittests.filter
+++ /dev/null
@@ -1,6 +0,0 @@
-# https://crbug.com/1254869
--HarfBuzzShaperTest.IdeographicSpace
-
-# https://crbug.com/1108121
--HarfBuzzShaperTest.ShapeHorizontalWithSubpixelPositionWithoutKerningIsNotRounded
--HarfBuzzShaperTest.ShapeHorizontalWithoutSubpixelPositionWithKerningIsRounded
\ No newline at end of file
diff --git a/testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter
deleted file mode 100644
index b88c16522..0000000
--- a/testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter
+++ /dev/null
@@ -1,54 +0,0 @@
-# TODO(crbug/1280257)
--org.chromium.chrome.browser.tasks.tab_management.TabSuggestionMessageCardTest.closeTabSuggestionReviewedAndDismissed
-
-# TODO(crbug/1231259)
--org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.AddressAccessoryIntegrationTest.testFillsSuggestionOnClick
--org.chromium.chrome.browser.keyboard_accessory.sheet_tabs.CreditCardAccessoryIntegrationTest.testFillsSuggestionOnClick
-
-# TODO(crbug/1345499)
--org.chromium.chrome.browser.tasks.tab_management.TabGridDialogTest.testSwipeToDismiss_Dialog
-
-# TODO(crbug/1345504)
--org.chromium.chrome.browser.shape_detection.ShapeDetectionTest.testTextDetection
-
-# TODO(crbug/1347614)
--org.chromium.chrome.browser.tasks.tab_management.TabSuggestionMessageCardTest.closeTabSuggestionReviewedAndAccepted
-
-# TODO(crbug/1347615)
--org.chromium.chrome.browser.site_settings.SiteSettingsTest.testProtectedContentAllowThenBlock
-
-# TODO(crbug/1347903)
--org.chromium.chrome.features.start_surface.StartSurfaceBackButtonTest.testShow_SingleAsHomepage_BackButtonWithTabSwitcher__NoInstant_Return
-
-# TODO(crbug/1365596)
--org.chromium.chrome.browser.firstrun.FirstRunActivitySigninAndSyncTest.clickingSettingsThenCancelForChildAccountDoesNotEnableSync
--org.chromium.chrome.browser.firstrun.FirstRunActivitySigninAndSyncTest.clickingSettingsThenCancelForChildAccountWithAllowSyncOffDisabledPartiallyEnablesSync
--org.chromium.chrome.browser.firstrun.FirstRunActivitySigninAndSyncTest.continueButtonClickShowsSyncConsentPageWithChildAccountAndEarlySigninCheckerCreation
--org.chromium.chrome.browser.firstrun.FirstRunActivitySigninAndSyncTest.acceptingSyncForChildAccountEndsFreAndEnablesSyncIfAllowSyncOffForChildAccountsFeatureEnabled
-
-# TODO(crbug/1359954)
--org.chromium.chrome.browser.tasks.tab_management.TabSuggestionMessageCardTest.groupTabSuggestionReviewedAndAccepted
-
-# TODO(crbug/1369234)
--org.chromium.chrome.browser.customtabs.CustomTabActivityTest.testRecordRetainableSession_WithoutWarmupAndSession
-
-# TODO(crbug/1369381)
--org.chromium.chrome.browser.contextualsearch.ContextualSearchManagerTest.testSwipeExpand
-
-# TODO(crbug/1370814)
--org.chromium.chrome.browser.site_settings.SiteSettingsTest.testSiteExceptionCookiesBlocked
-
-# TODO(crbug/1370824)
--org.chromium.chrome.features.start_surface.StartSurfaceBackButtonTest.testShow_SingleAsHomepageV2_BackButtonWithTabSwitcher__Instant_NoReturn
-
-# TODO(crbug/1377732)
--org.chromium.chrome.features.start_surface.StartSurfaceTest.testShow_SingleAsHomepage_ResetScrollPosition__Instant_NoReturn
-
-# TODO(crbug/1381326)
--org.chromium.chrome.browser.tasks.tab_management.PriceAlertsMessageCardTest.testRenderMessageCard_Landscape_AppNotificationsDisabled
-
-# TODO(crbug/1382163)
--org.chromium.chrome.browser.signin.SyncConsentFragmentTest.testSyncConsentFragmentNewAccount
-
-# TODO(crbug/1383879)
--org.chromium.chrome.browser.partnercustomizations.PartnerHomepageIntegrationTest.testCloseAllTabs
diff --git a/testing/buildbot/filters/android.emulator_n.chrome_public_unit_test_apk.filter b/testing/buildbot/filters/android.emulator_n.chrome_public_unit_test_apk.filter
deleted file mode 100644
index 38c940b0..0000000
--- a/testing/buildbot/filters/android.emulator_n.chrome_public_unit_test_apk.filter
+++ /dev/null
@@ -1,7 +0,0 @@
-# TODO(crbug.com/1367390)
--org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorMenuTest.testSingleActionView_Enabled
--org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorMenuTest.testTwoActionView_OneActionDisabled
-
-# TODO(crbug.com/1367394)
--org.chromium.components.browser_ui.widget.promo.PromoCardViewRenderTest.testCompact_Stack__NightModeEnabled
--org.chromium.components.browser_ui.widget.promo.PromoCardViewRenderTest.testSlim__NightModeDisabled
diff --git a/testing/buildbot/filters/android.emulator_n.components_unittests.filter b/testing/buildbot/filters/android.emulator_n.components_unittests.filter
deleted file mode 100644
index 1373c86..0000000
--- a/testing/buildbot/filters/android.emulator_n.components_unittests.filter
+++ /dev/null
@@ -1,2 +0,0 @@
-# TODO(crbug/1381909)
--VisitDatabaseTest.GetDailyVisitsToHostWithVisits
diff --git a/testing/buildbot/filters/android.emulator_n.content_browsertests.filter b/testing/buildbot/filters/android.emulator_n.content_browsertests.filter
deleted file mode 100644
index 0b79687..0000000
--- a/testing/buildbot/filters/android.emulator_n.content_browsertests.filter
+++ /dev/null
@@ -1,54 +0,0 @@
-# TODO(crbug.com/1326993)
--All/RenderFrameHostImplBrowsingContextStateNameTest.BlockNameUpdateForBackForwardCache/NewBrowsingContextStateOnBrowsingContextGroupSwap_EnableFrameNameUpdateOnNonCurrentRenderFrameHost
-
-# TODO(crbug.com/1296333)
--WebRtcBrowserTest.CanSetupH264VideoCallOnSupportedDevice
-
-# TODO(crbug.com/1338951)
--WebRtcCaptureFromElementBrowserTest.VerifyCanvasWebGLCaptureColor
-
-# TODO(crbug.com/1347608)
--SecurityExploitBrowserTest.PostMessageSourceOrigin
-
-# TODO(crbug.com/1349961)
--PrefetchBrowserTest/PrefetchBrowserTest.CrossOriginWithPreloadCredentialled/*
-
-# TODO(crbug.com/1349978)
--PrefetchBrowserTest/PrefetchBrowserTest.CrossOriginWithPreloadHasNoSameSiteCookies/*
-
-# TODO(crbug.com/1116774)
--All/SitePerProcessBrowserTest.PageScaleFactorPropagatesToOOPIFs/0
--All/SitePerProcessBrowserTest.PageScaleFactorPropagatesToOOPIFs/1
-
-# TODO(crbug.com/1344391)
--All/SitePerProcessBrowserTest.KeyboardScrollBubblingFromOOPIF/*
-
-# TODO(crbug.com/1365601)
--All/DumpAccessibilityTreeTest.AccessibilityNoSourceVideo/android
-
-# TODO(crbug.com/1368352)
--FindRequestManagers/FindRequestManagerTestWithTestConfig.NavigateFrameDuringFind/*
-
-# TODO(crbug.com/1368744)
--All/DumpAccessibilityTreeTest.AccessibilityButtonNameCalc/android
-
-# TODO(crbug.com/1368929)
--PrefetchBrowserTest/PrefetchBrowserTest.CrossOriginDocumentHasNoSameSiteCookies/*
-
-# TODO(crbug.com/1370573)
--SignedExchangeSubresourcePrefetchBrowserTest.MainResourceSXGAndScriptSXG_CrossOrigin_AsDocument
-
-# TODO(crbug.com/1373194)
--PrefetchBrowserTest/PrefetchBrowserTest.CrossOriginDocumentReusedAsNavigation/*
-
-# TODO(crbug.com/1373197)
--PrefetchBrowserTest/PrefetchBrowserTest.CrossOriginSignedExchangeWithPreload/*
-
-# TODO(crbug.com/1373576)
--PrefetchBrowserTest/PrefetchBrowserTest.CrossOriginWithPreloadAnonymous/*
-
-# TODO(crbug.com/1375800)
--All/DumpAccessibilityTreeTest.AccessibilityNodeChangedCrashInEditableText/android
-
-# TODO(crbug.com/1376152)
--PrefetchBrowserTest/PrefetchBrowserTest.CrossOriginDocumentNotReusedAsNestedFrameNavigation/*
diff --git a/testing/buildbot/filters/android.emulator_n.content_shell_test_apk.filter b/testing/buildbot/filters/android.emulator_n.content_shell_test_apk.filter
deleted file mode 100644
index 7c380dc..0000000
--- a/testing/buildbot/filters/android.emulator_n.content_shell_test_apk.filter
+++ /dev/null
@@ -1,9 +0,0 @@
-# TODO(crbug.com/1189804)
--org.chromium.content.browser.input.ImeInputModeTest.testShowAndHideInputMode
--org.chromium.content.browser.input.ImeInputModeTest.testShowAndHideInputModeWithPhysicalKeyboard
-
-# TODO(crbug.com/1233309)
--org.chromium.content.browser.GestureDetectorResetTest.testSeparateClicksAreRegisteredOnReload
-
-# TODO(crbug.com/1370059)
--org.chromium.content.browser.accessibility.WebContentsAccessibilityEventsTest.test_immediateRefresh
diff --git a/testing/buildbot/filters/android.emulator_n.content_unittests.filter b/testing/buildbot/filters/android.emulator_n.content_unittests.filter
deleted file mode 100644
index 7b678285..0000000
--- a/testing/buildbot/filters/android.emulator_n.content_unittests.filter
+++ /dev/null
@@ -1,2 +0,0 @@
-# TODO(crbug/1368684)
--FirstPartySetsDatabaseTest.SetPublicSets_PreExistingVersion
diff --git a/testing/buildbot/filters/android.emulator_n_o_p.gl_tests.filter b/testing/buildbot/filters/android.emulator_o_p.gl_tests.filter
similarity index 100%
rename from testing/buildbot/filters/android.emulator_n_o_p.gl_tests.filter
rename to testing/buildbot/filters/android.emulator_o_p.gl_tests.filter
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index eab611e..c553a86 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -109,12 +109,6 @@
         },
       },
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'ci_only': True,
-        'swarming': {
-          'shards': 9,
-        },
-      },
       'android-oreo-x86-rel': {
         'ci_only': True,
         'swarming': {
@@ -141,7 +135,7 @@
           },
         },
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'ci_only': True,
         'swarming': {
@@ -179,19 +173,13 @@
         },
       },
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'ci_only': True,
-        'swarming': {
-          'shards': 2,
-        },
-      },
       'android-oreo-x86-rel': {
         'ci_only': True,
         'swarming': {
           'shards': 2,
         },
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'ci_only': True,
         'swarming': {
@@ -302,13 +290,6 @@
   },
   'blink_platform_unittests': {
     'modifications': {
-      # TODO(crbug.com/1303439): Remove this filter
-      # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.blink_platform_unittests.filter',
-        ],
-      },
       'android-pie-arm64-rel': {
         # TODO(crbug.com/1111436): Move this back to walleye if/when additional
         # capacity has been deployed.
@@ -318,12 +299,6 @@
           },
         },
       },
-      # Keep this same as android-nougat-x86-rel above
-      'android-x86-code-coverage': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.blink_platform_unittests.filter',
-        ],
-      },
       'fuchsia-code-coverage': {
         'swarming': {
           'shards': 5,
@@ -1530,18 +1505,6 @@
         },
       },
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter',
-        ],
-        'swarming': {
-          'shards': 75,
-          'dimensions': {
-            # use 8-core to shorten runtime
-            'cores': '8',
-          },
-        },
-      },
       'android-oreo-x86-rel': {
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o.chrome_public_test_apk.filter',
@@ -1576,10 +1539,10 @@
           'shards': 30,
         },
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter',
+          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o.chrome_public_test_apk.filter',
         ],
         'swarming': {
           'shards': 75,
@@ -1644,6 +1607,7 @@
           '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_13.chrome_public_unit_test_apk.filter',
         ],
       },
+      # If you change this, make similar changes in android-x86-code-coverage below
       'android-oreo-x86-rel': {
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o.chrome_public_unit_test_apk.filter',
@@ -1655,6 +1619,12 @@
           'shards': 3,
         },
       },
+      # Keep this same as android-oreo-x86-rel above
+      'android-x86-code-coverage': {
+        'args': [
+          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o.chrome_public_unit_test_apk.filter',
+        ],
+      },
     },
   },
   'chrome_public_wpt': {
@@ -1734,17 +1704,12 @@
         },
       },
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'swarming': {
-          'shards': 4,
-        },
-      },
       'android-oreo-x86-rel': {
         'swarming': {
           'shards': 4,
         },
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'swarming': {
           'shards': 4,
@@ -2034,18 +1999,6 @@
         },
       },
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.content_browsertests.filter',
-        ],
-        'swarming': {
-          'shards': 75,
-          'dimensions': {
-            # use 8-core to shorten runtime
-            'cores': '8',
-          },
-        },
-      },
       'android-oreo-x86-rel': {
         'args': [
           '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o.content_browsertests.filter',
@@ -2082,10 +2035,10 @@
           'shards': 30,
         },
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.content_browsertests.filter',
+          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o.content_browsertests.filter',
         ],
         'swarming': {
           'shards': 75,
@@ -2237,8 +2190,7 @@
   },
   'content_shell_crash_test': {
     'remove_from': [
-      'android-nougat-x86-rel', # crbug.com/1084353. If you remove this, also remove android-x86-code-coverage.
-      'android-oreo-x86-rel',
+      'android-oreo-x86-rel', # crbug.com/1084353. If you remove this, also remove android-x86-code-coverage.
       'android-x86-code-coverage',
     ],
     'modifications': {
@@ -2286,18 +2238,6 @@
         ],
       },
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.content_shell_test_apk.filter',
-        ],
-        'swarming': {
-          'shards': 6,
-          'dimensions': {
-            # use 8-core to shorten runtime
-            'cores': '8',
-          },
-        },
-      },
       'android-oreo-x86-rel': {
         'swarming': {
           'shards': 6,
@@ -2312,11 +2252,8 @@
           '--gtest_filter=-org.chromium.content.browser.input.ImeInputModeTest.testShowAndHideInputMode*',
         ],
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n.content_shell_test_apk.filter',
-        ],
         'swarming': {
           'shards': 6,
           'dimensions': {
@@ -2682,6 +2619,15 @@
           '--gtest_filter=-BluetoothShellApiTest.ApiSanityCheck:BluetoothSocketApiTest.Listen:BluetoothSocketApiTest.PermissionDenied',
         ],
       },
+      'win10-code-coverage': {
+        'swarming': {
+          'shards': 2,
+          'dimensions': {
+            'pool': 'chromium.tests.coverage',
+            'ssd': '1',
+          },
+        }
+      },
     },
   },
   'extensions_unittests': {
@@ -2917,14 +2863,9 @@
         ],
       },
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n_o_p.gl_tests.filter',
-        ],
-      },
       'android-oreo-x86-rel': {
         'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n_o_p.gl_tests.filter',
+          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o_p.gl_tests.filter',
         ],
       },
       'android-pie-arm64-rel': {
@@ -2934,13 +2875,13 @@
       },
       'android-pie-x86-rel': {
         'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n_o_p.gl_tests.filter',
+          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o_p.gl_tests.filter',
         ],
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_n_o_p.gl_tests.filter',
+          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o_p.gl_tests.filter',
         ],
       },
     },
@@ -3338,20 +3279,6 @@
       },
     },
   },
-  'interactive_ui_tests amd64-generic': {
-    'remove_from': [
-      # TODO(crbug.com/1204231): Re-enable.
-      'lacros-amd64-generic-rel',
-      'lacros-amd64-generic-rel-fyi',
-    ]
-  },
-  'interactive_ui_tests eve': {
-    'remove_from': [
-      # TODO(crbug.com/1204231): Re-enable.
-      'lacros-amd64-generic-rel',
-      'lacros-amd64-generic-rel-fyi',
-    ]
-  },
   'interactive_ui_tests_no_field_trial': {
     'remove_from': [
       'win10-rel-no-external-ip',
@@ -3424,7 +3351,6 @@
   'leveldb_unittests': {
     'remove_from': [
       # TODO(https://crbug.com/1432753): Runs too slowly in this configuration.
-      'android-nougat-x86-rel',
       'android-oreo-x86-rel',
     ],
   },
@@ -3761,19 +3687,13 @@
         ],
       },
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'args': [
-          # TODO(crbug.com/1260440): Fix the failed test
-          '--gtest_filter=-ScopedDirTest.CloseOutOfScope',
-        ],
-      },
       'android-oreo-x86-rel': {
         'args': [
           # TODO(crbug.com/1260440): Fix the failed test
           '--gtest_filter=-ScopedDirTest.CloseOutOfScope',
         ],
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'args': [
           # TODO(crbug.com/1260440): Fix the failed test
@@ -4075,16 +3995,6 @@
         },
       },
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'args': [
-          # TODO(crbug.com/1264654): Fix the failed tests
-          '--gtest_filter=-PacLibraryTest.ActualPacMyIpAddress*'
-        ],
-        'ci_only': True,
-        'swarming': {
-          'shards': 3,
-        },
-      },
       'android-oreo-x86-rel': {
         'ci_only': True,
         'args': [
@@ -4103,11 +4013,10 @@
           'shards': 2,
         },
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'args': [
-          # TODO(crbug.com/1264654): Fix the failed tests
-          '--gtest_filter=-PacLibraryTest.ActualPacMyIpAddress*'
+          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_o.services_unittests.filter',
         ],
         'swarming': {
           'shards': 3,
@@ -4289,13 +4198,10 @@
   'telemetry_chromium_minidump_unittests': {
     'modifications': {
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'ci_only': True,
-      },
       'android-oreo-x86-rel': {
         'ci_only': True,
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'ci_only': True,
       },
@@ -4304,13 +4210,10 @@
   'telemetry_monochrome_minidump_unittests': {
     'modifications': {
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'ci_only': True,
-      },
       'android-oreo-x86-rel': {
         'ci_only': True,
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'ci_only': True,
       },
@@ -4340,14 +4243,6 @@
         'ci_only': True,
       },
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'args': [
-          # For whatever reason, automatic browser selection on this bot chooses
-          # webview instead of the full browser, so explicitly specify it here.
-          '--browser=android-chromium',
-        ],
-        'ci_only': True,
-      },
       'android-oreo-x86-rel': {
         'args': [
           # For whatever reason, automatic browser selection on this bot chooses
@@ -4356,7 +4251,7 @@
         ],
         'ci_only': True,
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'args': [
           # For whatever reason, automatic browser selection on this bot chooses
@@ -5144,12 +5039,6 @@
   },
   'webview_cts_tests': {
     'modifications': {
-      # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.webview_cts_tests.filter',
-        ],
-      },
       'android-pie-arm64-rel': {
         # TODO(crbug.com/1111436): Move this back to walleye if/when additional
         # capacity has been deployed.
@@ -5159,12 +5048,6 @@
           },
         },
       },
-      # Keep this same as android-nougat-x86-rel above
-      'android-x86-code-coverage': {
-        'args': [
-          '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.webview_cts_tests.filter',
-        ],
-      },
     },
   },
   'webview_instrumentation_test_apk': {
@@ -5229,14 +5112,6 @@
         },
       },
       # If you change this, make similar changes in android-x86-code-coverage below
-      'android-nougat-x86-rel': {
-        'args': [
-          '--use-persistent-shell',
-        ],
-        'swarming': {
-          'shards': 27,
-        },
-      },
       'android-oreo-x86-rel': {
         'args': [
           '--use-persistent-shell',
@@ -5262,7 +5137,7 @@
           'shards': 13, # crbug.com/1294924
         },
       },
-      # Keep this same as android-nougat-x86-rel above
+      # Keep this same as android-oreo-x86-rel above
       'android-x86-code-coverage': {
         'args': [
           '--use-persistent-shell',
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl
index 0c19674f..bb445e8 100644
--- a/testing/buildbot/test_suites.pyl
+++ b/testing/buildbot/test_suites.pyl
@@ -4043,7 +4043,6 @@
     'lacros_device_or_vm_gtests': {
       'aura_unittests': {},
       'cc_unittests': {},
-      'interactive_ui_tests': {},
       'ozone_unittests': {},
       'vaapi_unittest': {
         'args': [
@@ -5770,7 +5769,14 @@
       'vr_platform_specific_chromium_gtests',
     ],
 
-    'android_nougat_emulator_gtests': [
+    'android_nougat_gtests': [
+      'android_ar_gtests',
+      'android_ddready_vr_gtests',
+      'android_monochrome_smoke_tests',
+      'android_smoke_tests',
+    ],
+
+    'android_oreo_emulator_gtests': [
       'android_emulator_specific_chrome_public_tests',
       'android_monochrome_smoke_tests',
       'android_smoke_tests',
@@ -5784,13 +5790,6 @@
       'webview_ui_instrumentation_tests',
     ],
 
-    'android_nougat_gtests': [
-      'android_ar_gtests',
-      'android_ddready_vr_gtests',
-      'android_monochrome_smoke_tests',
-      'android_smoke_tests',
-    ],
-
     'android_oreo_gtests': [
       'android_ar_gtests',
       'android_ddready_vr_gtests',
@@ -6599,7 +6598,7 @@
       'network_service_fyi_gtests',
     ],
 
-    'nougat_isolated_scripts': [
+    'oreo_isolated_scripts': [
       'android_isolated_scripts',
       'chromium_junit_tests_scripts',
       'components_perftests_isolated_scripts',
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 21ebfb9..02c30e7 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -86,16 +86,16 @@
   },
   'LACROS_VERSION_SKEW_DEV': {
     'identifier': 'Lacros version skew testing ash dev',
-    'description': 'Run with ash-chrome version 119.0.6036.0',
+    'description': 'Run with ash-chrome version 119.0.6045.10',
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6036.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6045.10/test_ash_chrome',
     ],
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v119.0.6036.0',
-          'revision': 'version:119.0.6036.0',
+          'location': 'lacros_version_skew_tests_v119.0.6045.10',
+          'revision': 'version:119.0.6045.10',
         },
       ],
     },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index f37ebbe..2280740 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -1087,28 +1087,6 @@
           'isolated_scripts': 'cronet_rel_isolated_scripts',
         },
       },
-      'android-nougat-x86-rel': {
-        'mixins': [
-          'has_native_resultdb_integration',
-          'isolate_profile_data',
-          'nougat-x86-emulator',
-          'emulator-4-cores',
-          'linux-jammy',
-          'x86-64',
-        ],
-        'additional_compile_targets': [
-          'chrome_nocompile_tests',
-        ],
-        'args': [
-          '--use-persistent-shell',
-        ],
-        'os_type': 'android',
-        'test_suites': {
-          'gtest_tests': 'android_nougat_emulator_gtests',
-          'isolated_scripts': 'nougat_isolated_scripts',
-          'scripts': 'chromium_android_scripts',
-        },
-      },
       'android-oreo-x86-rel': {
         'mixins': [
           'has_native_resultdb_integration',
@@ -1126,10 +1104,8 @@
         ],
         'os_type': 'android',
         'test_suites': {
-          # TODO(https://crbug.com/1459433): Rename the test group name
-          # after the migration
-          'gtest_tests': 'android_nougat_emulator_gtests',
-          'isolated_scripts': 'nougat_isolated_scripts',
+          'gtest_tests': 'android_oreo_emulator_gtests',
+          'isolated_scripts': 'oreo_isolated_scripts',
           'scripts': 'chromium_android_scripts',
         },
       },
@@ -2321,8 +2297,8 @@
         ],
         'os_type': 'android',
         'test_suites': {
-          'gtest_tests': 'android_nougat_emulator_gtests',
-          'isolated_scripts': 'nougat_isolated_scripts',
+          'gtest_tests': 'android_oreo_emulator_gtests',
+          'isolated_scripts': 'oreo_isolated_scripts',
           'scripts': 'chromium_android_scripts',
         },
       },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index bda3353..45d35fd 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -531,6 +531,22 @@
             ]
         }
     ],
+    "AndroidSurfaceControlMagnifier": [
+        {
+            "platforms": [
+                "android"
+            ],
+            "experiments": [
+                {
+                    "name": "AndroidSurfaceControlMagnifier",
+                    "enable_features": [
+                        "AndroidSurfaceControlMagnifier"
+                    ],
+                    "min_os_version": "14.0.0"
+                }
+            ]
+        }
+    ],
     "AndroidSystemTracing": [
         {
             "platforms": [
@@ -14332,6 +14348,7 @@
         {
             "platforms": [
                 "android",
+                "android_webview",
                 "chromeos",
                 "chromeos_lacros",
                 "ios",
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
index a077cb1..bb2198c 100644
--- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl
+++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -4499,9 +4499,9 @@
       # The normalized tangential pressure, which has a range of [-1,1] (default: 0).
       experimental optional number tangentialPressure
       # The plane angle between the Y-Z plane and the plane containing both the stylus axis and the Y axis, in degrees of the range [-90,90], a positive tiltX is to the right (default: 0)
-      experimental optional integer tiltX
+      optional number tiltX
       # The plane angle between the X-Z plane and the plane containing both the stylus axis and the X axis, in degrees of the range [-90,90], a positive tiltY is towards the user (default: 0).
-      experimental optional integer tiltY
+      optional number tiltY
       # The clockwise rotation of a pen stylus around its own major axis, in degrees in the range [0,359] (default: 0).
       experimental optional integer twist
       # Identifier used to track touch sources between events, must be unique within an event.
@@ -4667,9 +4667,9 @@
       # The normalized tangential pressure, which has a range of [-1,1] (default: 0).
       experimental optional number tangentialPressure
       # The plane angle between the Y-Z plane and the plane containing both the stylus axis and the Y axis, in degrees of the range [-90,90], a positive tiltX is to the right (default: 0).
-      experimental optional integer tiltX
+      optional number tiltX
       # The plane angle between the X-Z plane and the plane containing both the stylus axis and the X axis, in degrees of the range [-90,90], a positive tiltY is towards the user (default: 0).
-      experimental optional integer tiltY
+      optional number tiltY
       # The clockwise rotation of a pen stylus around its own major axis, in degrees in the range [0,359] (default: 0).
       experimental optional integer twist
       # X delta in CSS pixels for mouse wheel event (default: 0).
diff --git a/third_party/blink/public/mojom/file_system_access/file_system_access_capacity_allocation_host.mojom b/third_party/blink/public/mojom/file_system_access/file_system_access_capacity_allocation_host.mojom
index a7bc460..4c2d5d88 100644
--- a/third_party/blink/public/mojom/file_system_access/file_system_access_capacity_allocation_host.mojom
+++ b/third_party/blink/public/mojom/file_system_access/file_system_access_capacity_allocation_host.mojom
@@ -9,6 +9,9 @@
 //
 // Capacity allocations are used for non-incognito files only. In incognito
 // mode, quota is fully managed in the browser process.
+//
+// TODO(https://crbug.com/1490686): Consider renaming this to be more generic,
+// since it now does more than just handle quota.
 interface FileSystemAccessCapacityAllocationHost {
   // Requests or releases storage capacity.
   //
@@ -31,4 +34,13 @@
   [Sync]
   RequestCapacityChange(int64 capacity_delta) =>
       (int64 granted_capacity_delta);
+
+  // Signal to the browser process that the file has been modified. Since this
+  // write happened directly from the renderer, the observer hooks in
+  // storage/browser/file_system/ were bypassed.
+  //
+  // This is intentionally fire-and-forget, since SyncAccessHandle writes are
+  // synchronous and requiring round-trip IPC to complete before synchronously
+  // returning would be detrimental to performance.
+  OnContentsModified();
 };
diff --git a/third_party/blink/public/mojom/file_system_access/file_system_access_file_delegate_host.mojom b/third_party/blink/public/mojom/file_system_access/file_system_access_file_delegate_host.mojom
index 6495ae17..1191b09c 100644
--- a/third_party/blink/public/mojom/file_system_access/file_system_access_file_delegate_host.mojom
+++ b/third_party/blink/public/mojom/file_system_access/file_system_access_file_delegate_host.mojom
@@ -9,9 +9,10 @@
 
 // Routes file operations to the browser to interact with an in-memory file.
 // Used by a SyncAccessHandle in incognito mode, which creates an in-memory file
-// for the Origin-Private File System.
-// Methods are sync or async as appropriate to match the web-exposed
-// behavior of the corresponding methods of the SyncAccessHandle.
+// for a Bucket File System.
+//
+// Methods are sync to match the web-exposed behavior of the corresponding
+// methods of the SyncAccessHandle.
 interface FileSystemAccessFileDelegateHost {
   // Read up to `bytes_to_read` from the associated file starting at `offset`.
   // Ideally these would each be unsigned, but the backend code expects signed
diff --git a/third_party/blink/public/mojom/service_worker/embedded_worker.mojom b/third_party/blink/public/mojom/service_worker/embedded_worker.mojom
index fdc6f021..2942864 100644
--- a/third_party/blink/public/mojom/service_worker/embedded_worker.mojom
+++ b/third_party/blink/public/mojom/service_worker/embedded_worker.mojom
@@ -30,6 +30,7 @@
 import "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom";
 import "third_party/blink/public/mojom/worker/worker_content_settings_proxy.mojom";
 import "third_party/blink/public/mojom/worker/worker_main_script_load_params.mojom";
+import "third_party/blink/public/mojom/storage_key/storage_key.mojom";
 import "url/mojom/url.mojom";
 
 // Parameters to launch a service worker. This is passed from the browser to the
@@ -150,6 +151,9 @@
 
   // A container for several security policies to be applied to the worker.
   PolicyContainer? policy_container;
+
+  // The StorageKey of the scope where the service worker is created.
+  blink.mojom.StorageKey storage_key;
 };
 
 // Holds timing information about the start worker sequence for UMA.
diff --git a/third_party/blink/public/platform/modules/service_worker/web_service_worker_fetch_context.h b/third_party/blink/public/platform/modules/service_worker/web_service_worker_fetch_context.h
index 39a9c18..36e99cc 100644
--- a/third_party/blink/public/platform/modules/service_worker/web_service_worker_fetch_context.h
+++ b/third_party/blink/public/platform/modules/service_worker/web_service_worker_fetch_context.h
@@ -39,7 +39,8 @@
           preference_watcher_receiver,
       CrossVariantMojoReceiver<mojom::SubresourceLoaderUpdaterInterfaceBase>
           pending_subresource_loader_updater,
-      const WebVector<WebString>& cors_exempt_header_list);
+      const WebVector<WebString>& cors_exempt_header_list,
+      const bool is_third_party_context);
 };
 
 }  // namespace blink
diff --git a/third_party/blink/public/web/web_settings.h b/third_party/blink/public/web/web_settings.h
index 9701b0b..6248aee 100644
--- a/third_party/blink/public/web/web_settings.h
+++ b/third_party/blink/public/web/web_settings.h
@@ -160,7 +160,6 @@
   virtual void SetIgnoreMainFrameOverflowHiddenQuirk(bool) = 0;
   virtual void SetImageAnimationPolicy(mojom::ImageAnimationPolicy) = 0;
   virtual void SetImagesEnabled(bool) = 0;
-  virtual void SetInlineTextBoxAccessibilityEnabled(bool) = 0;
   virtual void SetJavaScriptCanAccessClipboard(bool) = 0;
   virtual void SetJavaScriptEnabled(bool) = 0;
   virtual void SetLoadsImagesAutomatically(bool) = 0;
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.cc b/third_party/blink/renderer/core/animation/css/css_animations.cc
index 4ca1c27..7762dc6 100644
--- a/third_party/blink/renderer/core/animation/css/css_animations.cc
+++ b/third_party/blink/renderer/core/animation/css/css_animations.cc
@@ -2483,8 +2483,10 @@
                                  transition_index) ==
           CSSTransitionData::TransitionBehavior::kAllowDiscrete;
   const StylePropertyShorthand& property_list =
-      animate_all ? PropertiesForTransitionAll(with_discrete)
-                  : shorthandForProperty(resolved_id);
+      animate_all
+          ? PropertiesForTransitionAll(
+                with_discrete, state.animating_element.GetExecutionContext())
+          : shorthandForProperty(resolved_id);
   // If not a shorthand we only execute one iteration of this loop, and
   // refer to the property directly.
   for (unsigned i = 0; !i || i < property_list.length(); ++i) {
@@ -3058,7 +3060,8 @@
 }
 
 const StylePropertyShorthand& CSSAnimations::PropertiesForTransitionAll(
-    bool with_discrete) {
+    bool with_discrete,
+    const ExecutionContext* execution_context) {
   DEFINE_STATIC_LOCAL(Vector<const CSSProperty*>, properties, ());
   DEFINE_STATIC_LOCAL(StylePropertyShorthand, property_shorthand, ());
   if (properties.empty()) {
@@ -3082,6 +3085,10 @@
         DCHECK(with_discrete);
         continue;
       }
+      if (!property.IsWebExposed(execution_context)) {
+        continue;
+      }
+
       properties.push_back(&property);
     }
     property_shorthand = StylePropertyShorthand(
diff --git a/third_party/blink/renderer/core/animation/css/css_animations.h b/third_party/blink/renderer/core/animation/css/css_animations.h
index 8391d42c..a54b2ee 100644
--- a/third_party/blink/renderer/core/animation/css/css_animations.h
+++ b/third_party/blink/renderer/core/animation/css/css_animations.h
@@ -73,7 +73,8 @@
   // many properties, which may result in slower style update performance, so
   // they are worth separating.
   static const StylePropertyShorthand& PropertiesForTransitionAll(
-      bool with_discrete);
+      bool with_discrete,
+      const ExecutionContext* execution_context);
 
   static bool IsAnimationAffectingProperty(const CSSProperty&);
   static bool IsAffectedByKeyframesFromScope(const Element&, const TreeScope&);
diff --git a/third_party/blink/renderer/core/dom/subscriber.cc b/third_party/blink/renderer/core/dom/subscriber.cc
index 066d1158..1ed85b9 100644
--- a/third_party/blink/renderer/core/dom/subscriber.cc
+++ b/third_party/blink/renderer/core/dom/subscriber.cc
@@ -8,6 +8,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/v8_observer.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_observer_callback.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_observer_complete_callback.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_script_runner.h"
 #include "third_party/blink/renderer/core/dom/abort_signal.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/platform/instrumentation/use_counter.h"
@@ -36,10 +37,31 @@
   }
 }
 
-void Subscriber::error(ScriptValue error) {
+void Subscriber::error(ScriptState* script_state, ScriptValue error) {
   if (error_) {
     error_->InvokeAndReportException(nullptr, error);
     CloseSubscription();
+  } else {
+    // The given observer's `error()` handler can be null here for one of two
+    // reasons:
+    //   1. The given observer simply doesn't have an `error()` handler (since
+    //      it is optional)
+    //   2. The subscription is already closed (in which case
+    //      `CloseSubscription()` manually clears `error_`)
+    // In both of these cases, if the observer is still producing errors, we
+    // must surface them to the global via "report the exception":
+    // https://html.spec.whatwg.org/C#report-the-exception.
+    //
+    // Reporting the exception requires a valid `ScriptState`, which we don't
+    // have if we're in a detached context. See observable-constructor.window.js
+    // for tests.
+    if (!script_state->ContextIsValid()) {
+      CHECK(!GetExecutionContext());
+      return;
+    }
+    ScriptState::Scope scope(script_state);
+    V8ScriptRunner::ReportException(script_state->GetIsolate(),
+                                    error.V8Value());
   }
 }
 
diff --git a/third_party/blink/renderer/core/dom/subscriber.h b/third_party/blink/renderer/core/dom/subscriber.h
index 3a9eec4..5b836866 100644
--- a/third_party/blink/renderer/core/dom/subscriber.h
+++ b/third_party/blink/renderer/core/dom/subscriber.h
@@ -32,7 +32,7 @@
   // API methods.
   void next(ScriptValue);
   void complete();
-  void error(ScriptValue);
+  void error(ScriptState*, ScriptValue);
 
   // API attributes.
   AbortSignal* signal() { return signal_; }
diff --git a/third_party/blink/renderer/core/dom/subscriber.idl b/third_party/blink/renderer/core/dom/subscriber.idl
index ee1665c..6c4c608 100644
--- a/third_party/blink/renderer/core/dom/subscriber.idl
+++ b/third_party/blink/renderer/core/dom/subscriber.idl
@@ -8,7 +8,7 @@
 interface Subscriber {
   void next(any result);
   void complete();
-  void error(any error);
+  [CallWith=ScriptState] void error(any error);
   readonly attribute AbortSignal? signal;
 };
 
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.cc b/third_party/blink/renderer/core/exported/web_settings_impl.cc
index db778ad..b68ed9ed 100644
--- a/third_party/blink/renderer/core/exported/web_settings_impl.cc
+++ b/third_party/blink/renderer/core/exported/web_settings_impl.cc
@@ -176,10 +176,6 @@
   settings_->SetAccessibilityPasswordValuesEnabled(enabled);
 }
 
-void WebSettingsImpl::SetInlineTextBoxAccessibilityEnabled(bool enabled) {
-  settings_->SetInlineTextBoxAccessibilityEnabled(enabled);
-}
-
 void WebSettingsImpl::SetAccessibilityFontWeightAdjustment(int size) {
   settings_->SetAccessibilityFontWeightAdjustment(size);
 }
diff --git a/third_party/blink/renderer/core/exported/web_settings_impl.h b/third_party/blink/renderer/core/exported/web_settings_impl.h
index a2a3642..0898729 100644
--- a/third_party/blink/renderer/core/exported/web_settings_impl.h
+++ b/third_party/blink/renderer/core/exported/web_settings_impl.h
@@ -109,7 +109,6 @@
   void SetIgnoreMainFrameOverflowHiddenQuirk(bool) override;
   void SetImageAnimationPolicy(mojom::blink::ImageAnimationPolicy) override;
   void SetImagesEnabled(bool) override;
-  void SetInlineTextBoxAccessibilityEnabled(bool) override;
   void SetJavaScriptCanAccessClipboard(bool) override;
   void SetJavaScriptEnabled(bool) override;
   void SetLoadsImagesAutomatically(bool) override;
diff --git a/third_party/blink/renderer/core/frame/settings.json5 b/third_party/blink/renderer/core/frame/settings.json5
index 93433e05..eb6fa41 100644
--- a/third_party/blink/renderer/core/frame/settings.json5
+++ b/third_party/blink/renderer/core/frame/settings.json5
@@ -700,12 +700,6 @@
       initial: false,
     },
 
-    // If true, static text nodes expose inline text box children.
-    {
-      name: "inlineTextBoxAccessibilityEnabled",
-      initial: false,
-    },
-
     // If true, context menu will be shown on mouse up instead of mouse down.
     // Typically enabled on Windows to match platform convention.
     {
diff --git a/third_party/blink/renderer/core/html/html_anchor_element.cc b/third_party/blink/renderer/core/html/html_anchor_element.cc
index 6023a58..85acd930 100644
--- a/third_party/blink/renderer/core/html/html_anchor_element.cc
+++ b/third_party/blink/renderer/core/html/html_anchor_element.cc
@@ -711,20 +711,27 @@
     sender->AddAnchorElement(*this);
   }
 
-  if (isConnected() && IsLink() &&
-      base::FeatureList::IsEnabled(features::kSpeculativeServiceWorkerWarmUp)) {
-    if (auto* observer =
-            AnchorElementObserverForServiceWorker::From(top_document)) {
-      if (features::kSpeculativeServiceWorkerWarmUpOnVisible.Get()) {
-        observer->ObserveAnchorElementVisibility(*this);
-      }
-      if (features::kSpeculativeServiceWorkerWarmUpOnInsertedIntoDom.Get()) {
-        observer->MaybeSendNavigationTargetLinks({this});
+  if (isConnected() && IsLink()) {
+    static const bool speculative_service_worker_warm_up_enabled =
+        base::FeatureList::IsEnabled(features::kSpeculativeServiceWorkerWarmUp);
+    if (speculative_service_worker_warm_up_enabled) {
+      static const bool warm_up_on_visible =
+          features::kSpeculativeServiceWorkerWarmUpOnVisible.Get();
+      static const bool warm_up_on_inserted_into_dom =
+          features::kSpeculativeServiceWorkerWarmUpOnInsertedIntoDom.Get();
+      if (warm_up_on_visible || warm_up_on_inserted_into_dom) {
+        if (auto* observer =
+                AnchorElementObserverForServiceWorker::From(top_document)) {
+          if (warm_up_on_visible) {
+            observer->ObserveAnchorElementVisibility(*this);
+          }
+          if (warm_up_on_inserted_into_dom) {
+            observer->MaybeSendNavigationTargetLinks({this});
+          }
+        }
       }
     }
-  }
 
-  if (isConnected() && IsLink()) {
     if (auto* document_rules =
             DocumentSpeculationRules::FromIfExists(GetDocument())) {
       document_rules->LinkInserted(this);
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn
index 7bb7e10..7a2dbbf 100644
--- a/third_party/blink/renderer/modules/BUILD.gn
+++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -378,7 +378,6 @@
 
   sources = [
     "accessibility/accessibility_object_model_test.cc",
-    "accessibility/ax_inline_text_box_test.cc",
     "accessibility/ax_layout_object_test.cc",
     "accessibility/ax_node_object_test.cc",
     "accessibility/ax_object_cache_test.cc",
@@ -607,6 +606,12 @@
     "xr/xr_view_test.cc",
   ]
 
+  if (!is_android) {
+    # Inline text box tests do not apply to Android, which only loads
+    # AXInlineTextBox tests for the focused node.
+    sources += [ "accessibility/ax_inline_text_box_test.cc" ]
+  }
+
   if (rtc_use_h264) {
     sources += [ "mediarecorder/h264_encoder_unittest.cc" ]
   }
diff --git a/third_party/blink/renderer/modules/accessibility/accessibility_object_model_test.cc b/third_party/blink/renderer/modules/accessibility/accessibility_object_model_test.cc
index 1d96910..a4932d3 100644
--- a/third_party/blink/renderer/modules/accessibility/accessibility_object_model_test.cc
+++ b/third_party/blink/renderer/modules/accessibility/accessibility_object_model_test.cc
@@ -135,11 +135,10 @@
   button->accessibleNode()->setRole(AtomicString("radio"));
   button->accessibleNode()->setLabel(AtomicString("Radio"));
   button->accessibleNode()->setDisabled(false);
-  GetDocument().View()->UpdateLifecycleToLayoutClean(
-      DocumentUpdateReason::kTest);
+  cache->UpdateAXForAllDocuments();
 
   // Assert that AOM does not affect the AXObject.
-  axButton = cache->GetOrCreate(button);
+  axButton = cache->Get(button);
   EXPECT_EQ(ax::mojom::Role::kCheckBox, axButton->RoleValue());
   EXPECT_EQ("Check", axButton->GetName(name_from, &name_objects));
   EXPECT_EQ(axButton->Restriction(), kRestrictionDisabled);
@@ -148,11 +147,10 @@
   button->accessibleNode()->setRole(g_null_atom);
   button->accessibleNode()->setLabel(g_null_atom);
   button->accessibleNode()->setDisabled(absl::nullopt);
-  GetDocument().View()->UpdateLifecycleToLayoutClean(
-      DocumentUpdateReason::kTest);
+  cache->UpdateAXForAllDocuments();
 
   // The AX Object should now revert to ARIA.
-  axButton = cache->GetOrCreate(button);
+  axButton = cache->Get(button);
   EXPECT_EQ(ax::mojom::Role::kCheckBox, axButton->RoleValue());
   EXPECT_EQ("Check", axButton->GetName(name_from, &name_objects));
   EXPECT_EQ(axButton->Restriction(), kRestrictionDisabled);
@@ -294,7 +292,7 @@
   auto* cache = AXObjectCache();
   ASSERT_NE(nullptr, cache);
   cache->UpdateAXForAllDocuments();
-  auto* ax_target = cache->GetOrCreate(target);
+  auto* ax_target = cache->Get(target);
   ui::AXNodeData node_data;
   ax_target->Serialize(&node_data, ui::kAXModeComplete);
 
@@ -337,6 +335,7 @@
       GetDocument().getElementById(AtomicString("error2"))->accessibleNode());
   target->accessibleNode()->setErrorMessage(error_message_node_list);
 
+  cache->UpdateAXForAllDocuments();
   ui::AXNodeData node_data2;
   ax_target->Serialize(&node_data2, ui::kAXModeComplete);
 
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index bae847d..35e361a1 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -4367,10 +4367,7 @@
     return false;
   }
 
-  // TODO(crrev.com/c/4884899): Switch to using AXMode instead of a setting.
-  // Unfortunately, the popup has a different setting than the main document.
-  Settings* settings = GetDocument()->GetSettings();
-  if (!settings || !settings->GetInlineTextBoxAccessibilityEnabled()) {
+  if (!AXObjectCache().GetAXMode().has_mode(ui::AXMode::kInlineTextBoxes)) {
     return false;
   }
 
@@ -4392,8 +4389,9 @@
   while (!work_queue.empty()) {
     AXObject* work_obj = AXObjectCache().ObjectFromAXID(work_queue.front());
     work_queue.pop();
-    if (!work_obj || !work_obj->AccessibilityIsIncludedInTree())
+    if (!work_obj || !work_obj->LastKnownIsIncludedInTreeValue()) {
       continue;
+    }
 
     if (CanHaveInlineTextBoxChildren(work_obj)) {
       if (work_obj->CachedChildrenIncludingIgnored().empty()) {
@@ -4402,21 +4400,25 @@
         // on subtrees that may later be stale, once they are stale, the old
         // inline text boxes are cleared because SetNeedsToUpdateChildren()
         // calls ClearChildren().
-        work_obj->ForceAddInlineTextBoxChildren();
+        work_obj->LoadInlineTextBoxesHelper();
       }
     } else {
       for (const auto& child : work_obj->ChildrenIncludingIgnored())
         work_queue.push(child->AXObjectID());
     }
   }
+
+  // If the work was deferred via ChildrenChanged(), update accessibility
+  // to force that work to be performed now.
+  if (!AXObjectCache().IsProcessingDeferredEvents()) {
+    AXObjectCache().UpdateAXForAllDocuments();
+  }
 }
 
-void AXNodeObject::ForceAddInlineTextBoxChildren() {
+void AXNodeObject::LoadInlineTextBoxesHelper() {
   // The inline textbox children start empty.
   DCHECK(CachedChildrenIncludingIgnored().empty());
-  AddInlineTextBoxChildren();
-  // Avoid adding these children twice.
-  children_dirty_ = false;
+
 #if BUILDFLAG(IS_ANDROID)
   // Keep inline text box children up-to-date for this object in the future.
   // This is only necessary on Android, which tries to skip inline text boxes
@@ -4424,23 +4426,33 @@
   always_load_inline_text_boxes_ = true;
 #endif
 
-  // If inline text box children were added, mark the node dirty so that the
-  // results are serialized.
-  if (!CachedChildrenIncludingIgnored().empty()) {
-    AXObjectCache().MarkAXObjectDirtyWithDetails(
-        this, /*subtree*/ false, ax::mojom::blink::EventFrom::kNone,
-        ax::mojom::blink::Action::kNone, {});
+  if (AXObjectCache().IsProcessingDeferredEvents()) {
+    // Can only add new objects while processing deferred events.
+    AddInlineTextBoxChildren();
+    // Avoid adding these children twice.
+    children_dirty_ = false;
+    // If inline text box children were added, mark the node dirty so that the
+    // results are serialized.
+    if (!CachedChildrenIncludingIgnored().empty()) {
+      AXObjectCache().MarkAXObjectDirtyWithDetails(
+          this, /*subtree*/ false, ax::mojom::blink::EventFrom::kNone,
+          ax::mojom::blink::Action::kNone, {});
+    }
+  } else {
+    // Wait until processing deferred events.
+    AXObjectCache().ChildrenChanged(this);
   }
 }
 
 void AXNodeObject::AddInlineTextBoxChildren() {
-  DCHECK(GetDocument());
-  DCHECK(CanHaveInlineTextBoxChildren(this));
-  DCHECK(!GetLayoutObject()->NeedsLayout());
-  DCHECK(AXObjectCache().GetAXMode().has_mode(ui::AXMode::kInlineTextBoxes));
-  DCHECK(!AXObjectCache().GetAXMode().HasExperimentalFlags(
+  CHECK(GetDocument());
+  CHECK(ShouldLoadInlineTextBoxes());
+  CHECK(!GetLayoutObject()->NeedsLayout());
+  CHECK(AXObjectCache().GetAXMode().has_mode(ui::AXMode::kInlineTextBoxes));
+  CHECK(!AXObjectCache().GetAXMode().HasExperimentalFlags(
       ui::AXMode::kExperimentalFormControls))
       << "Form controls mode should not have inline text boxes turned on.";
+  CHECK(AXObjectCache().IsProcessingDeferredEvents());
 
   auto* layout_text = To<LayoutText>(GetLayoutObject());
   for (auto* box = layout_text->FirstAbstractInlineTextBox(); box;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.h b/third_party/blink/renderer/modules/accessibility/ax_node_object.h
index ddc77ac..e7c1d93 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.h
@@ -56,6 +56,9 @@
 
   void Trace(Visitor*) const override;
 
+  // Call to force-load inline text boxes for the current subtree.
+  void LoadInlineTextBoxes() override;
+  // Should inline text boxes be considered when adding chldren to this node.
   bool ShouldLoadInlineTextBoxes() const override;
 
  protected:
@@ -290,9 +293,8 @@
   void ComputeAriaOwnsChildren(
       HeapVector<Member<AXObject>>& owned_children) const;
 
-  // Inline text boxes.
-  void LoadInlineTextBoxes() override;
-  void ForceAddInlineTextBoxChildren() override;
+  // Helper method for LoadInlineTextBoxes().
+  void LoadInlineTextBoxesHelper() override;
 
   //
   // Layout object specific methods.
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index 4495075..6456145 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -4774,7 +4774,7 @@
 
 void AXObject::LoadInlineTextBoxes() {}
 
-void AXObject::ForceAddInlineTextBoxChildren() {}
+void AXObject::LoadInlineTextBoxesHelper() {}
 
 AXObject* AXObject::NextOnLine() const {
   return nullptr;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h
index 8076c069..94c1d2ba 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -701,9 +701,12 @@
   virtual AXObject* ChooserPopup() const { return nullptr; }
 
   // Load inline text boxes for just this node, even if
-  // settings->inlineTextBoxAccessibilityEnabled() is false.
+  // AXObjectCache().GetAXMode().has_mode(ui::AXMode::kInlineTextBoxes) is
+  // false. Can be called even when layout is not clean, but in that case
+  // it will force clean layout.
   virtual void LoadInlineTextBoxes();
-  virtual void ForceAddInlineTextBoxChildren();
+  virtual void LoadInlineTextBoxesHelper();
+  // When adding children to this node, consider inline textboxes.
   virtual bool ShouldLoadInlineTextBoxes() const { return false; }
 
   // Walk the AXObjects on the same line.
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_test.cc b/third_party/blink/renderer/modules/accessibility/ax_object_test.cc
index dc4bab2..c8da0e8 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object_test.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object_test.cc
@@ -48,17 +48,15 @@
       )HTML");
 
   AXObject* button = GetAXObjectByElementId("button");
-  // Need to force child update for layout tree traversals to occur
-  button->SetNeedsToUpdateChildren();
-  button->UpdateChildrenIfNecessary();
+  button->LoadInlineTextBoxes();
   // Guaranteed to have no element since this should be the AX node created from
   // pseudo element content
   const AXObject* nodeWithNoElement =
-      button->DeepestFirstChildIncludingIgnored();
+      button->DeepestFirstChildIncludingIgnored()->ParentObject();
   ASSERT_EQ(nullptr, nodeWithNoElement->GetElement());
 
-  EXPECT_TRUE(nodeWithNoElement->GetClosestElement() ==
-              button->GetElement()->GetPseudoElement(kPseudoIdBefore));
+  EXPECT_EQ(nodeWithNoElement->GetClosestElement(),
+            button->GetElement()->GetPseudoElement(kPseudoIdBefore));
 }
 
 TEST_F(AccessibilityTest, IsEditableInTextField) {
@@ -376,8 +374,9 @@
                    <span id="ignored_b" aria-hidden="true"></span>
                    <button id="button">button</button>)HTML");
 
-  const AXObject* body = GetAXBodyObject();
+  AXObject* body = GetAXBodyObject();
   ASSERT_NE(nullptr, body);
+  body->LoadInlineTextBoxes();
   const AXObject* input = GetAXObjectByElementId("input");
   ASSERT_NE(nullptr, input);
   ASSERT_NE(nullptr, GetAXObjectByElementId("ignored_a"));
@@ -400,12 +399,17 @@
   ASSERT_NE(nullptr, paragraph->LastChildIncludingIgnored());
   EXPECT_EQ(ax::mojom::Role::kStaticText,
             paragraph->LastChildIncludingIgnored()->RoleValue());
-  ASSERT_NE(nullptr, paragraph->DeepestFirstChildIncludingIgnored());
+  ASSERT_NE(nullptr, paragraph->FirstChildIncludingIgnored()->ParentObject());
   EXPECT_EQ(ax::mojom::Role::kStaticText,
-            paragraph->DeepestFirstChildIncludingIgnored()->RoleValue());
-  ASSERT_NE(nullptr, paragraph->DeepestLastChildIncludingIgnored());
+            paragraph->DeepestFirstChildIncludingIgnored()
+                ->ParentObject()
+                ->RoleValue());
+  ASSERT_NE(nullptr,
+            paragraph->DeepestLastChildIncludingIgnored()->ParentObject());
   EXPECT_EQ(ax::mojom::Role::kStaticText,
-            paragraph->DeepestLastChildIncludingIgnored()->RoleValue());
+            paragraph->DeepestLastChildIncludingIgnored()
+                ->ParentObject()
+                ->RoleValue());
 
   EXPECT_EQ(paragraph->PreviousSiblingIncludingIgnored(),
             GetAXObjectByElementId("ignored_a"));
@@ -433,9 +437,12 @@
   ASSERT_NE(nullptr, button->LastChildIncludingIgnored());
   EXPECT_EQ(ax::mojom::Role::kStaticText,
             button->LastChildIncludingIgnored()->RoleValue());
-  ASSERT_NE(nullptr, button->DeepestFirstChildIncludingIgnored());
+  ASSERT_NE(nullptr,
+            button->DeepestFirstChildIncludingIgnored()->ParentObject());
   EXPECT_EQ(ax::mojom::Role::kStaticText,
-            paragraph->DeepestFirstChildIncludingIgnored()->RoleValue());
+            paragraph->DeepestFirstChildIncludingIgnored()
+                ->ParentObject()
+                ->RoleValue());
 }
 
 TEST_F(AccessibilityTest, LangAttrInteresting) {
@@ -495,7 +502,8 @@
       <p id="C">more text</p>
       )HTML");
 
-  const AXObject* root = GetAXRootObject();
+  AXObject* root = GetAXRootObject();
+  root->LoadInlineTextBoxes();
   const AXObject* body = GetAXBodyObject();
   ASSERT_EQ(3, body->ChildCountIncludingIgnored());
   ASSERT_EQ(1, body->ChildAtIncludingIgnored(1)->ChildCountIncludingIgnored());
@@ -549,7 +557,7 @@
   EXPECT_EQ(obj_c, obj_b->UnignoredNextSibling());
 
   EXPECT_EQ(obj_ignored, obj_b->PreviousInPreOrderIncludingIgnored());
-  EXPECT_EQ(obj_a_text, obj_b->UnignoredPreviousInPreOrder());
+  EXPECT_EQ(obj_a_text, obj_b->UnignoredPreviousInPreOrder()->ParentObject());
   EXPECT_EQ(obj_b_text, obj_b->NextInPreOrderIncludingIgnored());
   EXPECT_EQ(obj_b_text, obj_b->UnignoredNextInPreOrder());
 
@@ -558,8 +566,11 @@
   EXPECT_EQ(nullptr, obj_c->NextSiblingIncludingIgnored());
   EXPECT_EQ(nullptr, obj_c->UnignoredNextSibling());
 
-  EXPECT_EQ(obj_b_text, obj_c->PreviousInPreOrderIncludingIgnored());
-  EXPECT_EQ(obj_b_text, obj_c->UnignoredPreviousInPreOrder());
+  EXPECT_EQ(
+      obj_b_text,
+      obj_c->PreviousInPreOrderIncludingIgnored()->ParentObjectUnignored());
+  EXPECT_EQ(obj_b_text,
+            obj_c->UnignoredPreviousInPreOrder()->ParentObjectUnignored());
   EXPECT_EQ(obj_c_text, obj_c->NextInPreOrderIncludingIgnored());
   EXPECT_EQ(obj_c_text, obj_c->UnignoredNextInPreOrder());
 }
@@ -1139,7 +1150,13 @@
 }
 
 TEST_F(AccessibilityTest, CheckNoDuplicateChildren) {
-  GetPage().GetSettings().SetInlineTextBoxAccessibilityEnabled(false);
+  // Clear inline text boxes and refresh the tree.
+  ui::AXMode mode(ui::kAXModeComplete);
+  mode.set_mode(ui::AXMode::kInlineTextBoxes, false);
+  ax_context_->SetAXMode(mode);
+  GetAXObjectCache().MarkDocumentDirty();
+  GetAXObjectCache().UpdateAXForAllDocuments();
+
   SetBodyInnerHTML(R"HTML(
      <select id="sel"><option>1</option></select>
     )HTML");
diff --git a/third_party/blink/renderer/modules/accessibility/ax_position_test.cc b/third_party/blink/renderer/modules/accessibility/ax_position_test.cc
index ab453e7..435a106 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_position_test.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_position_test.cc
@@ -206,11 +206,12 @@
 
 TEST_F(AccessibilityTest, PositionAfterLineBreak) {
   SetBodyInnerHTML(R"HTML(Hello<br id="br">there)HTML");
+  GetAXRootObject()->LoadInlineTextBoxes();
   const AXObject* ax_br = GetAXObjectByElementId("br");
   ASSERT_NE(nullptr, ax_br);
   ASSERT_EQ(ax::mojom::Role::kLineBreak, ax_br->RoleValue());
   const AXObject* ax_static_text =
-      GetAXRootObject()->DeepestLastChildIncludingIgnored();
+      GetAXRootObject()->DeepestLastChildIncludingIgnored()->ParentObject();
   ASSERT_NE(nullptr, ax_static_text);
   ASSERT_EQ(ax::mojom::Role::kStaticText, ax_static_text->RoleValue());
 
@@ -235,8 +236,7 @@
   const AXObject* ax_div = GetAXObjectByElementId("div");
   ASSERT_NE(nullptr, ax_div);
   ASSERT_EQ(ax::mojom::Role::kGenericContainer, ax_div->RoleValue());
-  const AXObject* ax_static_text =
-      GetAXRootObject()->DeepestFirstChildIncludingIgnored();
+  const AXObject* ax_static_text = ax_div->FirstChildIncludingIgnored();
   ASSERT_NE(nullptr, ax_static_text);
   ASSERT_EQ(ax::mojom::Role::kStaticText, ax_static_text->RoleValue());
 
@@ -481,11 +481,12 @@
 
 TEST_F(AccessibilityTest, PositionAfterLineBreakWithWhiteSpace) {
   SetBodyInnerHTML(R"HTML(Hello     <br id="br">     there)HTML");
+  GetAXRootObject()->LoadInlineTextBoxes();
   const AXObject* ax_br = GetAXObjectByElementId("br");
   ASSERT_NE(nullptr, ax_br);
   ASSERT_EQ(ax::mojom::Role::kLineBreak, ax_br->RoleValue());
   const AXObject* ax_static_text =
-      GetAXRootObject()->DeepestLastChildIncludingIgnored();
+      GetAXRootObject()->DeepestLastChildIncludingIgnored()->ParentObject();
   ASSERT_NE(nullptr, ax_static_text);
   ASSERT_EQ(ax::mojom::Role::kStaticText, ax_static_text->RoleValue());
 
@@ -511,8 +512,7 @@
   const AXObject* ax_div = GetAXObjectByElementId("div");
   ASSERT_NE(nullptr, ax_div);
   ASSERT_EQ(ax::mojom::Role::kGenericContainer, ax_div->RoleValue());
-  const AXObject* ax_static_text =
-      GetAXRootObject()->DeepestFirstChildIncludingIgnored();
+  const AXObject* ax_static_text = ax_div->FirstChildIncludingIgnored();
   ASSERT_NE(nullptr, ax_static_text);
   ASSERT_EQ(ax::mojom::Role::kStaticText, ax_static_text->RoleValue());
 
diff --git a/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc b/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc
index 07de7d3..8efcd69 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_selection_test.cc
@@ -9,6 +9,7 @@
 #include "base/logging.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_focus_options.h"
+#include "third_party/blink/renderer/core/accessibility/ax_object_cache.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/node.h"
@@ -45,6 +46,7 @@
       <p id="paragraph2">How are you?</p>
       )HTML");
 
+  GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
   ASSERT_FALSE(AXSelection::FromCurrentSelection(GetDocument()).IsValid());
 
   Element* const script_element =
@@ -61,7 +63,6 @@
       selection.addRange(range);
       )SCRIPT");
   GetDocument().body()->AppendChild(script_element);
-  UpdateAllLifecyclePhasesForTest();
 
   const AXObject* ax_static_text_1 =
       GetAXObjectByElementId("paragraph1")->FirstChildIncludingIgnored();
@@ -71,6 +72,7 @@
   ASSERT_NE(nullptr, ax_paragraph_2);
   ASSERT_EQ(ax::mojom::Role::kParagraph, ax_paragraph_2->RoleValue());
 
+  GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
   const auto ax_selection = AXSelection::FromCurrentSelection(GetDocument());
   ASSERT_TRUE(ax_selection.IsValid());
 
@@ -1083,6 +1085,7 @@
 
   // Ensure that the selection that was just set could be successfully
   // retrieved.
+  GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
   const auto ax_current_selection =
       AXSelection::FromCurrentSelection(ToTextControl(*input));
   EXPECT_EQ(ax_selection, ax_current_selection);
@@ -1118,6 +1121,7 @@
 
   // Ensure that the selection that was just set could be successfully
   // retrieved.
+  GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
   const auto ax_current_selection =
       AXSelection::FromCurrentSelection(ToTextControl(*input));
   EXPECT_EQ(ax_selection, ax_current_selection);
@@ -1186,6 +1190,7 @@
 
   for (unsigned int i = 0; i < text_control.InnerEditorValue().length() - 1;
        ++i) {
+    GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
     AXSelection::Builder builder;
     AXSelection ax_selection =
         builder.SetBase(AXPosition::CreatePositionInTextObject(*ax_input, i))
@@ -1205,6 +1210,7 @@
   }
 
   for (unsigned int i = text_control.InnerEditorValue().length(); i > 0; --i) {
+    GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
     AXSelection::Builder builder;
     AXSelection ax_selection =
         builder.SetBase(AXPosition::CreatePositionInTextObject(*ax_input, i))
@@ -1262,6 +1268,7 @@
   // it's invalid.
   for (unsigned int i = 0; i < text_control.InnerEditorValue().length() - 1;
        ++i) {
+    GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
     AXSelection::Builder builder;
     AXSelection ax_selection =
         builder.SetBase(AXPosition::CreatePositionInTextObject(*ax_input, i))
@@ -1281,6 +1288,7 @@
   }
 
   for (unsigned int i = text_control.InnerEditorValue().length(); i > 0; --i) {
+    GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
     AXSelection::Builder builder;
     AXSelection ax_selection =
         builder.SetBase(AXPosition::CreatePositionInTextObject(*ax_input, i))
@@ -1323,6 +1331,7 @@
   ASSERT_NE(nullptr, ax_after);
   ASSERT_EQ(ax::mojom::Role::kParagraph, ax_after->RoleValue());
 
+  GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
   {
     // Light tree only selection. Selects the whole of the text field.
     AXSelection::Builder builder;
@@ -1395,6 +1404,7 @@
 
   // Ensure that the selection that was just set could be successfully
   // retrieved.
+  GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
   const auto ax_current_selection =
       AXSelection::FromCurrentSelection(ToTextControl(*textarea));
   EXPECT_EQ(ax_selection, ax_current_selection);
@@ -1422,6 +1432,7 @@
 
   // Backward selection.
   AXSelection::Builder builder;
+  GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
   AXSelection ax_selection =
       builder.SetBase(AXPosition::CreatePositionInTextObject(*ax_textarea, 10))
           .SetExtent(AXPosition::CreatePositionInTextObject(*ax_textarea, 3))
@@ -1435,6 +1446,7 @@
 
   // Ensure that the selection that was just set could be successfully
   // retrieved.
+  GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
   const auto ax_current_selection =
       AXSelection::FromCurrentSelection(ToTextControl(*textarea));
   EXPECT_EQ(ax_selection, ax_current_selection);
@@ -1466,6 +1478,7 @@
   ASSERT_EQ(ax::mojom::Role::kTextField, ax_textarea->RoleValue());
 
   // Light tree only selection. Selects the whole of the textarea field.
+  GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
   AXSelection::Builder builder;
   AXSelection ax_selection =
       builder.SetBase(AXPosition::CreatePositionBeforeObject(*ax_before))
@@ -1512,6 +1525,7 @@
   ASSERT_EQ(ax::mojom::Role::kTextField, ax_textarea->RoleValue());
 
   for (unsigned int i = 0; i < text_control.Value().length() - 1; ++i) {
+    GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
     AXSelection::Builder builder;
     AXSelection ax_selection =
         builder.SetBase(AXPosition::CreatePositionInTextObject(*ax_textarea, i))
@@ -1532,6 +1546,7 @@
   }
 
   for (unsigned int i = text_control.Value().length(); i > 0; --i) {
+    GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
     AXSelection::Builder builder;
     AXSelection ax_selection =
         builder.SetBase(AXPosition::CreatePositionInTextObject(*ax_textarea, i))
@@ -1657,6 +1672,7 @@
   ASSERT_NE(nullptr, ax_text);
   ASSERT_EQ(ax::mojom::Role::kStaticText, ax_text->RoleValue());
 
+  GetDocument().ExistingAXObjectCache()->UpdateAXForAllDocuments();
   const auto ax_selection = AXSelection::FromCurrentSelection(GetDocument());
   ASSERT_TRUE(ax_selection.IsValid());
 
diff --git a/third_party/blink/renderer/modules/accessibility/testing/accessibility_selection_test.cc b/third_party/blink/renderer/modules/accessibility/testing/accessibility_selection_test.cc
index bba703d..f3e63d2 100644
--- a/third_party/blink/renderer/modules/accessibility/testing/accessibility_selection_test.cc
+++ b/third_party/blink/renderer/modules/accessibility/testing/accessibility_selection_test.cc
@@ -348,6 +348,13 @@
     LocalFrameClient* local_frame_client)
     : AccessibilityTest(local_frame_client) {}
 
+void AccessibilitySelectionTest::SetUp() {
+  RenderingTest::SetUp();
+  // Do not include noisy inline textboxes in selection tests.
+  ax_context_ =
+      std::make_unique<AXContext>(GetDocument(), ui::AXMode::kWebContents);
+}
+
 std::string AccessibilitySelectionTest::GetCurrentSelectionText() const {
   const SelectionInDOMTree selection =
       GetFrame().Selection().GetSelectionInDOMTree();
diff --git a/third_party/blink/renderer/modules/accessibility/testing/accessibility_selection_test.h b/third_party/blink/renderer/modules/accessibility/testing/accessibility_selection_test.h
index f9dfd20d..76bfbe6 100644
--- a/third_party/blink/renderer/modules/accessibility/testing/accessibility_selection_test.h
+++ b/third_party/blink/renderer/modules/accessibility/testing/accessibility_selection_test.h
@@ -24,6 +24,8 @@
   AccessibilitySelectionTest(LocalFrameClient* local_frame_client = nullptr);
 
  protected:
+  void SetUp() override;
+
   // Gets a text representation of the accessibility tree that is currently
   // selected and annotates it with markers indicating the anchor and focus of
   // |selection|.
diff --git a/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl b/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl
index 902be48..e707cf9 100644
--- a/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl
+++ b/third_party/blink/renderer/modules/ad_auction/auction_ad_config.idl
@@ -68,7 +68,7 @@
   Promise<undefined> additionalBids;
 
   [RuntimeEnabled=FledgeNegativeTargeting]
-  USVString auctionNonce;
+  DOMString auctionNonce;
 
   USVString aggregationCoordinatorOrigin;
 
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.idl b/third_party/blink/renderer/modules/ad_auction/navigator_auction.idl
index 0dfb2df2..ee16454 100644
--- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.idl
+++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.idl
@@ -29,7 +29,7 @@
   void updateAdInterestGroups();
 
   [RuntimeEnabled=FledgeNegativeTargeting, CallWith=ScriptState, Measure, RaisesException]
-  Promise<USVString> createAuctionNonce();
+  Promise<DOMString> createAuctionNonce();
 
   [RuntimeEnabled=Fledge, CallWith=ScriptState, Measure, RaisesException]
   Promise<UrnOrConfig?> runAdAuction(AuctionAdConfig config);
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_capacity_tracker.cc b/third_party/blink/renderer/modules/file_system_access/file_system_access_capacity_tracker.cc
index e528907..f0b8c39e 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_access_capacity_tracker.cc
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_capacity_tracker.cc
@@ -103,7 +103,7 @@
   return file_capacity_ >= required_capacity;
 }
 
-void FileSystemAccessCapacityTracker::CommitFileSizeChange(int64_t new_size) {
+void FileSystemAccessCapacityTracker::OnFileContentsModified(int64_t new_size) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   DCHECK_GE(file_size_, 0) << "A file's size should never be negative.";
   DCHECK_GE(file_capacity_, file_size_)
@@ -111,6 +111,8 @@
   DCHECK_GE(new_size, 0) << "A file's size should never be negative.";
 
   file_size_ = new_size;
+
+  capacity_allocation_host_->OnContentsModified();
 }
 
 void FileSystemAccessCapacityTracker::DidRequestCapacityChange(
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_capacity_tracker.h b/third_party/blink/renderer/modules/file_system_access/file_system_access_capacity_tracker.h
index 92b9ffc7..534d150f 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_access_capacity_tracker.h
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_capacity_tracker.h
@@ -57,9 +57,10 @@
   // through the synchronous API of Access Handles.
   bool RequestFileCapacityChangeSync(int64_t required_capacity);
 
-  // Records a change of the file's size to `new_size`. The caller must make
-  // sure that `file_capacity` is at least `new_size`.
-  void CommitFileSizeChange(int64_t new_size);
+  // This method should be called for each modification to the file, even if the
+  // file's size does not change. The caller must make sure that
+  // `file_capacity_` is at least `new_size`.
+  void OnFileContentsModified(int64_t new_size);
 
   // GarbageCollected
   void Trace(Visitor* visitor) const {
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc
index 8934b46b..a024273 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc
@@ -89,7 +89,7 @@
   // is not needed here since `result` is guaranteed to be no more than
   // `write_size`.
   int64_t new_file_size = std::max(file_size_before, offset + result);
-  capacity_tracker_->CommitFileSizeChange(new_file_size);
+  capacity_tracker_->OnFileContentsModified(new_file_size);
 
   // Only return an error if no bytes were written. Partial writes should return
   // the number of bytes written.
@@ -113,7 +113,7 @@
     return base::unexpected(base::File::FILE_ERROR_NO_SPACE);
 
   if (backing_file_.SetLength(new_length)) {
-    capacity_tracker_->CommitFileSizeChange(new_length);
+    capacity_tracker_->OnFileContentsModified(new_length);
     return true;
   }
   return base::unexpected(base::File::GetLastFileError());
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper.cc
index c0b08e5..3778af2e 100644
--- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper.cc
@@ -4,17 +4,16 @@
 
 #include "third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper.h"
 
+#include "base/containers/contains.h"
 #include "base/numerics/safe_conversions.h"
 #include "media/base/video_encoder_metrics_provider.h"
 #include "media/base/video_frame.h"
 #include "media/media_buildflags.h"
+#include "media/video/alpha_video_encoder_wrapper.h"
+#include "media/video/gpu_video_accelerator_factories.h"
 #include "third_party/blink/renderer/modules/mediarecorder/buildflags.h"
 #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
 
-#if BUILDFLAG(ENABLE_LIBAOM)
-#include "media/video/av1_video_encoder.h"
-#endif
-
 namespace blink {
 
 MediaRecorderEncoderWrapper::EncodeTask::EncodeTask(
@@ -39,19 +38,28 @@
     scoped_refptr<base::SequencedTaskRunner> encoding_task_runner,
     media::VideoCodecProfile profile,
     uint32_t bits_per_second,
+    media::GpuVideoAcceleratorFactories* gpu_factories,
     CreateEncoderCB create_encoder_cb,
     VideoTrackRecorder::OnEncodedVideoCB on_encoded_video_cb,
     OnErrorCB on_error_cb)
     : Encoder(std::move(encoding_task_runner),
               on_encoded_video_cb,
               bits_per_second),
+      gpu_factories_(gpu_factories),
       profile_(profile),
       codec_(media::VideoCodecProfileToVideoCodec(profile_)),
       create_encoder_cb_(create_encoder_cb),
       on_error_cb_(std::move(on_error_cb)) {
   DETACH_FROM_SEQUENCE(sequence_checker_);
+  CHECK(create_encoder_cb_);
   CHECK(on_error_cb_);
-  CHECK_EQ(codec_, media::VideoCodec::kAV1);
+  constexpr media::VideoCodec kSupportedCodecs[] = {
+      media::VideoCodec::kH264,
+      media::VideoCodec::kVP8,
+      media::VideoCodec::kVP9,
+      media::VideoCodec::kAV1,
+  };
+  CHECK(base::Contains(kSupportedCodecs, codec_));
   options_.bitrate = media::Bitrate::VariableBitrate(
       bits_per_second, base::ClampMul(bits_per_second, 2u).RawValue());
 }
@@ -61,8 +69,9 @@
 }
 
 bool MediaRecorderEncoderWrapper::CanEncodeAlphaChannel() const {
-  // TODO(crbug.com/1424974): This should query media::VideoEncoder.
-  return false;
+  // Alpha encoding is supported only with VP8 and VP9 software encoders.
+  return !gpu_factories_ && (codec_ == media::VideoCodec::kVP8 ||
+                             codec_ == media::VideoCodec::kVP9);
 }
 
 void MediaRecorderEncoderWrapper::EnterErrorState(
@@ -81,22 +90,23 @@
   std::move(on_error_cb_).Run();
 }
 
-void MediaRecorderEncoderWrapper::ReconfigureForNewResolution(
-    const gfx::Size& frame_size) {
-  TRACE_EVENT1("media",
-               "MediaRecorderEncoderWrapper::ReconfigureForNewResolution",
-               "frame_size", frame_size.ToString());
+void MediaRecorderEncoderWrapper::Reconfigure(const gfx::Size& frame_size,
+                                              bool encode_alpha) {
+  TRACE_EVENT2(
+      "media", "MediaRecorderEncoderWrapper::ReconfigureForNewResolution",
+      "frame_size", frame_size.ToString(), "encode_alpha", encode_alpha);
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   CHECK(encoder_);
   CHECK_NE(state_, State::kInError);
   state_ = State::kInitializing;
   encoder_->Flush(
       WTF::BindOnce(&MediaRecorderEncoderWrapper::CreateAndInitialize,
-                    weak_factory_.GetWeakPtr(), frame_size));
+                    weak_factory_.GetWeakPtr(), frame_size, encode_alpha));
 }
 
 void MediaRecorderEncoderWrapper::CreateAndInitialize(
     const gfx::Size& frame_size,
+    bool encode_alpha,
     media::EncoderStatus status) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   TRACE_EVENT1("media", "MediaRecorderEncoderWrapper::CreateAndInitialize",
@@ -114,15 +124,25 @@
       << ", unexpected status: " << static_cast<int>(state_);
   state_ = State::kInitializing;
   options_.frame_size = frame_size;
+  encode_alpha_ = encode_alpha;
 
-  encoder_ = create_encoder_cb_.Run();
+  if (encode_alpha_) {
+    CHECK(CanEncodeAlphaChannel());
+    auto yuv_encoder = create_encoder_cb_.Run(gpu_factories_);
+    auto alpha_encoder = create_encoder_cb_.Run(gpu_factories_);
+    CHECK(yuv_encoder && alpha_encoder);
+    encoder_ = std::make_unique<media::AlphaVideoEncoderWrapper>(
+        std::move(yuv_encoder), std::move(alpha_encoder));
+  } else {
+    encoder_ = create_encoder_cb_.Run(gpu_factories_);
+  }
   CHECK(encoder_);
 
   // MediaRecorderEncoderWrapper doesn't require an encoder to post a callback
   // because a given |on_encoded_video_cb_| already hops a thread.
   encoder_->DisablePostedCallbacks();
   metrics_provider_->Initialize(profile_, options_.frame_size,
-                                /*is_hardware_encoder=*/false);
+                                /*is_hardware_encoder=*/gpu_factories_);
   encoder_->Initialize(
       profile_, options_,
       /*info_cb=*/base::DoNothing(),
@@ -171,16 +191,23 @@
   while (!pending_encode_tasks_.empty()) {
     auto& task = pending_encode_tasks_.front();
     const gfx::Size& frame_size = task.frame->visible_rect().size();
+    CHECK(media::IsOpaque(task.frame->format()) ||
+          task.frame->format() == media::PIXEL_FORMAT_I420A);
+    const bool need_alpha_encode =
+        task.frame->format() == media::PIXEL_FORMAT_I420A;
+
     // When a frame size is different from the current frame size (or first
     // Encode() call), encoder needs to be re-created because
     // media::VideoEncoder don't support all resolution change cases.
     // If |encoder_| exists, we first Flush() to not drop frames being encoded.
-    if (frame_size != options_.frame_size) {
+    if (frame_size != options_.frame_size ||
+        encode_alpha_ != need_alpha_encode) {
       if (encoder_) {
-        ReconfigureForNewResolution(frame_size);
+        Reconfigure(frame_size, encode_alpha_);
       } else {
         // Only first Encode() call.
-        CreateAndInitialize(frame_size, media::EncoderStatus::Codes::kOk);
+        CreateAndInitialize(frame_size, need_alpha_encode,
+                            media::EncoderStatus::Codes::kOk);
       }
       return;
     }
@@ -226,12 +253,16 @@
   auto [video_params, capture_timestamp] = std::move(params_in_encode_.front());
   params_in_encode_.pop_front();
   video_params.codec = codec_;
+
   on_encoded_video_cb_.Run(
       video_params,
       std::string(reinterpret_cast<const char*>(output.data.get()),
                   output.size),
-      /*encoded_alpha=*/std::string(), std::move(description),
-      capture_timestamp, output.key_frame);
+      encode_alpha_
+          ? std::string(reinterpret_cast<const char*>(output.alpha_data.get()),
+                        output.alpha_size)
+          : std::string(),
+      std::move(description), capture_timestamp, output.key_frame);
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper.h b/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper.h
index 6fd40620..a66c4623 100644
--- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper.h
+++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper.h
@@ -12,6 +12,10 @@
 #include "third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h"
 #include "third_party/blink/renderer/platform/wtf/deque.h"
 
+namespace media {
+class GpuVideoAcceleratorFactories;
+}  // namespace media
+
 namespace blink {
 
 // VideoTrackRecorder::Encoder class encodes h264, vp8, vp9 and av1 using
@@ -20,13 +24,15 @@
     : public VideoTrackRecorder::Encoder {
  public:
   using CreateEncoderCB =
-      base::RepeatingCallback<std::unique_ptr<media::VideoEncoder>()>;
+      base::RepeatingCallback<std::unique_ptr<media::VideoEncoder>(
+          media::GpuVideoAcceleratorFactories*)>;
   using OnErrorCB = base::OnceClosure;
 
   MediaRecorderEncoderWrapper(
       scoped_refptr<base::SequencedTaskRunner> encoding_task_runner,
       media::VideoCodecProfile profile,
       uint32_t bits_per_second,
+      media::GpuVideoAcceleratorFactories* gpu_factories,
       CreateEncoderCB create_encoder_cb,
       VideoTrackRecorder::OnEncodedVideoCB on_encoded_video_cb,
       OnErrorCB on_error_cb);
@@ -75,12 +81,13 @@
   bool CanEncodeAlphaChannel() const override;
 
   void EnterErrorState(const media::EncoderStatus& status);
-  void ReconfigureForNewResolution(const gfx::Size& frame_size);
+  void Reconfigure(const gfx::Size& frame_size, bool encode_alpha);
 
   // (Re)creates |encoder_| and initialize the encoder with |frame_size|.
   // |status| can be non kOk only if it is called as flush done callback and the
   // the flush fails.
   void CreateAndInitialize(const gfx::Size& frame_size,
+                           bool encode_alpha,
                            media::EncoderStatus status);
   void InitializeDone(media::EncoderStatus status);
   void EncodePendingTasks();
@@ -89,6 +96,9 @@
       media::VideoEncoderOutput output,
       absl::optional<media::VideoEncoder::CodecDescription> description);
 
+  const raw_ptr<media::GpuVideoAcceleratorFactories, ExperimentalRenderer>
+      gpu_factories_;
+
   const media::VideoCodecProfile profile_;
   const media::VideoCodec codec_;
 
@@ -96,6 +106,7 @@
   OnErrorCB on_error_cb_;
 
   media::VideoEncoder::Options options_;
+  bool encode_alpha_ = false;
   State state_ = State::kEncoding;
   WTF::Deque<EncodeTask> pending_encode_tasks_;
   WTF::Deque<VideoParamsAndTimestamp> params_in_encode_;
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper_unittest.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper_unittest.cc
index 50ea37e..5510849 100644
--- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper_unittest.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper_unittest.cc
@@ -9,6 +9,7 @@
 #include "base/memory/raw_ptr.h"
 #include "media/base/mock_filters.h"
 #include "media/base/video_frame.h"
+#include "media/video/gpu_video_accelerator_factories.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/platform/scheduler/test/renderer_scheduler_test_support.h"
 
@@ -20,9 +21,6 @@
 
 namespace blink {
 namespace {
-constexpr media::VideoCodecProfile kCodecProfile =
-    media::VideoCodecProfile::AV1PROFILE_PROFILE_MAIN;
-constexpr media::VideoCodec kCodec = media::VideoCodec::kAV1;
 constexpr uint32_t kDefaultBitrate = 1280 * 720;
 constexpr gfx::Size k720p{1280, 720};
 constexpr gfx::Size k360p{640, 360};
@@ -107,13 +105,17 @@
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
-class MediaRecorderEncoderWrapperTest : public ::testing::Test {
+class MediaRecorderEncoderWrapperTest
+    : public ::testing::TestWithParam<media::VideoCodecProfile> {
  public:
   MediaRecorderEncoderWrapperTest()
-      : encoder_wrapper_(
+      : profile_(GetParam()),
+        codec_(media::VideoCodecProfileToVideoCodec(profile_)),
+        encoder_wrapper_(
             scheduler::GetSingleThreadTaskRunnerForTesting(),
-            kCodecProfile,
+            profile_,
             kDefaultBitrate,
+            /*gpu_factories=*/nullptr,
             WTF::BindRepeating(
                 &MediaRecorderEncoderWrapperTest::CreateMockVideoEncoder,
                 base::Unretained(this)),
@@ -138,7 +140,8 @@
   MOCK_METHOD(void, OnError, (), ());
   MOCK_METHOD(void, MockVideoEncoderWrapperDtor, (), ());
 
-  std::unique_ptr<media::VideoEncoder> CreateMockVideoEncoder() {
+  std::unique_ptr<media::VideoEncoder> CreateMockVideoEncoder(
+      media::GpuVideoAcceleratorFactories* /*gpu_factories*/) {
     CreateEncoder();
     return std::make_unique<MockVideoEncoderWrapper>(
         &mock_encoder_,
@@ -166,8 +169,8 @@
 
   void SetupSuccessful720pEncoderInitialization() {
     ON_CALL(mock_encoder_,
-            Initialize(kCodecProfile,
-                       MatchEncoderOptions(kDefaultBitrate, k720p), _, _, _))
+            Initialize(profile_, MatchEncoderOptions(kDefaultBitrate, k720p), _,
+                       _, _))
         .WillByDefault(WithArgs<3, 4>(
             [this](media::VideoEncoder::OutputCB output_callback,
                    media::VideoEncoder::EncoderStatusCB initialize_done_cb) {
@@ -183,11 +186,14 @@
               this->output_cb.Run(std::move(output), absl::nullopt);
             }));
     ON_CALL(*mock_metrics_provider_,
-            MockInitialize(kCodecProfile, k720p, false,
+            MockInitialize(profile_, k720p, false,
                            media::SVCScalabilityMode::kL1T1))
         .WillByDefault(Return());
   }
 
+  const media::VideoCodecProfile profile_;
+  const media::VideoCodec codec_;
+
   media::VideoEncoder::OutputCB output_cb;
 
   media::MockVideoEncoder mock_encoder_;
@@ -196,14 +202,15 @@
   MediaRecorderEncoderWrapper encoder_wrapper_;
 };
 
-TEST_F(MediaRecorderEncoderWrapperTest, InitializesAndEncodesOneFrame) {
+TEST_P(MediaRecorderEncoderWrapperTest, InitializesAndEncodesOneFrame) {
   InSequence s;
   EXPECT_CALL(*this, CreateEncoder);
   EXPECT_CALL(*mock_metrics_provider_, MockInitialize);
   EXPECT_CALL(mock_encoder_, Initialize);
   EXPECT_CALL(mock_encoder_, Encode);
+
   EXPECT_CALL(*mock_metrics_provider_, MockIncrementEncodedFrameCount);
-  EXPECT_CALL(*this, OnEncodedVideo(MatchVideoParams(k720p, kCodec),
+  EXPECT_CALL(*this, OnEncodedVideo(MatchVideoParams(k720p, codec_),
                                     MatchStringSize(kChunkSize),
                                     MatchStringSize(0), _, _,
                                     /*key_frame=*/true));
@@ -212,14 +219,14 @@
   EXPECT_CALL(*this, MockVideoEncoderWrapperDtor);
 }
 
-TEST_F(MediaRecorderEncoderWrapperTest,
+TEST_P(MediaRecorderEncoderWrapperTest,
        EncodesTwoFramesWithoutRecreatingEncoder) {
   InSequence s;
   const auto capture_timestamp1 = base::TimeTicks::Now();
   EXPECT_CALL(*mock_metrics_provider_, MockIncrementEncodedFrameCount);
   // OnEncodedVideo to check capture_timestamp1.
   EXPECT_CALL(*this,
-              OnEncodedVideo(MatchVideoParams(k720p, kCodec),
+              OnEncodedVideo(MatchVideoParams(k720p, codec_),
                              MatchStringSize(kChunkSize), MatchStringSize(0), _,
                              capture_timestamp1, /*key_frame=*/true));
   EncodeFrame(media::VideoFrame::CreateBlackFrame(k720p), capture_timestamp1);
@@ -238,7 +245,7 @@
           }));
   EXPECT_CALL(*mock_metrics_provider_, MockIncrementEncodedFrameCount);
   EXPECT_CALL(*this,
-              OnEncodedVideo(MatchVideoParams(k720p, kCodec),
+              OnEncodedVideo(MatchVideoParams(k720p, codec_),
                              MatchStringSize(kChunkSize), MatchStringSize(0), _,
                              capture_timestamp2, /*key_frame=*/false));
 
@@ -246,7 +253,7 @@
   EXPECT_CALL(*this, MockVideoEncoderWrapperDtor);
 }
 
-TEST_F(MediaRecorderEncoderWrapperTest,
+TEST_P(MediaRecorderEncoderWrapperTest,
        EncodeTwoFramesAndDelayEncodeDoneAndOutputCB) {
   InSequence s;
   media::VideoEncoder::EncoderStatusCB encode_done_cb1;
@@ -274,12 +281,12 @@
           }));
   EXPECT_CALL(*mock_metrics_provider_, MockIncrementEncodedFrameCount);
   EXPECT_CALL(*this,
-              OnEncodedVideo(MatchVideoParams(k720p, kCodec),
+              OnEncodedVideo(MatchVideoParams(k720p, codec_),
                              MatchStringSize(kChunkSize), MatchStringSize(0), _,
                              capture_timestamp1, /*key_frame=*/true));
   EXPECT_CALL(*mock_metrics_provider_, MockIncrementEncodedFrameCount);
   EXPECT_CALL(*this,
-              OnEncodedVideo(MatchVideoParams(k720p, kCodec),
+              OnEncodedVideo(MatchVideoParams(k720p, codec_),
                              MatchStringSize(kChunkSize), MatchStringSize(0), _,
                              capture_timestamp2, /*key_frame=*/false));
   EncodeFrame(media::VideoFrame::CreateBlackFrame(k720p), capture_timestamp1);
@@ -287,7 +294,7 @@
   EXPECT_CALL(*this, MockVideoEncoderWrapperDtor);
 }
 
-TEST_F(MediaRecorderEncoderWrapperTest, RecreatesEncoderOnNewResolution) {
+TEST_P(MediaRecorderEncoderWrapperTest, RecreatesEncoderOnNewResolution) {
   InSequence s;
   EXPECT_CALL(*mock_metrics_provider_, MockIncrementEncodedFrameCount);
   EncodeFrame(media::VideoFrame::CreateBlackFrame(k720p),
@@ -300,12 +307,12 @@
           }));
   EXPECT_CALL(*this, CreateEncoder);
   EXPECT_CALL(*this, MockVideoEncoderWrapperDtor);
-  EXPECT_CALL(*mock_metrics_provider_,
-              MockInitialize(kCodecProfile, k360p, false,
-                             media::SVCScalabilityMode::kL1T1));
+  EXPECT_CALL(
+      *mock_metrics_provider_,
+      MockInitialize(profile_, k360p, false, media::SVCScalabilityMode::kL1T1));
   EXPECT_CALL(mock_encoder_,
-              Initialize(kCodecProfile,
-                         MatchEncoderOptions(kDefaultBitrate, k360p), _, _, _))
+              Initialize(profile_, MatchEncoderOptions(kDefaultBitrate, k360p),
+                         _, _, _))
       .WillOnce(WithArgs<3, 4>(
           [this](media::VideoEncoder::OutputCB output_cb,
                  media::VideoEncoder::EncoderStatusCB initialize_done_cb) {
@@ -320,7 +327,7 @@
             this->output_cb.Run(std::move(output), absl::nullopt);
           }));
   EXPECT_CALL(*mock_metrics_provider_, MockIncrementEncodedFrameCount);
-  EXPECT_CALL(*this, OnEncodedVideo(MatchVideoParams(k360p, kCodec),
+  EXPECT_CALL(*this, OnEncodedVideo(MatchVideoParams(k360p, codec_),
                                     MatchStringSize(kChunkSize),
                                     MatchStringSize(0), _, _,
                                     /*key_frame=*/true));
@@ -329,11 +336,11 @@
   EXPECT_CALL(*this, MockVideoEncoderWrapperDtor);
 }
 
-TEST_F(MediaRecorderEncoderWrapperTest, HandlesInitializeFailure) {
+TEST_P(MediaRecorderEncoderWrapperTest, HandlesInitializeFailure) {
   InSequence s;
   EXPECT_CALL(mock_encoder_,
-              Initialize(kCodecProfile,
-                         MatchEncoderOptions(kDefaultBitrate, k720p), _, _, _))
+              Initialize(profile_, MatchEncoderOptions(kDefaultBitrate, k720p),
+                         _, _, _))
       .WillOnce(WithArgs<4>(
           [](media::VideoEncoder::EncoderStatusCB initialize_done_cb) {
             std::move(initialize_done_cb)
@@ -348,7 +355,7 @@
   EXPECT_CALL(*this, MockVideoEncoderWrapperDtor);
 }
 
-TEST_F(MediaRecorderEncoderWrapperTest, HandlesEncodeFailure) {
+TEST_P(MediaRecorderEncoderWrapperTest, HandlesEncodeFailure) {
   InSequence s;
   EXPECT_CALL(mock_encoder_, Encode(_, MatchEncodeOption(false), _))
       .WillOnce(
@@ -365,7 +372,7 @@
   EXPECT_CALL(*this, MockVideoEncoderWrapperDtor);
 }
 
-TEST_F(MediaRecorderEncoderWrapperTest, HandlesFlushFailure) {
+TEST_P(MediaRecorderEncoderWrapperTest, HandlesFlushFailure) {
   InSequence s;
   EXPECT_CALL(*mock_metrics_provider_, MockIncrementEncodedFrameCount);
   EXPECT_CALL(mock_encoder_, Flush)
@@ -385,7 +392,7 @@
   EXPECT_CALL(*this, MockVideoEncoderWrapperDtor);
 }
 
-TEST_F(MediaRecorderEncoderWrapperTest, NotCallOnEncodedVideoCBIfEncodeFail) {
+TEST_P(MediaRecorderEncoderWrapperTest, NotCallOnEncodedVideoCBIfEncodeFail) {
   InSequence s;
   EXPECT_CALL(mock_encoder_, Encode(_, MatchEncodeOption(false), _))
       .WillOnce(WithArgs<2>(
@@ -405,7 +412,7 @@
   EXPECT_CALL(*this, MockVideoEncoderWrapperDtor);
 }
 
-TEST_F(MediaRecorderEncoderWrapperTest,
+TEST_P(MediaRecorderEncoderWrapperTest,
        NotErrorCallbackTwiceByTwiceEncodeDoneFailure) {
   InSequence s;
   media::VideoEncoder::EncoderStatusCB encode_done_cb1;
@@ -435,11 +442,11 @@
   EXPECT_CALL(*this, MockVideoEncoderWrapperDtor);
 }
 
-TEST_F(MediaRecorderEncoderWrapperTest, IgnoresEncodeAfterFailure) {
+TEST_P(MediaRecorderEncoderWrapperTest, IgnoresEncodeAfterFailure) {
   InSequence s;
   EXPECT_CALL(mock_encoder_,
-              Initialize(kCodecProfile,
-                         MatchEncoderOptions(kDefaultBitrate, k720p), _, _, _))
+              Initialize(profile_, MatchEncoderOptions(kDefaultBitrate, k720p),
+                         _, _, _))
       .WillOnce(WithArgs<4>(
           [](media::VideoEncoder::EncoderStatusCB initialize_done_cb) {
             std::move(initialize_done_cb)
@@ -459,4 +466,75 @@
               base::TimeTicks::Now());
   EXPECT_CALL(*this, MockVideoEncoderWrapperDtor);
 }
+
+TEST_P(MediaRecorderEncoderWrapperTest, InitializesAndEncodesOneAlphaFrame) {
+  InSequence s;
+  if (codec_ != media::VideoCodec::kVP8 && codec_ != media::VideoCodec::kVP9) {
+    GTEST_SKIP() << "no alpha encoding is supported in"
+                 << media::GetCodecName(codec_);
+  }
+
+  constexpr size_t kAlphaChunkSize = 2345;
+  EXPECT_CALL(*this, CreateEncoder).Times(2);
+  EXPECT_CALL(*mock_metrics_provider_, MockInitialize);
+  media::VideoEncoder::OutputCB yuv_output_cb;
+  media::VideoEncoder::OutputCB alpha_output_cb;
+  EXPECT_CALL(mock_encoder_, Initialize(profile_, _, _, _, _))
+      .WillOnce(WithArgs<3, 4>(
+          [&](media::VideoEncoder::OutputCB output_callback,
+              media::VideoEncoder::EncoderStatusCB initialize_done_cb) {
+            yuv_output_cb = output_callback;
+            std::move(initialize_done_cb).Run(media::EncoderStatus::Codes::kOk);
+          }));
+  EXPECT_CALL(mock_encoder_, Initialize(profile_, _, _, _, _))
+      .WillOnce(WithArgs<3, 4>(
+          [&](media::VideoEncoder::OutputCB output_callback,
+              media::VideoEncoder::EncoderStatusCB initialize_done_cb) {
+            alpha_output_cb = output_callback;
+            std::move(initialize_done_cb).Run(media::EncoderStatus::Codes::kOk);
+          }));
+
+  EXPECT_CALL(mock_encoder_, Encode)
+      .WillOnce(
+          WithArgs<2>([yuv_output_cb_ptr = &yuv_output_cb](
+                          media::VideoEncoder::EncoderStatusCB encode_done_cb) {
+            std::move(encode_done_cb).Run(media::EncoderStatus::Codes::kOk);
+            media::VideoEncoderOutput output;
+            output.data = std::make_unique<uint8_t[]>(kChunkSize);
+            output.size = kChunkSize;
+            output.key_frame = true;
+            yuv_output_cb_ptr->Run(std::move(output), absl::nullopt);
+          }));
+  EXPECT_CALL(mock_encoder_, Encode)
+      .WillOnce(
+          WithArgs<2>([alpha_output_cb_ptr = &alpha_output_cb](
+                          media::VideoEncoder::EncoderStatusCB encode_done_cb) {
+            std::move(encode_done_cb).Run(media::EncoderStatus::Codes::kOk);
+            media::VideoEncoderOutput output;
+            output.data = std::make_unique<uint8_t[]>(kAlphaChunkSize);
+            output.size = kAlphaChunkSize;
+            output.key_frame = true;
+            alpha_output_cb_ptr->Run(std::move(output), absl::nullopt);
+          }));
+
+  EXPECT_CALL(*mock_metrics_provider_, MockIncrementEncodedFrameCount);
+  EXPECT_CALL(*this, OnEncodedVideo(MatchVideoParams(k720p, codec_),
+                                    MatchStringSize(kChunkSize),
+                                    MatchStringSize(kAlphaChunkSize), _, _,
+                                    /*key_frame=*/true));
+
+  EncodeFrame(media::VideoFrame::CreateZeroInitializedFrame(
+                  media::VideoPixelFormat::PIXEL_FORMAT_I420A, k720p,
+                  gfx::Rect(k720p), k720p, base::TimeDelta()),
+              base::TimeTicks::Now());
+  EXPECT_CALL(*this, MockVideoEncoderWrapperDtor).Times(2);
+}
+
+INSTANTIATE_TEST_SUITE_P(CodecProfile,
+                         MediaRecorderEncoderWrapperTest,
+                         ::testing::Values(media::H264PROFILE_MIN,
+                                           media::VP8PROFILE_MIN,
+                                           media::VP9PROFILE_MIN,
+                                           media::AV1PROFILE_MIN));
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc
index cd78718..9622c8d 100644
--- a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc
+++ b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc
@@ -250,7 +250,8 @@
 #if BUILDFLAG(RTC_USE_H264)
     case CodecId::kH264:
       return ConvertToBaseRepeatingCallback(WTF::CrossThreadBindRepeating(
-          []() -> std::unique_ptr<media::VideoEncoder> {
+          [](media::GpuVideoAcceleratorFactories* /*gpu_factories*/)
+              -> std::unique_ptr<media::VideoEncoder> {
             return std::make_unique<media::OpenH264VideoEncoder>();
           }));
 #endif  // BUILDFLAG(RTC_USE_H264)
@@ -258,14 +259,16 @@
     case CodecId::kVp8:
     case CodecId::kVp9:
       return ConvertToBaseRepeatingCallback(WTF::CrossThreadBindRepeating(
-          []() -> std::unique_ptr<media::VideoEncoder> {
+          [](media::GpuVideoAcceleratorFactories* /*gpu_factories*/)
+              -> std::unique_ptr<media::VideoEncoder> {
             return std::make_unique<media::VpxVideoEncoder>();
           }));
 #endif
 #if BUILDFLAG(ENABLE_LIBAOM)
     case CodecId::kAv1:
       return ConvertToBaseRepeatingCallback(WTF::CrossThreadBindRepeating(
-          []() -> std::unique_ptr<media::VideoEncoder> {
+          [](media::GpuVideoAcceleratorFactories* /*gpu_factories*/)
+              -> std::unique_ptr<media::VideoEncoder> {
             return std::make_unique<media::Av1VideoEncoder>();
           }));
 #endif  // BUILDFLAG(ENABLE_LIBAOM)
@@ -797,6 +800,77 @@
   encoder_.AsyncCall(&Encoder::ForceKeyFrameForNextFrameForTesting);
 }
 
+std::unique_ptr<VideoTrackRecorder::Encoder>
+VideoTrackRecorderImpl::CreateSoftwareVideoEncoder(
+    scoped_refptr<base::SequencedTaskRunner> encoding_task_runner,
+    CodecProfile codec_profile,
+    uint32_t bits_per_second,
+    const OnEncodedVideoCB& on_encoded_video_cb) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
+  switch (codec_profile.codec_id) {
+#if BUILDFLAG(RTC_USE_H264)
+    case CodecId::kH264:
+      return std::make_unique<H264Encoder>(std::move(encoding_task_runner),
+                                           on_encoded_video_cb, codec_profile,
+                                           bits_per_second);
+#endif
+    case CodecId::kVp8:
+    case CodecId::kVp9:
+      return std::make_unique<VpxEncoder>(
+          std::move(encoding_task_runner),
+          codec_profile.codec_id == CodecId::kVp9, on_encoded_video_cb,
+          bits_per_second);
+#if BUILDFLAG(ENABLE_LIBAOM)
+    case CodecId::kAv1: {
+      auto on_error_cb = base::BindPostTask(
+          main_thread_task_runner_,
+          WTF::BindOnce(&CallbackInterface::OnVideoEncodingError,
+                        WrapWeakPersistent(callback_interface())));
+      return std::make_unique<MediaRecorderEncoderWrapper>(
+          std::move(encoding_task_runner),
+          codec_profile.profile.value_or(media::AV1PROFILE_PROFILE_MAIN),
+          bits_per_second,
+          /*gpu_factories=*/nullptr,
+          GetCreateSoftwareVideoEncoderCallback(CodecId::kAv1),
+          on_encoded_video_cb, std::move(on_error_cb));
+    }
+#endif  // BUILDFLAG(ENABLE_LIBAOM)
+    default:
+      NOTREACHED_NORETURN()
+          << "Unsupported codec: " << static_cast<int>(codec_profile.codec_id);
+  }
+}
+
+std::unique_ptr<VideoTrackRecorder::Encoder>
+VideoTrackRecorderImpl::CreateHardwareVideoEncoder(
+    scoped_refptr<base::SequencedTaskRunner> encoding_task_runner,
+    CodecProfile codec_profile,
+    const gfx::Size& input_size,
+    uint32_t bits_per_second,
+    const OnEncodedVideoCB& on_encoded_video_cb,
+    bool use_import_mode,
+    bool is_screencast) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(main_sequence_checker_);
+  const auto [vea_profile, vbr_supported] =
+      codec_profile.profile
+          ? GetCodecEnumerator()->FindSupportedVideoCodecProfile(
+                codec_profile.codec_id, *codec_profile.profile)
+          : GetCodecEnumerator()->GetFirstSupportedVideoCodecProfile(
+                codec_profile.codec_id);
+  // VBR encoding is preferred.
+  media::Bitrate::Mode bitrate_mode = vbr_supported
+                                          ? media::Bitrate::Mode::kVariable
+                                          : media::Bitrate::Mode::kConstant;
+  return std::make_unique<VEAEncoder>(
+      std::move(encoding_task_runner), on_encoded_video_cb,
+      base::BindPostTask(
+          main_thread_task_runner_,
+          WTF::BindRepeating(&VideoTrackRecorderImpl::OnHardwareEncoderError,
+                             weak_factory_.GetWeakPtr())),
+      bitrate_mode, bits_per_second, vea_profile, codec_profile.level,
+      input_size, use_import_mode, is_screencast);
+}
+
 void VideoTrackRecorderImpl::InitializeEncoder(
     CodecProfile codec_profile,
     const OnEncodedVideoCB& on_encoded_video_cb,
@@ -860,88 +934,30 @@
   const bool is_screencast =
       static_cast<const MediaStreamVideoTrack*>(track_->GetPlatformTrack())
           ->is_screencast();
-  std::unique_ptr<Encoder> encoder;
-  base::WeakPtr<Encoder> weak_encoder;
+  const bool use_import_mode =
+      frame->storage_type() == media::VideoFrame::STORAGE_GPU_MEMORY_BUFFER;
+  const bool create_vea_encoder = allow_vea_encoder && can_use_vea;
+
   scoped_refptr<base::SequencedTaskRunner> encoding_task_runner;
-  if (allow_vea_encoder && can_use_vea) {
-    // TODO(b/227350897): remove once codec histogram is verified working
-    UMA_HISTOGRAM_BOOLEAN("Media.MediaRecorder.VEAUsed", true);
-    UmaHistogramForCodec(true, codec_profile.codec_id);
+  std::unique_ptr<Encoder> encoder;
+  if (create_vea_encoder) {
     encoding_task_runner =
         Platform::Current()->GetGpuFactories()->GetTaskRunner();
-
-    const auto [vea_profile, vbr_supported] =
-        codec_profile.profile
-            ? GetCodecEnumerator()->FindSupportedVideoCodecProfile(
-                  codec_profile.codec_id, *codec_profile.profile)
-            : GetCodecEnumerator()->GetFirstSupportedVideoCodecProfile(
-                  codec_profile.codec_id);
-
-    bool use_import_mode =
-        frame->storage_type() == media::VideoFrame::STORAGE_GPU_MEMORY_BUFFER;
-    // VBR encoding is preferred.
-    media::Bitrate::Mode bitrate_mode = vbr_supported
-                                            ? media::Bitrate::Mode::kVariable
-                                            : media::Bitrate::Mode::kConstant;
-
-    auto vea_encoder = std::make_unique<VEAEncoder>(
-        encoding_task_runner, on_encoded_video_cb,
-        base::BindPostTask(
-            main_thread_task_runner_,
-            WTF::BindRepeating(&VideoTrackRecorderImpl::OnHardwareEncoderError,
-                               weak_factory_.GetWeakPtr())),
-        bitrate_mode, bits_per_second, vea_profile, codec_profile.level,
-        input_size, use_import_mode, is_screencast);
-    weak_encoder = vea_encoder->GetWeakPtr();
-    encoder = std::move(vea_encoder);
+    encoder = CreateHardwareVideoEncoder(
+        encoding_task_runner, codec_profile, input_size, bits_per_second,
+        on_encoded_video_cb, use_import_mode, is_screencast);
   } else {
-    // TODO(b/227350897): remove once codec histogram is verified working
-    UMA_HISTOGRAM_BOOLEAN("Media.MediaRecorder.VEAUsed", false);
-    UmaHistogramForCodec(false, codec_profile.codec_id);
     encoding_task_runner =
         base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()});
-    switch (codec_profile.codec_id) {
-#if BUILDFLAG(RTC_USE_H264)
-      case CodecId::kH264: {
-        auto h264_encoder = std::make_unique<H264Encoder>(
-            encoding_task_runner, on_encoded_video_cb, codec_profile,
-            bits_per_second);
-        weak_encoder = h264_encoder->GetWeakPtr();
-        encoder = std::move(h264_encoder);
-      } break;
-#endif
-      case CodecId::kVp8:
-      case CodecId::kVp9: {
-        auto vpx_encoder = std::make_unique<VpxEncoder>(
-            encoding_task_runner, codec_profile.codec_id == CodecId::kVp9,
-            on_encoded_video_cb, bits_per_second);
-        weak_encoder = vpx_encoder->GetWeakPtr();
-        encoder = std::move(vpx_encoder);
-      } break;
-#if BUILDFLAG(ENABLE_LIBAOM)
-      case CodecId::kAv1: {
-        auto on_error_cb = base::BindPostTask(
-            main_thread_task_runner_,
-            WTF::BindOnce(&CallbackInterface::OnVideoEncodingError,
-                          WrapWeakPersistent(callback_interface())));
-        // TODO(crbug.com/1424974): Use MediaRecorderEncoderWrapper for other
-        // codecs.
-        auto video_encoder = std::make_unique<MediaRecorderEncoderWrapper>(
-            encoding_task_runner,
-            codec_profile.profile.value_or(media::AV1PROFILE_PROFILE_MAIN),
-            bits_per_second,
-            GetCreateSoftwareVideoEncoderCallback(codec_profile.codec_id),
-            on_encoded_video_cb, std::move(on_error_cb));
-        weak_encoder = video_encoder->GetWeakPtr();
-        encoder = std::move(video_encoder);
-      } break;
-#endif  // BUILDFLAG(ENABLE_LIBAOM)
-      default:
-        NOTREACHED() << "Unsupported codec "
-                     << static_cast<int>(codec_profile.codec_id);
-    }
+    encoder = CreateSoftwareVideoEncoder(encoding_task_runner, codec_profile,
+                                         bits_per_second, on_encoded_video_cb);
   }
 
+  UMA_HISTOGRAM_BOOLEAN("Media.MediaRecorder.VEAUsed", create_vea_encoder);
+  UmaHistogramForCodec(create_vea_encoder, codec_profile.codec_id);
+  CHECK(encoder);
+  base::WeakPtr<Encoder> weak_encoder = encoder->GetWeakPtr();
+
   CHECK(callback_interface());
   auto metrics_provider =
       callback_interface()->CreateVideoEncoderMetricsProvider();
diff --git a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h
index 56fa5d1..d74d148 100644
--- a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h
+++ b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h
@@ -374,6 +374,19 @@
       bool allow_vea_encoder,
       scoped_refptr<media::VideoFrame> frame,
       base::TimeTicks capture_time);
+  std::unique_ptr<Encoder> CreateSoftwareVideoEncoder(
+      scoped_refptr<base::SequencedTaskRunner> encoding_task_runner,
+      CodecProfile codec_profile,
+      uint32_t bits_per_second,
+      const OnEncodedVideoCB& on_encoded_video_cb);
+  std::unique_ptr<Encoder> CreateHardwareVideoEncoder(
+      scoped_refptr<base::SequencedTaskRunner> encoding_task_runner,
+      CodecProfile codec_profile,
+      const gfx::Size& input_size,
+      uint32_t bits_per_second,
+      const OnEncodedVideoCB& on_encoded_video_cb,
+      bool use_import_mode,
+      bool create_vea_encoder);
   void OnHardwareEncoderError();
 
   void ConnectToTrack(const VideoCaptureDeliverFrameCB& callback);
diff --git a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
index 18be090..e68963a 100644
--- a/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
+++ b/third_party/blink/renderer/modules/remoteplayback/remote_playback.cc
@@ -381,7 +381,7 @@
       IsInParallelAlgorithmRunnable(
           prompt_promise_resolver_->GetExecutionContext(),
           prompt_promise_resolver_->GetScriptState())) {
-    // Changing state to "disconnected" from "disconnected" or "connecting"
+    // Changing state to "CLOSED" from "CLOSED" or "CONNECTING"
     // means that establishing connection with remote playback device failed.
     // Changing state to anything else means the state change intended by
     // prompt() succeeded.
@@ -395,10 +395,6 @@
           DOMExceptionCode::kAbortError,
           "Failed to connect to the remote device."));
     } else {
-      DCHECK((state_ == mojom::blink::PresentationConnectionState::CLOSED &&
-              state == mojom::blink::PresentationConnectionState::CONNECTING) ||
-             (state_ == mojom::blink::PresentationConnectionState::CONNECTED &&
-              state == mojom::blink::PresentationConnectionState::CLOSED));
       prompt_promise_resolver_->Resolve();
     }
   }
@@ -609,6 +605,11 @@
   if (!presentation_controller)
     return;
 
+#if !BUILDFLAG(IS_ANDROID)
+  media_element_->Play();
+  media_element_->GetWebMediaPlayer()->RequestMediaRemoting();
+#endif
+
   // Note: Messages on |connection_receiver| are ignored.
   target_presentation_connection_.Bind(
       std::move(result->connection_remote),
diff --git a/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.cc b/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.cc
index 4fd08f41..247ea6c 100644
--- a/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.cc
+++ b/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.cc
@@ -8,6 +8,7 @@
 #include "base/synchronization/waitable_event.h"
 #include "base/task/single_thread_task_runner.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
+#include "net/cookies/site_for_cookies.h"
 #include "services/network/public/cpp/wrapper_shared_url_loader_factory.h"
 #include "third_party/blink/public/common/loader/loader_constants.h"
 #include "third_party/blink/public/mojom/fetch/fetch_api_request.mojom-blink.h"
@@ -38,7 +39,8 @@
     CrossVariantMojoReceiver<
         mojom::blink::SubresourceLoaderUpdaterInterfaceBase>
         pending_subresource_loader_updater,
-    const WebVector<WebString>& web_cors_exempt_header_list) {
+    const WebVector<WebString>& web_cors_exempt_header_list,
+    const bool is_third_party_context) {
   Vector<String> cors_exempt_header_list(
       base::checked_cast<wtf_size_t>(web_cors_exempt_header_list.size()));
   base::ranges::transform(web_cors_exempt_header_list,
@@ -53,7 +55,7 @@
       std::move(websocket_handshake_throttle_provider),
       std::move(preference_watcher_receiver),
       std::move(pending_subresource_loader_updater),
-      std::move(cors_exempt_header_list));
+      std::move(cors_exempt_header_list), is_third_party_context);
 }
 
 WebServiceWorkerFetchContextImpl::WebServiceWorkerFetchContextImpl(
@@ -71,7 +73,8 @@
         preference_watcher_receiver,
     mojo::PendingReceiver<mojom::blink::SubresourceLoaderUpdater>
         pending_subresource_loader_updater,
-    Vector<String> cors_exempt_header_list)
+    Vector<String> cors_exempt_header_list,
+    const bool is_third_party_context)
     : renderer_preferences_(renderer_preferences),
       worker_script_url_(worker_script_url),
       pending_url_loader_factory_(std::move(pending_url_loader_factory)),
@@ -84,7 +87,8 @@
           std::move(preference_watcher_receiver)),
       pending_subresource_loader_updater_(
           std::move(pending_subresource_loader_updater)),
-      cors_exempt_header_list_(std::move(cors_exempt_header_list)) {}
+      cors_exempt_header_list_(std::move(cors_exempt_header_list)),
+      is_third_party_context_(is_third_party_context) {}
 
 WebServiceWorkerFetchContextImpl::~WebServiceWorkerFetchContextImpl() = default;
 
@@ -184,10 +188,9 @@
 }
 
 net::SiteForCookies WebServiceWorkerFetchContextImpl::SiteForCookies() const {
-  // According to the spec, we can use the |worker_script_url_| for
-  // SiteForCookies, because "site for cookies" for the service worker is
-  // the service worker's origin's host's registrable domain.
-  // https://tools.ietf.org/html/draft-ietf-httpbis-cookie-same-site-07#section-2.1.2
+  if (is_third_party_context_) {
+    return net::SiteForCookies();
+  }
   return net::SiteForCookies::FromUrl(GURL(worker_script_url_));
 }
 
diff --git a/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.h b/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.h
index b74ee6b..1bbcbc1c7 100644
--- a/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.h
+++ b/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl.h
@@ -58,7 +58,8 @@
           preference_watcher_receiver,
       mojo::PendingReceiver<mojom::blink::SubresourceLoaderUpdater>
           pending_subresource_loader_updater,
-      Vector<String> cors_exempt_header_list);
+      Vector<String> cors_exempt_header_list,
+      bool is_third_party_context);
 
   // WebServiceWorkerFetchContext implementation:
   void SetTerminateSyncLoadEvent(base::WaitableEvent*) override;
@@ -140,6 +141,8 @@
 
   Vector<String> cors_exempt_header_list_;
   bool is_offline_mode_ = false;
+
+  bool is_third_party_context_ = false;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl_test.cc b/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl_test.cc
index cd7fdb67a..01317e39 100644
--- a/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl_test.cc
+++ b/third_party/blink/renderer/modules/service_worker/web_service_worker_fetch_context_impl_test.cc
@@ -49,7 +49,8 @@
       std::make_unique<FakeURLLoaderThrottleProvider>(),
       /*websocket_handshake_throttle_provider=*/nullptr, mojo::NullReceiver(),
       mojo::NullReceiver(),
-      /*cors_exempt_header_list=*/WebVector<WebString>());
+      /*cors_exempt_header_list=*/WebVector<WebString>(),
+      /*is_third_party_context*/ false);
 
   {
     // Call WillSendRequest() for kScriptURL.
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index a7a38734..72f3f14 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -6755,6 +6755,10 @@
 crbug.com/1487363 [ Linux ] inspector-protocol/overlay/overlay-with-emulation-scale.js [ Failure ]
 crbug.com/1486131 [ Linux ] external/wpt/html/browsers/history/the-history-interface/005.html [ Failure Pass ]
 
+# The following tests should fail with third-party cookie not blocked.
+external/wpt/cookies/third-party-cookies/third-party-cookies.tentative.https.html [ Failure ]
+http/tests/inspector-protocol/issues/third-party-cookie-phaseout-exclusion.js [ Failure ]
+
 # Gardener 2023-09-29
 crbug.com/1481694 [ Win11 ] accessibility/selection-change-notification-on-selection-removed.html [ Failure ]
 crbug.com/1486616 [ Linux ] fast/sub-pixel/sub-pixel-composited-layers.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 166a4d9..dc2882c 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1227,10 +1227,10 @@
     "platforms": ["Linux", "Mac", "Win"],
     "bases": [
       "external/wpt/cookies/third-party-cookies",
+      "external/wpt/service-workers/service-worker/partitioned-cookies.tentative.https.html",
       "external/wpt/workers/shared-worker-partitioned-cookies.tentative.https.html",
       "http/tests/inspector-protocol/issues/third-party-cookie-phaseout-exclusion.js"
     ],
-    "exclusive_tests": "ALL",
     "args": ["--test-third-party-cookie-phaseout",
              "--disable-threaded-compositing", "--disable-threaded-animation"],
     "expires": "Mar 1, 2024"
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index ee5b34d..c42f12a 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -3446,6 +3446,13 @@
        {}
       ]
      ],
+     "first-line-input-image-crash.html": [
+      "66bd0330f0808bd129417733772fedcf643140d7",
+      [
+       null,
+       {}
+      ]
+     ],
      "highlight-painting-005-crash.html": [
       "3f93fc3cbe4c7459cad625b0d363c5cdc6d130c5",
       [
@@ -138273,7 +138280,7 @@
          ]
         ],
         "masonry-grid-item-self-baseline-002a.html": [
-         "f89217c68e04fc2e20b680bec4705f8c8a961fba",
+         "6708e58332808b1bba0f20db46cfa062270956b8",
          [
           null,
           [
@@ -138286,7 +138293,7 @@
          ]
         ],
         "masonry-grid-item-self-baseline-002b.html": [
-         "eae435707d2298c7ca9d5baa507c020f5288c9ab",
+         "34911b7c9fa632da919b769e015148e2b8c4c488",
          [
           null,
           [
@@ -138338,45 +138345,6 @@
           ],
           {}
          ]
-        ],
-        "masonry-fragmentation-004.html": [
-         "ddfc1bb331f788833e5a4e7c003fc0d4b130a984",
-         [
-          null,
-          [
-           [
-            "/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-004-ref.html",
-            "=="
-           ]
-          ],
-          {}
-         ]
-        ],
-        "masonry-fragmentation-005.html": [
-         "8315b8f2b557cc56459acffc682099cc5d10a447",
-         [
-          null,
-          [
-           [
-            "/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-005-ref.html",
-            "=="
-           ]
-          ],
-          {}
-         ]
-        ],
-        "masonry-fragmentation-006.html": [
-         "9dab0ddc9b6b3c73a7c5727b56a8890a4c9a41e5",
-         [
-          null,
-          [
-           [
-            "/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-006-ref.html",
-            "=="
-           ]
-          ],
-          {}
-         ]
         ]
        },
        "gap": {
@@ -283925,11 +283893,11 @@
   "support": {
    ".cache": {
     "gitignore2.json": [
-     "501f3af3d1e2c64b354a066777c349cdd45f4aeb",
+     "dc64de0663e11263ff89b6e444caf85517a3bb6e",
      []
     ],
     "mtime.json": [
-     "d09309cf3fceca4dc423d3251c82128ab1ca7a8e",
+     "39b26a72ff517f09b8210a3bdd9ad133f202f67f",
      []
     ]
    },
@@ -299547,7 +299515,7 @@
        []
       ],
       "mix-blend-mode-rotated-clip.html.ini": [
-       "0d5faf8336190e5407dd769163229304f1f72c80",
+       "7278750bb2506e9ceb77d0af3a515108b97fc57e",
        []
       ],
       "mix-blend-mode-stacking-context-001.html.ini": [
@@ -319771,14 +319739,6 @@
        []
       ]
      },
-     "grid-layout-properties-expected.txt": [
-      "3b841764fdce05ffd036c91e3a4cd4ce6dd4cdd5",
-      []
-     ],
-     "grid-layout-properties.html.ini": [
-      "5dded5230b73daed770ca451b4aea095e1943998",
-      []
-     ],
      "grid-model": {
       "grid-areas-overflowing-grid-container-009.html.ini": [
        "2e56f1ddf2bc36b521394d056890a5c9f0e1ab18",
@@ -319961,30 +319921,6 @@
         "masonry-fragmentation-003.html.ini": [
          "4254cef5011e5f96dc69bc5054804dfb7cbf1b84",
          []
-        ],
-        "masonry-fragmentation-004-ref.html": [
-         "10246dac42101bf200e15af99e8b172cf41bfc61",
-         []
-        ],
-        "masonry-fragmentation-004.html.ini": [
-         "c929bcf6b77ba71ec7bd692569c0a99bb02021ff",
-         []
-        ],
-        "masonry-fragmentation-005-ref.html": [
-         "e059f414dc7f40844f01cb892c86ba5de9d51d82",
-         []
-        ],
-        "masonry-fragmentation-005.html.ini": [
-         "c4d1a3255ee1108c8829ede85a1c3bc2570da0c8",
-         []
-        ],
-        "masonry-fragmentation-006-ref.html": [
-         "5df37376190870fc162e3205bb32045a37b5f467",
-         []
-        ],
-        "masonry-fragmentation-006.html.ini": [
-         "fbc642ed6a8096b42234030dbbea18fe6d366525",
-         []
         ]
        },
        "gap": {
@@ -330259,18 +330195,10 @@
       "b2b2d7f2841c6fdf0593c57cb556f6bd58666667",
       []
      ],
-     "scrollbar-width-paint-004.html.ini": [
-      "9d88f2e6483b9a59dfa4c448da11e32a4080c3f5",
-      []
-     ],
      "scrollbar-width-paint-005-ref.html": [
       "e5c325b85423dda8d07b4a07ae0cd6f8199c9023",
       []
      ],
-     "scrollbar-width-paint-005.html.ini": [
-      "ff2930018bd6e0664b1bf99b62a86a9363560f1a",
-      []
-     ],
      "scrollbar-width-paint-006-ref.html": [
       "731430735347ef8ba4c69fc9ba7862bea02e2f54",
       []
@@ -330754,7 +330682,7 @@
         []
        ],
        "shape-image-014.html.ini": [
-        "84206104734b21d64a30f71de7b5256764406332",
+        "e495df199c99f59be7cc23a0ff3f5d4d8942173a",
         []
        ],
        "shape-image-015.html.ini": [
@@ -336765,7 +336693,7 @@
        []
       ],
       "text-transform-capitalize-030.html.ini": [
-       "c3e6d0fc941b942b35af00cf0986f758e875a3b3",
+       "8fc3fddcdd697e4f4c6cd7ab29425cac13900cc1",
        []
       ],
       "text-transform-capitalize-033-ref.html": [
@@ -354013,7 +353941,7 @@
     "observable": {
      "tentative": {
       "observable-constructor.any-expected.txt": [
-       "ec5785a4c37af834e9bc7741875bc9f079f8ad5b",
+       "5b7474249a83b549349611538e7d78d3ce5289e9",
        []
       ],
       "observable-constructor.any.js.ini": [
@@ -354021,7 +353949,7 @@
        []
       ],
       "observable-constructor.any.worker-expected.txt": [
-       "3397bf7b95982de0620c41d7c9858c02f01fec8a",
+       "5b7474249a83b549349611538e7d78d3ce5289e9",
        []
       ]
      }
@@ -361886,7 +361814,7 @@
       []
      ],
      "shared-worker-fetch.tentative.window.js.ini": [
-      "6487469e6f5cb7de2fa90649951344f76022778a",
+      "18f7ca1993afb29b85b7a41b4e25afd8f32b5c74",
       []
      ],
      "shared-worker.tentative.https.window.js.ini": [
@@ -369959,11 +369887,11 @@
        },
        "the-offscreen-canvas": {
         "offscreencanvas.getcontext.html.ini": [
-         "bc34b99eda473486ab6ee00f991f345564a1289e",
+         "e49d3e17246ad7e06d92ea4a3a97f451c78542f3",
          []
         ],
         "offscreencanvas.getcontext.worker.js.ini": [
-         "cc58ae8adcef8f39c33ea8ca108ff848573d919a",
+         "6af2eb8f2f5a393c19b0b3da25f9ed37ff472701",
          []
         ],
         "offscreencanvas.resize.html.ini": [
@@ -369971,15 +369899,15 @@
          []
         ],
         "offscreencanvas.transfer.to.imagebitmap.html.ini": [
-         "d0533c545e8644dca9e615cb14c03e6bd8b985c8",
+         "13dd7791894dc8afa54cd6b8e9c7effe3a8165d8",
          []
         ],
         "offscreencanvas.transfer.to.imagebitmap.w.html.ini": [
-         "6ce450a6a6ea6911228f76ba2cb20a086b7ed29f",
+         "4baa7edab967565eba6c920d4d84887e7174fc8f",
          []
         ],
         "offscreencanvas.transferrable.w.html.ini": [
-         "2d0f26215686089474d90daa37cd6154b1670cd2",
+         "fe3dde2bfac362dd63dcc88560c57ae87e3a7eb9",
          []
         ]
        }
@@ -389830,6 +389758,14 @@
        "fe7c3eca2b372a71cf6350bd6577bd60f372c38f",
        []
       ],
+      "loaf-after-callback.js": [
+       "d9ac74ccf471548088715f19504d0c4766b39930",
+       []
+      ],
+      "loaf-in-microtask-after-callback.js": [
+       "c73b604f6dcabb4b0c6247f53a524c05c6344194",
+       []
+      ],
       "promise-generates-loaf.js": [
        "53369f722606e3fbc62b6c1f2568b90b67655e97",
        []
@@ -394076,7 +394012,7 @@
     },
     "with-first-paint": {
      "first-contentful-canvas-webgl2.html.ini": [
-      "4028fe8f6e4be4da62257119eec11101568ef14e",
+      "7cd9f9aa6ac4b4649237d682086deb8caa834fb3",
       []
      ]
     }
@@ -399576,7 +399512,7 @@
       []
      ],
      "animation-inactive-outside-range-test.html.ini": [
-      "b6240681255e51c4b3b3bb5dcbabd675f9c83600",
+      "887eb3b2df9242ff29c4a0cee1f7de7adfaadad5",
       []
      ],
      "animation-range-visual-test-ref.html": [
@@ -410175,11 +410111,11 @@
      []
     ],
     "request-video-frame-callback-before-xr-session.https.html.ini": [
-     "1af1335a4ca33257187fa747eca17e36cb6a808f",
+     "26a1d4727a09bd1b658f5e1467ea20345e233137",
      []
     ],
     "request-video-frame-callback-during-xr-session.https.html.ini": [
-     "8affa31d75f5c6f737891fa10ad6c7c58e73a060",
+     "f5941ab0c1a465d44083f5463454f84d9b81338b",
      []
     ],
     "request-video-frame-callback-webrtc.https.html.ini": [
@@ -420690,27 +420626,27 @@
       []
      ],
      "ar_anchor_freefloating_create_move.https.html.ini": [
-      "488fb7385d478aedc136c79a9ebbcdc68c0c43eb",
+      "c7e8abea6d053ace434039701a04738cf749c8cc",
       []
      ],
      "ar_anchor_freefloating_delay_creation.https.html.ini": [
-      "7c6d5c436c410cd5fcce661c81d4369b3eaaed9d",
+      "3551180d00474ab35fb36a55b8b2db5927ffd368",
       []
      ],
      "ar_anchor_freefloating_failure.https.html.ini": [
-      "bdc823ee77df8b7bdf96d220a281db0590f08038",
+      "b37def3e082a31488682f7fd27f9caa9f0314fb1",
       []
      ],
      "ar_anchor_freefloating_pause_resume_stop.https.html.ini": [
-      "a999adb610d8d215c37e7c5e4ea300f1a7f03a13",
+      "f53d912361b280fd2a359b2483417f260e9a9ea2",
       []
      ],
      "ar_anchor_getAnchors.https.html.ini": [
-      "be625d3959fa6496d1e020e658bf3544b359d019",
+      "a9e02b815e7eb2c31c36bda9c42c97cf0615a74f",
       []
      ],
      "ar_anchor_states.https.html.ini": [
-      "1609571b0f22e476f359b324863cc932f2094852",
+      "3cf1160f3ff08cb39a4e6cb91a7b80bcf4c1116e",
       []
      ],
      "idlharness.https.window-expected.txt": [
@@ -420728,44 +420664,44 @@
       []
      ],
      "xrDevice_requestSession_immersive-ar.https.html.ini": [
-      "064e84117430924d9c17a33e00296416d9a18715",
+      "5498ba0da63f3ec042f1068b51c57a56b500a19d",
       []
      ],
      "xrSession_environmentBlendMode.https.html.ini": [
-      "3d3343538c8c2f9e91e44524c3ce5fa49a83d6c0",
+      "9d3181029754e4a26f1f092568bb375a80bbbbd8",
       []
      ],
      "xrSession_interactionMode.https.html.ini": [
-      "7615a6a1274e66230b3c28b39823430dc555928a",
+      "ad282d0677b9665e50125af512caa06b1b5e0624",
       []
      ]
     },
     "camera-access": {
      "xrCamera_resolution.https.html.ini": [
-      "d29460f5e57a39eba936067ecec9ef3b3a3a66b2",
+      "9271f9f75569c1ce51bf93c0322d06a28beff468",
       []
      ]
     },
     "depth-sensing": {
      "cpu": {
       "depth_sensing_cpu_dataUnavailable.https.html.ini": [
-       "32eb9074426ef7b50aa25439648824bf0639a75e",
+       "476288ccde5bef926520dac6a23d7250c1e1fd44",
        []
       ],
       "depth_sensing_cpu_inactiveFrame.https.html.ini": [
-       "088d4ec4813876e3a1609bb10b871c313d8e9e63",
+       "1fab590327a2de9e457fe3628f74119b515e79d5",
        []
       ],
       "depth_sensing_cpu_incorrectUsage.https.html.ini": [
-       "5e9bef5d89be590f2faef8d19ece6325c45c9dd6",
+       "0d7411711d6896de577ee7218920a853f5d6b200",
        []
       ],
       "depth_sensing_cpu_luminance_alpha_dataValid.https.html.ini": [
-       "c31fe7649deb233ffab54ecdbbb773d9e82938f3",
+       "142a752447f18172a81c1fcfe5ad1e81814a2712",
        []
       ],
       "depth_sensing_cpu_staleView.https.html.ini": [
-       "5c3db41d2568b7516dade9e56c37ed6ec73c7b6a",
+       "55e053955fbe62a4176de6b9f0db471442266a4f",
        []
       ]
      },
@@ -420774,7 +420710,7 @@
       []
      ],
      "depth_sensing_notEnabled.https.html.ini": [
-      "df2c30c4e394e4ac2de0b77c811e93a477609826",
+      "e1ea241c378fba020327e999ef01c845afd5bd13",
       []
      ],
      "gpu": {
@@ -420810,48 +420746,48 @@
       []
      ],
      "ar_dom_overlay.https.html.ini": [
-      "27b869bf9a543261e4238af9f6295325640865b9",
+      "cf98ea4324364aab849bb46c813a2bf943e9cf03",
       []
      ],
      "ar_dom_overlay_hit_test.https.html.ini": [
-      "dd711ce05c41b19e609c7e8e7dfb7d1e12ca2e6d",
+      "d111cedb83ebd3b875344c34df2b704ac66592fd",
       []
      ],
      "nested_fullscreen.https.html.ini": [
-      "f65f465704ff26aee08832954fdc55b602185ec5",
+      "5213f3280a8de11ef5b8f95357bfd92db34a9c0d",
       []
      ]
     },
     "events_input_source_recreation.https.html.ini": [
-     "ad4f4ba945f7701a4745fd7650d0fc9700820eb8",
+     "2c5a601f321065949dd8799b63f8b21e66a678d1",
      []
     ],
     "events_input_sources_change.https.html.ini": [
-     "ede519d5e708d8d3db5705374c283d198da7a304",
+     "6bee0f644b18107e1ae841eb90790beb7b89d9c2",
      []
     ],
     "events_referenceSpace_reset_immersive.https.html.ini": [
-     "0dc7b85e67f4281ab53702adadccb91d29192e25",
+     "c8bbcb0e64739f58502245ab77158c2d90923839",
      []
     ],
     "events_referenceSpace_reset_inline.https.html.ini": [
-     "abf9cd27c69c36a4465dd6e24533da4043d21670",
+     "702bd1968eeaa82f7d6b3c3ce6552ec35e54fcfd",
      []
     ],
     "events_session_select.https.html.ini": [
-     "7c9b1f5df7792c5de5a3a957c47618a26e9c7a68",
+     "0385b191adf9b1aa703af0418992e3f383bae5d5",
      []
     ],
     "events_session_select_subframe.https.html.ini": [
-     "9604fba8a417a4f2fb95aab7f07b851bdda35f12",
+     "cd41f2876f6986f33dec7651ca6125d788504225",
      []
     ],
     "events_session_squeeze.https.html.ini": [
-     "e5999c24870ca25ec1e018cc8d21c046b6af278c",
+     "781e094d283f7d48f92bc5fe9f9eb2d2522fe046",
      []
     ],
     "exclusive_requestFrame_nolayer.https.html.ini": [
-     "c5c698f4c9402f4d93bc45c3ebf4863d633c111c",
+     "8319060df9f36e23cdcde28efefd6fabfbed4a87",
      []
     ],
     "gamepads-module": {
@@ -420860,24 +420796,24 @@
       []
      ],
      "xrInputSource_gamepad_disconnect.https.html.ini": [
-      "6936c08a499c1048d0a1fdc0924fd902a8ae835d",
+      "b0ceaf63b1cbd8e266d5afab7abe9078fd6dd306",
       []
      ],
      "xrInputSource_gamepad_input_registered.https.html.ini": [
-      "9f0ff91a51f7a4111edbeea5bef16b11cebc43ac",
+      "a302af80e06b19ba0e0d708b11c5e7a9898b0717",
       []
      ]
     },
     "getInputPose_handedness.https.html.ini": [
-     "a1195fac5581e0009db5755e6bc57081ab808313",
+     "bcd50f7bb27b4b030c0d927586867c333bfd5879",
      []
     ],
     "getInputPose_pointer.https.html.ini": [
-     "91a596baac3ed84b6da0c2148542728af0e19bc9",
+     "292e22db9b9998d9dd696664dc7408af6bb4f167",
      []
     ],
     "getViewerPose_emulatedPosition.https.html.ini": [
-     "a8c404e66f38831be9ad36e66b0a7c17133fbf26",
+     "61bccdc90b9e46e993cb7f9057768e4febb62b89",
      []
     ],
     "hand-input": {
@@ -420892,31 +420828,31 @@
       []
      ],
      "ar_hittest_source_cancel.https.html.ini": [
-      "b60d168888a05a398f25108c87c6ce700c5e8053",
+      "6f9f8c1aa3166629794051c05015f7896771473b",
       []
      ],
      "ar_hittest_subscription_inputSources.https.html.ini": [
-      "b22f501bd209acc05235072505f58f18ae082a78",
+      "20aaa1037cc70929d18ae0104062067bd3bf3e27",
       []
      ],
      "ar_hittest_subscription_refSpaces.https.html.ini": [
-      "9dbe67d61f3b695987214b25402d03257bb3ebde",
+      "67ff0d044d7d43ecd9cc7c55326abaeeea18948c",
       []
      ],
      "ar_hittest_subscription_states_regular.https.html.ini": [
-      "d4af61d3f684c5e8a02988c302f4d059ddcb4848",
+      "2b451a021ac01fbed1eb52ee200a1dd0d8355e93",
       []
      ],
      "ar_hittest_subscription_states_transient.https.html.ini": [
-      "444feab021f0196bc8fb93d5d3dfacab3e259478",
+      "0e154a766ff1c770a80ba83a996db8ad6cef54d5",
       []
      ],
      "ar_hittest_subscription_transientInputSources.https.html.ini": [
-      "cfb29f5ca84c54dca1128cc0d7b2550fa6dc049d",
+      "a2c214ce2dcb0775a497f767cdedcc4ad24d5c89",
       []
      ],
      "ar_hittest_subscription_unlocalizable.https.html.ini": [
-      "e0cf12bb58e066066d62b95a9a1ed7a09e2b6aca",
+      "f08b3e7109f543459a7e8d303e444f25a3780e86",
       []
      ]
     },
@@ -420925,7 +420861,7 @@
      []
     ],
     "idlharness.https.window.js.ini": [
-     "a55bd8ad89b7238494574c34d900d0737f133397",
+     "58e35503078fd2aa75c7b0d241e2e6be3927b36b",
      []
     ],
     "layers": {
@@ -420934,58 +420870,58 @@
       []
      ],
      "xrSession_updateRenderState.https.html.ini": [
-      "88bb4d7914164472614db43bf974bfe4700e0a5e",
+      "b94d877da1add73f3db6b2940dac5bd5421f71d6",
       []
      ],
      "xrWebGLBinding_constructor.https.html.ini": [
-      "c957c47c66f97a1236151e8ecd94b8811399e26b",
+      "e55aad93a1015f10edfd5f31e273bea7cb582e48",
       []
      ]
     },
     "light-estimation": {
      "xrFrame_getLightEstimate_oldSession.https.html.ini": [
-      "c2ad2ba9af5f337bae952f5e369ad05f50349fde",
+      "1b057eb60d94749b53ba8ae916f2bf0e448e45b7",
       []
      ],
      "xrFrame_getLightEstimate_staleFrame.https.html.ini": [
-      "50016316974e51389b2d206c8f826fcd4ab173ee",
+      "d581b78d0f8866dba8be466489bd981a5060840f",
       []
      ],
      "xrFrame_getLightEstimate_valid.https.html.ini": [
-      "c4a9659a45299434e7068747d166e555a14bf21a",
+      "4216dd1b646be36c8219ecfb50c1ff04c4364dc9",
       []
      ],
      "xrSession_getLightProbe_ended.https.html.ini": [
-      "b8ef5bd55ae8232d670f492e40fbb8edf1d0da72",
+      "44484f703572efd3c7096e069ef3b572c0d91b77",
       []
      ],
      "xrSession_getLightProbe_notEnabled.https.html.ini": [
-      "16f8d164608883fd6ea269fdb44b9a16940a1641",
+      "185f5aaf6096a9b0b7b1096fe04784bdae4a56dd",
       []
      ],
      "xrSession_getLightProbe_valid.https.html.ini": [
-      "b308aa8e216751a3e7a8c0594f0bedc7cdc7e983",
+      "700f75152c9039e00fb2ddd17a04b0c957fbc399",
       []
      ],
      "xrWebGLBinding_getReflectionCubeMap.https.html.ini": [
-      "50bfedbded0c40eb903f1bc9ac81bddade3cdb02",
+      "fae907f9182ad56f5da95f65137a758de219f344",
       []
      ]
     },
     "navigator_xr_sameObject.https.html.ini": [
-     "303844883d1686d3a9f5c6d87edc05dc6aba5b00",
+     "6d8ba9d0292806afcc8f5442d825ca5e50a6d7de",
      []
     ],
     "render_state_update.https.html.ini": [
-     "1ac5bb4e43c8b0b514895ff5cb6c9b002300739a",
+     "7335b9e6813cc8e9e2ba2a4b0078ab2f4ae1dba7",
      []
     ],
     "render_state_vertical_fov_immersive.https.html.ini": [
-     "81cd5b64422afcecf830105e8f93723a91a6632e",
+     "631798cead803981b2a749edaa1ae175e3f17a9d",
      []
     ],
     "render_state_vertical_fov_inline.https.html.ini": [
-     "f12b7195255e7fcdfa5461525bdafb1d6d325af2",
+     "2bd342074694cfb78457c8799f3015c39d5ec45b",
      []
     ],
     "resources": {
@@ -421019,15 +420955,15 @@
      ]
     },
     "webGLCanvasContext_create_xrcompatible.https.html.ini": [
-     "f347e95ba4ef8601272f4fe2939b8b663c5f61bd",
+     "77254db6dd1b72e9ed684ead3c14c472c58ae77e",
      []
     ],
     "webGLCanvasContext_makecompatible_contextlost.https.html.ini": [
-     "029b42fe2c33541386d065a98e75a1beadcdc02b",
+     "999ebad20d82eb07502c64ee0c362a29844b1940",
      []
     ],
     "webGLCanvasContext_makecompatible_reentrant.https.html.ini": [
-     "900b45bb8830f410dc7bce6f49e3397ff22b82f8",
+     "0e3d96d4f1725c73bf4c029cf255a9aeb8804e4a",
      []
     ],
     "webxr_permissions_policy.https.html.headers": [
@@ -421035,215 +420971,215 @@
      []
     ],
     "webxr_permissions_policy.https.html.ini": [
-     "65f44353dbd63595da6c80c4f5227341636eaeaf",
+     "eec7b36d0e71b60f2044d1c0b8a4e8dc56242c12",
      []
     ],
     "xrBoundedReferenceSpace_updates.https.html.ini": [
-     "9db6588933a52abaf66a852ae659bda75abaccfe",
+     "da4b4c74a7195fc1f9cf4f045635455a455121e7",
      []
     ],
     "xrDevice_disconnect_ends.https.html.ini": [
-     "fc2dbabaa278046872c642e9d5d777c10ee81883",
+     "77e2fbfa07eb74c40e4667ccf1934b7da21f9a9f",
      []
     ],
     "xrDevice_requestSession_immersive.https.html.ini": [
-     "b64e56f2897d9e45a633a514bd138655c05fff7a",
+     "838c13a408ff6edf1df531c8654a8d047a7b4a31",
      []
     ],
     "xrDevice_requestSession_optionalFeatures.https.html.ini": [
-     "92e3855252a0a7d2ce5ed801a2a840b515b28a41",
+     "d18bc5f842edb8f0f6530aece3b8962a5741b520",
      []
     ],
     "xrFrame_getPose.https.html.ini": [
-     "9070199c7df1cfbb4df92a7bdc79a071aa8a8149",
+     "9a556176adb3aac02ab88e299e6c15434bcfb11d",
      []
     ],
     "xrFrame_getViewerPose_getPose.https.html.ini": [
-     "54ae2a29c1ef256e2dc3ea86580dbb5a2e35f9bf",
+     "cf749793d674009ab116408d9925b10f63444d08",
      []
     ],
     "xrFrame_getViewerPose_getPose_identities.https.html.ini": [
-     "375c7c9186f78acf6637807f89da7da74c2b7bc7",
+     "3f8dcf88276c59c612d5f765200a30e71caedee5",
      []
     ],
     "xrFrame_lifetime.https.html.ini": [
-     "ccb30f87bfc88f25bf36cc94ab12cfd81109b8e7",
+     "5220baf6bd4ec73793dabd293d54793f2cd33181",
      []
     ],
     "xrFrame_session_sameObject.https.html.ini": [
-     "95f42826c7f9cbc1b51717f1812cc807d59ea441",
+     "cfbd9ebb308ef927035f8e0e99062d3a9e9a289a",
      []
     ],
     "xrInputSource_add_remove.https.html.ini": [
-     "7302871186345b710fe69ff144027eb123f17c25",
+     "e371762806533fd963ac8ca6ef1f21b9e8326dda",
      []
     ],
     "xrInputSource_emulatedPosition.https.html.ini": [
-     "78f8a38b0c06aff99ef81306ce57b98e2fb6b57e",
+     "513c621d396bd523b41b6faace3c98c33922727e",
      []
     ],
     "xrInputSource_getPose_targetRay_grip.https.html.ini": [
-     "bc6eec8bca516303c68fad27f7743081ec63f654",
+     "a224c9d9d1b7eaab73f6ae2fe8630f080d404045",
      []
     ],
     "xrInputSource_profiles.https.html.ini": [
-     "e724f5648a2577aa4105a8639e7a388213cb3063",
+     "14377f9563e8749bb873785f14eafecbbc5a34bc",
      []
     ],
     "xrInputSource_sameObject.https.html.ini": [
-     "507870a543a7c881d2ad11180d70bb9a08e9f753",
+     "48db13ccd29a75a37e7d555741ceb7c225ac69a1",
      []
     ],
     "xrPose_transform_sameObject.https.html.ini": [
-     "a8ffd66721645e274bbc57fb1e6dc2a78c336d0b",
+     "d6e84debd56c61954cceac9f1fb16b5f38867518",
      []
     ],
     "xrReferenceSpace_originOffset.https.html.ini": [
-     "9507cd5ad89dd04eaa8334db23f7b1b6d8e9a4d8",
+     "c9095502b8ac3d54101e75cbdf789fc0b2c470b2",
      []
     ],
     "xrReferenceSpace_originOffsetBounded.https.html.ini": [
-     "6477b9e9f4aeb67e2c52aac250e7ce42f1796de0",
+     "5c8b17524dd32fb81e76673ce67c5358284091cd",
      []
     ],
     "xrReferenceSpace_originOffset_viewer.https.html.ini": [
-     "b7d5791641af63861cfd0cee65229b098d5f6c76",
+     "0655b71ea846e48aa55ab46c6317d04dbeb910f2",
      []
     ],
     "xrReferenceSpace_relationships.https.html.ini": [
-     "0eb7585722ebfbe9864f92d0c54818c4a65ebfc4",
+     "23bd6a8f3a41f5fc8e76e41c7474cec066e48a3d",
      []
     ],
     "xrRigidTransform_constructor.https.html.ini": [
-     "acc1b9928dd4ff5011c03472ad20197772cb0515",
+     "66fef7e77b22e1602d6ab9c1ceaf40917d165b58",
      []
     ],
     "xrRigidTransform_inverse.https.html.ini": [
-     "a1e73af9de7d947981fc4117fe3f5b49d6bf00cc",
+     "62f82b5cd8c903b0eed183479d43e02a8b13d421",
      []
     ],
     "xrRigidTransform_sameObject.https.html.ini": [
-     "2a26b319ad0c1215d15caa00e1dfd247491cfc64",
+     "2074a2456be12f8af7ecf8dd736e8bda8039a43c",
      []
     ],
     "xrSession_cancelAnimationFrame.https.html.ini": [
-     "376c78fb6844db7b252302970c5c1670c55cc4df",
+     "22b6764d6349e148fd6f9051f04bdae270139517",
      []
     ],
     "xrSession_cancelAnimationFrame_invalidhandle.https.html.ini": [
-     "0f793a1fc02e92566d82071dc34069b55b0b18a0",
+     "57ad315308d322986b567dc4a442d5d1ba2dbbc5",
      []
     ],
     "xrSession_enabledFeatures.https.html.ini": [
-     "f27edb3f799298fa2438101bf7c6712daa94a7a3",
+     "7b77e9300c2de7ec6339f741da76a6c55a80c051",
      []
     ],
     "xrSession_end.https.html.ini": [
-     "fba913c1e3bc5859dac48c974195e265a11554ea",
+     "d5546036a9f527c1f4eb54cd336afeafbbe4cf48",
      []
     ],
     "xrSession_input_events_end.https.html.ini": [
-     "af0c3b9c884c8beda1d7c40538c8c350759d00fd",
+     "47dbdae6b7cd81e852925a3e46951eb337337c2a",
      []
     ],
     "xrSession_requestAnimationFrame_callback_calls.https.html.ini": [
-     "fe514f5dd21086fd19d17f7ae73d365351233df9",
+     "7811d411da7215f03f589979735d6d613b580bdf",
      []
     ],
     "xrSession_requestAnimationFrame_data_valid.https.html.ini": [
-     "a59fbfd511aac8c7adf66a614873a636eb44afe8",
+     "2dc844f4675a4aa9a5fdcc418948483fe1d4bf71",
      []
     ],
     "xrSession_requestAnimationFrame_getViewerPose.https.html.ini": [
-     "3bbcc4158632aba175f41bd50eee23d1fb3b10ba",
+     "465544ef51f5a9c2e3459073c8606a1a6bffc3b7",
      []
     ],
     "xrSession_requestAnimationFrame_timestamp.https.html.ini": [
-     "786c841a22a940bac71a1d4c6edffc9846369400",
+     "d871fc6f15718c0a1b9766d6ff1520eee48f01bf",
      []
     ],
     "xrSession_requestReferenceSpace.https.html.ini": [
-     "4705cc6572d9d9faf93a72c8a21a3b17bb67785b",
+     "1a0435c60218e5fcbda92181005d46ad84de59cf",
      []
     ],
     "xrSession_requestReferenceSpace_features.https.html.ini": [
-     "9751f3d84a23bf2225d7467053fb335b0a0ab6df",
+     "61c83c11a1f556cb36b2ae1db6ebec4e227c8331",
      []
     ],
     "xrSession_requestSessionDuringEnd.https.html.ini": [
-     "a8d4058546a02d047f3bd65a8032eb96962a6e29",
+     "dd14d683cb7de8a467c50bcb409ad34d5b283013",
      []
     ],
     "xrSession_sameObject.https.html.ini": [
-     "808a21f2f14e001e9407078beabbd75d850c7db8",
+     "d58ebdb651c818604bb2e196de977f3d96976b02",
      []
     ],
     "xrSession_viewer_referenceSpace.https.html.ini": [
-     "104789b2efa5000709bc8c44334514d3548a0efe",
+     "127e15b5630f0d5e639fbeabf0a84fed1829dbdd",
      []
     ],
     "xrSession_visibilityState.https.html.ini": [
-     "22160e17583170c80cf3dbaf39f9c3ca0faaf49e",
+     "31db7db04e634de0400bff8af8cb347694379a66",
      []
     ],
     "xrStationaryReferenceSpace_floorlevel_updates.https.html.ini": [
-     "29681fe09ee7738b8de92aca63e0de595167c8fb",
+     "99e3b359723c5cd9854eae8455b43026e2f8f0c6",
      []
     ],
     "xrView_eyes.https.html.ini": [
-     "0c60b77dd83022b4cefbfc18e438c0aa9bbcef94",
+     "b5a197d26e214a15e7d425456feef879f9dc2716",
      []
     ],
     "xrView_match.https.html.ini": [
-     "c3baeb69a88c4458b036d9a34a3d3aff211325d9",
+     "0505f42c32ccdc9ce60d9091dc4124a0a39b9835",
      []
     ],
     "xrView_oneframeupdate.https.html.ini": [
-     "ba20722d84f8532d9825b05dfbc9d77a7b3e9408",
+     "3b79c591e1df005d994ddef76886e5b0da5e96b5",
      []
     ],
     "xrView_sameObject.https.html.ini": [
-     "069955fbff2b8d1bcf0c9c607e67ad6111af2b45",
+     "40ab9df895b78153da2d48282f5340759dc9d4c6",
      []
     ],
     "xrViewerPose_secondaryViews.https.html.ini": [
-     "7b2beeb21d6964eda65b3f59e3e6371c2e98a856",
+     "3f1d1eb429a2020930762b017b5dd3b186eb7eb5",
      []
     ],
     "xrViewerPose_views_sameObject.https.html.ini": [
-     "c72689e6141e0ada7a84f49420c728440d41da53",
+     "2aa564343315af6609db0c7ebc496feaffd8253b",
      []
     ],
     "xrViewport_valid.https.html.ini": [
-     "4022805aa5c7e0fa8a1b64dda439333131e1312d",
+     "66cccc7db5c028340df577f14067a7f43c4be21c",
      []
     ],
     "xrWebGLLayer_constructor.https.html.ini": [
-     "52f9a21a13b84801e4d432276767df0547e311f3",
+     "7c660ed19d7fdeb59e040c8c3efbf6a2eb39daac",
      []
     ],
     "xrWebGLLayer_framebuffer_draw.https.html.ini": [
-     "bee5ddc033e07136df57ead2df18bc400ff39c91",
+     "4d478f844a7f6101f0678ccd22e101e5823b4303",
      []
     ],
     "xrWebGLLayer_framebuffer_sameObject.https.html.ini": [
-     "827b02adef00526986ae0f8d61a71a1d42e18863",
+     "5a980883291d4f9a8f4cb579cffd63074fc116af",
      []
     ],
     "xrWebGLLayer_framebuffer_scale.https.html.ini": [
-     "d92e419e61d80dd4be175e6c43ec538707f00990",
+     "4d27b9b36c7edbf8ca7eabb110b35888b88cbae9",
      []
     ],
     "xrWebGLLayer_opaque_framebuffer.https.html.ini": [
-     "308b903ce758f1f8a3b399cad3897099e98908b5",
+     "f6639afa7049ee673a7662030efa83dbfad69702",
      []
     ],
     "xrWebGLLayer_opaque_framebuffer_stencil.https.html.ini": [
-     "61d6a446e72ea72c0a0cff56587c005fcbcdbfe0",
+     "5d848bdfb8da6586f31e427daa2a6b341e65a1f6",
      []
     ],
     "xrWebGLLayer_viewports.https.html.ini": [
-     "865f306775a11cf1b390358e8d52dfb2bf9eb461",
+     "0e1f454c893337f053d050dd0e7181708150804d",
      []
     ],
     "xr_viewport_scale.https-expected.txt": [
@@ -421251,7 +421187,7 @@
      []
     ],
     "xr_viewport_scale.https.html.ini": [
-     "3ce487643bf862bf12edfa88306c6f6dedff4ebc",
+     "a109a93d5bb2397145e598bb709f25b40072ecea",
      []
     ]
    },
@@ -422672,7 +422608,7 @@
       []
      ],
      "shared-worker-partitioned-cookies-3p-frame.html": [
-      "dc700d31f97a2b2c85040531dfe52924f0058d56",
+      "c1857977389a598711630f2d1a636b27b63cd8be",
       []
      ],
      "shared-worker-partitioned-cookies-3p-window.html": [
@@ -462816,7 +462752,7 @@
       ]
      ],
      "all-prop-revert-layer.html": [
-      "420a3a61cacdcf3743e612302dfa82fdbb775145",
+      "cd76a647baa72ac8d080855c3bb3477026a95474",
       [
        null,
        {}
@@ -471684,7 +471620,7 @@
       ]
      },
      "grid-layout-properties.html": [
-      "4ffa89bce528e9a7b4988b41c41c7703b785712c",
+      "8452334b6a1a4d85e0419b66657223c9d15ca927",
       [
        null,
        {}
@@ -500360,7 +500296,7 @@
     "observable": {
      "tentative": {
       "observable-constructor.any.js": [
-       "37c242661d6041db1df39802768d440e53b515c8",
+       "6ee1221cfae61ea9f87e4ae1ef1b2e5b1607c2ab",
        [
         "dom/observable/tentative/observable-constructor.any.html",
         {}
@@ -597929,7 +597865,7 @@
        ]
       ],
       "multiTouchPointsTwoTouchStarts.html": [
-       "06f48ebc38a17ee952cbfb208724a7ba73b457eb",
+       "7855a48da35ee434bb8a8e31d2e807def4966dd4",
        [
         null,
         {
@@ -601330,15 +601266,6 @@
        }
       ]
      ],
-     "loaf-callback-after-promise.html": [
-      "f7048072fa84dd52a10858141ba400c12f0917c0",
-      [
-       null,
-       {
-        "timeout": "long"
-       }
-      ]
-     ],
      "loaf-desired-exec-time.html": [
       "656c58d0c24c7738e9dc3c7fcdfb5c05d2a69506",
       [
@@ -601405,7 +601332,16 @@
       ]
      ],
      "loaf-script-block.html": [
-      "5cd82c2c1320ac8baf4cb95f76777a543fa2d685",
+      "1bfad63c82e1b0193c445fcb389c85641343b9a7",
+      [
+       null,
+       {
+        "timeout": "long"
+       }
+      ]
+     ],
+     "loaf-script-nested-callback.html": [
+      "c1eb4adc89c21e2662f850f6b9811dca0728faac",
       [
        null,
        {
@@ -601465,15 +601401,6 @@
        {}
       ]
      ],
-     "loaf-trusted-types.html": [
-      "4297842759f435902289de8e67ecf792d254ea72",
-      [
-       null,
-       {
-        "timeout": "long"
-       }
-      ]
-     ],
      "loaf-user-callback.html": [
       "3d868af87f3b7bb597b44fe78b1787deda003d3c",
       [
@@ -686783,9 +686710,9 @@
         ]
        ],
        "close-connecting-async.any.js": [
-        "c7ace1fca2734085705e191cd2a5e089f2306664",
+        "88005520b000b173954f4ba3042639c41206f688",
         [
-         "websockets/interfaces/WebSocket/close/close-connecting-async.any.html",
+         "websockets/interfaces/WebSocket/close/close-connecting-async.any.html?default",
          {
           "script_metadata": [
            [
@@ -686794,7 +686721,7 @@
            ],
            [
             "variant",
-            ""
+            "?default"
            ],
            [
             "variant",
@@ -686817,7 +686744,7 @@
            ],
            [
             "variant",
-            ""
+            "?default"
            ],
            [
             "variant",
@@ -686840,7 +686767,7 @@
            ],
            [
             "variant",
-            ""
+            "?default"
            ],
            [
             "variant",
@@ -686854,7 +686781,7 @@
          }
         ],
         [
-         "websockets/interfaces/WebSocket/close/close-connecting-async.any.worker.html",
+         "websockets/interfaces/WebSocket/close/close-connecting-async.any.worker.html?default",
          {
           "script_metadata": [
            [
@@ -686863,7 +686790,7 @@
            ],
            [
             "variant",
-            ""
+            "?default"
            ],
            [
             "variant",
@@ -686886,7 +686813,7 @@
            ],
            [
             "variant",
-            ""
+            "?default"
            ],
            [
             "variant",
@@ -686909,7 +686836,7 @@
            ],
            [
             "variant",
-            ""
+            "?default"
            ],
            [
             "variant",
diff --git a/third_party/blink/web_tests/external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-rotated-clip.html.ini b/third_party/blink/web_tests/external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-rotated-clip.html.ini
index 0d5faf83..7278750 100644
--- a/third_party/blink/web_tests/external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-rotated-clip.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/compositing/mix-blend-mode/mix-blend-mode-rotated-clip.html.ini
@@ -2,3 +2,4 @@
   expected:
     if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
     if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
+    if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-cascade/all-prop-revert-layer.html b/third_party/blink/web_tests/external/wpt/css/css-cascade/all-prop-revert-layer.html
index 420a3a6..cd76a64 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-cascade/all-prop-revert-layer.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-cascade/all-prop-revert-layer.html
@@ -11,7 +11,6 @@
   align-content: baseline;
   align-items: baseline;
   align-self: baseline;
-  align-tracks: baseline;
   alignment-baseline: central;
   alt: "a";
   animation-composition: add;
@@ -174,7 +173,6 @@
   justify-content: center;
   justify-items: baseline;
   justify-self: baseline;
-  justify-tracks: center;
   kerning: 123px;
   left: 123px;
   letter-spacing: 123px;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html
index f89217c..6708e58 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002a.html
@@ -23,13 +23,13 @@
   padding-block-start: 1px;
   margin-left: 1px;
   border:1px solid;
-  align-tracks: end;
-  justify-tracks: end;
   masonry-auto-flow: next;
   height: 100px;
   width: 100px;
 }
 .c { grid: repeat(4, auto) / masonry; }
+.ae { align-content: end; }
+.je { justify-content: end; }
 
 span {
   text-decoration: underline lime;
@@ -66,19 +66,19 @@
 </head>
 <body>
 
-<div class="grid"><span class="fb hl">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span></div>
-<div class="grid"><span class="fb hl pbe">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span></div>
-<div class="grid vll central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
-<div class="grid vll central"><span class="fb pbs">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
-<div class="grid vlr central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
+<div class="grid ae"><span class="fb hl">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span></div>
+<div class="grid ae"><span class="fb hl pbe">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span><span class="fb hl">F<br><x>x</x></span></div>
+<div class="grid ae vll central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
+<div class="grid ae vll central"><span class="fb pbs">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
+<div class="grid ae vlr central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
 
 <br clear="all">
 
-<div class="grid vrr central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
-<div class="grid vrr central"><span class="fb pbe">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
-<div class="grid vrl central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
-<div class="grid swl central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
-<div class="grid swr central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
+<div class="grid ae vrr central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
+<div class="grid ae vrr central"><span class="fb pbe">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
+<div class="grid ae vrl central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
+<div class="grid ae swl central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
+<div class="grid ae swr central"><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span><span class="fb">F<br><x>x</x></span></div>
 
 <br clear="all">
 
@@ -93,13 +93,13 @@
 <div class="grid vrl central"><span class="lb pbe"><x>x</x><br>L</span><span class="lb"><x>x</x><br>L</span><span class="lb"><x>x</x><br>L</span><span class="lb"><x>x</x><br>L</span></div>
 <div class="grid swl"><span class="lb"><x>x</x><br>L</span><span class="lb"><x>x</x><br>L</span><span class="lb"><x>x</x><br>L</span><span class="lb"><x>x</x><br>L</span></div>
 <div class="grid swr"><span class="lb"><x>x</x><br>L</span><span class="lb"><x>x</x><br>L</span><span class="lb"><x>x</x><br>L</span><span class="lb"><x>x</x><br>L</span></div>
-<div class="grid c central"><span class="jfb vll">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span></div>
-<div class="grid c central"><span class="jfb vll pbe">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span></div>
+<div class="grid je c central"><span class="jfb vll">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span></div>
+<div class="grid je c central"><span class="jfb vll pbe">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span><span class="jfb vll">F<br><x>x</x></span></div>
 
 <br clear="all">
 
-<div class="grid c vll"><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
-<div class="grid c vll"><span class="jfb hl pbs">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
+<div class="grid je c vll"><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
+<div class="grid je c vll"><span class="jfb hl pbs">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
 
 </body>
 </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html
index eae4357..34911b7 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/baseline/masonry-grid-item-self-baseline-002b.html
@@ -23,13 +23,13 @@
   padding-block-start: 1px;
   margin-left: 1px;
   border:1px solid;
-  align-tracks: end;
-  justify-tracks: end;
   masonry-auto-flow: next;
   height: 100px;
   width: 100px;
 }
 .c { grid: repeat(4, auto) / masonry; }
+.ae { align-content: end; }
+.je { justify-content: end; }
 
 span {
   text-decoration: underline lime;
@@ -67,13 +67,13 @@
 <body>
 
 <!-- TODO: baseline alignment is wrong (bug 1633610)
-<div class="grid c vrr"><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
-<div class="grid c vrr"><span class="jfb hl pbe">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
-<div class="grid c swl"><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
+<div class="grid je c vrr"><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
+<div class="grid je c vrr"><span class="jfb hl pbe">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
+<div class="grid je c swl"><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
 -->
-<div class="grid c swr"><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
+<div class="grid je c swr"><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span><span class="jfb hl">F<br><x>x</x></span></div>
 
-<div class="grid"><span class="lb hl"><x>x</x><br>L</span><span class="lb hl"><x>x</x><br>L</span><span class="lb hl"><x>x</x><br>L</span><span class="lb hl"><x>x</x><br>L</span></div>
+<div class="grid ae"><span class="lb hl"><x>x</x><br>L</span><span class="lb hl"><x>x</x><br>L</span><span class="lb hl"><x>x</x><br>L</span><span class="lb hl"><x>x</x><br>L</span></div>
 
 <br clear="all">
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-004-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-004-ref.html
deleted file mode 100644
index 10246dac..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-004-ref.html
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE HTML>
-<!--
-     Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html><head>
-  <meta charset="utf-8">
-  <title>Reference: Grid axis fragmentation with column masonry layout</title>
-  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
-  <style>
-html,body {
-  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
-}
-wrapper {
-  display: block;
-  width: 600px;
-  height: 600px;
-  overflow: hidden;
-}
-
-.columns {
-  columns: 3;
-  column-fill: auto;
-  background: lightgrey;
-  margin-bottom: 15px;
-}
-
-.grid {
-  display: grid;
-  grid: 20px auto 30px / auto;
-  border: solid;
-  border-width: 3px 1px 7px 5px;
-  padding: 1px 3px 5px 7px;
-  gap: 1px 5px;
-}
-
-x {
-  background: cyan;
-  min-width: 20px;
-  min-height: 10px;
-}
-y {
-  background: blue;
-  width: 35px;
-}
-z {
-  background: gray;
-  width: 40px;
-}
-masonry-track {
-  display: grid;
-  justify-content: end;
-  column-gap: 5px;
-}
-</style>
-</head>
-<body>
-<wrapper style="display:none">
-<div class="columns" style="height:90px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:68px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:48px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:38px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:28px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:18px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-</wrapper>
-
-<script>
-let wrapper = document.querySelectorAll("wrapper")[0];
-let grids = document.querySelectorAll(".grid");
-for (let e of grids) {
-  for (let track of e.children) {
-    track.style.gridTemplateColumns = "repeat(" + track.children.length + ",auto)";
-  }
-}
-wrapper.style.display="";
-</script>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-004.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-004.html
deleted file mode 100644
index ddfc1bb3..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-004.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<!DOCTYPE HTML>
-<!--
-     Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html><head>
-  <meta charset="utf-8">
-  <title>CSS Grid Test: Grid axis fragmentation with column masonry layout</title>
-  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
-  <link rel="help" href="https://drafts.csswg.org/css-grid-2">
-  <link rel="match" href="masonry-fragmentation-004-ref.html">
-  <style>
-html,body {
-  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
-}
-wrapper {
-  display: block;
-  width: 600px;
-  height: 600px;
-  overflow: hidden;
-}
-
-.columns {
-  columns: 3;
-  column-fill: auto;
-  background: lightgrey;
-  margin-bottom: 15px;
-}
-
-.grid {
-  display: grid;
-  grid: 20px auto 30px / masonry;
-  justify-tracks: end;
-  border: solid;
-  border-width: 3px 1px 7px 5px;
-  padding: 1px 3px 5px 7px;
-  gap: 1px 5px;
-}
-
-.grid > * {
-  background: cyan;
-  min-width: 20px;
-  min-height: 10px;
-}
-.grid > :nth-child(4n) {
-  background: blue;
-  width: 35px;
-}
-.grid > :nth-child(3n) {
-  background: gray;
-  width: 40px;
-}
-</style>
-</head>
-<body>
-<wrapper style="display:none">
-<div style="display:none">
-<div class="columns">
-  <div class="grid">
-    <x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x>
-  </div>
-</div>
-</div>
-<script>
-let wrapper = document.querySelectorAll("wrapper")[0];
-let tmplt = document.querySelectorAll(".columns")[0];
-let heights = [ 90, 68, 48, 38, 28, 18 ];
-for (let h of heights) {
-  let e = tmplt.cloneNode(true);
-  e.style.height = h + "px";
-  wrapper.appendChild(e);
-}
-wrapper.style.display="";
-</script>
-</wrapper>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-004.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-004.html.ini
deleted file mode 100644
index c929bcf..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-004.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[masonry-fragmentation-004.html]
-  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-005-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-005-ref.html
deleted file mode 100644
index e059f41..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-005-ref.html
+++ /dev/null
@@ -1,114 +0,0 @@
-<!DOCTYPE HTML>
-<!--
-     Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html><head>
-  <meta charset="utf-8">
-  <title>Reference: Grid axis fragmentation with column masonry layout</title>
-  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
-  <style>
-html,body {
-  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
-}
-wrapper {
-  display: block;
-  width: 600px;
-  height: 600px;
-  overflow: hidden;
-}
-
-.columns {
-  columns: 3;
-  column-fill: auto;
-  background: lightgrey;
-  margin-bottom: 15px;
-}
-
-.grid {
-  display: grid;
-  grid: 20px auto 30px / auto;
-  border: solid;
-  border-width: 3px 1px 7px 5px;
-  padding: 1px 3px 5px 7px;
-  gap: 1px 5px;
-}
-
-x {
-  background: cyan;
-  min-width: 20px;
-  min-height: 10px;
-}
-y {
-  background: blue;
-  width: 35px;
-}
-z {
-  background: gray;
-  width: 40px;
-}
-masonry-track {
-  display: grid;
-  justify-content: space-between;
-  column-gap: 5px;
-}
-</style>
-</head>
-<body>
-<wrapper style="display:none">
-<div class="columns" style="height:90px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:68px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:48px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:38px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:28px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:18px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-</wrapper>
-
-<script>
-let wrapper = document.querySelectorAll("wrapper")[0];
-let grids = document.querySelectorAll(".grid");
-for (let e of grids) {
-  for (let track of e.children) {
-    track.style.gridTemplateColumns = "repeat(" + track.children.length + ",auto)";
-  }
-}
-wrapper.style.display="";
-</script>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-005.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-005.html
deleted file mode 100644
index 8315b8f..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-005.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<!DOCTYPE HTML>
-<!--
-     Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html><head>
-  <meta charset="utf-8">
-  <title>CSS Grid Test: Grid axis fragmentation with column masonry layout</title>
-  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
-  <link rel="help" href="https://drafts.csswg.org/css-grid-2">
-  <link rel="match" href="masonry-fragmentation-005-ref.html">
-  <style>
-html,body {
-  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
-}
-wrapper {
-  display: block;
-  width: 600px;
-  height: 600px;
-  overflow: hidden;
-}
-
-.columns {
-  columns: 3;
-  column-fill: auto;
-  background: lightgrey;
-  margin-bottom: 15px;
-}
-
-.grid {
-  display: grid;
-  grid: 20px auto 30px / masonry;
-  justify-tracks: space-between;
-  border: solid;
-  border-width: 3px 1px 7px 5px;
-  padding: 1px 3px 5px 7px;
-  gap: 1px 5px;
-}
-
-.grid > * {
-  background: cyan;
-  min-width: 20px;
-  min-height: 10px;
-}
-.grid > :nth-child(4n) {
-  background: blue;
-  width: 35px;
-}
-.grid > :nth-child(3n) {
-  background: gray;
-  width: 40px;
-}
-</style>
-</head>
-<body>
-<wrapper style="display:none">
-<div style="display:none">
-<div class="columns">
-  <div class="grid">
-    <x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x>
-  </div>
-</div>
-</div>
-<script>
-let wrapper = document.querySelectorAll("wrapper")[0];
-let tmplt = document.querySelectorAll(".columns")[0];
-let heights = [ 90, 68, 48, 38, 28, 18 ];
-for (let h of heights) {
-  let e = tmplt.cloneNode(true);
-  e.style.height = h + "px";
-  wrapper.appendChild(e);
-}
-wrapper.style.display="";
-</script>
-</wrapper>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-005.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-005.html.ini
deleted file mode 100644
index c4d1a32..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-005.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[masonry-fragmentation-005.html]
-  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-006-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-006-ref.html
deleted file mode 100644
index 5df3737..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-006-ref.html
+++ /dev/null
@@ -1,118 +0,0 @@
-<!DOCTYPE HTML>
-<!--
-     Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html><head>
-  <meta charset="utf-8">
-  <title>Reference: Grid axis fragmentation with column masonry layout</title>
-  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
-  <style>
-html,body {
-  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
-}
-wrapper {
-  display: block;
-  width: 600px;
-  height: 600px;
-  overflow: hidden;
-}
-
-.columns {
-  columns: 3;
-  column-fill: auto;
-  background: lightgrey;
-  margin-bottom: 15px;
-}
-
-.grid {
-  display: grid;
-  grid: 20px auto 30px / auto;
-  border: solid;
-  border-width: 3px 1px 7px 5px;
-  padding: 1px 3px 5px 7px;
-  gap: 1px 5px;
-}
-
-x {
-  background: cyan;
-  min-width: 20px;
-  min-height: 10px;
-}
-y {
-  background: blue;
-  width: 35px;
-}
-z {
-  background: gray;
-  width: 40px;
-}
-masonry-track {
-  display: grid;
-  justify-content: stretch;
-  column-gap: 5px;
-}
-</style>
-</head>
-<body>
-<wrapper style="display:none">
-<div class="columns" style="height:90px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:68px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:48px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:38px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:28px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-<div class="columns" style="height:18px">
-  <div class="grid">
-    <masonry-track><x></x><y></y><y></y><x></x></masonry-track>
-    <masonry-track><x></x><x></x><x></x><z></z></masonry-track>
-    <masonry-track><z></z><z></z><x></x><z></z></masonry-track>
-  </div>
-</div>
-</wrapper>
-
-<script>
-let wrapper = document.querySelectorAll("wrapper")[0];
-let grids = document.querySelectorAll(".grid");
-for (let e of grids) {
-  for (let track of e.children) {
-    var cols = "";
-    for (let item of track.children) {
-      if (item.tagName != "X") cols += "min-content "; else  cols += "auto ";
-    }
-    track.style.gridTemplateColumns = cols;
-  }
-}
-wrapper.style.display="";
-</script>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-006.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-006.html
deleted file mode 100644
index 9dab0dd..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-006.html
+++ /dev/null
@@ -1,77 +0,0 @@
-<!DOCTYPE HTML>
-<!--
-     Any copyright is dedicated to the Public Domain.
-     http://creativecommons.org/publicdomain/zero/1.0/
--->
-<html><head>
-  <meta charset="utf-8">
-  <title>CSS Grid Test: Grid axis fragmentation with column masonry layout</title>
-  <link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
-  <link rel="help" href="https://drafts.csswg.org/css-grid-2">
-  <link rel="match" href="masonry-fragmentation-006-ref.html">
-  <style>
-html,body {
-  color:black; background-color:white; font:10px/1 monospace; padding:0; margin:0;
-}
-wrapper {
-  display: block;
-  width: 600px;
-  height: 600px;
-  overflow: hidden;
-}
-
-.columns {
-  columns: 3;
-  column-fill: auto;
-  background: lightgrey;
-  margin-bottom: 15px;
-}
-
-.grid {
-  display: grid;
-  grid: 20px auto 30px / masonry;
-  justify-tracks: stretch;
-  border: solid;
-  border-width: 3px 1px 7px 5px;
-  padding: 1px 3px 5px 7px;
-  gap: 1px 5px;
-}
-
-.grid > * {
-  background: cyan;
-  min-width: 20px;
-  min-height: 10px;
-}
-.grid > :nth-child(4n) {
-  background: blue;
-  width: 35px;
-}
-.grid > :nth-child(3n) {
-  background: gray;
-  width: 40px;
-}
-</style>
-</head>
-<body>
-<wrapper style="display:none">
-<div style="display:none">
-<div class="columns">
-  <div class="grid">
-    <x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x><x></x>
-  </div>
-</div>
-</div>
-<script>
-let wrapper = document.querySelectorAll("wrapper")[0];
-let tmplt = document.querySelectorAll(".columns")[0];
-let heights = [ 90, 68, 48, 38, 28, 18 ];
-for (let h of heights) {
-  let e = tmplt.cloneNode(true);
-  e.style.height = h + "px";
-  wrapper.appendChild(e);
-}
-wrapper.style.display="";
-</script>
-</wrapper>
-</body>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-006.html.ini b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-006.html.ini
deleted file mode 100644
index fbc642ed..0000000
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/fragmentation/masonry-fragmentation-006.html.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[masonry-fragmentation-006.html]
-  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-014.html.ini b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-014.html.ini
index 8420610..e495df1 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-014.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-014.html.ini
@@ -1,4 +1,4 @@
 [shape-image-014.html]
   expected:
-    if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL
     if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+    if (product == "content_shell") and (os == "win"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/support/get-char-advances.js b/third_party/blink/web_tests/external/wpt/css/css-text/support/get-char-advances.js
index 846a39a..71a33634 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/support/get-char-advances.js
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/support/get-char-advances.js
@@ -1,25 +1,43 @@
 'use strict';
 
 /**
- * Returns an array of advances (widths) for all characters in the descendants
+ * Returns an array of advances for all characters in the descendants
  * of the specified element.
+ *
+ * Technically speaking, advances and glyph bounding boxes are different things,
+ * and advances are not exposed. This function computes approximate values from
+ * bounding boxes.
  */
 function getCharAdvances(element) {
   const range = document.createRange();
-  let advances = [];
-  for (const node of element.childNodes) {
-    const nodeType = node.nodeType;
-    if (nodeType === Node.TEXT_NODE) {
-      const text = node.nodeValue;
-      for (let i = 0; i < text.length; ++i) {
-        range.setStart(node, i);
-        range.setEnd(node, i + 1);
-        const bounds = range.getBoundingClientRect();
-        advances.push(bounds.width);
+  const advances = [];
+  let origin = undefined;
+  let blockEnd = -1;
+  function walk(element) {
+    for (const node of element.childNodes) {
+      const nodeType = node.nodeType;
+      if (nodeType === Node.TEXT_NODE) {
+        const text = node.nodeValue;
+        for (let i = 0; i < text.length; ++i) {
+          range.setStart(node, i);
+          range.setEnd(node, i + 1);
+          const bounds = range.getBoundingClientRect();
+          // Check if this is on the same line.
+          if (bounds.top >= blockEnd) {
+            origin = undefined;
+            blockEnd = bounds.bottom;
+          }
+          // For the first character, the left bound is closest to the origin.
+          if (origin === undefined) origin = bounds.left;
+          // The right bound is a good approximation of the next origin.
+          advances.push(bounds.right - origin);
+          origin = bounds.right;
+        }
+      } else if (nodeType === Node.ELEMENT_NODE) {
+        walk(node);
       }
-    } else if (nodeType === Node.ELEMENT_NODE) {
-      advances = advances.concat(getCharAdvances(node));
     }
   }
+  walk(element);
   return advances;
 }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-030.html.ini b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-030.html.ini
index c3e6d0f..8fc3fdd 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-030.html.ini
+++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-030.html.ini
@@ -1,3 +1,4 @@
 [text-transform-capitalize-030.html]
   expected:
     if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): FAIL
+    if (product == "content_shell") and (os == "linux") and (flag_specific == ""): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any-expected.txt b/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any-expected.txt
index 5b74742..a44202c73 100644
--- a/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any-expected.txt
@@ -4,13 +4,13 @@
 PASS subscribe() can be called with no arguments
 PASS Observable constructor calls initializer on subscribe
 PASS Observable error path called synchronously
-FAIL Observable should error if initializer throws assert_array_equals: should emit values and the throw error synchronously lengths differ, expected array [1, object "Error: error"] length 2, got [1] length 1
+FAIL Observable should error if initializer throws assert_equals: The global error handler should not be invoked when the subscribe callback throws an error and the subscriber has given an error handler expected null but got object "[object ErrorEvent]"
 PASS Subscription does not emit values after completion
 PASS Subscription does not emit values after error
 PASS Completing or nexting a subscriber after an error does nothing
-FAIL Errors pushed to the subscriber that are not handled by the subscription are reported to the global assert_true: Exception was reported to global expected true got false
+PASS Errors pushed to the subscriber that are not handled by the subscription are reported to the global
 PASS Errors thrown in the initializer that are not handled by the subscription are reported to the global
-FAIL Subscription reports errors that are pushed after subscriber is closed by completion assert_true: Exception was reported to global expected true got false
+PASS Subscription reports errors that are pushed after subscriber is closed by completion
 PASS Errors thrown by initializer function after subscriber is closed by completion are reported
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any.js b/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any.js
index 6ee1221..9e5a044b 100644
--- a/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any.js
+++ b/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any.js
@@ -100,6 +100,9 @@
 test(() => {
   const error = new Error("error");
   const results = [];
+  let errorReported = null;
+
+  self.addEventListener("error", e => errorReported = e, {once: true});
 
   const source = new Observable((subscriber) => {
     subscriber.next(1);
@@ -116,10 +119,13 @@
     complete: () => assert_unreached("complete should not be called"),
   });
 
+  assert_equals(errorReported, null, "The global error handler should not be " +
+      "invoked when the subscribe callback throws an error and the " +
+      "subscriber has given an error handler");
   assert_array_equals(
     results,
     [1, error],
-    "should emit values and the throw error synchronously"
+    "should emit values and the thrown error synchronously"
   );
 }, "Observable should error if initializer throws");
 
@@ -209,12 +215,13 @@
     subscriber.error(error);
   });
 
-  // No error handler provided.
+  // No error handler provided...
   source.subscribe({
     next: () => assert_unreached("next should not be called"),
     complete: () => assert_unreached("complete should not be called"),
   });
 
+  // ... still the exception is reported to the global.
   assert_true(errorReported !== null, "Exception was reported to global");
   assert_equals(errorReported.message, "Uncaught Error: custom error", "Error message matches");
   assert_greater_than(errorReported.lineno, 0, "Error lineno is greater than 0");
@@ -233,12 +240,13 @@
     throw error;
   });
 
-  // No error handler provided.
+  // No error handler provided...
   source.subscribe({
     next: () => assert_unreached("next should not be called"),
     complete: () => assert_unreached("complete should not be called"),
   });
 
+  // ... still the exception is reported to the global.
   assert_true(errorReported !== null, "Exception was reported to global");
   assert_equals(errorReported.message, "Uncaught Error: custom error", "Error message matches");
   assert_greater_than(errorReported.lineno, 0, "Error lineno is greater than 0");
@@ -273,6 +281,7 @@
     "should emit values synchronously, but not error values after complete"
   );
 
+  // Error reporting still happens even after  the subscription is closed.
   assert_true(errorReported !== null, "Exception was reported to global");
   assert_equals(errorReported.message, "Uncaught Error: custom error", "Error message matches");
   assert_greater_than(errorReported.lineno, 0, "Error lineno is greater than 0");
@@ -289,6 +298,9 @@
   self.addEventListener("error", e => errorReported = e, { once: true });
 
   const source = new Observable((subscriber) => {
+    subscriber.next(1);
+    subscriber.next(2);
+    subscriber.complete();
     throw error;
   });
 
@@ -298,7 +310,7 @@
     complete: () => results.push("complete"),
   });
 
-  assert_array_equals(results, [],
+  assert_array_equals(results, [1, 2, "complete"],
     "should emit values synchronously, but not error after complete"
   );
 
diff --git a/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any.worker-expected.txt
index 5b74742..a44202c73 100644
--- a/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any.worker-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.any.worker-expected.txt
@@ -4,13 +4,13 @@
 PASS subscribe() can be called with no arguments
 PASS Observable constructor calls initializer on subscribe
 PASS Observable error path called synchronously
-FAIL Observable should error if initializer throws assert_array_equals: should emit values and the throw error synchronously lengths differ, expected array [1, object "Error: error"] length 2, got [1] length 1
+FAIL Observable should error if initializer throws assert_equals: The global error handler should not be invoked when the subscribe callback throws an error and the subscriber has given an error handler expected null but got object "[object ErrorEvent]"
 PASS Subscription does not emit values after completion
 PASS Subscription does not emit values after error
 PASS Completing or nexting a subscriber after an error does nothing
-FAIL Errors pushed to the subscriber that are not handled by the subscription are reported to the global assert_true: Exception was reported to global expected true got false
+PASS Errors pushed to the subscriber that are not handled by the subscription are reported to the global
 PASS Errors thrown in the initializer that are not handled by the subscription are reported to the global
-FAIL Subscription reports errors that are pushed after subscriber is closed by completion assert_true: Exception was reported to global expected true got false
+PASS Subscription reports errors that are pushed after subscriber is closed by completion
 PASS Errors thrown by initializer function after subscriber is closed by completion are reported
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.window.js b/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.window.js
new file mode 100644
index 0000000..bf98ca3e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/dom/observable/tentative/observable-constructor.window.js
@@ -0,0 +1,72 @@
+async function loadIframeAndReturnContentWindow() {
+   // Create and attach an iframe.
+  const iframe = document.createElement('iframe');
+  const iframeLoadPromise = new Promise((resolve, reject) => {
+    iframe.onload = resolve;
+    iframe.onerror = reject;
+  });
+  document.body.append(iframe);
+  await iframeLoadPromise;
+  return iframe.contentWindow;
+}
+
+promise_test(async t => {
+  // Hang this off of the main document's global, so the child can easily reach
+  // it.
+  window.results = [];
+  const contentWin = await loadIframeAndReturnContentWindow();
+
+  contentWin.eval(`
+    // Get a reference to the parent result array before we detach and lose
+    // access to the parent.
+    const parentResults = parent.results;
+
+    const source = new Observable((subscriber) => {
+      parentResults.push("subscribe");
+      // Detach the iframe and push a value to the subscriber/Observer.
+      window.frameElement.remove();
+      parentResults.push("detached");
+      subscriber.next("next");
+      subscriber.complete();
+      subscriber.error("error");
+    });
+    source.subscribe({
+      next: v => {
+        // Should never run.
+        parentResults.push(v);
+      },
+      complete: () => {
+        // Should never run.
+        parentResults.push("complete");
+      },
+      erorr: e => {
+        // Should never run.
+        parentResults.push(e);
+      }
+    });
+  `);
+
+  assert_array_equals(results, ["subscribe", "detached"]);
+}, "No observer handlers can be invoked in detached document");
+
+promise_test(async t => {
+  const contentWin = await loadIframeAndReturnContentWindow();
+
+  // Set a global error handler on the iframe document's window, and verify that
+  // it is never called (because the thing triggering the error happens when the
+  // document is detached, and "reporting the exception" relies on an attached
+  // document).
+  contentWin.addEventListener("error",
+      t.unreached_func("Error should not be called"), { once: true });
+
+  contentWin.eval(`
+    const source = new Observable((subscriber) => {
+      // Detach the iframe and push an error, which would normally "report the
+      // exception", since this subscriber did not specify an error handler.
+      window.frameElement.remove();
+      subscriber.error("this is an error that should not be reported");
+    });
+    source.subscribe();
+  `);
+}, "Subscriber.error() does not \"report the exception\" even when an " +
+   "`error()` handler is not present, when it is invoked in a detached document");
diff --git a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-fetch.tentative.window.js.ini b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-fetch.tentative.window.js.ini
index 6487469..18f7ca1 100644
--- a/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-fetch.tentative.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/fetch/private-network-access/shared-worker-fetch.tentative.window.js.ini
@@ -1,7 +1,8 @@
 [shared-worker-fetch.tentative.window.html]
   expected:
-    if (product == "content_shell") and (os == "linux") and (virtual_suite == "pna-workers-disabled") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
-    if (product == "content_shell") and (os == "linux") and (virtual_suite == "pna-permission") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
+    if (product == "content_shell") and (virtual_suite == "pna-workers-disabled") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
+    if (product == "content_shell") and (virtual_suite == "pna-permission") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [OK, TIMEOUT]
+    if (product == "content_shell") and (virtual_suite == "produce-compile-hints"): [OK, TIMEOUT]
   [private https to local: failure.]
     expected: FAIL
 
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.getcontext.html.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.getcontext.html.ini
index bc34b99e..e49d3e17 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.getcontext.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.getcontext.html.ini
@@ -1,12 +1,15 @@
 [offscreencanvas.getcontext.html]
   [Test that getContext twice with different context type returns null the second time]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Test that getContext with supported string returns correct results]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Test that webglcontext.canvas should return the original OffscreenCanvas]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.getcontext.worker.js.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.getcontext.worker.js.ini
index cc58ae8..6af2eb8 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.getcontext.worker.js.ini
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.getcontext.worker.js.ini
@@ -1,12 +1,15 @@
 [offscreencanvas.getcontext.worker.html]
   [Test that getContext twice with different context type returns null the second time]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Test that getContext with supported string returns correct results]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Test that webglcontext.canvas should return the original OffscreenCanvas]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html.ini
index d0533c5..13dd77918 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.html.ini
@@ -1,4 +1,5 @@
 [offscreencanvas.transfer.to.imagebitmap.html]
   [Test that transferToImageBitmap returns an ImageBitmap with correct width and height]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html.ini
index 6ce450a..4baa7ed 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transfer.to.imagebitmap.w.html.ini
@@ -1,4 +1,5 @@
 [offscreencanvas.transfer.to.imagebitmap.w.html]
   [Test that transferToImageBitmap returns an ImageBitmap with correct width and height in a worker]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.w.html.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.w.html.ini
index 2d0f262..fe3dde2 100644
--- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.w.html.ini
+++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/the-offscreen-canvas/offscreencanvas.transferrable.w.html.ini
@@ -1,4 +1,5 @@
 [offscreencanvas.transferrable.w.html]
   [Test that transfer an OffscreenCanvas that has a webgl context throws exception in a worker.]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html b/third_party/blink/web_tests/external/wpt/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html
index 06f48eb..7855a48d 100644
--- a/third_party/blink/web_tests/external/wpt/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html
+++ b/third_party/blink/web_tests/external/wpt/infrastructure/testdriver/actions/multiTouchPointsTwoTouchStarts.html
@@ -43,7 +43,7 @@
       .pointerMove(0, 0, {origin: test1, sourceName: "touchPointer1"})
       .pointerMove(10, 0, {origin: test1, sourceName: "touchPointer2"})
       .pointerDown({sourceName: "touchPointer1"})
-      .pointerMove(0, 5, {origin: test1, sourceName: "touchPointer1"})
+      .pointerMove(0, 50, {origin: test1, sourceName: "touchPointer1"})
       .addTick()
       .pointerDown({sourceName: "touchPointer2"})
       .addTick()
diff --git a/third_party/blink/web_tests/external/wpt/paint-timing/with-first-paint/first-contentful-canvas-webgl2.html.ini b/third_party/blink/web_tests/external/wpt/paint-timing/with-first-paint/first-contentful-canvas-webgl2.html.ini
index 4028fe8..7cd9f9a 100644
--- a/third_party/blink/web_tests/external/wpt/paint-timing/with-first-paint/first-contentful-canvas-webgl2.html.ini
+++ b/third_party/blink/web_tests/external/wpt/paint-timing/with-first-paint/first-contentful-canvas-webgl2.html.ini
@@ -1,4 +1,5 @@
 [first-contentful-canvas-webgl2.html]
   [First contentful paint fires due to webgl2 canvas render.]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): PRECONDITION_FAILED
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): PRECONDITION_FAILED
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): PRECONDITION_FAILED
diff --git a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-inactive-outside-range-test.html.ini b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-inactive-outside-range-test.html.ini
index b6240681..887eb3b 100644
--- a/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-inactive-outside-range-test.html.ini
+++ b/third_party/blink/web_tests/external/wpt/scroll-animations/css/animation-inactive-outside-range-test.html.ini
@@ -2,6 +2,7 @@
   expected:
     if (product == "content_shell") and (virtual_suite == "threaded-prefer-compositing") and (os == "win") and (port == "win10.20h2"): FAIL
     if (product == "content_shell") and (virtual_suite == "threaded-prefer-compositing") and (os == "mac") and (port == "mac13-arm64"): FAIL
+    if (product == "content_shell") and (virtual_suite == "threaded-prefer-compositing") and (os == "mac") and (port == "mac13"): FAIL
     if (product == "content_shell") and (virtual_suite == "threaded-prefer-compositing") and (os == "mac") and (port == "mac12-arm64"): FAIL
     if (product == "content_shell") and (virtual_suite == "threaded-prefer-compositing") and (os == "mac") and (port == "mac12"): FAIL
     if (product == "content_shell") and (virtual_suite == "threaded-prefer-compositing") and (os == "mac") and (port == "mac11"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html
index 00b3412..3773c81 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/resources/partitioned-cookies-3p-frame.html
@@ -16,7 +16,6 @@
   const absolute_scope = new URL(scope, window.location).href;
 
   assert_false(document.cookie.includes('__Host-partitioned=123'), 'DOM cannot access partitioned cookie');
-  assert_true(document.cookie.includes('unpartitioned=456'), 'DOM can access unpartitioned cookie');
 
   const reg = await service_worker_unregister_and_register(t, script, scope);
   await wait_for_state(t, reg.installing, 'activated');
diff --git a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/same-site-cookies.https-expected.txt b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/same-site-cookies.https-expected.txt
index 3dd2cd7..0535759 100644
--- a/third_party/blink/web_tests/external/wpt/service-workers/service-worker/same-site-cookies.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/service-workers/service-worker/same-site-cookies.https-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 66 tests; 55 PASS, 11 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 66 tests; 57 PASS, 9 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS Setup service workers
 PASS same-origin, window.open with no service worker
 PASS same-origin, window.open with fallback
@@ -38,8 +38,8 @@
 PASS same-origin, nested window.open with cross-site middle frame and navpreload service worker
 PASS same-origin, nested set location with cross-site middle frame and no service worker
 PASS same-origin, nested set location with cross-site middle frame and fallback service worker
-FAIL same-origin, nested set location with cross-site middle frame and passthrough service worker assert_not_equals: SameSite=Strict cookies are not sent with cross-site requests. got disallowed value "COOKIE_VALUE"
-FAIL same-origin, nested set location with cross-site middle frame and change-request service worker assert_not_equals: SameSite=Strict cookies are not sent with cross-site requests. got disallowed value "COOKIE_VALUE"
+PASS same-origin, nested set location with cross-site middle frame and passthrough service worker
+PASS same-origin, nested set location with cross-site middle frame and change-request service worker
 PASS same-origin, nested set location with cross-site middle frame and navpreload service worker
 PASS same-origin, form post with no service worker
 PASS same-origin, form post with fallback
diff --git a/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-before-xr-session.https.html.ini b/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-before-xr-session.https.html.ini
index 1af1335..26a1d472 100644
--- a/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-before-xr-session.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-before-xr-session.https.html.ini
@@ -4,16 +4,20 @@
     if (product == "content_shell") and (os == "mac") and (port == "mac12"): TIMEOUT
   [Make sure video.rVFC works during a non-immersive session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Make sure video.rVFC works during a non-immersive session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Make sure video.rVFC works during an immersive session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Make sure video.rVFC works during an immersive session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-during-xr-session.https.html.ini b/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-during-xr-session.https.html.ini
index 8affa31..f5941ab 100644
--- a/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-during-xr-session.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/video-rvfc/request-video-frame-callback-during-xr-session.https.html.ini
@@ -1,8 +1,10 @@
 [request-video-frame-callback-during-xr-session.https.html]
   [Make sure video.rVFC callbacks started during an immersive session continue after it ends - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Make sure video.rVFC callbacks started during an immersive session continue after it ends - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/websockets/interfaces/WebSocket/close/close-connecting-async.any.js b/third_party/blink/web_tests/external/wpt/websockets/interfaces/WebSocket/close/close-connecting-async.any.js
index c7ace1fc..8800552 100644
--- a/third_party/blink/web_tests/external/wpt/websockets/interfaces/WebSocket/close/close-connecting-async.any.js
+++ b/third_party/blink/web_tests/external/wpt/websockets/interfaces/WebSocket/close/close-connecting-async.any.js
@@ -1,5 +1,5 @@
 // META: script=../../../constants.sub.js
-// META: variant=
+// META: variant=?default
 // META: variant=?wpt_flags=h2
 // META: variant=?wss
 
diff --git a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini
index 488fb73..c7e8abe 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_create_move.https.html.ini
@@ -1,8 +1,10 @@
 [ar_anchor_freefloating_create_move.https.html]
   [Ensures free-floating anchor move gets propagated to anchor poses - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures free-floating anchor move gets propagated to anchor poses - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini
index 7c6d5c4..3551180 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_delay_creation.https.html.ini
@@ -1,16 +1,20 @@
 [ar_anchor_freefloating_delay_creation.https.html]
   [Ensures free-floating anchor creation with delayed failure is handled correctly - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures free-floating anchor creation with delayed failure is handled correctly - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures free-floating anchor creation with delayed success is handled correctly - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures free-floating anchor creation with delayed success is handled correctly - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini
index bdc823e..b37def3 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_failure.https.html.ini
@@ -1,8 +1,10 @@
 [ar_anchor_freefloating_failure.https.html]
   [Ensures free-floating anchor creation failure is handled correctly - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures free-floating anchor creation failure is handled correctly - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini
index a999adb..f53d912 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_freefloating_pause_resume_stop.https.html.ini
@@ -1,8 +1,10 @@
 [ar_anchor_freefloating_pause_resume_stop.https.html]
   [Ensures free-floating anchor state changes get propagated - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures free-floating anchor state changes get propagated - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_getAnchors.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_getAnchors.https.html.ini
index be625d3..a9e02b8 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_getAnchors.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_getAnchors.https.html.ini
@@ -1,16 +1,20 @@
 [ar_anchor_getAnchors.https.html]
   [XRFrame's trackedAnchors is empty when the feature was not requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame's trackedAnchors is empty when the feature was not requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame's trackedAnchors is empty when the feature was requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame's trackedAnchors is empty when the feature was requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_states.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_states.https.html.ini
index 1609571b..3cf1160 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_states.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/anchors/ar_anchor_states.https.html.ini
@@ -1,24 +1,30 @@
 [ar_anchor_states.https.html]
   [Anchor creation fails if the feature was not requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Anchor creation fails if the feature was not requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Anchor creation fails if the feature was requested but the session already ended - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Anchor creation fails if the feature was requested but the session already ended - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Anchor creation succeeds if the feature was requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Anchor creation succeeds if the feature was requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini
index 064e841..5498ba0 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrDevice_requestSession_immersive-ar.https.html.ini
@@ -1,8 +1,10 @@
 [xrDevice_requestSession_immersive-ar.https.html]
   [Tests requestSession accepts immersive-ar mode - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession accepts immersive-ar mode - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini
index 3d33435..9d318102 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_environmentBlendMode.https.html.ini
@@ -1,16 +1,20 @@
 [xrSession_environmentBlendMode.https.html]
   [Tests environmentBlendMode for a VR device - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests environmentBlendMode for a VR device - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests environmentBlendMode for an AR device - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests environmentBlendMode for an AR device - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_interactionMode.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_interactionMode.https.html.ini
index 7615a6a1..ad282d0 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_interactionMode.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/ar-module/xrSession_interactionMode.https.html.ini
@@ -1,40 +1,50 @@
 [xrSession_interactionMode.https.html]
   [Tests interactionMode for a INLINE_SCREEN_DEVICE - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests interactionMode for a INLINE_SCREEN_DEVICE - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests interactionMode for an AR_HMD_DEVICE - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests interactionMode for an AR_HMD_DEVICE - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests interactionMode for an AR_SCREEN_DEVICE - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests interactionMode for an AR_SCREEN_DEVICE - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests interactionMode for an VR_HMD_DEVICE - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests interactionMode for an VR_HMD_DEVICE - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests interactionMode for an VR_SCREEN_DEVICE - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests interactionMode for an VR_SCREEN_DEVICE - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/camera-access/xrCamera_resolution.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/camera-access/xrCamera_resolution.https.html.ini
index d29460f5..9271f9f 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/camera-access/xrCamera_resolution.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/camera-access/xrCamera_resolution.https.html.ini
@@ -1,8 +1,10 @@
 [xrCamera_resolution.https.html]
   [XRCamera object is present and carries expected dimensions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRCamera object is present and carries expected dimensions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_dataUnavailable.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_dataUnavailable.https.html.ini
index 32eb9074..476288c 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_dataUnavailable.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_dataUnavailable.https.html.ini
@@ -1,8 +1,10 @@
 [depth_sensing_cpu_dataUnavailable.https.html]
   [Ensures depth data is not available when cleared in the controller, `cpu-optimized` - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures depth data is not available when cleared in the controller, `cpu-optimized` - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_inactiveFrame.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_inactiveFrame.https.html.ini
index 088d4ec4..1fab590 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_inactiveFrame.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_inactiveFrame.https.html.ini
@@ -1,8 +1,10 @@
 [depth_sensing_cpu_inactiveFrame.https.html]
   [Ensures getDepthInformation() throws when not run in an active frame, `cpu-optimized` - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures getDepthInformation() throws when not run in an active frame, `cpu-optimized` - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_incorrectUsage.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_incorrectUsage.https.html.ini
index 5e9bef5d..0d741171 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_incorrectUsage.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_incorrectUsage.https.html.ini
@@ -1,8 +1,10 @@
 [depth_sensing_cpu_incorrectUsage.https.html]
   [Ensures XRWebGLDepthInformation is not obtainable in `cpu-optimized` usage mode - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures XRWebGLDepthInformation is not obtainable in `cpu-optimized` usage mode - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_luminance_alpha_dataValid.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_luminance_alpha_dataValid.https.html.ini
index c31fe76..142a752 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_luminance_alpha_dataValid.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_luminance_alpha_dataValid.https.html.ini
@@ -1,8 +1,10 @@
 [depth_sensing_cpu_luminance_alpha_dataValid.https.html]
   [Ensures depth data is returned and values match expectation, cpu-optimized, luminance-alpha. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures depth data is returned and values match expectation, cpu-optimized, luminance-alpha. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_staleView.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_staleView.https.html.ini
index 5c3db41..55e05395 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_staleView.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/cpu/depth_sensing_cpu_staleView.https.html.ini
@@ -1,8 +1,10 @@
 [depth_sensing_cpu_staleView.https.html]
   [Ensures getDepthInformation() throws when run with stale XRView, `cpu-optimized` - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures getDepthInformation() throws when run with stale XRView, `cpu-optimized` - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/depth_sensing_notEnabled.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/depth_sensing_notEnabled.https.html.ini
index df2c30c..e1ea241 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/depth_sensing_notEnabled.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/depth-sensing/depth_sensing_notEnabled.https.html.ini
@@ -1,16 +1,20 @@
 [depth_sensing_notEnabled.https.html]
   [XRFrame.getDepthInformation() rejects if depth sensing is not enabled on a session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame.getDepthInformation() rejects if depth sensing is not enabled on a session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLBinding.getDepthInformation() rejects if depth sensing is not enabled on a session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLBinding.getDepthInformation() rejects if depth sensing is not enabled on a session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html.ini
index 27b869b..cf98ea4 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay.https.html.ini
@@ -5,37 +5,43 @@
     if product == "chrome": TIMEOUT
   [Ensures DOM Overlay Fullscreen API doesn't change DOM overlay - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, NOTRUN]
       if product == "chrome": NOTRUN
 
   [Ensures DOM Overlay Fullscreen API doesn't change DOM overlay - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, NOTRUN]
       if product == "chrome": NOTRUN
 
   [Ensures DOM Overlay feature works for immersive-ar, body element - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, TIMEOUT]
       if product == "chrome": TIMEOUT
 
   [Ensures DOM Overlay feature works for immersive-ar, body element - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, NOTRUN]
       if product == "chrome": NOTRUN
 
   [Ensures DOM Overlay feature works for immersive-ar, div element - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, NOTRUN]
       if product == "chrome": NOTRUN
 
   [Ensures DOM Overlay feature works for immersive-ar, div element - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if (product == "content_shell") and (os == "linux") and (flag_specific == "disable-site-isolation-trials"): [PASS, NOTRUN]
       if product == "chrome": NOTRUN
 
diff --git a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay_hit_test.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay_hit_test.https.html.ini
index dd711ce..d111ced 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay_hit_test.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/ar_dom_overlay_hit_test.https.html.ini
@@ -1,13 +1,16 @@
 [ar_dom_overlay_hit_test.https.html]
   expected:
-    if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): OK
+    if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): OK
+    if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): OK
     TIMEOUT
   [Ensures DOM Overlay interactions on cross origin iframe do not cause hit test results to come up - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       TIMEOUT
 
   [Ensures DOM Overlay interactions on cross origin iframe do not cause hit test results to come up - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       NOTRUN
diff --git a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/nested_fullscreen.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/nested_fullscreen.https.html.ini
index f65f4657..5213f32 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/nested_fullscreen.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/dom-overlay/nested_fullscreen.https.html.ini
@@ -1,16 +1,20 @@
 [nested_fullscreen.https.html]
   expected:
-    if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): OK
+    if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): OK
+    if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): OK
     TIMEOUT
   [Check XR session from fullscreen - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Check XR session from fullscreen - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [fullscreen setup]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): PASS
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): PASS
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): PASS
       TIMEOUT
diff --git a/third_party/blink/web_tests/external/wpt/webxr/events_input_source_recreation.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/events_input_source_recreation.https.html.ini
index ad4f4ba..2c5a601 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/events_input_source_recreation.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_input_source_recreation.https.html.ini
@@ -1,8 +1,10 @@
 [events_input_source_recreation.https.html]
   [Input sources are re-created when handedness or target ray mode changes - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Input sources are re-created when handedness or target ray mode changes - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/events_input_sources_change.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/events_input_sources_change.https.html.ini
index ede519d..6bee0f6 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/events_input_sources_change.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_input_sources_change.https.html.ini
@@ -1,8 +1,10 @@
 [events_input_sources_change.https.html]
   [Transient input sources fire events in the right order - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Transient input sources fire events in the right order - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_immersive.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_immersive.https.html.ini
index 0dc7b85e..c8bbcb0 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_immersive.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_immersive.https.html.ini
@@ -1,8 +1,10 @@
 [events_referenceSpace_reset_immersive.https.html]
   [XRSession resetpose from a device properly fires off the right events for immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession resetpose from a device properly fires off the right events for immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini
index abf9cd2..702bd19 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_referenceSpace_reset_inline.https.html.ini
@@ -1,15 +1,18 @@
 [events_referenceSpace_reset_inline.https.html]
   expected:
-    if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): OK
+    if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): OK
+    if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): OK
     TIMEOUT
   [XRSession resetpose from a device properly fires off the right events for non-immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if product == "chrome": [PASS, TIMEOUT]
       TIMEOUT
 
   [XRSession resetpose from a device properly fires off the right events for non-immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if product == "chrome": [TIMEOUT, NOTRUN]
       NOTRUN
diff --git a/third_party/blink/web_tests/external/wpt/webxr/events_session_select.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/events_session_select.https.html.ini
index 7c9b1f5..0385b191 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/events_session_select.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_session_select.https.html.ini
@@ -1,8 +1,10 @@
 [events_session_select.https.html]
   [XRInputSources primary input presses properly fires off the right events - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRInputSources primary input presses properly fires off the right events - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/events_session_select_subframe.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/events_session_select_subframe.https.html.ini
index 9604fba..cd41f28 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/events_session_select_subframe.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_session_select_subframe.https.html.ini
@@ -1,8 +1,10 @@
 [events_session_select_subframe.https.html]
   [Ensures that an XRInputSources primary input being pressed and released in the space of a single frame properly fires off the right events - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures that an XRInputSources primary input being pressed and released in the space of a single frame properly fires off the right events - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/events_session_squeeze.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/events_session_squeeze.https.html.ini
index e5999c24..781e094 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/events_session_squeeze.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/events_session_squeeze.https.html.ini
@@ -1,8 +1,10 @@
 [events_session_squeeze.https.html]
   [XRInputSources primary input presses properly fires off the right events - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRInputSources primary input presses properly fires off the right events - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/exclusive_requestFrame_nolayer.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/exclusive_requestFrame_nolayer.https.html.ini
index c5c698f4..8319060 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/exclusive_requestFrame_nolayer.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/exclusive_requestFrame_nolayer.https.html.ini
@@ -1,16 +1,20 @@
 [exclusive_requestFrame_nolayer.https.html]
   [XRSession requestAnimationFrame must fail if the session has no baseLayer for immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession requestAnimationFrame must fail if the session has no baseLayer for immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession requestAnimationFrame must fail if the session has no baseLayer for non immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession requestAnimationFrame must fail if the session has no baseLayer for non immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/gamepads-module/xrInputSource_gamepad_disconnect.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/gamepads-module/xrInputSource_gamepad_disconnect.https.html.ini
index 6936c08a4..b0ceaf63 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/gamepads-module/xrInputSource_gamepad_disconnect.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/gamepads-module/xrInputSource_gamepad_disconnect.https.html.ini
@@ -1,8 +1,10 @@
 [xrInputSource_gamepad_disconnect.https.html]
   [WebXR InputSource's gamepad gets disconnected when the input source is removed - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [WebXR InputSource's gamepad gets disconnected when the input source is removed - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini
index 9f0ff91a..a302af80 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/gamepads-module/xrInputSource_gamepad_input_registered.https.html.ini
@@ -1,8 +1,10 @@
 [xrInputSource_gamepad_input_registered.https.html]
   [WebXR InputSource's gamepad properly registers input - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [WebXR InputSource's gamepad properly registers input - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html.ini
index a1195fa..bcd50f7 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_handedness.https.html.ini
@@ -1,8 +1,10 @@
 [getInputPose_handedness.https.html]
   [XRInputSources properly communicate their handedness - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRInputSources properly communicate their handedness - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/getInputPose_pointer.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_pointer.https.html.ini
index 91a596b..292e22d 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/getInputPose_pointer.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/getInputPose_pointer.https.html.ini
@@ -1,8 +1,10 @@
 [getInputPose_pointer.https.html]
   [XRInputSources with a target ray mode of 'tracked-pointer' properly communicate their poses - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRInputSources with a target ray mode of 'tracked-pointer' properly communicate their poses - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/getViewerPose_emulatedPosition.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/getViewerPose_emulatedPosition.https.html.ini
index a8c404e..61bccdc 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/getViewerPose_emulatedPosition.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/getViewerPose_emulatedPosition.https.html.ini
@@ -1,8 +1,10 @@
 [getViewerPose_emulatedPosition.https.html]
   [XRFrame getViewerPose has emulatedPosition set properly. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame getViewerPose has emulatedPosition set properly. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_source_cancel.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_source_cancel.https.html.ini
index b60d1688..6f9f8c1 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_source_cancel.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_source_cancel.https.html.ini
@@ -1,32 +1,40 @@
 [ar_hittest_source_cancel.https.html]
   [Ensures hit test source cancellation works when the session has ended - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures hit test source cancellation works when the session has ended - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures hit test source cancellation works when the session has not ended. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures hit test source cancellation works when the session has not ended. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures transient input hit test source cancellation works when the session has ended - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures transient input hit test source cancellation works when the session has ended - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures transient input hit test source cancellation works when the session has not ended. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures transient input hit test source cancellation works when the session has not ended. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_inputSources.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_inputSources.https.html.ini
index b22f501b..20aaa103 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_inputSources.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_inputSources.https.html.ini
@@ -1,24 +1,30 @@
 [ar_hittest_subscription_inputSources.https.html]
   [Ensures subscription to hit test works with an XRSpace from input source - after move - 1 result - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with an XRSpace from input source - after move - 1 result - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with an XRSpace from input source - after move - no results - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with an XRSpace from input source - after move - no results - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with an XRSpace from input source - no move - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with an XRSpace from input source - no move - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini
index 9dbe67d..67ff0d0 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_refSpaces.https.html.ini
@@ -1,32 +1,40 @@
 [ar_hittest_subscription_refSpaces.https.html]
   [Ensures subscription to hit test works with local space - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with local space - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with local-floor space - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with local-floor space - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with viewer space - straight ahead - plane - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with viewer space - straight ahead - plane - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with viewer space - straight up - no results - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to hit test works with viewer space - straight up - no results - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini
index d4af61d3..2b451a0 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_states_regular.https.html.ini
@@ -1,24 +1,30 @@
 [ar_hittest_subscription_states_regular.https.html]
   [Hit test subscription fails if the feature was not requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Hit test subscription fails if the feature was not requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Hit test subscription fails if the feature was requested but the session already ended - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Hit test subscription fails if the feature was requested but the session already ended - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Hit test subscription succeeds if the feature was requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Hit test subscription succeeds if the feature was requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_states_transient.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_states_transient.https.html.ini
index 444feab..0e154a7 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_states_transient.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_states_transient.https.html.ini
@@ -1,24 +1,30 @@
 [ar_hittest_subscription_states_transient.https.html]
   [Transient hit test subscription fails if the feature was not requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Transient hit test subscription fails if the feature was not requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Transient hit test subscription succeeds if the feature was requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Transient hit test subscription succeeds if the feature was requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Transient test subscription fails if the feature was requested but the session already ended - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Transient test subscription fails if the feature was requested but the session already ended - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini
index cfb29f5..a2c214c 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_transientInputSources.https.html.ini
@@ -1,24 +1,30 @@
 [ar_hittest_subscription_transientInputSources.https.html]
   [Ensures subscription to transient hit test works with an XRSpace from input source - after move - 1 result - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to transient hit test works with an XRSpace from input source - after move - 1 result - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to transient hit test works with an XRSpace from input source - after move - no results - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to transient hit test works with an XRSpace from input source - after move - no results - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to transient hit test works with an XRSpace from input source - no move - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures subscription to transient hit test works with an XRSpace from input source - no move - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_unlocalizable.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_unlocalizable.https.html.ini
index e0cf12bb..f08b3e7 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_unlocalizable.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/hit-test/ar_hittest_subscription_unlocalizable.https.html.ini
@@ -1,8 +1,10 @@
 [ar_hittest_subscription_unlocalizable.https.html]
   [Ensures hit test result returns null pose w/unlocalizable space - viewer space - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures hit test result returns null pose w/unlocalizable space - viewer space - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/idlharness.https.window.js.ini b/third_party/blink/web_tests/external/wpt/webxr/idlharness.https.window.js.ini
index a55bd8a..58e35503 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/idlharness.https.window.js.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/idlharness.https.window.js.ini
@@ -1,14 +1,16 @@
 [idlharness.https.window.html]
   [Stringification of xrWebGLLayer]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [WebGLRenderingContext includes WebGLRenderingContextOverloads: member names are unique]
     expected: FAIL
 
   [WebGLRenderingContextBase interface: webGLRenderingContextBase must inherit property "makeXRCompatible()" with the proper type]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame interface: attribute predictedDisplayTime]
     expected: FAIL
@@ -45,47 +47,58 @@
 
   [XRWebGLLayer interface: calling getNativeFramebufferScaleFactor(XRSession) on xrWebGLLayer with too few arguments must throw TypeError]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer interface: calling getViewport(XRView) on xrWebGLLayer with too few arguments must throw TypeError]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer interface: xrWebGLLayer must inherit property "antialias" with the proper type]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer interface: xrWebGLLayer must inherit property "fixedFoveation" with the proper type]
     expected: FAIL
 
   [XRWebGLLayer interface: xrWebGLLayer must inherit property "framebuffer" with the proper type]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer interface: xrWebGLLayer must inherit property "framebufferHeight" with the proper type]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer interface: xrWebGLLayer must inherit property "framebufferWidth" with the proper type]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer interface: xrWebGLLayer must inherit property "getNativeFramebufferScaleFactor(XRSession)" with the proper type]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer interface: xrWebGLLayer must inherit property "getViewport(XRView)" with the proper type]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer interface: xrWebGLLayer must inherit property "ignoreDepthValues" with the proper type]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer must be primary interface of xrWebGLLayer]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [idl_test setup]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/layers/xrSession_updateRenderState.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/layers/xrSession_updateRenderState.https.html.ini
index 88bb4d7..b94d877 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/layers/xrSession_updateRenderState.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/layers/xrSession_updateRenderState.https.html.ini
@@ -1,16 +1,20 @@
 [xrSession_updateRenderState.https.html]
   [Ensure XRSession throws appropriate errors when updating render state with layers feature enabled - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure XRSession throws appropriate errors when updating render state with layers feature enabled - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure XRSession throws appropriate errors when updating render state without layers feature enabled - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure XRSession throws appropriate errors when updating render state without layers feature enabled - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/layers/xrWebGLBinding_constructor.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/layers/xrWebGLBinding_constructor.https.html.ini
index c957c47c6..e55aad9 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/layers/xrWebGLBinding_constructor.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/layers/xrWebGLBinding_constructor.https.html.ini
@@ -1,8 +1,10 @@
 [xrWebGLBinding_constructor.https.html]
   [Ensure that XRWebGLBinding's constructor throws appropriate errors using webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure that XRWebGLBinding's constructor throws appropriate errors using webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_oldSession.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_oldSession.https.html.ini
index c2ad2ba..1b057eb 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_oldSession.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_oldSession.https.html.ini
@@ -1,8 +1,10 @@
 [xrFrame_getLightEstimate_oldSession.https.html]
   [getLightEstimate rejects if probe is from wrong session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [getLightEstimate rejects if probe is from wrong session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_staleFrame.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_staleFrame.https.html.ini
index 5001631..d581b78 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_staleFrame.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_staleFrame.https.html.ini
@@ -1,8 +1,10 @@
 [xrFrame_getLightEstimate_staleFrame.https.html]
   [Cannot get XrLightEstimate from stale frame - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Cannot get XrLightEstimate from stale frame - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_valid.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_valid.https.html.ini
index c4a9659..4216dd1 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_valid.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrFrame_getLightEstimate_valid.https.html.ini
@@ -1,8 +1,10 @@
 [xrFrame_getLightEstimate_valid.https.html]
   [Can get XRLightEstimates during frame - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Can get XRLightEstimates during frame - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_ended.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_ended.https.html.ini
index b8ef5bd5..44484f7 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_ended.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_ended.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_getLightProbe_ended.https.html]
   [getLightProbe rejects on an ended session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [getLightProbe rejects on an ended session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_notEnabled.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_notEnabled.https.html.ini
index 16f8d164..185f5aa 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_notEnabled.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_notEnabled.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_getLightProbe_notEnabled.https.html]
   [getLightProbe rejects if not enabled on session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [getLightProbe rejects if not enabled on session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_valid.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_valid.https.html.ini
index b308aa8..700f751 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_valid.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrSession_getLightProbe_valid.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_getLightProbe_valid.https.html]
   [Can create valid XRLightProbe objects - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Can create valid XRLightProbe objects - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrWebGLBinding_getReflectionCubeMap.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrWebGLBinding_getReflectionCubeMap.https.html.ini
index 50bfedb..fae907f 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrWebGLBinding_getReflectionCubeMap.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/light-estimation/xrWebGLBinding_getReflectionCubeMap.https.html.ini
@@ -1,8 +1,10 @@
 [xrWebGLBinding_getReflectionCubeMap.https.html]
   [Test that getReflectionCubeMap returns or throws appropriately without a reflection map. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Test that getReflectionCubeMap returns or throws appropriately without a reflection map. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/navigator_xr_sameObject.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/navigator_xr_sameObject.https.html.ini
index 3038448..6d8ba9d 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/navigator_xr_sameObject.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/navigator_xr_sameObject.https.html.ini
@@ -1,8 +1,10 @@
 [navigator_xr_sameObject.https.html]
   [Navigator.xr meets [SameObject\] requirement - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Navigator.xr meets [SameObject\] requirement - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/render_state_update.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/render_state_update.https.html.ini
index 1ac5bb4..7335b9e68 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/render_state_update.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/render_state_update.https.html.ini
@@ -1,40 +1,50 @@
 [render_state_update.https.html]
   [updateRenderState handles appropriately XRRenderStateInit params - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [updateRenderState handles appropriately XRRenderStateInit params - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [updateRenderState handles appropriately XRRenderStateInit with no params - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [updateRenderState handles appropriately XRRenderStateInit with no params - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [updateRenderState handles appropriately baseLayers created with different sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [updateRenderState handles appropriately baseLayers created with different sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [updateRenderState handles appropriately ended sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [updateRenderState handles appropriately ended sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [updateRenderState handles appropriately immersive sessions with specified inlineVerticalFieldOfView - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [updateRenderState handles appropriately immersive sessions with specified inlineVerticalFieldOfView - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/render_state_vertical_fov_immersive.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/render_state_vertical_fov_immersive.https.html.ini
index 81cd5b64..631798ce 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/render_state_vertical_fov_immersive.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/render_state_vertical_fov_immersive.https.html.ini
@@ -1,8 +1,10 @@
 [render_state_vertical_fov_immersive.https.html]
   [inlineVerticalFieldOfView is set appropriately on immersively sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [inlineVerticalFieldOfView is set appropriately on immersively sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/render_state_vertical_fov_inline.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/render_state_vertical_fov_inline.https.html.ini
index f12b719..2bd3420 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/render_state_vertical_fov_inline.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/render_state_vertical_fov_inline.https.html.ini
@@ -1,8 +1,10 @@
 [render_state_vertical_fov_inline.https.html]
   [inlineVerticalFieldOfView is set appropriately on inline sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [inlineVerticalFieldOfView is set appropriately on inline sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_create_xrcompatible.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_create_xrcompatible.https.html.ini
index f347e95..77254db6 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_create_xrcompatible.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_create_xrcompatible.https.html.ini
@@ -1,16 +1,20 @@
 [webGLCanvasContext_create_xrcompatible.https.html]
   [An XR-compatible webgl context can be created]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [An XR-compatible webgl2 context can be created]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Creating a webgl context with no device]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Creating a webgl2 context with no device]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_makecompatible_contextlost.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_makecompatible_contextlost.https.html.ini
index 029b42f..999ebad2 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_makecompatible_contextlost.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_makecompatible_contextlost.https.html.ini
@@ -1,8 +1,10 @@
 [webGLCanvasContext_makecompatible_contextlost.https.html]
   [A lost webgl context should not be able to set xr compatibility]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [A lost webgl2 context should not be able to set xr compatibility]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_makecompatible_reentrant.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_makecompatible_reentrant.https.html.ini
index 900b45b..0e3d96d 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_makecompatible_reentrant.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/webGLCanvasContext_makecompatible_reentrant.https.html.ini
@@ -1,16 +1,20 @@
 [webGLCanvasContext_makecompatible_reentrant.https.html]
   [Verify promise from a non-reentrant call to makeXRCompatible() is resolved for webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Verify promise from a non-reentrant call to makeXRCompatible() is resolved for webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Verify promises from reentrant calls to makeXRCompatible() are resolved for webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Verify promises from reentrant calls to makeXRCompatible() are resolved for webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/webxr_permissions_policy.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/webxr_permissions_policy.https.html.ini
index 65f4435..eec7b36d 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/webxr_permissions_policy.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/webxr_permissions_policy.https.html.ini
@@ -1,4 +1,5 @@
 [webxr_permissions_policy.https.html]
   [Validate xr compatibility requests without xr-spatial-tracking policy]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html.ini
index 9db6588..da4b4c7 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrBoundedReferenceSpace_updates.https.html.ini
@@ -1,8 +1,10 @@
 [xrBoundedReferenceSpace_updates.https.html]
   ['XRBoundedReferenceSpace updates properly when the changes are applied - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   ['XRBoundedReferenceSpace updates properly when the changes are applied - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrDevice_disconnect_ends.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrDevice_disconnect_ends.https.html.ini
index fc2dbaba..77e2fbf 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrDevice_disconnect_ends.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrDevice_disconnect_ends.https.html.ini
@@ -1,8 +1,10 @@
 [xrDevice_disconnect_ends.https.html]
   [Immersive session ends when device is disconnected - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Immersive session ends when device is disconnected - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrDevice_requestSession_immersive.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrDevice_requestSession_immersive.https.html.ini
index b64e56f..838c13a 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrDevice_requestSession_immersive.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrDevice_requestSession_immersive.https.html.ini
@@ -1,24 +1,30 @@
 [xrDevice_requestSession_immersive.https.html]
   [Tests requestSession accepts XRSessionInit dictionary - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession accepts XRSessionInit dictionary - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession ignores unknown optionalFeatures - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession ignores unknown optionalFeatures - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession resolves when supported - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession resolves when supported - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini
index 92e3855..d18bc5f84 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrDevice_requestSession_optionalFeatures.https.html.ini
@@ -3,32 +3,40 @@
     if (product == "content_shell") and (os == "mac") and (port == "mac12"): [TIMEOUT, OK]
   [Tests requestSession accepts XRSessionInit dictionary - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession accepts XRSessionInit dictionary - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession accepts XRSessionInit dictionary with empty feature lists - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession accepts XRSessionInit dictionary with empty feature lists - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession ignores unknown objects in optionalFeatures - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession ignores unknown objects in optionalFeatures - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession ignores unknown strings in optionalFeatures - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Tests requestSession ignores unknown strings in optionalFeatures - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html.ini
index 9070199..9a55617 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getPose.https.html.ini
@@ -1,16 +1,20 @@
 [xrFrame_getPose.https.html]
   [XRFrame.getPose works for immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame.getPose works for immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame.getPose works for non-immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame.getPose works for non-immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getViewerPose_getPose.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getViewerPose_getPose.https.html.ini
index 54ae2a29..cf749793 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getViewerPose_getPose.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getViewerPose_getPose.https.html.ini
@@ -1,8 +1,10 @@
 [xrFrame_getViewerPose_getPose.https.html]
   [XRFrame getViewerPose(refSpace) matches getPose(viewer, refSpace). - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame getViewerPose(refSpace) matches getPose(viewer, refSpace). - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getViewerPose_getPose_identities.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getViewerPose_getPose_identities.https.html.ini
index 375c7c9..3f8dcf8 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getViewerPose_getPose_identities.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_getViewerPose_getPose_identities.https.html.ini
@@ -1,8 +1,10 @@
 [xrFrame_getViewerPose_getPose_identities.https.html]
   [XRFrame getViewerPose(viewerSpace) & getPose(space, space) return identity even during tracking loss - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame getViewerPose(viewerSpace) & getPose(space, space) return identity even during tracking loss - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_lifetime.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_lifetime.https.html.ini
index ccb30f87..5220baf6 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_lifetime.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_lifetime.https.html.ini
@@ -1,16 +1,20 @@
 [xrFrame_lifetime.https.html]
   [XRFrame methods throw exceptions outside of the requestAnimationFrame callback for immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame methods throw exceptions outside of the requestAnimationFrame callback for immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame methods throw exceptions outside of the requestAnimationFrame callback for non-immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame methods throw exceptions outside of the requestAnimationFrame callback for non-immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_session_sameObject.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_session_sameObject.https.html.ini
index 95f42826c..cfbd9eb 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrFrame_session_sameObject.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrFrame_session_sameObject.https.html.ini
@@ -1,8 +1,10 @@
 [xrFrame_session_sameObject.https.html]
   [XRFrame.session meets [SameObject\] requirement - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame.session meets [SameObject\] requirement - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html.ini
index 7302871..e371762 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_add_remove.https.html.ini
@@ -1,8 +1,10 @@
 [xrInputSource_add_remove.https.html]
   [XRInputSources can be properly added and removed from the session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRInputSources can be properly added and removed from the session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_emulatedPosition.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_emulatedPosition.https.html.ini
index 78f8a38..513c621d 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_emulatedPosition.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_emulatedPosition.https.html.ini
@@ -1,8 +1,10 @@
 [xrInputSource_emulatedPosition.https.html]
   [Poses from XRInputSource.gripSpace have emulatedPosition set properly - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Poses from XRInputSource.gripSpace have emulatedPosition set properly - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_getPose_targetRay_grip.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_getPose_targetRay_grip.https.html.ini
index bc6eec8..a224c9d 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_getPose_targetRay_grip.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_getPose_targetRay_grip.https.html.ini
@@ -1,8 +1,10 @@
 [xrInputSource_getPose_targetRay_grip.https.html]
   [Poses between targetRaySpace and gripSpace can be obtained and behave correctly - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Poses between targetRaySpace and gripSpace can be obtained and behave correctly - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_profiles.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_profiles.https.html.ini
index e724f564..14377f9 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_profiles.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_profiles.https.html.ini
@@ -1,8 +1,10 @@
 [xrInputSource_profiles.https.html]
   [WebXR InputSource's profiles list can be set - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [WebXR InputSource's profiles list can be set - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_sameObject.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_sameObject.https.html.ini
index 507870a54..48db13cc 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_sameObject.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrInputSource_sameObject.https.html.ini
@@ -1,8 +1,10 @@
 [xrInputSource_sameObject.https.html]
   [XRInputSource attributes meet [SameObject\] requirement - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRInputSource attributes meet [SameObject\] requirement - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrPose_transform_sameObject.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrPose_transform_sameObject.https.html.ini
index a8ffd667..d6e84deb 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrPose_transform_sameObject.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrPose_transform_sameObject.https.html.ini
@@ -1,8 +1,10 @@
 [xrPose_transform_sameObject.https.html]
   [XRPose.transform meets [SameObject\] requirement - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRPose.transform meets [SameObject\] requirement - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset.https.html.ini
index 9507cd5..c909550 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset.https.html.ini
@@ -1,8 +1,10 @@
 [xrReferenceSpace_originOffset.https.html]
   [Updating XRReferenceSpace origin offset updates view and input matrices. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Updating XRReferenceSpace origin offset updates view and input matrices. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini
index 6477b9e..5c8b175 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffsetBounded.https.html.ini
@@ -1,8 +1,10 @@
 [xrReferenceSpace_originOffsetBounded.https.html]
   [Updating XRBoundedReferenceSpace origin offset updates view, input matrices, and bounds geometry. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Updating XRBoundedReferenceSpace origin offset updates view, input matrices, and bounds geometry. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini
index b7d57916..0655b71 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_originOffset_viewer.https.html.ini
@@ -1,8 +1,10 @@
 [xrReferenceSpace_originOffset_viewer.https.html]
   [Creating XRReferenceSpace origin offset off of `viewer` space works. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Creating XRReferenceSpace origin offset off of `viewer` space works. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_relationships.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_relationships.https.html.ini
index 0eb7585..23bd6a8f 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_relationships.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrReferenceSpace_relationships.https.html.ini
@@ -1,8 +1,10 @@
 [xrReferenceSpace_relationships.https.html]
   [Bounded space, viewer space, local and local-floor space have correct poses w.r.t. each other - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Bounded space, viewer space, local and local-floor space have correct poses w.r.t. each other - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_constructor.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_constructor.https.html.ini
index acc1b992..66fef7e77 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_constructor.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_constructor.https.html.ini
@@ -1,8 +1,10 @@
 [xrRigidTransform_constructor.https.html]
   [XRRigidTransform constructor works - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRRigidTransform constructor works - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_inverse.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_inverse.https.html.ini
index a1e73af9..62f82b5 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_inverse.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_inverse.https.html.ini
@@ -1,8 +1,10 @@
 [xrRigidTransform_inverse.https.html]
   [XRRigidTransform inverse works - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRRigidTransform inverse works - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_sameObject.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_sameObject.https.html.ini
index 2a26b31..2074a24 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_sameObject.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrRigidTransform_sameObject.https.html.ini
@@ -1,8 +1,10 @@
 [xrRigidTransform_sameObject.https.html]
   [XRRigidTransform position and orientation meet [SameObject\] requirements - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRRigidTransform position and orientation meet [SameObject\] requirements - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_cancelAnimationFrame.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_cancelAnimationFrame.https.html.ini
index 376c78f..22b6764 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_cancelAnimationFrame.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_cancelAnimationFrame.https.html.ini
@@ -1,16 +1,20 @@
 [xrSession_cancelAnimationFrame.https.html]
   [XRSession requestAnimationFrame callbacks can be unregistered with cancelAnimationFrame for immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession requestAnimationFrame callbacks can be unregistered with cancelAnimationFrame for immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession requestAnimationFrame callbacks can be unregistered with cancelAnimationFrame for non-immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession requestAnimationFrame callbacks can be unregistered with cancelAnimationFrame for non-immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini
index 0f793a1f..57ad315 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_cancelAnimationFrame_invalidhandle.https.html.ini
@@ -1,16 +1,20 @@
 [xrSession_cancelAnimationFrame_invalidhandle.https.html]
   [XRSession cancelAnimationFrame does not have unexpected behavior when given invalid handles on immersive testSession - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession cancelAnimationFrame does not have unexpected behavior when given invalid handles on immersive testSession - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession cancelAnimationFrame does not have unexpected behavior when given invalid handles on non-immersive testSession - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession cancelAnimationFrame does not have unexpected behavior when given invalid handles on non-immersive testSession - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_enabledFeatures.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_enabledFeatures.https.html.ini
index f27edb3f..7b77e93 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_enabledFeatures.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_enabledFeatures.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_enabledFeatures.https.html]
   [Validate enabledFeatures on XRSession - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Validate enabledFeatures on XRSession - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_end.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_end.https.html.ini
index fba913c..d554603 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_end.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_end.https.html.ini
@@ -1,16 +1,20 @@
 [xrSession_end.https.html]
   [end event fires when immersive session ends - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [end event fires when immersive session ends - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [end event fires when non-immersive session ends - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [end event fires when non-immersive session ends - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_input_events_end.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_input_events_end.https.html.ini
index af0c3b9..47dbdae 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_input_events_end.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_input_events_end.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_input_events_end.https.html]
   [Calling end during an input callback stops processing at the right time - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Calling end during an input callback stops processing at the right time - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini
index fe514f5d..7811d411 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_callback_calls.https.html.ini
@@ -1,16 +1,20 @@
 [xrSession_requestAnimationFrame_callback_calls.https.html]
   [XRSession requestAnimationFrame calls the provided callback a non-immersive session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession requestAnimationFrame calls the provided callback a non-immersive session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession requestAnimationFrame calls the provided callback for an immersive session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession requestAnimationFrame calls the provided callback for an immersive session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini
index a59fbfd..2dc844f4 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_data_valid.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_requestAnimationFrame_data_valid.https.html]
   [RequestAnimationFrame resolves with good data - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [RequestAnimationFrame resolves with good data - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini
index 3bbcc415..465544e 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_getViewerPose.https.html.ini
@@ -1,15 +1,18 @@
 [xrSession_requestAnimationFrame_getViewerPose.https.html]
   [XRFrame getViewerPose updates on the next frame for immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame getViewerPose updates on the next frame for immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame getViewerPose updates on the next frame for non-immersive sessions - webgl]
     expected: FAIL
 
   [XRFrame getViewerPose updates on the next frame for non-immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini
index 786c841a..d871fc6f 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestAnimationFrame_timestamp.https.html.ini
@@ -1,16 +1,20 @@
 [xrSession_requestAnimationFrame_timestamp.https.html]
   [XRFrame getViewerPose updates on the next frame for immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame getViewerPose updates on the next frame for immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame getViewerPose updates on the next frame for non-immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame getViewerPose updates on the next frame for non-immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace.https.html.ini
index 4705cc6..1a0435c60 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace.https.html.ini
@@ -1,16 +1,20 @@
 [xrSession_requestReferenceSpace.https.html]
   [Immersive XRSession requestReferenceSpace returns expected objects - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Immersive XRSession requestReferenceSpace returns expected objects - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Non-immersive XRSession requestReferenceSpace returns expected objects - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Non-immersive XRSession requestReferenceSpace returns expected objects - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html.ini
index 9751f3d..61c83c11 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestReferenceSpace_features.https.html.ini
@@ -3,117 +3,141 @@
     if (product == "content_shell") and (os == "mac") and (port == "mac12"): TIMEOUT
   [Immersive session rejects local-floor space if not requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Immersive session rejects local-floor space if not requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Immersive session supports local space by default - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Immersive session supports local space by default - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Immersive session supports local-floor space when optional - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Immersive session supports local-floor space when optional - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Immersive session supports local-floor space when required - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Immersive session supports local-floor space when required - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Immersive session supports viewer space by default - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Immersive session supports viewer space by default - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session rejects bounded-floor space even when requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session rejects bounded-floor space even when requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session rejects local space if not requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session rejects local space if not requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session rejects unbounded space even when requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session rejects unbounded space even when requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session supports local space when optional - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session supports local space when optional - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session supports local space when required - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session supports local space when required - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session supports local-floor space when required - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session supports local-floor space when required - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session supports viewer space by default - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
 
   [Non-immersive session supports viewer space by default - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): [FAIL, PASS]
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): [FAIL, PASS]
       [PASS, FAIL]
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestSessionDuringEnd.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestSessionDuringEnd.https.html.ini
index a8d4058..dd14d683c 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestSessionDuringEnd.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_requestSessionDuringEnd.https.html.ini
@@ -1,16 +1,20 @@
 [xrSession_requestSessionDuringEnd.https.html]
   [Create mew session in end promise - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Create mew session in end promise - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Create new session in OnSessionEnded event - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Create new session in OnSessionEnded event - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_sameObject.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_sameObject.https.html.ini
index 808a21f..d58ebdb 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_sameObject.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_sameObject.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_sameObject.https.html]
   [XRSession attributes meet [SameObject\] requirement - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRSession attributes meet [SameObject\] requirement - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_viewer_referenceSpace.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_viewer_referenceSpace.https.html.ini
index 104789b..127e15b 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_viewer_referenceSpace.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_viewer_referenceSpace.https.html.ini
@@ -1,16 +1,20 @@
 [xrSession_viewer_referenceSpace.https.html]
   [Identity reference space provides correct poses for immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Identity reference space provides correct poses for immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Identity reference space provides correct poses for inline sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Identity reference space provides correct poses for inline sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrSession_visibilityState.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrSession_visibilityState.https.html.ini
index 22160e1..31db7db 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrSession_visibilityState.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrSession_visibilityState.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_visibilityState.https.html]
   [Ensures that the XRSession's visibilityState is correctly reported and that the associated visibilitychange event fires. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures that the XRSession's visibilityState is correctly reported and that the associated visibilitychange event fires. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html.ini
index 29681fe0..99e3b35 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrStationaryReferenceSpace_floorlevel_updates.https.html.ini
@@ -1,16 +1,20 @@
 [xrStationaryReferenceSpace_floorlevel_updates.https.html]
   ['floor-level' XRStationaryReferenceSpace updates properly when the transform changes for immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   ['floor-level' XRStationaryReferenceSpace updates properly when the transform changes for immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   ['floor-level' XRStationaryReferenceSpace updates properly when the transform changes for non-immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   ['floor-level' XRStationaryReferenceSpace updates properly when the transform changes for non-immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html.ini
index 0c60b77d..b5a197d 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrView_eyes.https.html.ini
@@ -1,16 +1,20 @@
 [xrView_eyes.https.html]
   [XRView.eye is correct for immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRView.eye is correct for immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRView.eye is correct for non-immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRView.eye is correct for non-immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrView_match.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrView_match.https.html.ini
index c3baeb69..0505f42c 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrView_match.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrView_match.https.html.ini
@@ -1,8 +1,10 @@
 [xrView_match.https.html]
   [XRFrame contains the expected views - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame contains the expected views - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrView_oneframeupdate.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrView_oneframeupdate.https.html.ini
index ba20722..3b79c59 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrView_oneframeupdate.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrView_oneframeupdate.https.html.ini
@@ -1,8 +1,10 @@
 [xrView_oneframeupdate.https.html]
   [XRView projection matrices update near and far depths on the next frame - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRView projection matrices update near and far depths on the next frame - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrView_sameObject.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrView_sameObject.https.html.ini
index 069955f..40ab9df8 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrView_sameObject.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrView_sameObject.https.html.ini
@@ -1,8 +1,10 @@
 [xrView_sameObject.https.html]
   [XRView attributes meet [SameObject\] requirement - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRView attributes meet [SameObject\] requirement - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrViewerPose_secondaryViews.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrViewerPose_secondaryViews.https.html.ini
index 7b2beeb..3f1d1eb 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrViewerPose_secondaryViews.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrViewerPose_secondaryViews.https.html.ini
@@ -1,32 +1,40 @@
 [xrViewerPose_secondaryViews.https.html]
   [Only primary views are returned if secondary views are not requested for immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Only primary views are returned if secondary views are not requested for immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Only primary views are returned if secondary views are not requested for non-immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Only primary views are returned if secondary views are not requested for non-immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Requesting secondary views only returns primary views for non-immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Requesting secondary views only returns primary views for non-immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Requesting secondary views returns both primary and secondary views for immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Requesting secondary views returns both primary and secondary views for immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrViewerPose_views_sameObject.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrViewerPose_views_sameObject.https.html.ini
index c72689e..2aa5643 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrViewerPose_views_sameObject.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrViewerPose_views_sameObject.https.html.ini
@@ -1,8 +1,10 @@
 [xrViewerPose_views_sameObject.https.html]
   [XRViewerPose.views meets [SameObject\] requirement - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRViewerPose.views meets [SameObject\] requirement - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrViewport_valid.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrViewport_valid.https.html.ini
index 4022805aa..66cccc7 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrViewport_valid.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrViewport_valid.https.html.ini
@@ -1,16 +1,20 @@
 [xrViewport_valid.https.html]
   [XRViewport attributes are valid - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRViewport attributes are valid - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRViewport attributes are valid with secondary views requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRViewport attributes are valid with secondary views requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_constructor.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_constructor.https.html.ini
index 52f9a21a..7c660ed 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_constructor.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_constructor.https.html.ini
@@ -1,8 +1,10 @@
 [xrWebGLLayer_constructor.https.html]
   [Ensure that XRWebGLLayer's constructor throws appropriate errors using webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure that XRWebGLLayer's constructor throws appropriate errors using webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini
index bee5ddc..4d478f8 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_draw.https.html.ini
@@ -1,8 +1,10 @@
 [xrWebGLLayer_framebuffer_draw.https.html]
   [Ensure a WebGL layer's framebuffer can only be drawn to inside a XR frame - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure a WebGL layer's framebuffer can only be drawn to inside a XR frame - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini
index 827b02ad..5a98088 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_sameObject.https.html.ini
@@ -1,8 +1,10 @@
 [xrWebGLLayer_framebuffer_sameObject.https.html]
   [XRWebGLLayer.framebuffer meets [SameObject\] requirement - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer.framebuffer meets [SameObject\] requirement - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_scale.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_scale.https.html.ini
index d92e419e..4d27b9b3 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_scale.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_framebuffer_scale.https.html.ini
@@ -1,8 +1,10 @@
 [xrWebGLLayer_framebuffer_scale.https.html]
   [Ensure framebuffer scaling works as expected. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure framebuffer scaling works as expected. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini
index 308b903..f6639afa 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_opaque_framebuffer.https.html.ini
@@ -1,16 +1,20 @@
 [xrWebGLLayer_opaque_framebuffer.https.html]
   [Ensure that the framebuffer given by the WebGL layer is opaque for immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure that the framebuffer given by the WebGL layer is opaque for immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure that the framebuffer given by the WebGL layer is opaque for non-immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure that the framebuffer given by the WebGL layer is opaque for non-immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_opaque_framebuffer_stencil.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_opaque_framebuffer_stencil.https.html.ini
index 61d6a44..5d848bd 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_opaque_framebuffer_stencil.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_opaque_framebuffer_stencil.https.html.ini
@@ -1,8 +1,10 @@
 [xrWebGLLayer_opaque_framebuffer_stencil.https.html]
   [Ensure that the framebuffer given by the WebGL layer works with stencil for immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure that the framebuffer given by the WebGL layer works with stencil for immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html.ini
index 865f306..0e1f454 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xrWebGLLayer_viewports.https.html.ini
@@ -1,32 +1,40 @@
 [xrWebGLLayer_viewports.https.html]
   [XRWebGLLayer reports a valid viewports for immersive sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer reports a valid viewports for immersive sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer reports a valid viewports for immersive sessions with secondary views requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer reports a valid viewports for immersive sessions with secondary views requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer reports a valid viewports for inline sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer reports a valid viewports for inline sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer reports a valid viewports for inline sessions with secondary views requested - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRWebGLLayer reports a valid viewports for inline sessions with secondary views requested - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/external/wpt/webxr/xr_viewport_scale.https.html.ini b/third_party/blink/web_tests/external/wpt/webxr/xr_viewport_scale.https.html.ini
index 3ce4876..a109a93 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/xr_viewport_scale.https.html.ini
+++ b/third_party/blink/web_tests/external/wpt/webxr/xr_viewport_scale.https.html.ini
@@ -1,153 +1,182 @@
 [xr_viewport_scale.https.html]
   expected:
+    if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): OK
     if (product == "content_shell") and (os == "mac") and (port == "mac13"): TIMEOUT
-    if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): OK
+    if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): OK
     if (product == "content_shell") and (os == "win"): [OK, TIMEOUT]
     if (product == "content_shell") and (os == "linux"): OK
     [TIMEOUT, OK]
   [recommendedViewportScale for immersive-vr session - webgl]
     expected:
       if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [NOTRUN, TIMEOUT, PRECONDITION_FAILED]
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if product == "chrome": [NOTRUN, TIMEOUT, PRECONDITION_FAILED]
       PRECONDITION_FAILED
 
   [recommendedViewportScale for immersive-vr session - webgl2]
     expected:
       if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [TIMEOUT, PRECONDITION_FAILED, NOTRUN]
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if product == "chrome": [TIMEOUT, NOTRUN, PRECONDITION_FAILED]
       PRECONDITION_FAILED
 
   [recommendedViewportScale for inline session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       PRECONDITION_FAILED
 
   [recommendedViewportScale for inline session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       PRECONDITION_FAILED
 
   [requestViewportScale applied next frame for immersive-vr session - webgl]
     expected:
       if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, NOTRUN]
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if product == "chrome": [PASS, NOTRUN]
 
   [requestViewportScale applied next frame for immersive-vr session - webgl2]
     expected:
       if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, TIMEOUT, NOTRUN]
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if product == "chrome": [PASS, TIMEOUT, NOTRUN]
 
   [requestViewportScale applied next frame for inline session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       PRECONDITION_FAILED
 
   [requestViewportScale applied next frame for inline session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       PRECONDITION_FAILED
 
   [requestViewportScale same frame for immersive-vr session - webgl]
     expected:
       if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, NOTRUN]
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if product == "chrome": [PASS, NOTRUN]
 
   [requestViewportScale same frame for immersive-vr session - webgl2]
     expected:
       if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, NOTRUN]
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if product == "chrome": [PASS, NOTRUN]
 
   [requestViewportScale same frame for inline session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       PRECONDITION_FAILED
 
   [requestViewportScale same frame for inline session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       PRECONDITION_FAILED
 
   [requestViewportScale valid viewport for immersive-vr session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [requestViewportScale valid viewport for immersive-vr session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [requestViewportScale valid viewport for inline session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [requestViewportScale valid viewport for inline session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [requestViewportScale valid viewport w/ null scale for immersive-vr session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [requestViewportScale valid viewport w/ null scale for immersive-vr session - webgl2]
     expected:
       if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, TIMEOUT]
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): [PASS, TIMEOUT]
       if product == "chrome": [PASS, TIMEOUT]
 
   [requestViewportScale valid viewport w/ null scale for inline session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [requestViewportScale valid viewport w/ null scale for inline session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [requestViewportScale valid viewport w/ undefined scale for immersive-vr session - webgl]
     expected:
       if (product == "content_shell") and (os == "win") and (port == "win10.20h2"): [PASS, NOTRUN]
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): [PASS, NOTRUN]
       if product == "chrome": [PASS, NOTRUN]
 
   [requestViewportScale valid viewport w/ undefined scale for immersive-vr session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): [PASS, NOTRUN]
       if (product == "content_shell") and (os == "win"): [PASS, NOTRUN]
       if product == "chrome": [PASS, NOTRUN]
 
   [requestViewportScale valid viewport w/ undefined scale for inline session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [requestViewportScale valid viewport w/ undefined scale for inline session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): [PASS, NOTRUN]
       if (product == "content_shell") and (os == "win"): [PASS, NOTRUN]
       if product == "chrome": [PASS, NOTRUN]
 
   [requestViewportScale valid viewport w/ very small scale for immersive-vr session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
       if (product == "content_shell") and (os == "mac") and (port == "mac10.15"): [PASS, NOTRUN]
       if (product == "content_shell") and (os == "win"): [PASS, NOTRUN]
       if product == "chrome": [PASS, NOTRUN]
 
   [requestViewportScale valid viewport w/ very small scale for inline session - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [requestViewportScale valid viewport w/ very small scale for inline session - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/shared-storage/debugger-pause-on-first-script-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/shared-storage/debugger-pause-on-first-script-expected.txt
new file mode 100644
index 0000000..0fd93700b
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/shared-storage/debugger-pause-on-first-script-expected.txt
@@ -0,0 +1,17 @@
+Tests debugger pause in shared storage worklet.
+{
+    sessionId : <string>
+    targetInfo : {
+        attached : true
+        browserContextId : <string>
+        canAccessOpener : false
+        targetId : <string>
+        title : Shared storage worklet for http://127.0.0.1:8000/inspector-protocol/shared-storage/resources/module.js
+        type : shared_storage_worklet
+        url : http://127.0.0.1:8000/inspector-protocol/shared-storage/resources/module.js
+    }
+    waitingForDebugger : true
+}
+Paused at http://127.0.0.1:8000/inspector-protocol/shared-storage/resources/module.js:0:0
+[WORKLET]: loaded module, test token: 42
+
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/shared-storage/debugger-pause-on-first-script.js b/third_party/blink/web_tests/http/tests/inspector-protocol/shared-storage/debugger-pause-on-first-script.js
new file mode 100644
index 0000000..5b5d3ba2
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/shared-storage/debugger-pause-on-first-script.js
@@ -0,0 +1,42 @@
+(async function(testRunner) {
+  const {session, dp} = await testRunner.startURL(
+    'http://127.0.0.1:8000/inspector-protocol/shared-storage/resources/empty.html',
+    'Tests debugger pause in shared storage worklet.');
+
+  const bp = testRunner.browserP();
+  await bp.Target.setAutoAttach({autoAttach: true, flatten: true, waitForDebuggerOnStart: true});
+
+  session.evaluateAsync(`
+    sharedStorage.worklet.addModule('http://127.0.0.1:8000/inspector-protocol/shared-storage/resources/module.js');
+  `);
+
+  const worklet = (await bp.Target.onceAttachedToTarget()).params;
+  testRunner.log(worklet);
+
+  const worklet_session = session.createChild(worklet.sessionId);
+  const wp = worklet_session.protocol;
+  wp.Runtime.onConsoleAPICalled(event => {
+    testRunner.log(`[WORKLET]: ${event.params.args[0].value}`);
+  });
+  const scripts = new Map();
+  wp.Debugger.onScriptParsed(({params}) => {
+    scripts.set(params.scriptId, params.url);
+  });
+
+  wp.Runtime.enable();
+  wp.Debugger.enable();
+  wp.Debugger.pause();
+  wp.Runtime.runIfWaitingForDebugger();
+
+  const paused = (await wp.Debugger.oncePaused()).params;
+
+  const location = paused.callFrames[0].functionLocation;
+  testRunner.log(`Paused at ${scripts.get(location.scriptId) ?? '<unknown>'}:${location.lineNumber}:${location.columnNumber}`);
+  worklet_session.evaluate(`testToken = 42;`);
+  wp.Debugger.resume();
+
+  // This should return once top-level script completes and hence the
+  // console message is logged.
+  await worklet_session.evaluate("");
+  testRunner.completeTest();
+});
\ No newline at end of file
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/shared-storage/resources/module.js b/third_party/blink/web_tests/http/tests/inspector-protocol/shared-storage/resources/module.js
index 3d50cd0..475aa67 100644
--- a/third_party/blink/web_tests/http/tests/inspector-protocol/shared-storage/resources/module.js
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/shared-storage/resources/module.js
@@ -1,3 +1,4 @@
+console.log(`loaded module, test token: ${typeof(testToken) === 'undefined' ? '<undefined>' : testToken}`);
 var globalVar = 0;
 
 class EmptyOperation {
diff --git a/third_party/blink/web_tests/http/tests/lcp-script-observer/lcp-img-creation-vs-insertion.html b/third_party/blink/web_tests/http/tests/lcp-script-observer/lcp-img-creation-vs-insertion.html
index f4ae8a5..6a34739 100644
--- a/third_party/blink/web_tests/http/tests/lcp-script-observer/lcp-img-creation-vs-insertion.html
+++ b/third_party/blink/web_tests/http/tests/lcp-script-observer/lcp-img-creation-vs-insertion.html
@@ -26,21 +26,26 @@
 
         // wait until IMG becomes LCP to remove flakiness.
         const lcp = entries.find(entry => entry.element.nodeName === 'IMG');
-        if (lcp) resolve(lcp);
+        resolve(lcp);
       });
       observer.observe({type: "largest-contentful-paint", buffered: true});
 
-    }).then(lcp => {
-      // ensure LCP is an image.
-      assert_equals(lcp.element.nodeName, 'IMG');
+    }).then(lcpImage => {
+      if (lcpImage) {
+        // look for creator scripts if LCP is an image.
+        assert_equals(lcpImage.element.nodeName, 'IMG');
 
-      // assert LCP image knows its creator scripts.
-      const creators = internals.getCreatorScripts(lcp.element)
-        .map(url => new URL(url).pathname);
-      assert_array_equals(creators, [
-        '/lcp-script-observer/resources/lcp-img-insert.js',
-        '/lcp-script-observer/resources/lcp-img-create.js',
-      ]);
+        // assert LCP image knows its creator scripts.
+        const creators = internals.getCreatorScripts(lcpImage.element)
+          .map(url => new URL(url).pathname);
+        assert_array_equals(creators, [
+          '/lcp-script-observer/resources/lcp-img-insert.js',
+          '/lcp-script-observer/resources/lcp-img-create.js',
+        ]);
+      }
+      else {
+        console.log('LCP was NOT an image.');
+      }
     });
   }, 'LCP element knows its dependencies, including creation and insertion scripts');
 
diff --git a/third_party/blink/web_tests/virtual/third-party-cookie-phaseout-enabled/external/wpt/service-workers/service-worker/partitioned-cookies.tentative.https-expected.txt b/third_party/blink/web_tests/virtual/third-party-cookie-phaseout-enabled/external/wpt/service-workers/service-worker/partitioned-cookies.tentative.https-expected.txt
new file mode 100644
index 0000000..d4a1375
--- /dev/null
+++ b/third_party/blink/web_tests/virtual/third-party-cookie-phaseout-enabled/external/wpt/service-workers/service-worker/partitioned-cookies.tentative.https-expected.txt
@@ -0,0 +1,7 @@
+This is a testharness.js-based test.
+PASS Service Worker: Partitioned Cookies
+PASS Service Worker: Partitioned Cookies 3P Window
+FAIL Service Worker: Partitioned Cookies 3P Iframe assert_true: Worker can access unpartitioned cookie via HTTP expected true got false
+PASS Service Worker: Partitioned Cookies 3P Credentialless Iframe
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/wpt_internal/messaging/message-port-memory.any.js.ini b/third_party/blink/web_tests/wpt_internal/messaging/message-port-memory.any.js.ini
new file mode 100644
index 0000000..79171625
--- /dev/null
+++ b/third_party/blink/web_tests/wpt_internal/messaging/message-port-memory.any.js.ini
@@ -0,0 +1,10 @@
+[message-port-memory.any.html]
+  [Message ports get GCed after they are no longer referenced.]
+    expected:
+      if product == "chrome": FAIL
+
+
+[message-port-memory.any.worker.html]
+  [Message ports get GCed after they are no longer referenced.]
+    expected:
+      if product == "chrome": FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_anchor_getAnchors_null.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_anchor_getAnchors_null.https.html.ini
index 63cc723..30386f9 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_anchor_getAnchors_null.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_anchor_getAnchors_null.https.html.ini
@@ -1,8 +1,10 @@
 [ar_anchor_getAnchors_null.https.html]
   [XRFrame's trackedAnchors is empty when the feature was requested & device returned null anchorsData - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame's trackedAnchors is empty when the feature was requested & device returned null anchorsData - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html.ini
index b0b4a415..c122607 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html.ini
@@ -1,32 +1,40 @@
 [ar_hittestsource_lifetimes.https.html]
   [Ensures hit test source cancellation propagates to the device when manually cancelled. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures hit test source cancellation propagates to the device when manually cancelled. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures hit test source cancellation propagates to the device when relying on GC - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures hit test source cancellation propagates to the device when relying on GC - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures transient input hit test source cancellation propagates to the device when manually cancelled. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures transient input hit test source cancellation propagates to the device when manually cancelled. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures transient input hit test source cancellation propagates to the device when relying on GC - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures transient input hit test source cancellation propagates to the device when relying on GC - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_light_estimation.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_light_estimation.https.html.ini
index 9b356c64..6199eab 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_light_estimation.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/ar/ar_light_estimation.https.html.ini
@@ -1,16 +1,20 @@
 [ar_light_estimation.https.html]
   [Ensure lighting estimation feature does not work when not explicitly enabled - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensure lighting estimation feature does not work when not explicitly enabled - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures lighting estimation feature works when enabled - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Ensures lighting estimation feature works when enabled - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/render_state_vertical_fov_inline.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/render_state_vertical_fov_inline.https.html.ini
index f12b719..2bd3420 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/render_state_vertical_fov_inline.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/render_state_vertical_fov_inline.https.html.ini
@@ -1,8 +1,10 @@
 [render_state_vertical_fov_inline.https.html]
   [inlineVerticalFieldOfView is set appropriately on inline sessions - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [inlineVerticalFieldOfView is set appropriately on inline sessions - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/xrFrame_getPose.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/xrFrame_getPose.https.html.ini
index b143d70..a492b8a 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/xrFrame_getPose.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/xrFrame_getPose.https.html.ini
@@ -1,8 +1,10 @@
 [xrFrame_getPose.https.html]
   [XRFrame.getPose works between eye-level and floor-level spaces - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [XRFrame.getPose works between eye-level and floor-level spaces - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/xrSession_dataProviderDisconnect_immersive.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/xrSession_dataProviderDisconnect_immersive.https.html.ini
index 2d429417..2d5baf2 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/xrSession_dataProviderDisconnect_immersive.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/xrSession_dataProviderDisconnect_immersive.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_dataProviderDisconnect_immersive.https.html]
   [Immersive session ends if data provider disconnects. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Immersive session ends if data provider disconnects. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/xrSession_dataProviderDisconnect_inline.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/xrSession_dataProviderDisconnect_inline.https.html.ini
index 7b7cdc6c..d0c75dd8 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/xrSession_dataProviderDisconnect_inline.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/xrSession_dataProviderDisconnect_inline.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_dataProviderDisconnect_inline.https.html]
   [Inline session ends if magic window data provider disconnects. - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Inline session ends if magic window data provider disconnects. - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/xrSession_environmentBlendMode.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/xrSession_environmentBlendMode.https.html.ini
index 47888a8a..741ba83 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/xrSession_environmentBlendMode.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/xrSession_environmentBlendMode.https.html.ini
@@ -1,16 +1,20 @@
 [xrSession_environmentBlendMode.https.html]
   [environmentBlendMode is correct for a VR device in immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [environmentBlendMode is correct for a VR device in immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [environmentBlendMode is correct for a VR device in non-immersive - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [environmentBlendMode is correct for a VR device in non-immersive - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/xrSession_environmentProviderDisconnect.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/xrSession_environmentProviderDisconnect.https.html.ini
index b18772ff3..963c10c 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/xrSession_environmentProviderDisconnect.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/xrSession_environmentProviderDisconnect.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_environmentProviderDisconnect.https.html]
   [Outstanding promises get rejected if environmentProvider disconnects - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Outstanding promises get rejected if environmentProvider disconnects - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/xrSession_framesThrottled.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/xrSession_framesThrottled.https.html.ini
index 4bdcce6..88acdae 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/xrSession_framesThrottled.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/xrSession_framesThrottled.https.html.ini
@@ -1,8 +1,10 @@
 [xrSession_framesThrottled.https.html]
   [Blink appropriately reports when frames are throttled - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [Blink appropriately reports when frames are throttled - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/xrWebGLLayer_dirty_framebuffer.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/xrWebGLLayer_dirty_framebuffer.https.html.ini
index b88971a7..5bf238c2 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/xrWebGLLayer_dirty_framebuffer.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/xrWebGLLayer_dirty_framebuffer.https.html.ini
@@ -1,8 +1,10 @@
 [xrWebGLLayer_dirty_framebuffer.https.html]
   [A frame should be submitted if the base layer was written to during requestAnimationFrame - webgl]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
 
   [A frame should be submitted if the base layer was written to during requestAnimationFrame - webgl2]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/blink/web_tests/wpt_internal/webxr/xr_view_projection_detached.https.html.ini b/third_party/blink/web_tests/wpt_internal/webxr/xr_view_projection_detached.https.html.ini
index 9fc18187..0490121 100644
--- a/third_party/blink/web_tests/wpt_internal/webxr/xr_view_projection_detached.https.html.ini
+++ b/third_party/blink/web_tests/wpt_internal/webxr/xr_view_projection_detached.https.html.ini
@@ -1,4 +1,5 @@
 [xr_view_projection_detached.https.html]
   [Test that xrview.projection being detached doesn't cause a crash.]
     expected:
-      if (product == "content_shell") and (os == "mac") and (port == "mac12-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac13-arm64"): FAIL
+      if (product == "content_shell") and (os == "mac") and (port == "mac11-arm64"): FAIL
diff --git a/third_party/closure_compiler/externs/extension_types.js b/third_party/closure_compiler/externs/extension_types.js
index 659bb4eb3..365d2715 100644
--- a/third_party/closure_compiler/externs/extension_types.js
+++ b/third_party/closure_compiler/externs/extension_types.js
@@ -114,5 +114,4 @@
 chrome.extensionTypes.ExecutionWorld = {
   ISOLATED: 'ISOLATED',
   MAIN: 'MAIN',
-  USER_SCRIPT: 'USER_SCRIPT',
 };
diff --git a/third_party/dawn b/third_party/dawn
index cef64ad..335656a 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit cef64adb5d612633e7f02d538651f0e317e4da55
+Subproject commit 335656a25637d3d616edb560c6a2e766a96e2bcf
diff --git a/third_party/skia b/third_party/skia
index f45ac45..f4f3c90 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit f45ac4569300c567cf285051a62b9c7aa1657cd0
+Subproject commit f4f3c909993df833b8e56a4cf9735e8d85f236f9
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl
index d18b9c1..14955210 100644
--- a/tools/mb/mb_config.pyl
+++ b/tools/mb/mb_config.pyl
@@ -140,7 +140,6 @@
       'android-cronet-x64-rel': 'android_cronet_release_bot_minimal_symbols_x64_reclient',
       'android-cronet-x86-dbg': 'android_cronet_debug_static_bot_x86_reclient',
       'android-cronet-x86-rel': 'android_cronet_release_bot_minimal_symbols_x86_reclient',
-      'android-nougat-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient',
       'android-oreo-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient',
       'android-pie-arm64-rel': 'android_release_bot_minimal_symbols_arm64_webview_monochrome_reclient',
       'android-pie-x86-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient',
@@ -1097,7 +1096,6 @@
       'android-deterministic-rel': 'android_without_codecs_release_trybot_reclient',
       'android-fieldtrial-rel': 'android_release_trybot_x64_fastbuild_webview_trichrome_reclient',
       'android-inverse-fieldtrials-pie-x86-fyi-rel': 'android_release_trybot_x86_fastbuild_webview_google_invert_fieldtrials_reclient',
-      'android-nougat-x86-rel': 'android_release_trybot_x86_fastbuild_webview_monochrome_coverage_reclient',
       'android-oreo-arm64-dbg': 'android_debug_trybot_arm64_reclient',
       'android-oreo-x86-rel': 'android_release_trybot_x86_fastbuild_webview_monochrome_coverage_reclient',
       'android-perfetto-rel': 'perfetto_release_trybot_reclient_android',
diff --git a/tools/mb/mb_config_expectations/chromium.android.json b/tools/mb/mb_config_expectations/chromium.android.json
index 8ee7586..f39cea95 100644
--- a/tools/mb/mb_config_expectations/chromium.android.json
+++ b/tools/mb/mb_config_expectations/chromium.android.json
@@ -752,24 +752,6 @@
       "use_thin_lto": false
     }
   },
-  "android-nougat-x86-rel": {
-    "gn_args": {
-      "android_static_analysis": "off",
-      "dcheck_always_on": false,
-      "debuggable_apks": false,
-      "ffmpeg_branding": "Chrome",
-      "is_component_build": false,
-      "is_debug": false,
-      "proprietary_codecs": true,
-      "strip_debug_info": true,
-      "symbol_level": 1,
-      "system_webview_package_name": "com.google.android.apps.chrome",
-      "system_webview_shell_package_name": "org.chromium.my_webview_shell",
-      "target_cpu": "x86",
-      "target_os": "android",
-      "use_remoteexec": true
-    }
-  },
   "android-oreo-x86-rel": {
     "gn_args": {
       "android_static_analysis": "off",
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
index 2a7275a6..01fc8148 100644
--- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json
+++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -1053,27 +1053,6 @@
       "use_remoteexec": true
     }
   },
-  "android-nougat-x86-rel": {
-    "gn_args": {
-      "android_static_analysis": "off",
-      "coverage_instrumentation_input_file": "//.code-coverage/files_to_instrument.txt",
-      "dcheck_always_on": true,
-      "debuggable_apks": false,
-      "ffmpeg_branding": "Chrome",
-      "is_component_build": false,
-      "is_debug": false,
-      "proprietary_codecs": true,
-      "strip_debug_info": true,
-      "symbol_level": 0,
-      "system_webview_package_name": "com.google.android.apps.chrome",
-      "system_webview_shell_package_name": "org.chromium.my_webview_shell",
-      "target_cpu": "x86",
-      "target_os": "android",
-      "use_dummy_lastchange": true,
-      "use_jacoco_coverage": true,
-      "use_remoteexec": true
-    }
-  },
   "android-oreo-arm64-dbg": {
     "gn_args": {
       "debuggable_apks": false,
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 2b2da6b..16618c0 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -9518,30 +9518,31 @@
   <int value="2" label="No suggestion, user changed form, form submitted"/>
   <int value="3" label="No suggestion, user changed form, no form submitted"/>
   <int value="4"
-      label="No suggestion, user didn't change form, form submitted"/>
+      label="No suggestion, user did not change form, form submitted"/>
   <int value="5"
-      label="No suggestion, user didn't change form, no form submitted"/>
+      label="No suggestion, user did not change form, no form submitted"/>
   <int value="6"
-      label="user selected suggestion, user changed form, form submitted"/>
+      label="User selected suggestion, user changed form, form submitted"/>
   <int value="7"
-      label="user selected suggestion, user changed form, no form submitted"/>
+      label="User selected suggestion, user changed form, no form submitted"/>
   <int value="8"
-      label="user selected suggestion, user didn't change form, form
+      label="User selected suggestion, user did not change form, form
              submitted"/>
   <int value="9"
-      label="user selected suggestion, user didn't change form, no form
+      label="User selected suggestion, user did not change form, no form
              submitted"/>
   <int value="10"
-      label="user not selected suggestion, user changed form, form submitted"/>
+      label="User did not select suggestion, user changed form, form
+             submitted"/>
   <int value="11"
-      label="user not selected suggestion, user changed form, no form
+      label="User did not select suggestion, user changed form, no form
              submitted"/>
   <int value="12"
-      label="user not selected suggestion, user didn't change form, form
+      label="User did not select suggestion, user did not change form, form
              submitted"/>
-  <int value="14"
-      label="user not selected suggestion, user didn't change form, no form
-             submitted"/>
+  <int value="13"
+      label="User did not select suggestion, user did not change form, no
+             form submitted"/>
 </enum>
 
 <enum name="AutofillSettingsVisibleTypes">
@@ -54213,6 +54214,7 @@
   <int value="35" label="kIndexedDBEvent"/>
   <int value="36" label="kIndexedDBTransactionIsAcquiringLocks"/>
   <int value="37" label="kIndexedDBTransactionIsBlockingOthers"/>
+  <int value="38" label="kSafeBrowsingUnsafeSubresource"/>
 </enum>
 
 <enum name="InactiveTabsThresholdSettingType">
@@ -77159,6 +77161,16 @@
   <int value="28" label="SetVpnLockdown success"/>
   <int value="29" label="SetDnsRedirectionRule"/>
   <int value="30" label="SetDnsRedirectionRule success"/>
+  <int value="31" label="CreateLocalOnlyNetwork"/>
+  <int value="32" label="CreateLocalOnlyNetworkSuccess"/>
+  <int value="33" label="CreateTetheredNetwork"/>
+  <int value="34" label="CreateTetheredNetworkSuccess"/>
+  <int value="35" label="GetDownstreamNetworkInfo"/>
+  <int value="36" label="GetDownstreamNetworkInfoSuccess"/>
+  <int value="37" label="BruschettaVmStartup"/>
+  <int value="38" label="BruschettaVmStartupSuccess"/>
+  <int value="39" label="BruschettaVmShutdown"/>
+  <int value="40" label="BruschettaVmShutdownSuccess"/>
 </enum>
 
 <enum name="NetworkPatchpanelDHCPServerEvent">
@@ -94362,6 +94374,7 @@
   <int value="136" label="IDC_CONTENT_CONTEXT_ORCA"/>
   <int value="137" label="IDC_CONTENT_CONTEXT_RUN_LAYOUT_EXTRACTION"/>
   <int value="138" label="IDC_CONTENT_PASTE_FROM_CLIPBOARD"/>
+  <int value="139" label="IDC_CONTEXT_COMPOSE"/>
 </enum>
 
 <enum name="ReopenTabPromoStepAtDismissal">
diff --git a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
index 8c4d672..d9e019d5 100644
--- a/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
+++ b/tools/metrics/histograms/metadata/METRIC_REVIEWER_OWNERS
@@ -348,6 +348,7 @@
 # safe_browsing
 drubery@chromium.org
 jacastro@chromium.org
+skrakowi@chromium.org
 thefrog@chromium.org
 xinghuilu@chromium.org
 # sb_client
diff --git a/tools/metrics/histograms/metadata/arc/histograms.xml b/tools/metrics/histograms/metadata/arc/histograms.xml
index 8559b74..dbca024 100644
--- a/tools/metrics/histograms/metadata/arc/histograms.xml
+++ b/tools/metrics/histograms/metadata/arc/histograms.xml
@@ -2825,6 +2825,16 @@
   </summary>
 </histogram>
 
+<histogram name="Arc.WM.WindowClosedDelayTime.ArcApp" units="ms"
+    expires_after="2024-10-05">
+  <owner>lingyufeng@google.com</owner>
+  <owner>arc-framework@google.com</owner>
+  <summary>
+    Records the time elapsed from a window closing operation until the window is
+    destroyed. The data is collected once when a closing operation happens.
+  </summary>
+</histogram>
+
 <histogram name="Arc.WM.WindowMaximizedDelayTime.{ChromeOSAppType}" units="ms"
     expires_after="2024-09-30">
   <owner>lingyufeng@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml
index b844c29..b2e0cd4 100644
--- a/tools/metrics/histograms/metadata/browser/histograms.xml
+++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -231,7 +231,7 @@
 </histogram>
 
 <histogram name="Browser.ERP.ResponsePayloadSize" units="bytes"
-    expires_after="2023-11-17">
+    expires_after="2024-10-09">
   <owner>xuhong@chromium.org</owner>
   <owner>lbaraz@chromium.org</owner>
   <owner>cros-reporting-team@google.com</owner>
@@ -244,7 +244,7 @@
 </histogram>
 
 <histogram name="Browser.ERP.SingleRequestPayloadSize" units="bytes"
-    expires_after="2024-02-10">
+    expires_after="2024-10-09">
   <owner>xuhong@chromium.org</owner>
   <owner>lbaraz@chromium.org</owner>
   <owner>cros-reporting-team@google.com</owner>
@@ -295,7 +295,7 @@
 </histogram>
 
 <histogram name="Browser.ERP.{Param}PayloadSizePerHour" units="KiB"
-    expires_after="2023-11-17">
+    expires_after="2024-10-09">
   <owner>xuhong@chromium.org</owner>
   <owner>lbaraz@chromium.org</owner>
   <owner>cros-reporting-team@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml
index c4f3049..bdeeff99 100644
--- a/tools/metrics/histograms/metadata/file/histograms.xml
+++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -1151,6 +1151,17 @@
   </token>
 </histogram>
 
+<histogram name="FileBrowser.OfficeFiles.ODFS.Version" units="version"
+    expires_after="M124">
+  <owner>simmonsjosh@google.com</owner>
+  <owner>src/ui/file_manager/OWNERS</owner>
+  <summary>
+    Chrome OS File Browser: version of the ODFS extension on service worker
+    startup. The version string is encoded in 9 bits to fit max histogram
+    buckets (1002), major: 1 bit (MSB), minor: 3 bits, patch: 5 bits.
+  </summary>
+</histogram>
+
 <histogram name="FileBrowser.OfficeFiles.Open.FileType.{CloudProvider}"
     enum="OfficeOpenExtensions" expires_after="M124">
   <owner>simmonsjosh@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/OWNERS b/tools/metrics/histograms/metadata/safe_browsing/OWNERS
index 65b95a9c..94c9aa5 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/OWNERS
+++ b/tools/metrics/histograms/metadata/safe_browsing/OWNERS
@@ -4,5 +4,6 @@
 # Use chromium-metrics-reviews@google.com as a backup.
 drubery@chromium.org
 jacastro@chromium.org
+skrakowi@chromium.org
 thefrog@chromium.org
 xinghuilu@chromium.org
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index 48586d7..f03311a7 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -284,50 +284,6 @@
   </summary>
 </histogram>
 
-<histogram name="Tab.Preview.TimeToFirstUsableFrameAfterStartCapture"
-    units="ms" expires_after="2023-11-06">
-  <owner>dfried@chromium.org</owner>
-  <owner>collinbaker@chromium.org</owner>
-  <summary>
-    When generating a preview for a background tab, this measures the time
-    between requesting a video capture and receiving the first usable frame.
-  </summary>
-</histogram>
-
-<histogram name="Tab.Preview.TimeToNotifyObserversAfterCaptureReceived"
-    units="microseconds" expires_after="2022-11-27">
-  <obsolete>
-    Removed 12/2022. Not actively used because reported values are 0 most of the
-    time. It would be more useful to report number of discards per day.
-  </obsolete>
-  <owner>dfried@chromium.org</owner>
-  <owner>collinbaker@chromium.org</owner>
-  <summary>
-    When generating a preview, a tab's contents are captured as an uncompressed
-    image, compressed in the background, then sent to subscribers on the main
-    thread. This roughly measures the time between the capture completing and
-    the compressed image being available on the main thread.
-
-    This histogram only records metrics on machines with high-resolution clocks.
-  </summary>
-</histogram>
-
-<histogram name="Tab.Preview.TimeToStoreAfterFrameReceived"
-    units="microseconds" expires_after="2022-11-27">
-  <obsolete>
-    Removed 12/2022. Not actively used because reported values are 0 most of the
-    time. It would be more useful to report number of discards per day.
-  </obsolete>
-  <owner>dfried@chromium.org</owner>
-  <owner>collinbaker@chromium.org</owner>
-  <summary>
-    When generating a preview for a background tab, this measures the time
-    between receiving a frame and storing it as the current thumbnail.
-
-    This histogram only records metrics on machines with high-resolution clocks.
-  </summary>
-</histogram>
-
 <histogram name="Tab.Preview.TimeToStoreAfterTabSwitch" units="ms"
     expires_after="2024-03-31">
   <owner>dfried@chromium.org</owner>
diff --git a/ui/base/clipboard/clipboard_ios.mm b/ui/base/clipboard/clipboard_ios.mm
index e4cda7a..3b791ee4 100644
--- a/ui/base/clipboard/clipboard_ios.mm
+++ b/ui/base/clipboard/clipboard_ios.mm
@@ -7,6 +7,7 @@
 #import <UIKit/UIKit.h>
 
 #include "base/apple/foundation_util.h"
+#include "base/containers/span.h"
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "skia/ext/skia_utils_base.h"
@@ -133,7 +134,10 @@
   NSData* data = GetDataWithTypeFromPasteboard(
       GetPasteboard(), (NSString*)kUTTypeChromiumWebCustomData);
   if (data) {
-    ReadCustomDataTypes([data bytes], [data length], types);
+    ReadCustomDataTypes(
+        base::span(reinterpret_cast<const uint8_t*>([data bytes]),
+                   [data length]),
+        types);
   }
 }
 
@@ -266,7 +270,13 @@
   NSData* data = GetDataWithTypeFromPasteboard(
       GetPasteboard(), (NSString*)kUTTypeChromiumWebCustomData);
   if (data) {
-    ReadCustomDataForType([data bytes], [data length], type, result);
+    if (absl::optional<std::u16string> maybe_result = ReadCustomDataForType(
+            base::span(reinterpret_cast<const uint8_t*>([data bytes]),
+                       [data length]),
+            type);
+        maybe_result) {
+      *result = std::move(*maybe_result);
+    }
   }
 }
 
diff --git a/ui/base/clipboard/clipboard_mac.mm b/ui/base/clipboard/clipboard_mac.mm
index 7cae355..9d80c78 100644
--- a/ui/base/clipboard/clipboard_mac.mm
+++ b/ui/base/clipboard/clipboard_mac.mm
@@ -11,6 +11,7 @@
 
 #include "base/apple/foundation_util.h"
 #include "base/apple/scoped_cftyperef.h"
+#include "base/containers/span.h"
 #include "base/feature_list.h"
 #include "base/files/file_path.h"
 #include "base/logging.h"
@@ -235,8 +236,12 @@
 
   if ([pb.types containsObject:kUTTypeChromiumWebCustomData]) {
     NSData* data = [pb dataForType:kUTTypeChromiumWebCustomData];
-    if ([data length])
-      ReadCustomDataTypes([data bytes], [data length], types);
+    if ([data length]) {
+      ReadCustomDataTypes(
+          base::span(reinterpret_cast<const uint8_t*>([data bytes]),
+                     [data length]),
+          types);
+    }
   }
 }
 
@@ -351,8 +356,15 @@
   NSPasteboard* pb = GetPasteboard();
   if ([[pb types] containsObject:kUTTypeChromiumWebCustomData]) {
     NSData* data = [pb dataForType:kUTTypeChromiumWebCustomData];
-    if ([data length])
-      ReadCustomDataForType([data bytes], [data length], type, result);
+    if ([data length]) {
+      if (absl::optional<std::u16string> maybe_result = ReadCustomDataForType(
+              base::span(reinterpret_cast<const uint8_t*>([data bytes]),
+                         [data length]),
+              type);
+          maybe_result) {
+        *result = std::move(*maybe_result);
+      }
+    }
   }
 }
 
diff --git a/ui/base/clipboard/clipboard_non_backed.cc b/ui/base/clipboard/clipboard_non_backed.cc
index 609bf2ad..ce53e51 100644
--- a/ui/base/clipboard/clipboard_non_backed.cc
+++ b/ui/base/clipboard/clipboard_non_backed.cc
@@ -15,6 +15,7 @@
 
 #include "base/check_op.h"
 #include "base/containers/contains.h"
+#include "base/containers/span.h"
 #include "base/functional/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
@@ -238,8 +239,11 @@
     if (!HasFormat(ClipboardInternalFormat::kCustom))
       return;
 
-    ReadCustomDataForType(data->custom_data_data().c_str(),
-                          data->custom_data_data().size(), type, result);
+    absl::optional<std::u16string> maybe_result = ReadCustomDataForType(
+        base::as_bytes(base::span(data->custom_data_data())), type);
+    if (maybe_result) {
+      *result = std::move(*maybe_result);
+    }
   }
 
   // Reads filenames from the ClipboardData.
@@ -620,9 +624,9 @@
 
   if (clipboard_internal.IsFormatAvailable(ClipboardInternalFormat::kCustom) &&
       clipboard_internal.GetData()) {
-    ReadCustomDataTypes(
-        clipboard_internal.GetData()->custom_data_data().c_str(),
-        clipboard_internal.GetData()->custom_data_data().size(), types);
+    ReadCustomDataTypes(base::as_bytes(base::span(
+                            clipboard_internal.GetData()->custom_data_data())),
+                        types);
   }
 }
 
diff --git a/ui/base/clipboard/clipboard_ozone.cc b/ui/base/clipboard/clipboard_ozone.cc
index fa95c4a..25fab2bf 100644
--- a/ui/base/clipboard/clipboard_ozone.cc
+++ b/ui/base/clipboard/clipboard_ozone.cc
@@ -457,7 +457,7 @@
                         data_dst)) {
     auto data = async_clipboard_ozone_->ReadClipboardDataSetSourceAndWait(
         buffer, ClipboardFormatType::WebCustomDataType().GetName());
-    ReadCustomDataTypes(data.data(), data.size(), types);
+    ReadCustomDataTypes(data, types);
   }
 }
 
@@ -586,7 +586,11 @@
     return;
 
   RecordRead(ClipboardFormatMetric::kCustomData);
-  ReadCustomDataForType(custom_data.data(), custom_data.size(), type, result);
+  if (absl::optional<std::u16string> maybe_data =
+          ReadCustomDataForType(custom_data, type);
+      maybe_data) {
+    *result = std::move(*maybe_data);
+  }
 }
 
 void ClipboardOzone::ReadFilenames(ClipboardBuffer buffer,
diff --git a/ui/base/clipboard/clipboard_util_win.cc b/ui/base/clipboard/clipboard_util_win.cc
index bff4eb9..7f508779 100644
--- a/ui/base/clipboard/clipboard_util_win.cc
+++ b/ui/base/clipboard/clipboard_util_win.cc
@@ -810,11 +810,15 @@
   STGMEDIUM store;
   if (GetData(data_object, ClipboardFormatType::WebCustomDataType(), &store)) {
     {
-      base::win::ScopedHGlobal<char*> data(store.hGlobal);
-      ReadCustomDataIntoMap(data.data(), data.size(), custom_data);
+      base::win::ScopedHGlobal<const uint8_t*> data(store.hGlobal);
+      if (absl::optional<std::unordered_map<std::u16string, std::u16string>>
+              maybe_custom_data = ReadCustomDataIntoMap(data);
+          maybe_custom_data) {
+        *custom_data = std::move(*maybe_custom_data);
+        return true;
+      }
     }
     ReleaseStgMedium(&store);
-    return true;
   }
   return false;
 }
diff --git a/ui/base/clipboard/clipboard_win.cc b/ui/base/clipboard/clipboard_win.cc
index 7219b87..41f27ac 100644
--- a/ui/base/clipboard/clipboard_win.cc
+++ b/ui/base/clipboard/clipboard_win.cc
@@ -336,8 +336,8 @@
   if (!hdata)
     return;
 
-  ReadCustomDataTypes(::GlobalLock(hdata), ::GlobalSize(hdata), types);
-  ::GlobalUnlock(hdata);
+  base::win::ScopedHGlobal<const uint8_t*> locked_data(hdata);
+  ReadCustomDataTypes(locked_data, types);
 }
 
 // |data_dst| is not used. It's only passed to be consistent with other
@@ -526,8 +526,12 @@
   if (!hdata)
     return;
 
-  ReadCustomDataForType(::GlobalLock(hdata), ::GlobalSize(hdata), type, result);
-  ::GlobalUnlock(hdata);
+  base::win::ScopedHGlobal<const uint8_t*> locked_data(hdata);
+  if (absl::optional<std::u16string> maybe_result =
+          ReadCustomDataForType(locked_data, type);
+      maybe_result) {
+    *result = std::move(*maybe_result);
+  }
 }
 
 // |data_dst| is not used. It's only passed to be consistent with other
diff --git a/ui/base/clipboard/custom_data_helper.cc b/ui/base/clipboard/custom_data_helper.cc
index 17710ccc..76eaca4 100644
--- a/ui/base/clipboard/custom_data_helper.cc
+++ b/ui/base/clipboard/custom_data_helper.cc
@@ -11,6 +11,7 @@
 #include <tuple>
 #include <utility>
 
+#include "base/containers/span.h"
 #include "base/pickle.h"
 
 namespace ui {
@@ -28,10 +29,9 @@
 
 }  // namespace
 
-void ReadCustomDataTypes(const void* data,
-                         size_t data_length,
+void ReadCustomDataTypes(base::span<const uint8_t> data,
                          std::vector<std::u16string>* types) {
-  base::Pickle pickle(reinterpret_cast<const char*>(data), data_length);
+  base::Pickle pickle(data);
   base::PickleIterator iter(pickle);
 
   uint32_t size = 0;
@@ -52,55 +52,58 @@
   }
 }
 
-void ReadCustomDataForType(const void* data,
-                           size_t data_length,
-                           const std::u16string& type,
-                           std::u16string* result) {
-  base::Pickle pickle(reinterpret_cast<const char*>(data), data_length);
+absl::optional<std::u16string> ReadCustomDataForType(
+    base::span<const uint8_t> data,
+    std::u16string_view type) {
+  base::Pickle pickle(data);
   base::PickleIterator iter(pickle);
 
   uint32_t size = 0;
   if (!iter.ReadUInt32(&size))
-    return;
+    return absl::nullopt;
 
   for (uint32_t i = 0; i < size; ++i) {
     std::u16string deserialized_type;
-    if (!iter.ReadString16(&deserialized_type))
-      return;
-    if (deserialized_type == type) {
-      std::ignore = iter.ReadString16(result);
-      return;
+    if (!iter.ReadString16(&deserialized_type)) {
+      return absl::nullopt;
     }
-    if (!SkipString16(&iter))
-      return;
+    if (deserialized_type == type) {
+      std::u16string result;
+      if (iter.ReadString16(&result)) {
+        return std::move(result);
+      }
+      return absl::nullopt;
+    }
+    if (!SkipString16(&iter)) {
+      return absl::nullopt;
+    }
   }
+  return absl::nullopt;
 }
 
-void ReadCustomDataIntoMap(
-    const void* data,
-    size_t data_length,
-    std::unordered_map<std::u16string, std::u16string>* result) {
-  base::Pickle pickle(reinterpret_cast<const char*>(data), data_length);
+absl::optional<std::unordered_map<std::u16string, std::u16string>>
+ReadCustomDataIntoMap(base::span<const uint8_t> data) {
+  base::Pickle pickle(data);
   base::PickleIterator iter(pickle);
 
   uint32_t size = 0;
-  if (!iter.ReadUInt32(&size))
-    return;
-
-  for (uint32_t i = 0; i < size; ++i) {
-    std::u16string type;
-    if (!iter.ReadString16(&type)) {
-      // Data is corrupt, return an empty map.
-      result->clear();
-      return;
-    }
-    auto insert_result = result->insert({type, std::u16string()});
-    if (!iter.ReadString16(&insert_result.first->second)) {
-      // Data is corrupt, return an empty map.
-      result->clear();
-      return;
-    }
+  if (!iter.ReadUInt32(&size)) {
+    return absl::nullopt;
   }
+
+  std::unordered_map<std::u16string, std::u16string> result;
+  for (uint32_t i = 0; i < size; ++i) {
+    std::u16string custom_type;
+    if (!iter.ReadString16(&custom_type)) {
+      return absl::nullopt;
+    }
+    std::u16string custom_data;
+    if (!iter.ReadString16(&custom_data)) {
+      return absl::nullopt;
+    }
+    result.insert({std::move(custom_type), std::move(custom_data)});
+  }
+  return std::move(result);
 }
 
 void WriteCustomDataToPickle(
diff --git a/ui/base/clipboard/custom_data_helper.h b/ui/base/clipboard/custom_data_helper.h
index 04c7ee6..6531321 100644
--- a/ui/base/clipboard/custom_data_helper.h
+++ b/ui/base/clipboard/custom_data_helper.h
@@ -8,12 +8,15 @@
 #include <stddef.h>
 
 #include <string>
+#include <string_view>
 #include <unordered_map>
 #include <vector>
 
 #include "base/component_export.h"
 #include "base/containers/flat_map.h"
+#include "base/containers/span.h"
 #include "build/build_config.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 
 // Due to restrictions of most operating systems, we don't directly map each
 // type of custom data to a native data transfer type. Instead, we serialize
@@ -26,19 +29,16 @@
 namespace ui {
 
 COMPONENT_EXPORT(UI_BASE_CLIPBOARD)
-void ReadCustomDataTypes(const void* data,
-                         size_t data_length,
+void ReadCustomDataTypes(base::span<const uint8_t> data,
                          std::vector<std::u16string>* types);
-COMPONENT_EXPORT(UI_BASE_CLIPBOARD)
-void ReadCustomDataForType(const void* data,
-                           size_t data_length,
-                           const std::u16string& type,
-                           std::u16string* result);
-COMPONENT_EXPORT(UI_BASE_CLIPBOARD)
-void ReadCustomDataIntoMap(
-    const void* data,
-    size_t data_length,
-    std::unordered_map<std::u16string, std::u16string>* result);
+[[nodiscard]] COMPONENT_EXPORT(UI_BASE_CLIPBOARD)
+    absl::optional<std::u16string> ReadCustomDataForType(
+        base::span<const uint8_t> data,
+        std::u16string_view type);
+[[nodiscard]] COMPONENT_EXPORT(UI_BASE_CLIPBOARD)
+    absl::optional<std::unordered_map<
+        std::u16string,
+        std::u16string>> ReadCustomDataIntoMap(base::span<const uint8_t> data);
 
 COMPONENT_EXPORT(UI_BASE_CLIPBOARD)
 void WriteCustomDataToPickle(
diff --git a/ui/base/clipboard/custom_data_helper_unittest.cc b/ui/base/clipboard/custom_data_helper_unittest.cc
index 64f06ba..b718343 100644
--- a/ui/base/clipboard/custom_data_helper_unittest.cc
+++ b/ui/base/clipboard/custom_data_helper_unittest.cc
@@ -32,7 +32,7 @@
   PrepareEmptyTestData(&pickle);
 
   std::vector<std::u16string> types;
-  ReadCustomDataTypes(pickle.data(), pickle.size(), &types);
+  ReadCustomDataTypes(pickle, &types);
   EXPECT_EQ(0u, types.size());
 }
 
@@ -40,18 +40,15 @@
   base::Pickle pickle;
   PrepareEmptyTestData(&pickle);
 
-  std::u16string result;
-  ReadCustomDataForType(pickle.data(), pickle.size(), u"f", &result);
-  EXPECT_EQ(std::u16string(), result);
+  EXPECT_EQ(absl::nullopt, ReadCustomDataForType(pickle, u"f"));
 }
 
 TEST(CustomDataHelperTest, EmptyReadMap) {
   base::Pickle pickle;
   PrepareEmptyTestData(&pickle);
 
-  std::unordered_map<std::u16string, std::u16string> result;
-  ReadCustomDataIntoMap(pickle.data(), pickle.size(), &result);
-  EXPECT_EQ(0u, result.size());
+  EXPECT_EQ((std::unordered_map<std::u16string, std::u16string>()),
+            ReadCustomDataIntoMap(pickle));
 }
 
 TEST(CustomDataHelperTest, ReadTypes) {
@@ -59,7 +56,7 @@
   PrepareTestData(&pickle);
 
   std::vector<std::u16string> types;
-  ReadCustomDataTypes(pickle.data(), pickle.size(), &types);
+  ReadCustomDataTypes(pickle, &types);
 
   std::vector<std::u16string> expected = {u"abc", u"de", u"f"};
   // We need to sort to compare equality, as the underlying custom data is
@@ -73,73 +70,66 @@
   base::Pickle pickle;
   PrepareTestData(&pickle);
 
-  std::u16string result;
-  ReadCustomDataForType(pickle.data(), pickle.size(), u"abc", &result);
-  EXPECT_EQ(std::u16string(), result);
-
-  ReadCustomDataForType(pickle.data(), pickle.size(), u"de", &result);
-  EXPECT_EQ(u"1", result);
-
-  ReadCustomDataForType(pickle.data(), pickle.size(), u"f", &result);
-  EXPECT_EQ(u"23", result);
+  EXPECT_EQ(u"", ReadCustomDataForType(pickle, u"abc"));
+  EXPECT_EQ(u"1", ReadCustomDataForType(pickle, u"de"));
+  EXPECT_EQ(u"23", ReadCustomDataForType(pickle, u"f"));
 }
 
 TEST(CustomDataHelperTest, ReadMap) {
   base::Pickle pickle;
   PrepareTestData(&pickle);
 
-  std::unordered_map<std::u16string, std::u16string> result;
-  ReadCustomDataIntoMap(pickle.data(), pickle.size(), &result);
-
-  std::unordered_map<std::u16string, std::u16string> expected = {
+  const std::unordered_map<std::u16string, std::u16string> expected = {
       {u"abc", std::u16string()}, {u"de", u"1"}, {u"f", u"23"}};
-  EXPECT_EQ(expected, result);
+  EXPECT_EQ(expected, ReadCustomDataIntoMap(pickle));
 }
 
 TEST(CustomDataHelperTest, BadReadTypes) {
   // ReadCustomDataTypes makes the additional guarantee that the contents of the
   // result vector will not change if the input is malformed.
-  std::vector<std::u16string> expected = {u"abc", u"de", u"f"};
+  const std::vector<std::u16string> expected = {u"abc", u"de", u"f"};
 
-  base::Pickle malformed;
-  malformed.WriteUInt32(1000);
-  malformed.WriteString16(u"hello");
-  malformed.WriteString16(u"world");
-  std::vector<std::u16string> actual(expected);
-  ReadCustomDataTypes(malformed.data(), malformed.size(), &actual);
-  EXPECT_EQ(expected, actual);
+  {
+    base::Pickle malformed;
+    malformed.WriteUInt32(1000);
+    malformed.WriteString16(u"hello");
+    malformed.WriteString16(u"world");
+    std::vector<std::u16string> actual = expected;
+    ReadCustomDataTypes(malformed, &actual);
+    EXPECT_EQ(expected, actual);
+  }
 
-  base::Pickle malformed2;
-  malformed2.WriteUInt32(1);
-  malformed2.WriteString16(u"hello");
-  std::vector<std::u16string> actual2(expected);
-  ReadCustomDataTypes(malformed2.data(), malformed2.size(), &actual2);
-  EXPECT_EQ(expected, actual2);
+  {
+    base::Pickle malformed;
+    malformed.WriteUInt32(1);
+    malformed.WriteString16(u"hello");
+    std::vector<std::u16string> actual = expected;
+    ReadCustomDataTypes(malformed, &actual);
+    EXPECT_EQ(expected, actual);
+  }
 }
 
 TEST(CustomDataHelperTest, BadPickle) {
-  std::u16string result_data;
   std::unordered_map<std::u16string, std::u16string> result_map;
 
-  base::Pickle malformed;
-  malformed.WriteUInt32(1000);
-  malformed.WriteString16(u"hello");
-  malformed.WriteString16(u"world");
+  {
+    base::Pickle malformed;
+    malformed.WriteUInt32(1000);
+    malformed.WriteString16(u"hello");
+    malformed.WriteString16(u"world");
 
-  ReadCustomDataForType(malformed.data(), malformed.size(), u"f", &result_data);
-  ReadCustomDataIntoMap(malformed.data(), malformed.size(), &result_map);
-  EXPECT_EQ(0u, result_data.size());
-  EXPECT_EQ(0u, result_map.size());
+    EXPECT_EQ(absl::nullopt, ReadCustomDataForType(malformed, u"f"));
+    EXPECT_EQ(absl::nullopt, ReadCustomDataIntoMap(malformed));
+  }
 
-  base::Pickle malformed2;
-  malformed2.WriteUInt32(1);
-  malformed2.WriteString16(u"hello");
+  {
+    base::Pickle malformed;
+    malformed.WriteUInt32(1);
+    malformed.WriteString16(u"hello");
 
-  ReadCustomDataForType(malformed2.data(), malformed2.size(), u"f",
-                        &result_data);
-  ReadCustomDataIntoMap(malformed2.data(), malformed2.size(), &result_map);
-  EXPECT_EQ(0u, result_data.size());
-  EXPECT_EQ(0u, result_map.size());
+    EXPECT_EQ(absl::nullopt, ReadCustomDataForType(malformed, u"f"));
+    EXPECT_EQ(absl::nullopt, ReadCustomDataIntoMap(malformed));
+  }
 }
 
 }  // namespace
diff --git a/ui/base/clipboard/test/test_clipboard.cc b/ui/base/clipboard/test/test_clipboard.cc
index 4ec1278f..049ce2f7 100644
--- a/ui/base/clipboard/test/test_clipboard.cc
+++ b/ui/base/clipboard/test/test_clipboard.cc
@@ -8,6 +8,7 @@
 #include <memory>
 #include <utility>
 #include "base/containers/contains.h"
+#include "base/containers/span.h"
 #include "base/memory/ptr_util.h"
 #include "base/notreached.h"
 #include "base/numerics/safe_conversions.h"
@@ -123,7 +124,7 @@
 
   auto it = store.data.find(ClipboardFormatType::WebCustomDataType());
   if (it != store.data.end())
-    ReadCustomDataTypes(it->second.c_str(), it->second.size(), &types);
+    ReadCustomDataTypes(base::as_bytes(base::span(it->second)), &types);
 
   return types;
 }
diff --git a/ui/color/ui_color_mixer.cc b/ui/color/ui_color_mixer.cc
index 01fe9090..1bef8b4 100644
--- a/ui/color/ui_color_mixer.cc
+++ b/ui/color/ui_color_mixer.cc
@@ -47,7 +47,7 @@
       kColorButtonBackgroundProminent};
   mixer[kColorButtonBackgroundTonal] = {kColorSysTonalContainer};
   mixer[kColorButtonBackgroundTonalDisabled] = {
-      kColorSysStateDisabledContainer};
+      kColorButtonBackgroundProminentDisabled};
   mixer[kColorButtonBackgroundTonalFocused] = {kColorButtonBackgroundTonal};
   mixer[kColorButtonBackgroundWithAttention] = {
       dark_mode ? SkColorSetRGB(0x35, 0x36, 0x3A) : SK_ColorWHITE};
diff --git a/ui/file_manager/PRESUBMIT.py b/ui/file_manager/PRESUBMIT.py
index 44b3e66..810794c 100644
--- a/ui/file_manager/PRESUBMIT.py
+++ b/ui/file_manager/PRESUBMIT.py
@@ -16,10 +16,7 @@
 def ChecksUnitTests(input_api, output_api):
     # Run all unit tests under ui/file_manager/base folder.
     return input_api.canned_checks.RunUnitTestsInDirectory(
-        input_api,
-        output_api,
-        'base',
-        files_to_check=TEST_PATTERNS)
+        input_api, output_api, 'base', files_to_check=TEST_PATTERNS)
 
 
 def ChecksCommon(input_api, output_api):
@@ -41,8 +38,6 @@
 
         sys.path += [input_api.os_path.join(cwd)]
         import base.presubmit_support
-        results += base.presubmit_support._CheckGM3Counterpart(
-            input_api, output_api)
         results += base.presubmit_support._CheckNoDirectLitImport(
             input_api, output_api)
     finally:
diff --git a/ui/file_manager/base/presubmit_support.py b/ui/file_manager/base/presubmit_support.py
index 1fe6184..9864e47 100644
--- a/ui/file_manager/base/presubmit_support.py
+++ b/ui/file_manager/base/presubmit_support.py
@@ -4,54 +4,6 @@
 
 from pathlib import Path
 
-GM3_SUFFIX = '_gm3.css'
-
-
-def _CheckGM3Counterpart(input_api, output_api):
-    """If a CSS file (say foo.css) is included in the patch, check if there
-    is a corresponding GM3 counterpart in the same directory (say, foo_gm3.css).
-    If so, output a warning message if the GM3 counterpart is not included in
-    the patch.
-
-    NOTE: For GM3 migration, we have duplicated the CSS file if we need to
-    modify it, this check acts as a warning to prompt developers that if the
-    original CSS is changed, the corresponding GM3 counterpart file might also
-    need to be updated.
-    """
-    css_filter = lambda f: Path(f.LocalPath()).suffix == '.css'
-    css_files = input_api.AffectedFiles(file_filter=css_filter)
-    if not css_files:
-        return []
-
-    css_file_paths = set([f.LocalPath() for f in css_files])
-    invalid_files = []
-    for path in css_file_paths:
-        file_path = Path(path)
-        # Skip _gm3.css file itself.
-        if file_path.name.endswith(GM3_SUFFIX):
-            continue
-        gm3_file_path = file_path.parent.joinpath(file_path.stem + GM3_SUFFIX)
-        gm3_file_abspath = Path(
-            input_api.change.RepositoryRoot()).joinpath(gm3_file_path)
-        # Skip if the the file doesn't have _gm3 counterpart.
-        if not gm3_file_abspath.is_file():
-            continue
-        # Skip if the _gm3 counterpart is also in the patch.
-        if str(gm3_file_path) in css_file_paths:
-            continue
-        invalid_files.append(path + ' -> ' + str(gm3_file_path))
-
-    if not invalid_files:
-        return []
-
-    warning_message = 'You updated a CSS file which has a corresponding '\
-    '"_gm3" counterpart, please double check if you need to apply the '\
-    'update to the corresponding "_gm3" file. go/files-gm3-presubmit'
-
-    return [
-        output_api.PresubmitPromptWarning(warning_message, items=invalid_files)
-    ]
-
 
 def _CheckNoDirectLitImport(input_api, output_api):
     """We want to isolate the dependency of LitElement to only one file
@@ -60,7 +12,6 @@
     the imports from the TS/JS files to make sure only xf_base can import from
     Lit directly.
     """
-
     def _isLitDisallowed(file_path):
         xf_base_file_path = input_api.os_path.join('ui', 'file_manager',
                                                    'file_manager', 'widgets',
diff --git a/ui/file_manager/base/presubmit_support_test.py b/ui/file_manager/base/presubmit_support_test.py
index 98202b9c..ca4ce0c 100755
--- a/ui/file_manager/base/presubmit_support_test.py
+++ b/ui/file_manager/base/presubmit_support_test.py
@@ -4,85 +4,15 @@
 # found in the LICENSE file.
 
 import os.path
-from pathlib import Path
 import unittest
-from unittest.mock import patch
 import sys
 
-from presubmit_support import _CheckGM3Counterpart, _CheckNoDirectLitImport
+from presubmit_support import _CheckNoDirectLitImport
 
 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
 from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi, MockFile
 
 
-class GM3CounterpartPresubmit(unittest.TestCase):
-    def setUp(self):
-        self.mock_input_api = MockInputApi()
-        self.mock_input_api.change.RepositoryRoot = lambda: os.path.join(
-            os.path.dirname(__file__), '..', '..', '..')
-
-        self.mock_output_api = MockOutputApi()
-
-    def testWarningWithGM3CounterpartNotChanged(self):
-        """
-        If a CSS file foo.css is changed, and there's a corresponding
-        foo_gm3.css existed but not changed, show warning.
-        """
-        foo_css = MockFile(os.path.join('some', 'path', 'foo.css'), '')
-        self.mock_input_api.files.append(foo_css)
-        # Mock Path.is_file call to make sure foo_gm3.css is existed.
-        with patch.object(Path, 'is_file') as mock_is_file:
-            mock_is_file.return_value = True
-            errors = _CheckGM3Counterpart(self.mock_input_api,
-                                          self.mock_output_api)
-            self.assertEqual(1, len(errors))
-            self.assertEqual(1, len(errors[0].items))
-            self.assertTrue('foo.css' in errors[0].items[0])
-            self.assertTrue('foo_gm3.css' in errors[0].items[0])
-
-    def testNoWarningWithGM3CounterpartChanged(self):
-        """
-        If a CSS file foo.css is changed, and there's a corresponding
-        foo_gm3.css existed also changed, no warnings.
-        """
-        foo_css = MockFile(os.path.join('some', 'path', 'foo.css'), '')
-        foo_gm3_css = MockFile(os.path.join('some', 'path', 'foo_gm3.css'), '')
-        self.mock_input_api.files.append(foo_css)
-        self.mock_input_api.files.append(foo_gm3_css)
-        # Mock Path.is_file call to make sure foo_gm3.css is existed.
-        with patch.object(Path, 'is_file') as mock_is_file:
-            mock_is_file.return_value = True
-            errors = _CheckGM3Counterpart(self.mock_input_api,
-                                          self.mock_output_api)
-            self.assertEqual([], errors)
-
-    def testNoWarningWithoutGM3Counterpart(self):
-        """
-        If a CSS file foo.css is changed, and the corresponding foo_gm3.css
-        does not existed, no warnings.
-        """
-        foo_css = MockFile(os.path.join('some', 'path', 'foo.css'), '')
-        self.mock_input_api.files.append(foo_css)
-        # Mock Path.is_file call to make sure foo_gm3.css is not existed.
-        with patch.object(Path, 'is_file') as mock_is_file:
-            mock_is_file.return_value = False
-            errors = _CheckGM3Counterpart(self.mock_input_api,
-                                          self.mock_output_api)
-            self.assertEqual([], errors)
-
-    def testNoWarningForNonCSSChange(self):
-        """
-        If the patch doesn't have any CSS files, no warnings.
-        """
-        foo_js = MockFile(os.path.join('some', 'path', 'foo.js'), '')
-        foo_cpp = MockFile(os.path.join('some', 'path', 'foo.cc'), '')
-        self.mock_input_api.files.append(foo_js)
-        self.mock_input_api.files.append(foo_cpp)
-        errors = _CheckGM3Counterpart(self.mock_input_api,
-                                      self.mock_output_api)
-        self.assertEqual([], errors)
-
-
 class NoDirectLitImportPresubmit(unittest.TestCase):
     def setUp(self):
         self.mock_input_api = MockInputApi()
@@ -138,8 +68,8 @@
         foo_js = MockFile(os.path.join('some', 'path', 'foo.js'), '')
         self.mock_input_api.files.append(foo_ts)
         self.mock_input_api.files.append(foo_js)
-        errors = _CheckGM3Counterpart(self.mock_input_api,
-                                      self.mock_output_api)
+        errors = _CheckNoDirectLitImport(self.mock_input_api,
+                                         self.mock_output_api)
         self.assertEqual([], errors)
 
 
diff --git a/ui/file_manager/file_manager/BUILD.gn b/ui/file_manager/file_manager/BUILD.gn
index 1ced06c..f411ec1 100644
--- a/ui/file_manager/file_manager/BUILD.gn
+++ b/ui/file_manager/file_manager/BUILD.gn
@@ -20,16 +20,11 @@
 
     # CSS:
     "foreground/css/combobutton.css",
-    "foreground/css/combobutton_gm3.css",
     "foreground/css/common.css",
-    "foreground/css/common_gm3.css",
     "foreground/css/file_manager.css",
-    "foreground/css/file_manager_gm3.css",
     "foreground/css/file_types.css",
-    "foreground/css/file_types_gm3.css",
     "foreground/css/list.css",
     "foreground/css/menu.css",
-    "foreground/css/menu_gm3.css",
     "foreground/css/table.css",
     "foreground/css/tree.css",
 
diff --git a/ui/file_manager/file_manager/foreground/css/combobutton.css b/ui/file_manager/file_manager/foreground/css/combobutton.css
index 69fd51b..7987319 100644
--- a/ui/file_manager/file_manager/foreground/css/combobutton.css
+++ b/ui/file_manager/file_manager/foreground/css/combobutton.css
@@ -1,4 +1,4 @@
-/* Copyright 2012 The Chromium Authors
+/* Copyright 2023 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
@@ -34,26 +34,22 @@
 }
 
 .dialog-header .combobutton > .button > .trigger {
-  margin-inline-end: -8px;
-  margin-inline-start: 2px;
-  margin-top: -1px;
-  width: 22px;
-}
-
-.dialog-header.files-ng .combobutton > .button > .trigger {
-  left: 2px;
-  position: relative;
-  right: 2px;
+  align-items: center;
+  display: inline-flex;
+  height: 20px;
+  justify-content: center;
+  margin-inline-start: 8px;
+  width: 20px;
 }
 
 /* This pseudo element expands clickable area of the .trigger */
 .dialog-header .combobutton > .button > .trigger::before {
   content: '';
   display: block;
-  height: 40px;
+  height: 48px;
   position: absolute;
-  top: -2px;
-  width: 30px;
+  right: 12px; /* Same value as padding-inline-end of the button. */
+  width: 20px;
 }
 
 .dialog-header .combobutton:not([multiple]) > .button > .trigger {
diff --git a/ui/file_manager/file_manager/foreground/css/combobutton_gm3.css b/ui/file_manager/file_manager/foreground/css/combobutton_gm3.css
deleted file mode 100644
index 7987319..0000000
--- a/ui/file_manager/file_manager/foreground/css/combobutton_gm3.css
+++ /dev/null
@@ -1,61 +0,0 @@
-/* Copyright 2023 The Chromium Authors
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-.dialog-header button.combobutton {
-  align-items: stretch;
-  background: transparent;
-  border-radius: 3px;
-  cursor: pointer;
-  display: flex;
-  flex: none;
-  font-weight: 500;
-  outline: none;
-  padding: 8px;
-  position: relative;
-  user-select: none;
-}
-
-.dialog-header .combobutton > .button {
-  align-items: center;
-  display: flex;
-}
-
-.dialog-header .combobutton > .button > .action {
-  background-position: left center;
-  background-repeat: no-repeat;
-  background-size: 16px 16px;
-  padding-top: 1px;
-  z-index: 1;
-}
-
-html[dir='rtl'] .dialog-header .combobutton > .button > .action {
-  background-position: right center;
-}
-
-.dialog-header .combobutton > .button > .trigger {
-  align-items: center;
-  display: inline-flex;
-  height: 20px;
-  justify-content: center;
-  margin-inline-start: 8px;
-  width: 20px;
-}
-
-/* This pseudo element expands clickable area of the .trigger */
-.dialog-header .combobutton > .button > .trigger::before {
-  content: '';
-  display: block;
-  height: 48px;
-  position: absolute;
-  right: 12px; /* Same value as padding-inline-end of the button. */
-  width: 20px;
-}
-
-.dialog-header .combobutton:not([multiple]) > .button > .trigger {
-  display: none;
-}
-
-.dialog-header .combobutton[hidden] {
-  display: none;
-}
diff --git a/ui/file_manager/file_manager/foreground/css/common.css b/ui/file_manager/file_manager/foreground/css/common.css
index 50d07a73..134cd73 100644
--- a/ui/file_manager/file_manager/foreground/css/common.css
+++ b/ui/file_manager/file_manager/foreground/css/common.css
@@ -1,4 +1,4 @@
-/* Copyright 2012 The Chromium Authors
+/* Copyright 2023 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
@@ -16,10 +16,12 @@
    menus in FileBrowser look like native ChromeOS menus. */
 
 cr-menu.chrome-menu {
-  background-color: var(--cros-bg-color-elevation-2);
-  border-radius: 4px;
+  background-color: var(--cros-sys-base_elevated);
+  border-radius: 8px;
   box-shadow: var(--cros-elevation-2-shadow);
-  color: var(--cros-menu-label-color);
+  color: var(--cros-sys-on_surface);
+  font: var(--cros-button-2-font);
+  min-width: 208px;
   outline: none;
   overflow: hidden;
   padding: 8px 0;
@@ -27,6 +29,11 @@
   z-index: 600;  /* Must be below the overlay pane (1000). */
 }
 
+cr-menu#gear-menu,
+cr-menu#file-context-menu {
+  min-width: 256px;
+}
+
 cr-menu.chrome-menu[hidden] {
   display: block !important;  /* Overrides default [hidden] for animation. */
   opacity: 0;
@@ -40,19 +47,12 @@
 }
 
 cr-menu.chrome-menu > :not(hr) {
-  background-position: right 10px center;
-  background-repeat: no-repeat;
-  line-height: 32px;
+  height: 36px;
   outline: none;
-  padding: 0 8px;
-}
-
-html[dir='rtl'] cr-menu.chrome-menu > :not(hr) {
-  background-position: left 10px center;
 }
 
 cr-menu.chrome-menu > cr-menu-item[disabled] {
-  color: var(--cros-text-color-disabled);
+  color: var(--cros-sys-disabled);
   pointer-events: none;
 }
 
@@ -66,9 +66,9 @@
 }
 
 cr-menu.chrome-menu > hr {
-  background: var(--cros-separator-color);
+  background: var(--cros-sys-separator);
   height: 1px;
-  margin: 4px 0;
+  margin: 8px 0;
 }
 
 cr-menu.chrome-menu > hr:first-child {
@@ -79,10 +79,12 @@
   -webkit-mask-image: url(../images/common/ic_selected.svg);
   -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-icon-color-prominent);
+  background-color: var(--cros-sys-primary);
   content: '';
   float: right;
-  height: 32px;
+  height: 20px;
+  /* Trailing icon has a different padding than its container padding (16px). */
+  margin-inline-end: calc(12px - 16px);
   width: 20px;
 }
 
@@ -90,47 +92,27 @@
   float: left;
 }
 
-cr-menu.chrome-menu > [checked]::before {
+cr-menu.chrome-menu > cr-menu-item#volume-space-info {
+  /* Volume info menu item has more contents to show. */
+  height: auto;
+  min-height: 36px;
+}
+
+cr-menu#file-context-menu.toolbar-menu > .hide-on-toolbar {
   display: none;
 }
 
-/* Style for <button>s to have similar style with Polymer's <paper-button>. */
-.imitate-paper-button {
-  background: transparent;
-  border: 0;
-  border-image: none;
-  border-radius: 3px;
+button {
+  background-color: var(--cros-sys-primary_container);
+  border: none;
+  border-radius: 18px;
   box-sizing: border-box;
-  color: inherit;
+  color: var(--cros-sys-on_primary_container);
   cursor: pointer;
-  display: inline-block;
-  font: inherit;
-  height: auto;
-  margin: 0 0.29em;
-  min-width: 5.14em;
-  outline: none;
-  overflow: hidden;
-  padding: 0.6em 0.57em;
-  position: relative;
-  text-align: center;
-  text-transform: uppercase;
-  user-select: none;
-  z-index: 0;
-}
-
-.cr-dialog-container .cr-dialog-buttons > button {
-  background-color: var(--cros-button-background-color-secondary);
-  border: 0;
-  border-radius: 4px;
-  box-sizing: border-box;
-  cursor: pointer;
-  display: inline-block;
-  font-size: 13px;
-  font-weight: 500;
-  height: var(--cr-button-height);
+  font: var(--cros-button-2-font);
+  height: 36px;
   margin: 0;
-  margin-inline-start: 8px;
-  min-height: 32px;
+  min-height: 36px;
   min-width: 5.14em;
   outline: none;
   padding: 8px 16px;
@@ -140,86 +122,99 @@
   z-index: 0;
 }
 
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-ok,
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-ok:hover {
-  background-color: var(--cros-button-background-color-primary);
-  color: var(--cros-button-label-color-primary);
+button > .hover-layer {
+  border-radius: 18px;
+  content: '';
+  display: none;
+  inset: 0;
+  pointer-events: none;
+  position: absolute;
+  z-index: 1;
+}
+
+button > paper-ripple {
+  --paper-ripple-opacity: 1;
+  border-radius: 18px;
+  color: var(--cros-sys-ripple_primary);
+}
+
+button:hover > .hover-layer {
+  display: block;
+}
+
+button.cr-dialog-ok,
+button.primary {
+  background-color: var(--cros-sys-primary);
+  color: var(--cros-sys-on_primary);
+}
+
+button.cr-dialog-ok:hover > .hover-layer,
+button.primary:hover > .hover-layer {
+  background-color: var(--cros-sys-hover_on_prominent);
+}
+
+button.cr-dialog-cancel:hover > .hover-layer,
+button.secondary:hover > .hover-layer {
+  background-color: var(--cros-sys-hover_on_subtle);
+}
+
+button[disabled] {
+  background-color: var(--cros-sys-disabled_container);
+  color: var(--cros-sys-disabled);
+  cursor: default;
+  pointer-events: none;
+}
+
+button[disabled]:hover > .hover-layer {
+  display: none;
+}
+
+:root.focus-outline-visible button:not(:active):focus,
+:host-context(:root.focus-outline-visible) button:not(:active):focus {
+  outline: 2px solid var(--cros-sys-focus_ring);
+  outline-offset: 2px;
+}
+
+.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-ok {
+  margin-inline-start: 8px;
   order: 1;
 }
 
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-ok:hover {
-  background: var(--cros-button-background-color-primary-hover-preblended);
-}
-
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-ok:active {
-  box-shadow: 0 1px 2px var(--cros-button-active-shadow-color-key-primary),
-              0 1px 3px var(--cros-button-active-shadow-color-ambient-primary);
-}
-
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-ok[disabled],
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-ok[disabled]:hover {
-  background-color:
-      var(--cros-button-background-color-primary-disabled);
-  color: var(--cros-button-label-color-primary-disabled);
-}
-
 .cr-dialog-container .cr-dialog-buttons > button.cr-dialog-cancel {
-  border: 1px solid var(--cros-button-stroke-color-secondary);
-  color: var(--cros-button-label-color-secondary);
   order: 0;
 }
 
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-cancel:hover {
-  background: var(--cros-button-background-color-secondary-hover);
-}
-
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-cancel:active {
-  box-shadow: 0 1px 2px var(--cros-button-active-shadow-color-key-secondary),
-              0 1px 3px var(--cros-button-active-shadow-color-ambient-secondary);
-}
-
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-cancel[disabled],
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-cancel[disabled]:hover  {
-  border: 1px solid var(--cros-button-stroke-color-secondary-disabled);
-  color: var(--cros-button-label-color-secondary-disabled);
-}
-
-:root.focus-outline-visible .cr-dialog-container .cr-dialog-buttons > button:not(:active):focus,
-:host-context(:root.focus-outline-visible) .cr-dialog-container .cr-dialog-buttons > button:not(:active):focus {
-  outline: 2px solid var(--cros-focus-ring-color);
-  outline-offset: 2px;
-}
-
 /* Some files confirm dialogs need to focus their 'Cancel' button by default,
    rather than the 'OK' button. The dialog buttons should have focus rings in
    this case (regardless of mouse, pointer, keyboard interaction). */
-.cr-dialog-container .cr-dialog-frame.files-confirm-dialog-cancel-default .cr-dialog-buttons > button:not(:active):focus {
-  outline: 2px solid var(--cros-focus-ring-color);
+.cr-dialog-container .cr-dialog-frame.files-confirm-dialog-cancel-default
+    .cr-dialog-buttons > button:not(:active):focus {
+  outline: 2px solid var(--cros-sys-focus_ring);
   outline-offset: 2px;
 }
 
-.buttonbar button {
-  margin-inline-start: 12px;
+.buttonbar button:not(:first-child) {
+  margin-inline-start: 8px;
 }
 
 .progress-bar {
-  background-color: var(--cros-slider-track-color-inactive);
+  background-color: var(--cros-sys-highlight_shape);
   border-radius: 3px;
   height: 6px;
+  margin-bottom: 6px;
+  margin-top: 8px;
 }
 
 .progress-track {
-  background-color: var(--cros-icon-color-primary);
+  background-color: var(--cros-sys-primary);
   border-radius: 3px;
   height: 6px;
   min-width: 6px;
 }
 
 .menu-warning {
-  color: var(--cros-textfield-label-color-error);
-  font-size: 11px;
-  line-height: 16px;
-  margin-top: 6px;
+  color: var(--cros-sys-error);
+  font: var(--cros-annotation-2-font);
 }
 
 /* Entry names (File names, Folder names, Volume names, ...). */
@@ -232,7 +227,7 @@
 
 /* Pop-up dialogs. */
 .cr-dialog-container.shown {
-  background-color: var(--cros-app-shield-60);
+  background-color: var(--cros-sys-scrim);
 }
 
 .cr-dialog-container {
@@ -248,19 +243,19 @@
 }
 
 .cr-dialog-container .cr-dialog-frame {
-  background-color: var(--cros-bg-color-elevation-3);
-  border-radius: 12px;
+  background-color: var(--cros-sys-dialog_container);
+  border-radius: 20px;
   box-shadow: var(--cros-elevation-3-shadow);
-  color: var(--cros-text-color-primary);
+  color: var(--cros-sys-on_surface_variant);
   cursor: default;
   display: flex;
   flex-direction: column;
   margin: auto;
   /* Narrower when viewport is too narrow. */
-  max-width: min(512px - 24px - 24px, 75vw);
-  min-width: calc(320px - 24px - 24px);
-  padding: 24px;
-  padding-bottom: 20px;
+  max-width: min(512px - 32px - 32px, 75vw);
+  min-width: calc(320px - 32px - 32px);
+  padding: 32px;
+  padding-bottom: 28px;
   position: relative;
 }
 
@@ -300,15 +295,14 @@
 }
 
 .cr-dialog-container .cr-dialog-title {
-  color: var(--cros-text-color-primary);
+  color: var(--cros-sys-on_surface);
   display: block;
-  font-size: 16px;
-  font-weight: 500;
+  font: var(--cros-display-7-font);
   margin-bottom: 16px;
 }
 
 .cr-dialog-container .cr-dialog-text {
-  font-size: 14px;
+  font: var(--cros-body-1-font);
 }
 
 .cr-dialog-container .cr-dialog-text,
@@ -317,11 +311,7 @@
 }
 
 .cr-dialog-container .cr-dialog-text {
-  color: var(--cros-text-color-secondary);
-}
-
-.cr-dialog-container .no-title .cr-dialog-text {
-  color: var(--cros-text-color-primary);
+  color: var(--cros-sys-on_surface_variant);
 }
 
 .cr-dialog-container .cr-dialog-buttons {
@@ -332,27 +322,45 @@
 }
 
 .cr-dialog-container .cr-dialog-close {
+  --hover-bg-color: var(--cros-sys-hover_on_subtle);
+  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
+  --ripple-opacity: 100%;
+  border: none;
+  border-radius: 16px;
+  color: var(--cros-sys-on_surface);
   display: none;
+  height: 32px;
+  min-width: 32px;
+  padding: 0;
+  position: absolute;
+  right: 16px;
+  top: 16px;
+  width: 32px;
 }
 
-.cr-dialog-container #suggest-app-dialog .cr-dialog-close,
+html.focus-outline-visible .cr-dialog-container
+    .cr-dialog-close:not(:active):focus {
+  outline: 2px solid var(--cros-sys-focus_ring);
+}
+
 .cr-dialog-container #default-task-dialog .cr-dialog-close {
+  display: inline-block;
+}
+
+.cr-dialog-container .cr-dialog-close > .icon {
   -webkit-mask-image: url(../images/common/ic_close.svg);
   -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-icon-color-primary);
-  cursor: pointer;
-  display: inline-block;
+  -webkit-mask-size: 16px;
+  background-color: currentColor;
   height: 32px;
   position: absolute;
-  right: 6px;
-  top: 6px;
   width: 32px;
 }
 
 :root[dir='rtl'] .cr-dialog-container .cr-dialog-close,
 :host-context(:root[dir='rtl']) .cr-dialog-container .cr-dialog-close {
-  left: 6px;
+  left: 16px;
   right: unset !important;
 }
 
@@ -398,16 +406,11 @@
 
 /* Common typography styles for ChromeOS. */
 .button2 {
-  color: var(--cros-text-color-primary);
-  font-family: Roboto;
-  font-size: 13px;
-  font-weight: 500;
-  line-height: 20px;
+  color: var(--cros-sys-on_surface);
+  font: var(--cros-button-2-font);
 }
 
 .body2-primary {
-  color: var(--cros-text-color-primary);
-  font-family: Roboto;
-  font-size: 13px;
-  line-height: 20px;
+  color: var(--cros-sys-on_surface);
+  font: var(--cros-body-2-font);
 }
diff --git a/ui/file_manager/file_manager/foreground/css/common_gm3.css b/ui/file_manager/file_manager/foreground/css/common_gm3.css
deleted file mode 100644
index 134cd73..0000000
--- a/ui/file_manager/file_manager/foreground/css/common_gm3.css
+++ /dev/null
@@ -1,416 +0,0 @@
-/* Copyright 2023 The Chromium Authors
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-/* Special attribute to hide elements. */
-[hidden] {
-  display: none !important;
-}
-
-cr-button {
-  --active-bg: none;  /* prevent dark-mode activation color */
-  box-shadow: none;
-}
-
-/* "chrome-menu" class overrides some standard menu.css styles, to make custom
-   menus in FileBrowser look like native ChromeOS menus. */
-
-cr-menu.chrome-menu {
-  background-color: var(--cros-sys-base_elevated);
-  border-radius: 8px;
-  box-shadow: var(--cros-elevation-2-shadow);
-  color: var(--cros-sys-on_surface);
-  font: var(--cros-button-2-font);
-  min-width: 208px;
-  outline: none;
-  overflow: hidden;
-  padding: 8px 0;
-  transition: opacity 200ms ease-in;
-  z-index: 600;  /* Must be below the overlay pane (1000). */
-}
-
-cr-menu#gear-menu,
-cr-menu#file-context-menu {
-  min-width: 256px;
-}
-
-cr-menu.chrome-menu[hidden] {
-  display: block !important;  /* Overrides default [hidden] for animation. */
-  opacity: 0;
-  pointer-events: none;
-  visibility: hidden;
-}
-
-cr-menu.chrome-menu.hide-delayed[hidden] {
-  transition-delay: 120ms;
-  transition-property: opacity, visibility;
-}
-
-cr-menu.chrome-menu > :not(hr) {
-  height: 36px;
-  outline: none;
-}
-
-cr-menu.chrome-menu > cr-menu-item[disabled] {
-  color: var(--cros-sys-disabled);
-  pointer-events: none;
-}
-
-cr-menu.chrome-menu > cr-menu-item#volume-space-info[disabled] {
-  color: inherit;
-  pointer-events: none;
-}
-
-cr-menu.chrome-menu > cr-menu-item[disabled] > .icon.start {
-  opacity: 0.20;
-}
-
-cr-menu.chrome-menu > hr {
-  background: var(--cros-sys-separator);
-  height: 1px;
-  margin: 8px 0;
-}
-
-cr-menu.chrome-menu > hr:first-child {
-  display: none;
-}
-
-cr-menu.chrome-menu > cr-menu-item[checked]::after {
-  -webkit-mask-image: url(../images/common/ic_selected.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-sys-primary);
-  content: '';
-  float: right;
-  height: 20px;
-  /* Trailing icon has a different padding than its container padding (16px). */
-  margin-inline-end: calc(12px - 16px);
-  width: 20px;
-}
-
-html[dir='rtl'] cr-menu.chrome-menu > cr-menu-item[checked]::after {
-  float: left;
-}
-
-cr-menu.chrome-menu > cr-menu-item#volume-space-info {
-  /* Volume info menu item has more contents to show. */
-  height: auto;
-  min-height: 36px;
-}
-
-cr-menu#file-context-menu.toolbar-menu > .hide-on-toolbar {
-  display: none;
-}
-
-button {
-  background-color: var(--cros-sys-primary_container);
-  border: none;
-  border-radius: 18px;
-  box-sizing: border-box;
-  color: var(--cros-sys-on_primary_container);
-  cursor: pointer;
-  font: var(--cros-button-2-font);
-  height: 36px;
-  margin: 0;
-  min-height: 36px;
-  min-width: 5.14em;
-  outline: none;
-  padding: 8px 16px;
-  position: relative;
-  text-align: center;
-  user-select: none;
-  z-index: 0;
-}
-
-button > .hover-layer {
-  border-radius: 18px;
-  content: '';
-  display: none;
-  inset: 0;
-  pointer-events: none;
-  position: absolute;
-  z-index: 1;
-}
-
-button > paper-ripple {
-  --paper-ripple-opacity: 1;
-  border-radius: 18px;
-  color: var(--cros-sys-ripple_primary);
-}
-
-button:hover > .hover-layer {
-  display: block;
-}
-
-button.cr-dialog-ok,
-button.primary {
-  background-color: var(--cros-sys-primary);
-  color: var(--cros-sys-on_primary);
-}
-
-button.cr-dialog-ok:hover > .hover-layer,
-button.primary:hover > .hover-layer {
-  background-color: var(--cros-sys-hover_on_prominent);
-}
-
-button.cr-dialog-cancel:hover > .hover-layer,
-button.secondary:hover > .hover-layer {
-  background-color: var(--cros-sys-hover_on_subtle);
-}
-
-button[disabled] {
-  background-color: var(--cros-sys-disabled_container);
-  color: var(--cros-sys-disabled);
-  cursor: default;
-  pointer-events: none;
-}
-
-button[disabled]:hover > .hover-layer {
-  display: none;
-}
-
-:root.focus-outline-visible button:not(:active):focus,
-:host-context(:root.focus-outline-visible) button:not(:active):focus {
-  outline: 2px solid var(--cros-sys-focus_ring);
-  outline-offset: 2px;
-}
-
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-ok {
-  margin-inline-start: 8px;
-  order: 1;
-}
-
-.cr-dialog-container .cr-dialog-buttons > button.cr-dialog-cancel {
-  order: 0;
-}
-
-/* Some files confirm dialogs need to focus their 'Cancel' button by default,
-   rather than the 'OK' button. The dialog buttons should have focus rings in
-   this case (regardless of mouse, pointer, keyboard interaction). */
-.cr-dialog-container .cr-dialog-frame.files-confirm-dialog-cancel-default
-    .cr-dialog-buttons > button:not(:active):focus {
-  outline: 2px solid var(--cros-sys-focus_ring);
-  outline-offset: 2px;
-}
-
-.buttonbar button:not(:first-child) {
-  margin-inline-start: 8px;
-}
-
-.progress-bar {
-  background-color: var(--cros-sys-highlight_shape);
-  border-radius: 3px;
-  height: 6px;
-  margin-bottom: 6px;
-  margin-top: 8px;
-}
-
-.progress-track {
-  background-color: var(--cros-sys-primary);
-  border-radius: 3px;
-  height: 6px;
-  min-width: 6px;
-}
-
-.menu-warning {
-  color: var(--cros-sys-error);
-  font: var(--cros-annotation-2-font);
-}
-
-/* Entry names (File names, Folder names, Volume names, ...). */
-/* Their base bidi direction should be ltr even in RTL languages. */
-html[dir='rtl'] .entry-name {
-  direction: ltr;
-  text-align: right;  /* csschecker-disable-line left-right */
-  unicode-bidi: embed;
-}
-
-/* Pop-up dialogs. */
-.cr-dialog-container.shown {
-  background-color: var(--cros-sys-scrim);
-}
-
-.cr-dialog-container {
-  display: flex;
-  height: 100%;
-  left: 0;
-  overflow: auto;
-  position: absolute;
-  top: 0;
-  user-select: none;
-  width: 100%;
-  z-index: 9999;
-}
-
-.cr-dialog-container .cr-dialog-frame {
-  background-color: var(--cros-sys-dialog_container);
-  border-radius: 20px;
-  box-shadow: var(--cros-elevation-3-shadow);
-  color: var(--cros-sys-on_surface_variant);
-  cursor: default;
-  display: flex;
-  flex-direction: column;
-  margin: auto;
-  /* Narrower when viewport is too narrow. */
-  max-width: min(512px - 32px - 32px, 75vw);
-  min-width: calc(320px - 32px - 32px);
-  padding: 32px;
-  padding-bottom: 28px;
-  position: relative;
-}
-
-.cr-dialog-container .cr-dialog-frame:focus {
-  outline: none;
-}
-
-@keyframes pulse {
- 0% {
-   transform: scale(1);
- }
- 40% {
-   transform: scale(1.02);
-  }
- 60% {
-   transform: scale(1.02);
-  }
- 100% {
-   transform: scale(1);
- }
-}
-
-.cr-dialog-container.pulse {
-  animation-duration: 180ms;
-  animation-iteration-count: 1;
-  animation-name: pulse;
-  animation-timing-function: ease-in-out;
-}
-
-.cr-dialog-container.shown > .cr-dialog-frame {
-  opacity: 1;
-}
-
-.cr-dialog-container .cr-dialog-frame {
-  opacity: 0;
-  transition: opacity 100ms;
-}
-
-.cr-dialog-container .cr-dialog-title {
-  color: var(--cros-sys-on_surface);
-  display: block;
-  font: var(--cros-display-7-font);
-  margin-bottom: 16px;
-}
-
-.cr-dialog-container .cr-dialog-text {
-  font: var(--cros-body-1-font);
-}
-
-.cr-dialog-container .cr-dialog-text,
-.cr-dialog-container .cr-dialog-title {
-  overflow-wrap: break-word;
-}
-
-.cr-dialog-container .cr-dialog-text {
-  color: var(--cros-sys-on_surface_variant);
-}
-
-.cr-dialog-container .cr-dialog-buttons {
-  display: flex;
-  flex-direction: row;
-  justify-content: flex-end;
-  padding-top: 32px;
-}
-
-.cr-dialog-container .cr-dialog-close {
-  --hover-bg-color: var(--cros-sys-hover_on_subtle);
-  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
-  --ripple-opacity: 100%;
-  border: none;
-  border-radius: 16px;
-  color: var(--cros-sys-on_surface);
-  display: none;
-  height: 32px;
-  min-width: 32px;
-  padding: 0;
-  position: absolute;
-  right: 16px;
-  top: 16px;
-  width: 32px;
-}
-
-html.focus-outline-visible .cr-dialog-container
-    .cr-dialog-close:not(:active):focus {
-  outline: 2px solid var(--cros-sys-focus_ring);
-}
-
-.cr-dialog-container #default-task-dialog .cr-dialog-close {
-  display: inline-block;
-}
-
-.cr-dialog-container .cr-dialog-close > .icon {
-  -webkit-mask-image: url(../images/common/ic_close.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  -webkit-mask-size: 16px;
-  background-color: currentColor;
-  height: 32px;
-  position: absolute;
-  width: 32px;
-}
-
-:root[dir='rtl'] .cr-dialog-container .cr-dialog-close,
-:host-context(:root[dir='rtl']) .cr-dialog-container .cr-dialog-close {
-  left: 16px;
-  right: unset !important;
-}
-
-/* Modal <dialog> container for Pop-up dialogs. */
-#files-app-modal-dialog {
-  background-color: transparent;
-  border: none;
-  height: 100%;
-  margin: 0;
-  max-height: initial;
-  max-width: initial;
-  outline: none;
-  overflow: hidden;
-  padding: 0;
-  width: 100%;
-}
-
-/* Minor tweak of vertical position for texts which need to be vertically
- * aligned with corresponding file-type icons. */
-.tree-row > .label,
-.table-row-cell .filename-label,
-.table-row-cell .size,
-.table-row-cell .type,
-.table-row-cell .date,
-.thumbnail-bottom .filename-label,
-.autocomplete-suggestions > li > .detail-text {
-  padding-top: 1px;
-}
-
-@media (-webkit-min-device-pixel-ratio: 1.5) {
-  .tree-row > .label,
-  .table-row-cell .filename-label,
-  .table-row-cell .size,
-  .table-row-cell .type,
-  .table-row-cell .date,
-  .thumbnail-bottom .filename-label,
-  .autocomplete-suggestions > li > .detail-text {
-    /* In HiDPI display, 13pt Roboto font is drawn upper than normal display,
-     * so add extra padding on top of it. */
-    padding-top: 3px;
-  }
-}
-
-/* Common typography styles for ChromeOS. */
-.button2 {
-  color: var(--cros-sys-on_surface);
-  font: var(--cros-button-2-font);
-}
-
-.body2-primary {
-  color: var(--cros-sys-on_surface);
-  font: var(--cros-body-2-font);
-}
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager.css b/ui/file_manager/file_manager/foreground/css/file_manager.css
index d96886e..3292d85 100644
--- a/ui/file_manager/file_manager/foreground/css/file_manager.css
+++ b/ui/file_manager/file_manager/foreground/css/file_manager.css
@@ -39,7 +39,6 @@
   display: flex;
   flex: auto;
   flex-direction: column;
-  font-size: 13px;
   height: 100%;
   margin: 0;
   padding: 0;
@@ -56,18 +55,21 @@
 /* Main part of the dialog between header and footer. */
 .dialog-container {
   align-items: stretch;
-  background-color: var(--cros-bg-color);
+  background-color: var(--cros-sys-app_base_shaded);
   display: flex;
   flex: auto;
   flex-direction: row;
   overflow: hidden;
+  padding-inline-end: 16px;
+  padding-top: 16px;
   position: relative;
 }
 
 /* List and grid are inside this container. */
 .dialog-main {
   align-items: stretch;
-  background-color: inherit;
+  background-color: var(--cros-sys-app_base);
+  border-radius: 16px 16px 0 0;
   display: flex;
   flex: auto;
   flex-direction: column;
@@ -91,7 +93,7 @@
 .dialog-navigation-list-contents {
   display: flex;
   flex: 1 1 auto;
-  margin-top: 8px;
+  margin-inline-start: 16px;
   position: relative;
 }
 
@@ -112,7 +114,6 @@
 }
 
 /* Can be removed after new directory replacement. -- BEGIN */
-
 #directory-tree .tree-item[section-start]::before {
   border-bottom: 1px solid var(--cros-separator-color);
   content: '';
@@ -124,67 +125,39 @@
 #directory-tree .tree-row {
   cursor: pointer;
   height: auto;
-  padding: 4px 0;
+  padding: 4px; /* To cater 8px top/bottom padding and outline. */
 }
 
 #directory-tree .tree-row > .file-row {
   align-items: center;
-  border: 2px solid transparent;
   border-inline-start-width: 0 !important;
-  border-radius: 0 20px 20px 0;
+  border-radius: 20px;
   box-sizing: border-box;
-  color: var(--cros-text-color-primary);
+  color: var(--cros-sys-on_surface);
   display: flex;
-  height: 32px;
-  margin-inline-end: 6px;
-}
-
-html[dir='rtl'] #directory-tree .tree-row > .file-row {
-  border-radius: 20px 0 0 20px;
-}
-
-#directory-tree .tree-row > .expand-icon {
-  flex: none;
-  height: 36px;
-  left: 3px;
-  margin: -12px -2px;
-  right: 3px;
-  top: 0;
-  width: 36px;
+  height: 40px;
+  padding-inline-end: 12px;
 }
 
 #directory-tree .tree-row > .file-row > .expand-icon {
   box-sizing: border-box;
   flex: none;
-  height: 32px;
-  padding: 6px;
-  width: 32px;
-}
-
-#directory-tree .tree-row > .item-icon {
-  flex: none;
-  height: 16px;
-  width: 16px;
+  height: 20px;
+  margin-inline-start: 8px;
+  width: 20px;
 }
 
 #directory-tree .tree-row > .file-row > .item-icon {
   -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-icon-color-primary);
+  background-color: currentColor;
   background-image: none;
   flex: none;
   height: 20px;
-  left: -4px;
   position: relative;
-  right: -4px;
   width: 20px;
 }
 
-#directory-tree .tree-item:not([disabled])
-  .tree-row[active] > .file-row > .item-icon:not([style*='background-image']) {
-  background-color: var(--cros-icon-color-selection);
-}
-
 #directory-tree .tree-row > .file-row > .item-icon[style*='background-image'] {
   background-color: transparent;
   background-position: center;
@@ -192,32 +165,26 @@
   background-size: 20px 20px;
 }
 
-#directory-tree .tree-row > .label {
+#directory-tree .tree-row > .file-row > .label {
   display: block;
   flex: auto;
-  font-weight: 500;
-  margin: 0 6px;
+  font: var(--cros-button-2-font);
+  margin-inline-start: 8px;
   overflow: hidden;
   text-overflow: ellipsis;
 }
 
-#directory-tree .tree-row > .file-row > .label {
-  display: block;
-  flex: auto;
-  font-weight: 500;
-  margin: 0 12px;
-  overflow: hidden;
-  text-overflow: ellipsis;
+/* The file label's direction is always LTR even in RTL mode
+   (.entry-name in common.css), so the inline-start above won't work in RTL
+   mode, we need to have the inline-end here. */
+html[dir='rtl'] #directory-tree .tree-row > .file-row > .label {
+  margin-inline-end: 8px;
+  margin-inline-start: 0;
 }
 
 #directory-tree .tree-row .rename-placeholder {
   flex: auto;
-  font-weight: 500;
-}
-
-#directory-tree .tree-row > .rename-placeholder {
-  display: block;
-  margin: 0 6px;
+  font: var(--cros-button-2-font);
 }
 
 #directory-tree .tree-row .rename-placeholder > input {
@@ -228,36 +195,34 @@
   display: none;
 }
 
-#directory-tree [renaming] > .tree-row > .label,
 #directory-tree [renaming] > .tree-row > .file-row > .label {
   display: none;
 }
 
-#directory-tree .tree-row > input {
-  display: none;
-  margin: 0 6px;
-  overflow: hidden;
-}
-
 #directory-tree .tree-row > .file-row > input {
   display: none;
-  margin: 0 10px;
+  height: 20px;
+  margin-inline: 8px 12px;
   overflow: hidden;
 }
 
-#directory-tree [renaming] > .tree-row > input,
+#directory-tree .tree-item:not([disabled])
+    .tree-row[active] > .file-row > input {
+  outline: 2px solid var(--cros-sys-inverse_primary);
+}
+
 #directory-tree [renaming] > .tree-row > .file-row > input {
   display: block;
 }
 
 html:not(.col-resize) #directory-tree .tree-item:not([disabled]) >
     .tree-row:not([active]):not([selected]):hover > .file-row {
-  background-color: var(--cros-ripple-color);
+  background-color: var(--cros-sys-hover_on_subtle);
 }
 
 html.pointer-active #directory-tree .tree-item:not([disabled]) >
     .tree-row:not([active]):not([selected]) > .file-row:active {
-  background-color: var(--cros-ripple-color);
+  background-color: var(--cros-sys-hover_on_subtle);
 }
 
 html.pointer-active #directory-tree
@@ -270,269 +235,176 @@
 }
 
 html.drag-drop-active #directory-tree .tree-item.denies > .tree-row > .file-row {
-  background-color: var(--cros-highlight-color-error);
+  background-color: var(--cros-sys-error_container);
+  color: var(--cros-sys-on_error_container);
 }
 
 html.drag-drop-active #directory-tree .tree-item.accepts > .tree-row > .file-row {
-  background-color: var(--cros-ripple-color);
+  background-color: var(--cros-sys-hover_on_subtle);
+}
+
+html.drag-drop-active #directory-tree
+    .tree-item.accepts > .tree-row[active] > .file-row {
+  background-color: var(--cros-sys-primary);
 }
 
 html.focus-outline-visible #directory-tree:focus .tree-row[selected] > .file-row {
-  border: 2px solid var(--cros-focus-ring-color);
+  outline: 2px solid var(--cros-sys-focus_ring);
+  outline-offset: 2px;
 }
 
 #directory-tree .tree-item:not([disabled]) .tree-row[active] > .file-row {
-  background-color: var(--cros-highlight-color);
-  color: var(--cros-text-color-selection);
+  background-color: var(--cros-sys-primary);
+  color: var(--cros-sys-on_primary);
 }
 
-#directory-tree .tree-item[disabled] > .tree-row {
+#directory-tree .tree-item[disabled] > .tree-row > .file-row {
   cursor: default;
 }
 
-#directory-tree .tree-row > .align-right-icon {
-  --iron-icon-height: 16px;
-  --iron-icon-width: 16px;
-  border-style: none;
+#directory-tree .tree-row > .file-row > .align-right-icon {
+  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
+  --iron-icon-height: 20px;
+  --iron-icon-width: 20px;
+  --ripple-opacity: 100%;
+  border: none;
+  border-radius: 20px;
+  box-sizing: border-box;
   flex: none;
   height: 40px;
   position: relative;
+  right: -12px; /* Same as padding inline end of side nav. */
   width: 40px;
   z-index: 1;
 }
 
-#directory-tree .tree-row > .file-row > .align-right-icon {
-  --iron-icon-height: 20px;
-  --iron-icon-width: 20px;
-  border-radius: 16px;
-  border-style: none;
-  box-sizing: border-box;
-  flex: none;
-  height: 32px;
-  left: 1px;
-  position: relative;
-  right: 1px;
-  width: 32px;
-  z-index: 1;
-}
-
-#directory-tree .tree-row > .external-link-icon iron-icon {
-  padding: 12px;
+html[dir='rtl'] #directory-tree .tree-row > .file-row > .align-right-icon {
+  left: -12px; /* Same as padding inline end of side nav. */
+  right: unset;
 }
 
 #directory-tree .tree-row > .file-row > .external-link-icon iron-icon {
-  padding: 6px;
-}
-
-#directory-tree .tree-row > .root-eject {
-  --text-color: currentColor;
-  min-width: 40px;
-  padding: 12px;
+  padding: 10px;
 }
 
 #directory-tree .tree-row > .file-row > .root-eject {
   --text-color: currentColor;
-  --hover-bg-color: var(--cros-ripple-color);
+  --hover-bg-color: var(--cros-sys-hover_on_subtle);
   min-width: 32px;
   padding: 0;
 }
 
-html.col-resize #directory-tree .tree-row > .root-eject:hover {
-  --hover-bg-color: none;
+#directory-tree .tree-row[active] > .file-row > .root-eject {
+  --hover-bg-color: var(--cros-sys-hover_on_prominent);
 }
 
 html.col-resize #directory-tree .tree-row > .file-row > .root-eject:hover {
   --hover-bg-color: none;
 }
 
-#directory-tree .tree-row > .root-eject:focus {
-  outline: 1px auto var(--cros-focus-ring-color);
-}
-
 #directory-tree .tree-row > .file-row > .root-eject:focus {
-  border: 1px solid var(--cros-focus-ring-color);
+  outline: 2px solid var(--cros-sys-focus_ring);
+  outline-offset: 2px;
 }
 
-#directory-tree .tree-row > .root-eject:active {
-  border-radius: 20px;
-  outline-width: 0;
+#directory-tree .tree-row[active] > .file-row > .root-eject:focus {
+  outline: 2px solid var(--cros-sys-inverse_primary);
+  outline-offset: 2px;
 }
 
-#directory-tree .tree-row > .file-row > .root-eject:active {
-  --ink-color: var(--cros-ripple-color);
-  border-width: 0;
+#directory-tree .tree-row[active] > .file-row > .root-eject:active {
+  --ink-color: var(--cros-sys-ripple_neutral_on_prominent);
 }
-
-#directory-tree .root-item[disabled] {
-  opacity: 0.5;
-  pointer-events: none;
-}
-
 /* Can be removed after new directory replacement. -- END */
 
 #directory-tree xf-tree-item > input::selection {
-  background-color: var(--cros-text-highlight-color);
+  background-color: var(--cros-sys-highlight_text);
 }
 
-/* These changes are for the new directory to work with FilesLegacy style. */
-#directory-tree .align-right-icon {
-  --iron-icon-height: 20px;
-  --iron-icon-width: 20px;
-  border-radius: 16px;
-  border-style: none;
-  box-sizing: border-box;
-  flex: none;
-  height: 32px;
-  left: 1px;
-  position: relative;
-  right: 1px;
-  width: 32px;
-  z-index: 1;
+#directory-tree xf-tree-item > .external-link-icon iron-icon {
+  padding: 10px;
 }
 
-#directory-tree .root-eject {
-  --text-color: currentColor;
-  --hover-bg-color: var(--cros-ripple-color);
-  min-width: 32px;
-  padding: 0;
-}
-
-html.col-resize #directory-tree .root-eject:hover {
-  --hover-bg-color: none;
-}
-
-#directory-tree .root-eject:focus {
-  outline: 1px auto var(--cros-focus-ring-color);
-}
-
-#directory-tree .root-eject:active {
-  --ink-color: var(--cros-ripple-color);
-  border-radius: 20px;
-  outline-width: 0;
-}
-
-#directory-tree .external-link-icon iron-icon {
-  padding: 6px;
-}
-
-/* A vertical splitter between the directory tree and the file list. It is
-   a transparent area centered on the directory tree right border. */
+/* Splitter. */
+/* Prevent the sudden flickering when opening the Files app. "div.splitter" is
+  the legacy splitter DOM element. We need to maintain the existing DOM
+  structure to make sure it can cater both the legacy splitter style and the
+  refresh23 style. In file_manager_ui.js we will remove the legacy ".splitter"
+  element if the jelly flag is on, this sudden removal will cause a flickering
+  issue due to position change, hence setting a width here for the legacy
+  splitter to prevent that.  */
 div.splitter {
-  align-items: center;
-  cursor: col-resize;
-  display: flex;
-  flex: none;
-  justify-content: center;
-  margin: 0;
-  margin-inline-end: calc(16px - 6px);
-  position: relative;
-  width: 32px;
-  z-index: 500;  /* Must be below the contextmenu (600). */
+  width: 24px;
 }
 
 div.splitter .splitter-button {
-  --hover-bg-color: var(--cros-ripple-color);
-  --ink-color: var(--cros-ripple-color);
-  --ripple-opacity: 100%;
-  border: none;
-  border-radius: 50%;
-  cursor: col-resize;
-  height: 32px;
-  min-width: 32px;
-  padding: 0;
-  width: 32px;
+  display: none;
 }
 
-html.pointer-active div.splitter:not(.splitter-active):hover {
-  cursor: default;
+.jelly-splitter {
+  --xf-splitter-tracker-offset: 16px;
+  --xf-splitter-z-index: 500;  /* Must be below the contextmenu (600). */
 }
 
-html.col-resize div.splitter:not(.splitter-active) .splitter-button:hover {
-  --hover-bg-color: none;
+html.pointer-active .jelly-splitter:not(.splitter-active):hover {
+  --xf-splitter-cursor: default;
+  --xf-splitter-hover-color: none;
 }
 
-html.pointer-active div.splitter:not(.splitter-active) .splitter-button:not(:active):hover {
-  --hover-bg-color: none;
-  cursor: default;
-}
-
-div.splitter.splitter-active .splitter-button:active:not(:hover) {
-  background-color: var(--cros-ripple-color);
-}
-
-div.splitter.splitter-active .splitter-button:not(:active) {
-  background-color: var(--cros-icon-button-pressed-color);
-}
-
-div.splitter .splitter-button .icon {
-  -webkit-mask-image: url(../images/common/dragger.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  /* TODO(crbug.com/1268206): the icon is not in disabled state */
-  background-color: var(--cros-icon-color-disabled);
-  height: 20px;
-  padding: 6px;
-  width: 20px;
-}
-
-html.pointer-active div.splitter:not(.splitter-active) .splitter-button:not(:active):hover .icon {
-  cursor: default;
+html.col-resize .jelly-splitter:not(.splitter-active):hover {
+  --xf-splitter-cursor: col-resize;
+  --xf-splitter-hover-color: none;
 }
 
 /* Breadcrumbs and things under the title but above the list view. */
 .dialog-header {
   align-items: center;
   background: none;
-  border-bottom: 1px solid var(--cros-separator-color);
+  border-bottom: 1px solid transparent;
   box-sizing: border-box;
-  color: var(--cros-text-color-secondary);
+  color: var(--cros-sys-on_surface_variant);
   display: flex;
   flex: none;
   flex-direction: row;
-  font-size: 14px;
   height: 57px;
   overflow: hidden;
   transition: background 220ms ease;
 }
 
 body.check-select .dialog-header {
-  border-bottom: 1px solid var(--cros-separator-color);
+  border-bottom: 1px solid transparent;
   border-top: 1px solid transparent;
-  color: var(--cros-text-color-prominent);
+  color: var(--cros-sys-on_primary_container);
 }
 
 /* Display a border during check-select mode if we're in a dialog. (This
    can only happen in an open-multi-file dialog). */
 body[type='open-multi-file'].check-select .dialog-header {
-  border-top: 1px solid var(--cros-bg-color);
+  border-top: 1px solid var(--cros-sys-app_base);
 }
 
 .dialog-header > .spacer {
-  flex: auto;
+  flex: 1 0 8px;
 }
 
 .dialog-header cr-button {
-  --active-bg: var(--cros-ripple-color);
-  --hover-bg-color: var(--cros-ripple-color);
-  --ink-color: var(--cros-ripple-color);
+  --hover-bg-color: var(--cros-sys-hover_on_subtle);
+  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
   --ripple-opacity: 100%;
   --text-color: currentColor;
-  border: 2px solid transparent;
+  border: none;
   border-radius: 18px;
   box-sizing: border-box;
-  color: var(--cros-text-color-primary);
+  color: var(--cros-sys-on_surface);
   cursor: pointer;
   height: 36px;
-  margin: 0 6px;
-  min-width: 36px;
-  padding: 0;
+  min-width: 48px;
   position: relative;
-  text-transform: uppercase;
   z-index: 1;
 }
 
 html.pointer-active .dialog-header cr-button:not(:active):hover {
-  background-color: unset;
+  --hover-bg-color: none;
   cursor: default;
 }
 
@@ -544,34 +416,16 @@
 }
 
 .dialog-header cr-button[menu-shown] {
-  background: var(--cros-icon-button-pressed-color);
+  background-color: var(--cros-sys-primary_container);
+  color: var(--cros-sys-on_primary_container);
 }
 
-.dialog-header button:not([menu-shown]):not(:active):hover,
-.dialog-header cr-button:not([menu-shown]):not(:active):hover {
-  background-color: var(--cros-ripple-color);
-}
-
-html.pointer-active .dialog-header cr-button:not([menu-shown]):not(:active):hover {
-  background-color: unset;
-  cursor: default;
-}
-
-.dialog-header cr-button:active:not([menu-shown]) {
-  background: var(--cros-icon-button-pressed-color);
+.dialog-header cr-button:not([aria-haspopup]):active {
+  background-color: var(--cros-sys-pressed_on_subtle);
 }
 
 html.focus-outline-visible .dialog-header cr-button:not(:active):focus {
-  border: 2px solid var(--cros-focus-ring-color);
-}
-
-body.check-select button,
-body.check-select button:hover {
-  color: var(--cros-text-color-primary);
-}
-
-body.check-select .dialog-header button paper-ripple {
-  color: var(--cros-text-color-primary);
+  outline: 2px solid var(--cros-sys-focus_ring);
 }
 
 /** Avoid highlighting if element doesn't have focus by tab (tabindex=-1)
@@ -583,7 +437,7 @@
 
 body.check-select .dialog-header
     .menu-button:focus:not([tabindex='-1']):not(:active) {
-  background-color: var(--cros-ripple-color);
+  background-color: var(--cros-sys-ripple_neutral_on_subtle);
 }
 
 .dialog-header iron-icon,
@@ -592,33 +446,25 @@
   width: 16px;
 }
 
-.dialog-header cr-button {
-  line-height: 32px;
-  padding: 0 8px;
+.dialog-header cr-button.icon-button {
+  border-radius: 12px;
+  height: 40px;
+  margin: 4px;
+  min-width: 40px;
+  padding: 10px;
+  width: 40px;
 }
 
-.dialog-header button.icon-button {
-  -webkit-app-region: no-drag;
-  background-color: transparent;
-  background-image: none;
-  background-position: center;
-  background-repeat: no-repeat;
-  box-shadow: none;
-  outline: none;
-  position: relative;
+.dialog-header cr-button.icon-button[aria-haspopup] {
+  --ink-color: var(--cros-sys-ripple_primary);
 }
 
 .dialog-header cr-button.icon-button > .icon {
   background-position: center;
   background-repeat: no-repeat;
-  height: 48px;
-  left: 0;
-  margin-inline-end: -8px;
-  margin-inline-start: -8px;
-  margin-top: -8px;
+  height: 20px;
   position: absolute;
-  top: 0;
-  width: 48px;
+  width: 20px;
 }
 
 .dialog-header cr-button.icon-button > xf-icon {
@@ -626,9 +472,16 @@
 }
 
 .dialog-header #tasks {
-  border-radius: 4px;
-  height: 32px;
-  padding: 0 12px;
+  color: var(--cros-sys-primary);
+  font: var(--cros-button-2-font);
+  margin: 0 8px;
+  padding-bottom: 0;
+  padding-inline: 16px;
+  padding-top: 0;
+}
+
+.dialog-header #tasks[multiple] {
+  padding-inline-end: 12px;
 }
 
 .dialog-header cr-button > .icon,
@@ -640,34 +493,33 @@
   background-image: none;
 }
 
-.dialog-header #cloud-wrapper {
-  display: flex;
-  position: relative;
-}
-
 .dialog-header #search-wrapper {
   display: flex;
 }
 
 .dialog-header.files-ng #search-wrapper {
   align-items: center;
-  border-radius: 4px;
-  height: 40px;
+  border-radius: 8px;
+  height: 48px;
   transition: background-color 200ms ease;
 }
 
 .dialog-header.files-ng #search-wrapper.has-cursor,
 .dialog-header.files-ng #search-wrapper.has-text,
 .dialog-header.files-ng #search-wrapper.hide-pending {
-  background-color: var(--cros-textfield-background-color);
-  margin-inline-end: 16px;
+  background-color: var(--cros-sys-input_field_on_base);
 }
 
 .dialog-header #search-box cr-input {
   --cr-input-background-color: transparent;
+  --cr-input-border-bottom: transparent;
   --cr-input-border-radius: 0;
+  --cr-input-color: var(--cros-sys-on_surface);
   --cr-input-error-display: none;
-  --cr-input-padding-end: 20px;
+  --cr-input-focus-color: transparent;
+  --cr-input-min-height: 20px;
+  --cr-input-placeholder-color: var(--cros-sys-secondary);
+  --cr-input-padding-end: 0;
   --cr-input-padding-start: 0;
   display: inline-block;
   transition: width 200ms ease;
@@ -744,11 +596,11 @@
 
 #files-selected-label {
   display: none;
-  font-weight: 500;
+  font: var(--cros-button-1-font);
 }
 
 body.files-ng #files-selected-label {
-  margin-inline-start: 8px;
+  margin-inline: 8px 12px;
 }
 
 body.check-select #files-selected-label {
@@ -756,7 +608,7 @@
 }
 
 #cancel-selection-button {
-  --ink-color: var(--cros-ripple-color);
+  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
   border: none;
   box-shadow: none;
   color: currentColor;
@@ -764,15 +616,16 @@
   text-transform: none;
 }
 
-/* TODO(adanilo) document the calc() reason. */
 body.files-ng #cancel-selection-button {
-  border: 2px solid transparent;
-  margin-inline-start: calc(10px + 1px);
-  width: 36px;
+  height: 32px;
+  margin-inline-start: 12px;
+  min-width: 32px;
+  padding: 6px;
+  width: 32px;
 }
 
 html.focus-outline-visible body.files-ng #cancel-selection-button:focus:not([tabindex='-1']):not(:active) {
-  border: 2px solid var(--cros-icon-color-prominent);
+  outline: 2px solid var(--cros-sys-focus_ring);
 }
 
 body.files-ng #cancel-selection-button > span#cancel-selection-label {
@@ -783,7 +636,7 @@
   -webkit-mask-image: url(../images/files/ui/list_check.svg);
   -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-icon-color-prominent);
+  background-color: currentColor;
   flex: none;
   height: 20px;
   width: 20px;
@@ -824,18 +677,12 @@
 #search-box {
   display: flex;
   flex: none;
-  font-size: 14px;
-}
-
-.dialog-header.files-ng #search-box cr-input {
-  --cr-input-border-bottom: transparent;
-  --cr-input-color: var(--cros-text-color-primary);
-  --cr-input-focus-color: transparent;
-  --cr-input-placeholder-color: var(--cros-text-color-secondary);
+  font: var(--cros-body-2-font);
 }
 
 .dialog-header.files-ng #search-box cr-input::part(input) {
-  caret-color: var(--cr-input-color);
+  caret-color: var(--cros-sys-primary);
+  margin-inline-end: 16px;
 }
 
 body.check-select-v1 #search-box {
@@ -867,12 +714,14 @@
 
 .dialog-header.files-ng #search-box .clear {
   background: none;
-  height: 36px;
-  width: 36px;
+  height: 32px;
+  margin-inline-end: 4px;
+  padding: 0;
+  width: 32px;
 }
 
 html:not(.pointer-active) .dialog-header.files-ng #search-box .clear:hover {
-  background-color: var(--cros-ripple-color);
+  background-color: var(--cros-sys-hover_on_subtle);
 }
 
 .dialog-header.files-ng #search-box .clear > .icon {
@@ -900,27 +749,30 @@
 }
 
 .dialog-header.files-ng #pinned-toggle-label {
-  color: var(--cros-text-color-primary);
+  color: var(--cros-sys-on_surface);
+  font: var(--cros-button-2-font);
   margin-inline-end: 16px;
   margin-inline-start: 12px;
 }
 
 .dialog-header.files-ng cr-toggle {
-  --cr-toggle-checked-bar-color: var(--cros-switch-track-color-active);
+  --cr-toggle-checked-bar-color: var(--cros-sys-primary_container);
   /* bar color above already defines the opacity, so use 100% here */
   --cr-toggle-checked-bar-opacity: 100%;
-  --cr-toggle-checked-button-color: var(--cros-switch-knob-color-active);
-  --cr-toggle-checked-ripple-color: var(--cros-focus-aura-color);
-  --cr-toggle-unchecked-bar-color: var(--cros-switch-track-color-inactive);
-  --cr-toggle-unchecked-button-color: var(--cros-switch-knob-color-inactive);
-  --cr-toggle-unchecked-ripple-color: var(--cros-ripple-color);
+  --cr-toggle-checked-button-color: var(--cros-sys-primary);
+  --cr-toggle-checked-ripple-color: transparent;
+  --cr-toggle-unchecked-bar-color: var(--cros-sys-secondary);
+  --cr-toggle-unchecked-button-color: var(--cros-sys-surface_variant);
+  --cr-toggle-unchecked-ripple-color: transparent;
   --cr-toggle-box-shadow: var(--cros-elevation-1-shadow);
   --cr-toggle-ripple-diameter: 32px;
+  margin-inline: 6px;
+  margin-top: 2px;
 }
 
 /* only show the ripple ring for tab navigation */
 html.focus-outline-visible .dialog-header.files-ng cr-toggle:focus {
-  --cr-toggle-ripple-ring: 2px solid var(--cros-focus-ring-color);
+  --cr-toggle-ripple-ring: 2px solid var(--cros-sys-focus_ring);
 }
 
 /* Container for the detail and thumbnail list views. */
@@ -951,8 +803,8 @@
 /* Container for the ok/cancel buttons. */
 .dialog-footer {
   align-items: center;
-  background-color: var(--cros-bg-color);
-  border-top: 1px solid var(--cros-separator-color);
+  background-color: var(--cros-sys-app_base);
+  border-top: 1px solid var(--cros-sys-separator);
   display: flex;
   flex: none;
   flex-direction: row;
@@ -968,123 +820,40 @@
 }
 
 .dialog-footer cr-input {
-  --cr-input-background-color: var(--cros-textfield-background-color);
-  --cr-input-border-radius: 0;
-  --cr-input-color: var(--cros-textfield-input-color);
-  --cr-input-error-color: var(--cros-textfield-label-color-error);
+  --cr-input-background-color: var(--cros-sys-input_field_on_base);
+  --cr-input-border-radius: 8px;
+  --cr-input-color: var(--cros-sys-on_surface);
+  --cr-input-error-color: var(--cros-sys-error);
   --cr-input-error-display: none;
-  --cr-input-focus-color: var(--cros-textfield-label-color-focus);
-  --cr-input-min-height: 32px;
+  --cr-input-focus-color: var(--cros-sys-primary);
+  --cr-input-min-height: 36px;
+  --cr-input-padding-end: 16px;
+  --cr-input-padding-start: 16px;
+  --cr-input-placeholder-color: var(--cros-sys-secondary);
+  font: var(--cros-body-2-font);
   width: 100%;
 }
 
+cr-input::part(input)::selection {
+  background-color: var(--cros-sys-highlight_text);
+}
+
 .dialog-footer .buttonbar {
   display: flex;
-  height: 32px;
-}
-
-/* Copy style from paper-button for buttons on the footer. */
-.dialog-footer button {
-  border: 0;
-  border-image: none;
-  border-radius: 4px;
-  box-sizing: border-box;
-  cursor: pointer;
-  margin: 0;
-  outline: none;
-  padding: 1px 16px;
-  position: relative;
-  text-align: center;
-  user-select: none;
-  z-index: 0;
-}
-
-/* This is only for refresh23 style. */
-button > .hover-layer {
-  display: none;
-}
-
-.dialog-footer button[disabled] {
-  cursor: auto;
-  pointer-events: none;
-}
-
-.dialog-footer button {
-  font-weight: 500;
-}
-
-.dialog-footer button:hover {
-  border-image: none;  /* Overrides the definition of common.css. */
-}
-
-.dialog-footer cr-button,
-.dialog-footer button {
-  height: 32px;
-  margin: 0 4px;
-  min-width: 92px;
-}
-
-.dialog-footer cr-button[disabled],
-.dialog-footer cr-button[disabled]:hover,
-.dialog-footer button[disabled],
-.dialog-footer button[disabled]:hover {
-  background-color:
-      var(--cros-button-background-color-primary-disabled);
-  color: var(--cros-button-label-color-primary-disabled);
-}
-
-.dialog-footer .primary {
-  background-color: var(--cros-button-background-color-primary);
-  color: var(--cros-button-label-color-primary);
-}
-
-.dialog-footer .primary:hover {
-   background: var(--cros-button-background-color-primary-hover-preblended);
-}
-
-.dialog-footer .primary paper-ripple {
-  --paper-ripple-opacity: var(--cros-button-primary-ripple-opacity);
-  color: var(--cros-button-ripple-color-primary);
-}
-
-.dialog-footer .primary:active {
-  box-shadow: 0 1px 2px var(--cros-button-active-shadow-color-key-primary),
-              0 1px 3px var(--cros-button-active-shadow-color-ambient-primary);
-}
-
-.dialog-footer .secondary {
-  background: transparent;
-  border: 1px solid var(--cros-button-stroke-color-secondary);
-  color: var(--cros-button-label-color-secondary);
-  margin-inline-end: 8px;
-}
-
-.dialog-footer .secondary:hover {
-  background: var(--cros-button-background-color-secondary-hover);
-  border: 1px solid var(--cros-button-stroke-color-secondary-hover);
-}
-
-.dialog-footer .secondary paper-ripple {
-  --paper-ripple-opacity: var(--cros-button-secondary-ripple-opacity);
-  color: var(--cros-button-ripple-color-secondary);
-}
-
-.dialog-footer .secondary:active {
-  box-shadow: 0 1px 2px var(--cros-button-active-shadow-color-key-secondary),
-              0 1px 3px var(--cros-button-active-shadow-color-ambient-secondary);
+  height: 36px;
 }
 
 .dialog-footer .select {
-  background-color: var(--cros-textfield-background-color);
+  background-color: var(--cros-sys-input_field_on_base);
   border: 0;
-  border-radius: 4px;
+  border-radius: 8px;
   cursor: pointer;
   margin-inline-start: 16px;
   max-width: 152px;
-  min-height: 32px;
+  min-height: 36px;
   min-width: 104px;
   outline: none;
-  padding: 0 36px 0 16px;
+  padding: 0 48px 0 16px;
   position: relative;
 }
 
@@ -1092,22 +861,21 @@
   -webkit-mask-image: url(../images/files/ui/sort_desc.svg);
   -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-icon-color-primary);
+  background-color: var(--cros-sys-secondary);
   content: '';
-  height: 32px;
+  height: 36px;
   position: absolute;
   right: 0;
-  width: 32px;
+  width: 36px;
 }
 
 .dialog-footer div.select:not(:active):focus {
-  box-shadow: 0 0 0 2px var(--cros-focus-ring-color);
+  outline: 2px solid var(--cros-sys-focus_ring);
 }
 
 .dialog-footer div.select > span {
-  color: var(--cros-text-color-primary);
   display: inline-block;
-  line-height: 32px;
+  line-height: 36px;
   max-width: 100%;
   overflow: hidden;
   text-overflow: ellipsis;
@@ -1116,8 +884,8 @@
 }
 
 .dialog-footer div.select > div.options {
-  background-color: var(--cros-bg-color-elevation-2);
-  border-radius: 4px;
+  background-color: var(--cros-sys-base_elevated);
+  border-radius: 8px;
   bottom: calc(100% + 2px);
   box-shadow: var(--cros-elevation-2-shadow);
   left: 0;
@@ -1133,29 +901,48 @@
 }
 
 .dialog-footer div.select > div.options option {
-  color: var(--cros-menu-label-color);
-  line-height: 32px;
-  min-height: 32px;
-  padding: 0 12px 0 16px;
+  color: var(--cros-sys-on_surface);
+  font: var(--cros-button-2-font);
+  line-height: 36px;
+  min-height: 36px;
+  padding: 0 16px;
   vertical-align: middle;
 }
 
 .dialog-footer div.select > div.options option:hover,
 .dialog-footer div.select > div.options:not(:hover) option.selected {
-  background-color: var(--cros-menu-item-background-hover);
+  background-color: var(--cros-sys-hover_on_subtle);
 }
 
 .dialog-footer select:hover {
   border-image: none;
 }
 
-html.focus-outline-visible .dialog-footer .primary:focus,
-html.focus-outline-visible .dialog-footer .secondary:focus,
 html.focus-outline-visible .dialog-footer select:focus {
-  outline: 2px solid var(--cros-focus-ring-color);
+  outline: 2px solid var(--cros-sys-focus_ring);
   outline-offset: 2px;
 }
 
+/** Reset the hover color when using keyboard to navigate the dropdown items. */
+html.focus-outline-visible .dialog-footer div.select > div.options option:hover,
+html.focus-outline-visible
+    .dialog-footer div.select > div.options:not(:hover) option.selected {
+  background-color: unset;
+}
+
+html.focus-outline-visible
+    .dialog-footer div.select > div.options option:hover::after,
+html.focus-outline-visible
+    .dialog-footer div.select > div.options:not(:hover) option.selected::after {
+  border: 2px solid var(--cros-sys-focus_ring);
+  border-radius: 8px;
+  content: '';
+  height: 32px; /* option height - 2 x border width */
+  left: 0;
+  position: absolute;
+  width: calc(100% - 4px); /* 2 x border width */
+}
+
 .progressable:not([progress]) .progress-bar,
 .progressable:not([progress]) .preparing-label {
   display: none;
@@ -1183,6 +970,8 @@
   display: flex;
   flex-direction: row;
   overflow: hidden;
+  padding-bottom: 4px;
+  padding-top: 4px;
 }
 
 body.check-select .breadcrumbs {
@@ -1192,14 +981,13 @@
 /* The toolbar indicator that means the current directory is read only. */
 #read-only-indicator {
   align-items: center;
-  background-color: var(--cros-highlight-color-hover);
-  border-radius: 16px;
+  background-color: var(--cros-sys-disabled_container);
+  border: 1px solid var(--cros-sys-separator);
+  border-radius: 8px;
   display: flex;
   flex: none;
   height: 32px;
-  margin-inline-start: 12px;
-  padding: 0 16px;
-  padding-inline: 16px 12px;
+  padding-inline: 8px 12px;
 }
 
 body.check-select #read-only-indicator {
@@ -1208,7 +996,6 @@
 
 .dialog-header.files-ng #read-only-icon {
   -webkit-mask-image: url(../images/files/ui/visibility_ng.svg);
-  background-color: var(--cros-icon-color-secondary);
   height: 20px;
   margin-inline-end: 8px;
   width: 20px;
@@ -1216,8 +1003,7 @@
 
 #read-only-label {
   flex: none;
-  font-size: 13px;
-  font-weight: 500;
+  font: var(--cros-button-1-font);
 }
 
 .filelist-panel {
@@ -1236,6 +1022,7 @@
 }
 
 #empty-folder {
+  align-items: center;
   display: flex;
   flex-direction: column;
   height: 100%;
@@ -1246,49 +1033,36 @@
 }
 
 #empty-folder > .image {
-  --empty-folder-svg-dot-color: var(--cros-illustration-color-1-shade-1);
-  --empty-folder-svg-file-color: var(--cros-illustration-secondary-color);
-  --empty-folder-svg-ellipse-color: var(--cros-illustration-color-1);
-  --empty-folder-svg-folder-color: var(--cros-illustration-color-1-shade-2);
-
-
-  /* TODO(b/283366482) Remove this manual GM3 -> GM2 mapping once b/280712160
-  fixed. */
-  --cros-sys-illo-color1: var(--cros-illustration-color-1);
-  --cros-sys-illo-color1-2: var(--cros-illustration-color-1-shade-2);
-  --cros-sys-illo-secondary: var(--cros-illustration-secondary-color);
-  --cros-sys-illo-color3: var(--cros-illustration-color-3);
-  --cros-sys-illo-color5: var(--cros-illustration-color-5);
-  --cros-sys-illo-color2: var(--cros-illustration-color-2);
-  --cros-sys-illo-base: var(--cros-illustration-base-color);
-
-
+  --empty-folder-svg-dot-color: var(--cros-sys-illo-color1-1);
+  --empty-folder-svg-file-color: var(--cros-sys-illo-secondary);
+  --empty-folder-svg-ellipse-color: var(--cros-sys-illo-color1);
+  --empty-folder-svg-folder-color: var(--cros-sys-illo-color1-2);
   margin-top: 64px;
-  text-align: center;
 }
 
 .list-view #empty-folder > .image {
   /* The list view has a .table-header at the top, the margin-top should also
   cover that, hence the desired margin plus the .table-header height. */
-  margin-top: calc(64px + 57px);
+  margin-top: calc(64px + 49px);
 }
 
 #empty-folder > .label {
-  color: var(--cros-text-color-secondary);
+  color: var(--cros-sys-on_surface);
   font: var(--cros-body-2-font);
   margin-top: 16px;
   text-align: center;
+  width: 320px;
   /* Ensure links in label are on top when not hidden so a click is not
   absorbed by an empty file-list. */
   z-index: 500;  /* Must be below the contextmenu (600). */
 }
 
-#empty-folder > .label > span#empty-folder-title {
-  font-weight: bold;
+#empty-folder #empty-folder-title {
+  font: var(--cros-button-2-font);
 }
 
 #empty-folder > .label > span#empty-folder-desc > a {
-  color: var(--cros-text-color-prominent);
+  color: var(--cros-sys-primary);
   font: var(--cros-body-1-font);
 }
 
@@ -1306,10 +1080,12 @@
 }
 
 #file-list .drag-selection-border {
-  -webkit-box-sizing: border-box;
-  background-color: rgba(var(--cros-bg-color-rgb), 30%);
-  border: 2px solid rgba(var(--cros-bg-color-rgb), 60%);
-  outline: 1px solid var(--cros-selection-outline);
+  background-color: var(--cros-sys-highlight_shape);
+  border: 2px solid var(--cros-sys-primary);
+  border-radius: 4px;
+  box-sizing: border-box;
+  display: flex;
+  outline: 1px solid var(--cros-sys-separator);
   position: absolute;
   z-index: 2;
 }
@@ -1337,7 +1113,7 @@
 .list-view .loading-indicator {
   /* The list view has a .table-header at the top, the top should also
   cover that, hence the desired top plus the .table-header height. */
-  top: calc(64px + 57px);
+  top: calc(64px + 49px);
 }
 
 @keyframes heightAnimation {
@@ -1374,20 +1150,32 @@
      fully visible. */
   box-sizing: border-box;
   overflow-y: auto;
+  padding-inline: calc(20px - 16px); /* 16px is the padding of the thumbnail. */
   width: 100%;
 }
 
 body.files-ng grid .grid-title {
   box-sizing: border-box;
-  color: var(--cros-text-color-secondary);
-  font-family: 'Roboto Medium';
+  color: var(--cros-sys-on_surface);
+  font: var(--cros-button-2-font);
+  padding-bottom: 6px;
   padding-inline-start: 16px;
-  padding-top: 20px;
+  padding-top: 14px;
   /* Make sure clicking this area can unselect file grids. */
   pointer-events: none;
   width: 100%;
 }
 
+/* Only add margin-top for non-first grid-title, this is mainly because
+   we don't have separator between the action bar and list container, which
+   makes the first group heading in the list container looks higher than
+   others (because of action bar's bottom padding), so in order to make all
+   group headings looks in the same height, we manually add a margin-top for
+   non-first group headings. */
+grid .grid-title ~ .grid-title {
+  margin-top: 16px;
+}
+
 grid .grid-title.group-by-isDirectory {
   /* Folders/Files heading doesn't have border bottom, so having a padding
    * bottom together with grid item's margin-top will make the gap too big.
@@ -1409,8 +1197,9 @@
   position: relative;
 }
 
-#list-container.thumbnail-view xf-inline-status {
+#list-container.thumbnail-view li xf-inline-status {
   align-items: center;
+  color: var(--cros-sys-secondary);
   display: flex;
   position: absolute;
   right: 5px;
@@ -1423,6 +1212,21 @@
   top: 0;
 }
 
+#list-container.thumbnail-view .thumbnail-grid:focus .thumbnail-item[selected] xf-inline-status,
+#list-container.thumbnail-view .thumbnail-grid:focus .thumbnail-item[lead] xf-inline-status {
+  color: var(--cros-sys-on_secondary_container);
+}
+
+#list-container.thumbnail-view .thumbnail-grid .thumbnail-item[selected] xf-inline-status,
+#list-container.thumbnail-view .thumbnail-grid .thumbnail-item[lead] xf-inline-status {
+  color: var(--cros-sys-on_surface);
+}
+
+body.check-select #list-container.thumbnail-view .thumbnail-grid:focus .thumbnail-item[selected] xf-inline-status,
+body.check-select #list-container.thumbnail-view .thumbnail-grid:focus .thumbnail-item[selected] xf-inline-status {
+  color: var(--cros-sys-on_primary_container);
+}
+
 /* Hide inline status when renaming directories in grid view. */
 #list-container.thumbnail-view li.directory[renaming] xf-inline-status {
   display: none;
@@ -1430,7 +1234,7 @@
 
 /* Only display outlines for entries with thumbnails. */
 #list-container.thumbnail-view li:has(.thumbnail) xf-inline-status {
-  --xf-icon-color-outline: var(--cros-bg-color);
+  --xf-icon-color-outline: var(--cros-sys-app_base);
 }
 
 html:not(.pointer-active) body[type='full-page'] .thumbnail-frame > .img-container,
@@ -1447,15 +1251,11 @@
   display: flex;
   flex-direction: row;
   left: 0;
-  padding: 0 6px;
+  padding: 0;
   position: absolute;
   right: 0;
 }
 
-body.files-ng .thumbnail-bottom {
-  padding: 0;
-}
-
 .thumbnail-bottom .detail-icon {
   flex: none;
   height: 16px;
@@ -1464,74 +1264,63 @@
 
 .thumbnail-bottom .filename-label {
   flex: auto;
-  font-weight: 500;
-  padding-inline-end: 6px;
-}
-
-body.files-ng .thumbnail-item .filename-label {
-  font-weight: normal;
-  padding-inline-end: 12px;
-}
-
-body.files-ng .thumbnail-item.directory.pinned .filename-label {
-  padding-inline-end: 24px;
+  font: var(--cros-body-2-font);
+  padding-inline-end: 8px;
 }
 
 /* Styles specific for the grid view. */
 
-body.files-ng .thumbnail-grid .thumbnail-item {
-  background-color: inherit;
-  border-radius: 4px;
+.thumbnail-grid .thumbnail-item {
+  background-color: var(--cros-sys-app_base);
+  border-radius: 12px;
   height: 160px;
   margin-inline-start: 16px;
   margin-top: 16px;
   overflow: hidden;
   position: relative;
   vertical-align: top;  /* Prevent vertical spacing for wrapped inline box. */
-  width: 180px;
+  width: 160px;
 }
 
-body.files-ng .thumbnail-item.directory   {
+.thumbnail-grid .thumbnail-item.directory.pinned .filename-label {
+  padding-inline-end: 24px;
+}
+
+.thumbnail-item.directory   {
   box-shadow: none;
-  height: 40px;
+  height: 48px;
 }
 
-body.files-ng #list-container .thumbnail-grid li {
-  border: 1px solid var(--cros-separator-color);
+#list-container .thumbnail-grid li {
+  border: 1px solid var(--cros-sys-separator);
 }
 
-body.files-ng grid .thumbnail-bottom .detail-icon {
-  color: var(--cros-icon-color-secondary);
-  height: 40px;
+grid .thumbnail-bottom .detail-icon {
+  height: 48px;
   padding-inline-end: 6px;
   padding-inline-start: 6px;
   width: 32px;
 }
 
-html:not(.pointer-active) body.files-ng grid .thumbnail-bottom .detail-icon,
-body.files-ng grid .thumbnail-bottom .detail-icon:active {
+html:not(.pointer-active) grid .thumbnail-bottom .detail-icon,
+grid .thumbnail-bottom .detail-icon:active {
   cursor: pointer;
 }
 
 .thumbnail-grid .thumbnail-frame {
+  background-color: var(--cros-sys-app_base_shaded);
   height: 100%;
   width: 100%;
 }
 
 .thumbnail-grid .img-container {
-  background-color: var(--cros-highlight-color-hover);
-  height: 100%;
+  color: var(--cros-sys-on_surface_bodytext);
+  height: 112px;
   width: 100%;
 }
 
-body.files-ng .thumbnail-grid .img-container {
-  color: var(--cros-text-color-secondary);
-  height: 120px;
-}
-
 .thumbnail-grid .img-container > .thumbnail {
   -webkit-user-drag: none;
-  background-color: var(--cros-highlight-color-hover);
   background-position: center;
   background-repeat: no-repeat;
   height: 100%;
@@ -1540,69 +1329,80 @@
   width: 100%;
 }
 
-body.files-ng .thumbnail-grid .thumbnail-bottom {
-  color: var(--cros-text-color-primary);
-  height: 40px;
+.thumbnail-grid .thumbnail-bottom {
+  background-color: var(--cros-sys-app_base);
+  color: var(--cros-sys-on_surface);
+  height: 48px;
 }
 
-body.files-ng .thumbnail-grid .thumbnail-item[selected] .thumbnail-bottom,
-body.files-ng .thumbnail-grid .thumbnail-item[lead] .thumbnail-bottom,
-body.files-ng .thumbnail-grid .thumbnail-item[selected].directory
+.thumbnail-grid .thumbnail-item[selected] .thumbnail-bottom,
+.thumbnail-grid .thumbnail-item[lead] .thumbnail-bottom,
+.thumbnail-grid .thumbnail-item[selected].directory
     .thumbnail-bottom,
-body.files-ng .thumbnail-grid .thumbnail-item[lead].directory
+.thumbnail-grid .thumbnail-item[lead].directory
     .thumbnail-bottom,
 .thumbnail-grid .thumbnail-item[selected] .thumbnail-bottom .icon-badge,
 .thumbnail-grid .thumbnail-item[lead] .thumbnail-bottom .icon-badge {
-  background-color: var(--cros-highlight-color-hover);
+  background-color: var(--cros-sys-surface_variant);
 }
 
-body.files-ng .thumbnail-grid:focus .thumbnail-item[selected] .thumbnail-bottom,
-body.files-ng .thumbnail-grid:focus .thumbnail-item[lead] .thumbnail-bottom,
-body.files-ng .thumbnail-grid:focus .thumbnail-item[selected].directory
+.thumbnail-grid:focus .thumbnail-item[selected] .thumbnail-bottom,
+.thumbnail-grid:focus .thumbnail-item[lead] .thumbnail-bottom,
+.thumbnail-grid:focus .thumbnail-item[selected].directory
     .thumbnail-bottom,
-body.files-ng .thumbnail-grid:focus .thumbnail-item[lead].directory
+.thumbnail-grid:focus .thumbnail-item[lead].directory
     .thumbnail-bottom,
 .thumbnail-grid:focus .thumbnail-item[selected] .thumbnail-bottom .icon-badge,
 .thumbnail-grid:focus .thumbnail-item[lead] .thumbnail-bottom .icon-badge {
-  background-color: var(--cros-highlight-color);
+  background-color: var(--cros-sys-secondary_container);
 }
 
-body.check-select.files-ng .thumbnail-grid:focus .thumbnail-item[selected]
+.thumbnail-grid:focus .thumbnail-item[selected] .thumbnail-bottom,
+.thumbnail-grid:focus .thumbnail-item[lead] .thumbnail-bottom,
+.thumbnail-grid:focus .thumbnail-item[selected].directory
     .thumbnail-bottom,
-body.check-select.files-ng .thumbnail-grid:focus .thumbnail-item[lead]
-    .thumbnail-bottom,
-body.check-select.files-ng .thumbnail-grid:focus
-    .thumbnail-item[selected].directory .thumbnail-bottom,
-body.check-select.files-ng .thumbnail-grid:focus .thumbnail-item[lead].directory
+.thumbnail-grid:focus .thumbnail-item[lead].directory
     .thumbnail-bottom {
-  color: var(--cros-text-color-selection);
+  color: var(--cros-sys-on_secondary_container);
 }
 
-body.check-select.files-ng #list-container .thumbnail-grid:focus
+body.check-select .thumbnail-grid:focus .thumbnail-item[selected]
+    .thumbnail-bottom,
+body.check-select .thumbnail-grid:focus .thumbnail-item[lead]
+    .thumbnail-bottom,
+body.check-select .thumbnail-grid:focus
+    .thumbnail-item[selected].directory .thumbnail-bottom,
+body.check-select .thumbnail-grid:focus .thumbnail-item[lead].directory
+    .thumbnail-bottom {
+  background-color: var(--cros-sys-primary_container);
+  color: var(--cros-sys-on_primary_container);
+}
+
+body.check-select #list-container .thumbnail-grid:focus
     .thumbnail-item[lead],
-body.files-ng #list-container .thumbnail-grid:focus
+#list-container .thumbnail-grid:focus
     .thumbnail-item[lead]:not([selected]) {
   /* 2px border: 1px via box-shadow + 1px via border, to accommodate
      the difference between regular border 1px and selected border 2px.*/
-  border-color: var(--cros-focus-ring-color);
-  box-shadow: 0 0 0 1px var(--cros-focus-ring-color);
+  border-color: var(--cros-sys-focus_ring);
+  box-shadow: 0 0 0 1px var(--cros-sys-focus_ring);
 }
 
-body.check-select.files-ng #list-container .thumbnail-grid
+body.check-select #list-container .thumbnail-grid
     .thumbnail-item[lead],
-body.files-ng #list-container .thumbnail-grid
+#list-container .thumbnail-grid
     .thumbnail-item[lead]:not([selected]) {
   /* 2px border: 1px via box-shadow + 1px via border, to accommodate
      the difference between regular border 1px and selected border 2px.*/
-  border-color: var(--cros-focus-ring-color-inactive);
-  box-shadow: 0 0 0 1px var(--cros-focus-ring-color-inactive);
+  border-color: var(--cros-sys-on_surface_variant);
+  box-shadow: 0 0 0 1px var(--cros-sys-on_surface_variant);
 }
 
 .thumbnail-grid > .spacer.folder-spacer {
   height: 5px;
 }
 
-body.files-ng .thumbnail-grid > .spacer {
+.thumbnail-grid > .spacer {
   height: 0;
 }
 
@@ -1611,37 +1411,19 @@
   display: none;
 }
 
-.badge {
-  background-color: var(--cros-bg-color);
-  background-position: center;
-  background-repeat: no-repeat;
-  border-radius: 2px;
-  display: none;
-  height: 20px;
-  position: absolute;
-  right: 10px;
-  top: 10px;
-  width: 20px;
-}
-
-html[dir='rtl'] .badge {
-  left: 10px;
-  right: auto;
-}
-
 /* Padding counterweights negative margins of items, thus eliminating scroll
    bar when it's not needed. Max height is set to fit 8 items before showing
    scroll bar. */
 body.files-ng #default-tasks-list {
-  border-top: solid 1px var(--cros-separator-color);
   height: 240px;
-  margin: 16px -16px;
-  margin-bottom: 12px;
-  padding-top: 8px;
+  margin-bottom: 32px;
+  margin-top: 20px;
+  padding-inline: 32px;
 }
 
 #default-task-dialog.bottom-shadow::after {
-  background: linear-gradient(transparent 0, var(--cros-bg-color) 100%);
+  background:
+      linear-gradient(transparent 0, var(--cros-sys-base_elevated) 100%);
   bottom: 24px;
   content: '';
   height: 40px;
@@ -1651,14 +1433,8 @@
   width: 100%
 }
 
-@media (prefers-color-scheme: dark) {
-  #default-task-dialog.bottom-shadow::after {
-    background: linear-gradient(transparent 0,
-                                var(--cros-bg-color-elevation-2) 100%);
-  }
-}
-
 #default-tasks-list li {
+  border-radius: 8px;
   height: 40px;
   line-height: 40px;
 }
@@ -1673,8 +1449,11 @@
 }
 
 #default-tasks-list > li > .label {
-  padding-inline-start: 52px;
+  left: 52px;
+  overflow: hidden;
   position: absolute;
+  right: 52px;
+  text-overflow: ellipsis;
 }
 
 html[dir='rtl'] #default-tasks-list > li > .icon {
@@ -1690,14 +1469,7 @@
 body.files-ng #list-container list > li:active .icon-badge,
 body.files-ng #list-container list > li.accepts .icon-badge,
 body.files-ng #list-container list > li[lead] .icon-badge {
-  background-color: var(--cros-highlight-color-hover);
-}
-
-body.files-ng #list-container list > li[selected],
-body.files-ng #list-container list > li:active,
-body.files-ng #list-container list > li.accepts,
-body.files-ng #list-container list > li[lead] {
-  border-radius: 2px;
+  background-color: var(--cros-sys-surface_variant);
 }
 
 body.files-ng #list-container list:focus > li[selected],
@@ -1706,58 +1478,47 @@
 body.files-ng #list-container list:focus > li[selected] .icon-badge,
 body.files-ng #list-container list:focus > li.accepts[selected] .icon-badge,
 body.files-ng #list-container list:focus > li[lead] .icon-badge {
-  background-color: var(--cros-highlight-color);
+  background-color: var(--cros-sys-secondary_container);
 }
 
 body.files-ng #default-tasks-list:focus > li[selected],
 body.files-ng #default-tasks-list > li[selected] {
-  background-color: var(--cros-highlight-color);
+  background-color: var(--cros-sys-primary_container);
+  color: var(--cros-sys-on_primary_container);
   outline: none;
 }
 
 body.files-ng #default-tasks-list li[selected]::after {
   -webkit-mask-image: url(../images/common/ic_selected.svg);
-  -webkit-mask-position: right;
+  -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-icon-color-selection);
+  background-color: var(--cros-sys-on_primary_container);
   content: ' ';
   height: 40px;
   position: absolute;
-  right: 16px;
+  right: 6px;
   top: 0;
   width: 40px;
 }
 
 html[dir='rtl'] body.files-ng #default-tasks-list li[selected]::after {
-  background-position: left;
-  left: 16px;
+  left: 6px;
   right: unset;
 }
 
-/* selector "li[lead]:not([selected])" is for the row just gets unselected */
-body.check-select #list-container list > li[lead]:not([selected]),
-#list-container list > li[lead]:not([selected]) {
-  background-color: var(--cros-highlight-color-hover);
-}
-
-body.check-select #list-container list:focus > li[lead]:not([selected]),
-#list-container list > li[lead]:not([selected]):focus {
-  background-color: var(--cros-highlight-color);
-}
-
-body.files-ng #list-container li {
-  border: 1px solid transparent;
+#list-container li {
+  border: 2px solid transparent;
 }
 
 /* Modify GROUP_HEADING_HEIGHT in file_table_list.js if this height changes. */
 #list-container .group-heading {
   border-bottom: 1px solid var(--cros-separator-color);
   box-sizing: border-box;
-  color: var(--cros-text-color-secondary);
-  font-family: 'Roboto Medium';
+  color: var(--cros-sys-on_surface);
+  font: var(--cros-button-2-font);
   /* The desired height plus the border width. */
   height: calc(56px + 1px);
-  padding-inline-start: 16px;
+  padding-inline-start: 20px;
   padding-top: 20px;
   /* Make sure clicking this area can unselect file items. */
   pointer-events: none;
@@ -1769,16 +1530,26 @@
  * e.g. with mouse: click/select/unselect
  *      with keyboard: Ctrl + ArrowUp/ArrowDown to move
  */
-body.files-ng.check-select #list-container list:focus > li[lead] {
-  border: 1px solid var(--cros-focus-ring-color);
+body.check-select #list-container list:focus > li[lead],
+body.check-select #list-container list:focus > li[selected] {
+  background-color: var(--cros-sys-primary_container);
 }
 
-body.files-ng.check-select #list-container list > li[lead] {
-  border: 1px solid var(--cros-focus-ring-color-inactive);
+body.check-select #list-container list:focus > li[lead] {
+  border: 2px solid var(--cros-sys-focus_ring);
 }
 
-#list-container grid > .accepts {
-  background-color: var(--cros-highlight-color-hover)
+body.check-select #list-container list > li[lead],
+body.check-select #list-container list > li[selected] {
+  background-color: var(--cros-sys-surface_variant);
+}
+
+body.check-select #list-container list > li[lead] {
+  border: 2px solid var(--cros-sys-on_surface_variant);
+}
+
+#list-container grid > .accepts .thumbnail-bottom {
+  background-color: var(--cros-sys-surface_variant);
 }
 
 #directory-tree .tree-item.accepts > .tree-row,
@@ -1790,7 +1561,7 @@
 @keyframes acceptsBlink {
   0% {
     background-color: transparent;
-    color: var(--cros-ripple-color);
+    color: var(--cros-sys-hover_on_prominent);
   }
 }
 
@@ -1813,28 +1584,23 @@
 }
 
 input.rename:focus,
-#directory-tree .tree-row .rename-placeholder > input:focus,
 #directory-tree .tree-row > .file-row .rename-placeholder > input:focus,
-#directory-tree .tree-row > input:focus,
 #directory-tree .tree-row > .file-row > input:focus {
-  background-color: var(--cros-bg-color);
+  background-color: var(--cros-sys-app_base);
   border: none;
   border-radius: 2px;
-  caret-color: var(--cros-textfield-cursor-color-focus);
-  color: var(--cros-text-color-primary);
-  outline: 2px solid var(--cros-focus-ring-color);
+  color: var(--cros-sys-on_surface);
+  outline: 2px solid var(--cros-sys-focus_ring);
 }
 
 input.rename::selection,
-#directory-tree .tree-row .rename-placeholder > input::selection,
 #directory-tree .tree-row > .file-row .rename-placeholder > input::selection,
-#directory-tree .tree-row > input::selection,
 #directory-tree .tree-row > .file-row > input::selection {
-  background-color: var(--cros-text-highlight-color);
+  background-color: var(--cros-sys-highlight_text);
 }
 
 input.rename {
-  font: inherit;
+  font: var(--cros-body-2-font);
   line-height: 1;
   text-align: inherit;
 }
@@ -1847,8 +1613,16 @@
   flex: auto;
 }
 
-body.files-ng #list-container input.rename {
-  margin-inline-end: 4px;
+#list-container input.rename {
+  margin-inline-end: 12px;
+}
+
+/* The file name's direction is always LTR even in RTL mode
+   (.entry-name in common.css), so the inline-end above won't work in RTL
+   mode, we need to have the inline-start here. */
+html[dir='rtl'] #list-container input.rename {
+  margin-inline-end: 0;
+  margin-inline-start: 12px;
 }
 
 li[renaming=''] .filename-label {
@@ -1897,19 +1671,17 @@
 .table-header {
   border-bottom: 1px solid var(--cros-separator-color);
   box-sizing: border-box;
-  color: var(--cros-text-color-secondary);
+  color: var(--cros-sys-on_surface);
   flex: none;
-  font-family: 'Roboto Medium';
   /* The desired height plus the border bottom. */
-  height: calc(56px + 1px);
+  height: calc(48px + 1px);
   line-height: 20px;
 }
 
 /* Text label in a table header. */
 .table-header-label {
   color: inherit;
-  font-weight: normal;
-  line-height: 20px;
+  font: var(--cros-button-2-font);
   margin: 0 10px;
   margin-inline-end: 0;
   margin-inline-start: 32px;
@@ -1922,27 +1694,14 @@
   padding: 0 10px;
 }
 
-.table-row-cell {
-  color: var(--cros-text-color-secondary);
-}
-
 .table-row-cell > .detail-name {
   display: flex;
 }
 
-.table-row-cell > .detail-name {
-  color: var(--cros-text-color-primary);
-}
-
 .table-row-cell {
   align-items: center;
 }
 
-#list-container li.table-row {
-  height: 40px;
-  line-height: 40px;
-}
-
 /* The icon in the name column. See file_types.css for specific icons. */
 .detail-icon {
   height: 24px;
@@ -1971,10 +1730,9 @@
   -webkit-mask-repeat: no-repeat;
   -webkit-mask-size: 16px 16px;
   background-color: currentColor;
-  color: var(--cros-icon-color-secondary);
   height: 24px;
-  margin-inline-end: 10px;
   margin-inline-start: auto;
+  padding-inline-start: 8px;
   width: 24px;
 }
 
@@ -1986,31 +1744,21 @@
   visibility: visible;
 }
 
-body.files-ng.check-select #list-container list:focus li[selected]
-.table-row-cell .dlp-managed-icon,
-body.files-ng.check-select #list-container list:focus li[selected]
-.table-row-cell .encrypted-icon {
-  color: var(--cros-icon-color-selection);
-}
-
-body.files-ng #list-container list li .detail-icon {
-  color: var(--cros-icon-color-primary);
-  height: 40px;
-  margin-inline-end: 8px;
-  margin-inline-start: 8px;
-  width: 40px;
+#list-container list li .detail-icon {
+  height: 48px;
+  margin-inline-end: 20px;
+  margin-inline-start: calc(18px - 2px); /* 2px is the border width of li. */
+  width: 24px;
 }
 
 #list-container li .detail-checkmark {
   background-position: center;
   background-repeat: no-repeat;
-  color: var(--cros-icon-color-selection);
-  height: 28px;
   isolation: isolate;
   opacity: 0;
   position: absolute;
-  transition: opacity 220ms ease;
-  width: 28px;
+  /* TODO(b/298339491) Temporary fix for the colored square issue after deselecting file row. */
+  /* transition: opacity 220ms ease; */
 }
 
 body.check-select #list-container li[selected] .detail-checkmark {
@@ -2018,14 +1766,11 @@
 }
 
 #list-container list li .detail-thumbnail {
-  height: 28px;
   overflow: hidden;
-  width: 28px;
 }
 
 #list-container list li .detail-thumbnail > .thumbnail {
   -webkit-user-drag: none;
-  background-color: var(--cros-highlight-color-hover);
   background-position: center;
   background-size: cover;
   border-radius: 14px;
@@ -2076,15 +1821,15 @@
 
 /* Dimmed items */
 
-body[type='folder'] .file,
-body[type='upload-folder'] .file,
-.dialog-container[connection='OFFLINE'] .dim-offline,
-body[block-hosted-docs] .file.dim-hosted,
-body[block-encrypted] .file.dim-encrypted,
-.thumbnail-grid [disabled],
-#detail-table [disabled],
-#directory-tree .tree-item[disabled] > .tree-row {
-  opacity: var(--cros-disabled-opacity);
+body[type='folder'] .file > *,
+body[type='upload-folder'] .file > *,
+.dialog-container[connection='OFFLINE'] .dim-offline > *,
+body[block-hosted-docs] .file.dim-hosted > *,
+body[block-encrypted] .file.dim-encrypted > *,
+.thumbnail-grid [disabled] > *,
+#detail-table [disabled] > *,
+#directory-tree .tree-item[disabled] > .tree-row > .file-row  {
+  opacity: 0.38; /* TODO: no token for this right now. */
 }
 
 /* Invisible container for elements representing files while dragging. */
@@ -2099,8 +1844,8 @@
 }
 
 body.files-ng #drag-container .drag-box {
-  background-color: var(--cros-bg-color-elevation-2);
-  border-radius: 2px;
+  background-color: var(--cros-sys-base_elevated);
+  border-radius: 8px;
   box-shadow: var(--cros-elevation-2-shadow);
   box-sizing: border-box;
   height: 40px;
@@ -2112,7 +1857,6 @@
   align-items: center;
   display: flex;
   left: 8px;
-  padding-inline-end: 2px;
   padding-inline-start: 8px;
   right: 8px;
   top: 12px;
@@ -2130,11 +1874,12 @@
 }
 
 body.files-ng #drag-container .detail-icon[file-type-icon] {
-  color: var(--cros-icon-color-primary);
+  color: var(--cros-sys-on_surface);
 }
 
 body.files-ng #drag-container .label {
-  color: var(--cros-text-color-primary);
+  color: var(--cros-sys-on_surface);
+  font: var(--cros-body-2-font);
   overflow: hidden;
   padding: 0 10px;
   text-overflow: ellipsis;
@@ -2142,11 +1887,10 @@
 }
 
 body.files-ng #drag-container .drag-bubble {
-  background-color: var(--cros-icon-color-prominent);
+  background-color: var(--cros-sys-tertiary_container);
   border-radius: 12px;
-  color: var(--cros-bg-color);
-  font-size: 14px;
-  font-weight: 700;
+  color: var(--cros-sys-on_tertiary_container);
+  font: var(--cros-button-1-font);
   height: 24px;
   line-height: 24px;
   max-width: fit-content;
@@ -2161,25 +1905,6 @@
   right: unset;
 }
 
-/* TODO(fukino): Gather menu-related definitions into one place. */
-cr-menu#file-context-menu {
-  min-width: 208px;
-  z-index: 600;  /* Must be below the overlay pane (1000). */
-}
-
-cr-menu#file-context-menu > :not(hr) {
-  padding-inline-end: 8px;
-}
-
-cr-menu#file-context-menu.toolbar-menu > .hide-on-toolbar {
-  display: none;
-}
-
-cr-menu.chrome-menu hr {
-  color: transparent;
-  font-size: 0;
-}
-
 body[drive='unmounted'] .dialog-container #list-container,
 body[drive='mounting'] .dialog-container #list-container,
 body[drive='error'] .dialog-container #list-container,
@@ -2200,41 +1925,42 @@
 }
 
 #list-container .table-header-cell:first-child {
-  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  display: flex;
   padding-inline-start: 8px;
 }
 
-body.files-ng #list-container .table-header-cell:first-child {
+#list-container .table-header-cell:first-child {
   padding-inline-start: 0;
 }
 
-body.files-ng .table-header-cell {
-  padding-bottom: 12px;
-  padding-top: 12px;
+.table-header-cell {
+  padding-bottom: 8px;
+  padding-top: 8px;
 }
 
-html:not(.pointer-active) body.files-ng .table-header-cell,
-body.files-ng .table-header-cell:active {
+html:not(.pointer-active) .table-header-cell,
+.table-header-cell:active {
   cursor: pointer;
 }
 
-body.files-ng #list-container .table-header-cell:first-child
+#list-container .table-header-cell:first-child
 .table-header-label {
-  margin-inline-start: 16px;
+  margin-inline-start: 20px;
 }
 
 .table-header-label .sort-icon {
-  --cr-icon-button-fill-color: var(--cros-icon-color-secondary);
+  --cr-icon-button-fill-color: var(--cros-sys-on_surface);
   --cr-icon-button-icon-size: 16px;
-  --cr-icon-button-focus-outline-color: var(--cros-focus-ring-color);
-  --cr-icon-button-hover-background-color: var(--cros-ripple-color);
+  --cr-icon-button-focus-outline-color: var(--cros-sys-focus_ring);
+  --cr-icon-button-hover-background-color: var(--cros-sys-hover_on_subtle);
   --cr-icon-button-size: 32px;
   border-radius: 50%;
   cursor: default;
 }
 
 .table-header-label .sort-icon:active {
-  background: var(--cros-icon-button-pressed-color);
+  background: var(--cros-sys-pressed_on_subtle);
 }
 
 html:not(.pointer-active) .table-header-label .sort-icon:hover,
@@ -2251,53 +1977,91 @@
   --cr-icon-button-hover-background-color: none;
 }
 
-body.files-ng .table-label-container {
+.table-label-container {
   align-items: center;
   display: flex;
   height: 32px;
 }
 
 /* Text in the column header */
-body.files-ng .table-label-container > span {
+.table-label-container > span {
   overflow: hidden;
   text-overflow: ellipsis;
 }
 
-/** Size column is aligned to right. */
-body.files-ng .table-header-label.size .table-label-container {
-  justify-content: flex-end;
-}
-
-body.files-ng #list-container li.table-row {
+#list-container li.table-row {
+  background-color: var(--cros-sys-app_base);
   box-sizing: border-box;
-  height: 40px;
-  line-height: 20px;
+  font: var(--cros-body-2-font);
+  height: 48px;
 }
 
-body.files-ng.check-select #list-container list li[selected] .detail-thumbnail
+.check-select #list-container list li[selected] .detail-thumbnail
 > .thumbnail {
   animation: none;
 }
 
-body.files-ng #list-container list li .detail-thumbnail > .thumbnail {
+#list-container list li .detail-thumbnail > .thumbnail {
   border-radius: 50%;
   height: 24px;
-  margin-inline-start: 8px;
-  margin-top: 4px;
   width: 24px;
 }
 
-body.files-ng .table-row-cell > * {
-  color: var(--cros-text-color-secondary);
+.table-row-cell > * {
+  color: var(--cros-sys-on_surface);
   padding: 0;
   padding-inline-start: 32px;
   padding-top: 0 !important;
 }
 
-body.files-ng .table-header-splitter  {
+.table-row-cell .dlp-managed-icon,
+.table-row-cell .encrypted-icon,
+.table-row-cell xf-inline-status {
+  color: var(--cros-sys-secondary);
+}
+
+list:focus li[selected] .table-row-cell > * {
+  color: var(--cros-sys-on_secondary_container);
+}
+
+list:focus li[selected] .table-row-cell .dlp-managed-icon,
+list:focus li[selected] .table-row-cell .encrypted-icon,
+list:focus li[selected] .table-row-cell xf-inline-status {
+  color: var(--cros-sys-on_secondary_container);
+}
+
+.check-select list:focus li[selected] .table-row-cell > * {
+  color: var(--cros-sys-on_primary_container);
+}
+
+.check-select list:focus li[selected] .table-row-cell .dlp-managed-icon,
+.check-select list:focus li[selected] .table-row-cell .encrypted-icon,
+.check-select list:focus li[selected] .table-row-cell xf-inline-status {
+  color: var(--cros-sys-on_primary_container);
+}
+
+.table-row-cell > .dateholder {
+  display: flex;
+  margin-inline-end: 14px;
+}
+
+.table-row-cell > .dateholder > .date {
+  flex: 1 1;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: pre;
+}
+
+.table-row-cell > .dateholder > .dlp-managed-icon,
+.table-row-cell > .dateholder > .encrypted-icon {
+  flex: 0 0 24px;
+  margin-inline-start: 8px;
+}
+
+.table-header-splitter  {
   background: none;
   height: 32px;
-  margin-top: 12px;
+  margin-top: 8px;
   width: auto;
 }
 
@@ -2306,17 +2070,18 @@
    * TODO(crbug.com/1268206): the icon is not in disabled state, a new css
    * variable needs to be created and applied here.
    */
-  --cr-icon-button-fill-color: var(--cros-icon-color-disabled);
-  --cr-icon-button-hover-background-color: var(--cros-ripple-color);
+  --cr-icon-button-fill-color: var(--cros-sys-outline);
+  --cr-icon-button-hover-background-color: var(--cros-sys-hover_on_subtle);
   --cr-icon-button-icon-size: 32px;
   --cr-icon-button-margin-start: 0px;
   --cr-icon-button-size: 32px;
+  --cr-icon-button-stroke-color: var(--cros-sys-outline);
   cursor: default;
   height: 32px;
 }
 
 .table-header-splitter .splitter-icon:active {
-  background: var(--cros-icon-button-pressed-color);
+  background: var(--cros-sys-pressed_on_subtle);
 }
 
 html:not(.pointer-active) .table-header-splitter .splitter-icon:hover {
@@ -2328,28 +2093,23 @@
   --cr-icon-button-hover-background-color: none;
 }
 
-body.files-ng #list-container .table-row-cell .size {
+#list-container .table-row-cell .size {
   padding-inline-end: 5px;
-  padding-inline-start: 22px;
+  padding-inline-start: 32px;
 }
 
-body.files-ng.check-select list:focus li[selected] .table-row-cell > * {
-  color: var(--cros-text-color-selection);
-}
-
-body.files-ng .table-row-cell:first-child > * {
+.table-row-cell:first-child > * {
   padding-inline-start: 0;
 }
 
-body.files-ng .table-row-cell .filename-label {
-  color: var(--cros-text-color-primary);
+.table-row-cell .filename-label {
   flex-grow: 1;
+  margin-inline-end: 8px;
   padding-top: 0;
 }
 
-body.files-ng.check-select list:focus li[selected] .table-row-cell
-.filename-label {
-  color: var(--cros-text-color-selection);
+.check-select li[selected] .filename-label {
+  font: var(--cros-button-2-font);
 }
 
 body.files-ng #list-container li .detail-checkmark {
@@ -2358,25 +2118,25 @@
   -webkit-mask-repeat: no-repeat;
   background-color: currentColor;
   background-image: none;
-  height: 40px;
-  width: 40px;
+  height: 20px;
+  width: 20px;
 }
 
-body.files-ng grid li .detail-checkmark {
-  width: 32px !important;
+list li .detail-checkmark {
+  margin-inline-start: 2px;
+}
+
+grid li .detail-checkmark {
+  margin-inline-start: 6px;
+  margin-top: 14px;
 }
 
 body.files-ng #list-container :focus li .detail-checkmark {
-  color: var(--cros-icon-color-selection);
+  color: var(--cros-sys-on_primary_container);
 }
 
 body.files-ng #list-container li .detail-checkmark {
-  color: var(--cros-icon-color-secondary);
-}
-
-body.files-ng #list-container li .detail-thumbnail {
-  height: 32px;
-  width: 32px;
+  color: var(--cros-sys-on_surface);
 }
 
 /* Hide inline status when renaming in the list view. */
@@ -2388,12 +2148,29 @@
   flex: none;
 }
 
-.cr-dialog-container.files-ng #default-task-dialog {
+/* Default task dialog has its own background color for title and text
+   section. */
+.cr-dialog-container #default-task-dialog {
+  /* Override the default padding so we can have background color for different
+     sections in the dialog. */
+  padding: 0;
   width: 352px;
 }
 
+.cr-dialog-container #default-task-dialog .cr-dialog-title {
+  background-color: var(--cros-sys-surface1);
+  border-radius: 20px 20px 0 0;
+  margin-bottom: 0;
+  padding: 32px 32px 16px;
+}
+
+.cr-dialog-container #default-task-dialog .cr-dialog-text {
+  background-color: var(--cros-sys-surface1);
+  padding: 0 32px 20px;
+}
+
 .install-linux-package-details-frame {
-  border: 1px solid var(--cros-separator-color);
+  border: 1px solid var(--cros-sys-separator);
   display: block;
   height: 150px;
   overflow: scroll;
@@ -2410,13 +2187,13 @@
 }
 
 .cr-dialog-container.files-ng .install-linux-package-detail-label {
-  color: var(--cros-text-color-primary);
+  color: var(--cros-sys-on_surface);
   display: inline;
   margin-inline-end: 5px;
 }
 
 .cr-dialog-container.files-ng .install-linux-package-detail-value {
-  color: var(--cros-text-color-secondary);
+  color: var(--cros-sys-secondary);
   display: inline;
   margin-bottom: 5px;
   white-space: pre-wrap;
@@ -2478,17 +2255,6 @@
   background-color: var(--cros-menu-item-background-hover);
 }
 
-#gear-menu > cr-menu-item:not(.menuitem-button),
-#sort-menu > cr-menu-item {
-  margin-inline-end: 50px;
-}
-
-.cr-dialog-container.files-ng #suggest-app-dialog.cr-dialog-frame {
-  max-width: unset !important;
-  min-width: unset !important;
-  width: 735px;
-}
-
 .error-dialog-frame .error-dialog-img {
   background-image: -webkit-image-set(
     url(chrome://theme/IDR_ERROR_NETWORK_GENERIC) 1x,
@@ -2539,31 +2305,33 @@
 /* File type filter buttons in Recents view. */
 #file-type-filter-container {
   display: flex;
-  font-size: 13px;
-  padding: 12px 0 12px 12px;
+  padding-bottom: 12px;
+  padding-inline: 20px;
+  padding-top: 12px;
 }
 
 .file-type-filter-button {
-  --border-color: var(--cros-button-stroke-color-secondary);
+  --border-color: var(--cros-sys-separator);
   --cr-button-height: 32px;
-  --hover-bg-color: var(--cros-ripple-color);
-  --hover-border-color: var(--cros-button-stroke-color-secondary);
-  --ink-color: var(--cros-ripple-color);
+  --hover-bg-color: var(--cros-sys-hover_on_subtle);
+  --hover-border-color: var(--cros-sys-separator);
+  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
   --ripple-opacity: 100%;
-  --text-color: var(--cros-text-color-secondary);
-  border-radius: 20px;
+  --text-color: var(--cros-sys-on_surface);
+  border-radius: 8px;
+  font: var(--cros-button-1-font);
   margin-inline: 4px;
   min-width: auto;
-  outline: none;
+  padding-inline: 12px;
+}
+
+.file-type-filter-button:first-child {
+  margin-inline-start: 0;
 }
 
 .file-type-filter-button.active {
-  /* Intentionally no hover color for active state. */
-  --hover-bg-color: none;
-  --ink-color: var(--cros-ripple-color-prominent);
-  --text-color: var(--cros-text-color-selection);
-  background-color: var(--cros-highlight-color);
-  border-color: transparent;
+  --text-color: var(--cros-sys-on_secondary_container);
+  background-color: var(--cros-sys-secondary_container);
 }
 
 html.pointer-active .file-type-filter-button:not(:active) {
@@ -2572,7 +2340,7 @@
 }
 
 html.focus-outline-visible .file-type-filter-button:focus {
-  outline: 2px solid var(--cros-focus-ring-color);
+  outline: 2px solid var(--cros-sys-focus_ring);
   outline-offset: 2px;
 }
 
@@ -2598,36 +2366,21 @@
 }
 
 #banners > *:not([hidden]) {
-  background-color: var(--cros-bg-color-elevation-1);
+  background-color: var(--cros-sys-app_base_shaded);
   border-radius: 8px;
-  box-shadow: var(--cros-elevation-1-shadow);
   height: auto;
-  margin-bottom: 4px;
   margin-inline-end: 16px;
-  margin-inline-start: 0;
-  margin-top: 16px;
+  margin-inline-start: 16px;
   max-height: 300px;
   min-height: 46px;
   opacity: 1;
-  padding-bottom: 12px;
+  padding-bottom: 13px;
   padding-inline-end: 8px;
   padding-inline-start: 0;
-  padding-top: 12px;
+  padding-top: 13px;
   visibility: visible;
 }
 
-.table-row-cell > .dateholder {
-  display: flex;
-}
-
-
-.table-row-cell > .dateholder > .date {
-  flex: 1 1;
-  overflow: hidden;
-}
-
-.table-row-cell > .dateholder > .dlp-managed-icon,
-.table-row-cell > .dateholder > .encrypted-icon {
-  flex: 0 0 24px;
-  margin-inline-start: 8px;
+#path-display-container {
+  background-color: var(--cros-sys-app_base);
 }
diff --git a/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css b/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css
deleted file mode 100644
index 3292d85..0000000
--- a/ui/file_manager/file_manager/foreground/css/file_manager_gm3.css
+++ /dev/null
@@ -1,2386 +0,0 @@
-/* Copyright 2014 The Chromium Authors
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-/* Special attribute used in HTML to hide elements. */
-body:not([type]) [visibleif] {
-  display: none;
-}
-
-body[type='folder'] [invisibleif~='folder'],
-body[type='upload-folder'] [invisibleif~='upload-folder'],
-body[type='saveas-file'] [invisibleif~='saveas-file'],
-body[type='open-file'] [invisibleif~='open-file'],
-body[type='open-multi-file'] [invisibleif~='open-multi-file'],
-body[type='full-page'] [invisibleif~='full-page'],
-
-body[type='folder'] [visibleif]:not([visibleif~='folder']),
-body[type='upload-folder'] [visibleif]:not([visibleif~='upload-folder']),
-body[type='saveas-file'] [visibleif]:not([visibleif~='saveas-file']),
-body[type='open-file'] [visibleif]:not([visibleif~='open-file']),
-body[type='open-multi-file'] [visibleif]:not([visibleif~='open-multi-file']),
-body[type='full-page'] [visibleif]:not([visibleif~='full-page']) {
-  display: none !important;
-}
-
-html {
-  height: 100%;
-  overflow: hidden;
-}
-
-html.col-resize * {
-  cursor: col-resize !important;
-}
-
-/* Outer frame of the dialog. */
-body {
-  -webkit-tap-highlight-color: transparent;
-  cursor: default;
-  display: flex;
-  flex: auto;
-  flex-direction: column;
-  height: 100%;
-  margin: 0;
-  padding: 0;
-  user-select: none;
-  width: 100%;
-}
-
-/* Drop opacity of selected rows to give a visual feedback on copy/cut
- * operation. */
-.blink {
-  opacity: 0.8;
-}
-
-/* Main part of the dialog between header and footer. */
-.dialog-container {
-  align-items: stretch;
-  background-color: var(--cros-sys-app_base_shaded);
-  display: flex;
-  flex: auto;
-  flex-direction: row;
-  overflow: hidden;
-  padding-inline-end: 16px;
-  padding-top: 16px;
-  position: relative;
-}
-
-/* List and grid are inside this container. */
-.dialog-main {
-  align-items: stretch;
-  background-color: var(--cros-sys-app_base);
-  border-radius: 16px 16px 0 0;
-  display: flex;
-  flex: auto;
-  flex-direction: column;
-  overflow: hidden;
-}
-
-/* Directory tree at the left. */
-.dialog-navigation-list {
-  background-color: inherit;
-  border-inline-end: none;
-  display: flex;
-  flex: none;
-  flex-direction: column;
-  max-width: 40%;
-  min-width: 105px;
-  overflow: auto;
-  position: relative;
-  width: 240px;
-}
-
-.dialog-navigation-list-contents {
-  display: flex;
-  flex: 1 1 auto;
-  margin-inline-start: 16px;
-  position: relative;
-}
-
-#directory-tree {
-  bottom: 0;
-  flex: none;
-  left: 0;
-  overflow-x: hidden;
-  overflow-y: auto;
-  position: absolute;   /* TODO(adanilo): crbug.com/212268 still needed? */
-  right: 0;
-  top: 0;
-}
-
-html.col-resize #directory-tree,
-html.breadcrumb-elider-expanded #directory-tree {
-  overflow-y: hidden;
-}
-
-/* Can be removed after new directory replacement. -- BEGIN */
-#directory-tree .tree-item[section-start]::before {
-  border-bottom: 1px solid var(--cros-separator-color);
-  content: '';
-  display: block;
-  margin: 8px 0;
-  width: 100%;
-}
-
-#directory-tree .tree-row {
-  cursor: pointer;
-  height: auto;
-  padding: 4px; /* To cater 8px top/bottom padding and outline. */
-}
-
-#directory-tree .tree-row > .file-row {
-  align-items: center;
-  border-inline-start-width: 0 !important;
-  border-radius: 20px;
-  box-sizing: border-box;
-  color: var(--cros-sys-on_surface);
-  display: flex;
-  height: 40px;
-  padding-inline-end: 12px;
-}
-
-#directory-tree .tree-row > .file-row > .expand-icon {
-  box-sizing: border-box;
-  flex: none;
-  height: 20px;
-  margin-inline-start: 8px;
-  width: 20px;
-}
-
-#directory-tree .tree-row > .file-row > .item-icon {
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  background-color: currentColor;
-  background-image: none;
-  flex: none;
-  height: 20px;
-  position: relative;
-  width: 20px;
-}
-
-#directory-tree .tree-row > .file-row > .item-icon[style*='background-image'] {
-  background-color: transparent;
-  background-position: center;
-  background-repeat: no-repeat;
-  background-size: 20px 20px;
-}
-
-#directory-tree .tree-row > .file-row > .label {
-  display: block;
-  flex: auto;
-  font: var(--cros-button-2-font);
-  margin-inline-start: 8px;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-/* The file label's direction is always LTR even in RTL mode
-   (.entry-name in common.css), so the inline-start above won't work in RTL
-   mode, we need to have the inline-end here. */
-html[dir='rtl'] #directory-tree .tree-row > .file-row > .label {
-  margin-inline-end: 8px;
-  margin-inline-start: 0;
-}
-
-#directory-tree .tree-row .rename-placeholder {
-  flex: auto;
-  font: var(--cros-button-2-font);
-}
-
-#directory-tree .tree-row .rename-placeholder > input {
-  width: 100%;
-}
-
-#directory-tree [renaming] .root-eject {
-  display: none;
-}
-
-#directory-tree [renaming] > .tree-row > .file-row > .label {
-  display: none;
-}
-
-#directory-tree .tree-row > .file-row > input {
-  display: none;
-  height: 20px;
-  margin-inline: 8px 12px;
-  overflow: hidden;
-}
-
-#directory-tree .tree-item:not([disabled])
-    .tree-row[active] > .file-row > input {
-  outline: 2px solid var(--cros-sys-inverse_primary);
-}
-
-#directory-tree [renaming] > .tree-row > .file-row > input {
-  display: block;
-}
-
-html:not(.col-resize) #directory-tree .tree-item:not([disabled]) >
-    .tree-row:not([active]):not([selected]):hover > .file-row {
-  background-color: var(--cros-sys-hover_on_subtle);
-}
-
-html.pointer-active #directory-tree .tree-item:not([disabled]) >
-    .tree-row:not([active]):not([selected]) > .file-row:active {
-  background-color: var(--cros-sys-hover_on_subtle);
-}
-
-html.pointer-active #directory-tree
-    .tree-row:not([active]):not([selected]):hover > .file-row:not(:active) {
-  background-color: unset;
-}
-
-html.pointer-active #directory-tree :not(:active) {
-  cursor: default;
-}
-
-html.drag-drop-active #directory-tree .tree-item.denies > .tree-row > .file-row {
-  background-color: var(--cros-sys-error_container);
-  color: var(--cros-sys-on_error_container);
-}
-
-html.drag-drop-active #directory-tree .tree-item.accepts > .tree-row > .file-row {
-  background-color: var(--cros-sys-hover_on_subtle);
-}
-
-html.drag-drop-active #directory-tree
-    .tree-item.accepts > .tree-row[active] > .file-row {
-  background-color: var(--cros-sys-primary);
-}
-
-html.focus-outline-visible #directory-tree:focus .tree-row[selected] > .file-row {
-  outline: 2px solid var(--cros-sys-focus_ring);
-  outline-offset: 2px;
-}
-
-#directory-tree .tree-item:not([disabled]) .tree-row[active] > .file-row {
-  background-color: var(--cros-sys-primary);
-  color: var(--cros-sys-on_primary);
-}
-
-#directory-tree .tree-item[disabled] > .tree-row > .file-row {
-  cursor: default;
-}
-
-#directory-tree .tree-row > .file-row > .align-right-icon {
-  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
-  --iron-icon-height: 20px;
-  --iron-icon-width: 20px;
-  --ripple-opacity: 100%;
-  border: none;
-  border-radius: 20px;
-  box-sizing: border-box;
-  flex: none;
-  height: 40px;
-  position: relative;
-  right: -12px; /* Same as padding inline end of side nav. */
-  width: 40px;
-  z-index: 1;
-}
-
-html[dir='rtl'] #directory-tree .tree-row > .file-row > .align-right-icon {
-  left: -12px; /* Same as padding inline end of side nav. */
-  right: unset;
-}
-
-#directory-tree .tree-row > .file-row > .external-link-icon iron-icon {
-  padding: 10px;
-}
-
-#directory-tree .tree-row > .file-row > .root-eject {
-  --text-color: currentColor;
-  --hover-bg-color: var(--cros-sys-hover_on_subtle);
-  min-width: 32px;
-  padding: 0;
-}
-
-#directory-tree .tree-row[active] > .file-row > .root-eject {
-  --hover-bg-color: var(--cros-sys-hover_on_prominent);
-}
-
-html.col-resize #directory-tree .tree-row > .file-row > .root-eject:hover {
-  --hover-bg-color: none;
-}
-
-#directory-tree .tree-row > .file-row > .root-eject:focus {
-  outline: 2px solid var(--cros-sys-focus_ring);
-  outline-offset: 2px;
-}
-
-#directory-tree .tree-row[active] > .file-row > .root-eject:focus {
-  outline: 2px solid var(--cros-sys-inverse_primary);
-  outline-offset: 2px;
-}
-
-#directory-tree .tree-row[active] > .file-row > .root-eject:active {
-  --ink-color: var(--cros-sys-ripple_neutral_on_prominent);
-}
-/* Can be removed after new directory replacement. -- END */
-
-#directory-tree xf-tree-item > input::selection {
-  background-color: var(--cros-sys-highlight_text);
-}
-
-#directory-tree xf-tree-item > .external-link-icon iron-icon {
-  padding: 10px;
-}
-
-/* Splitter. */
-/* Prevent the sudden flickering when opening the Files app. "div.splitter" is
-  the legacy splitter DOM element. We need to maintain the existing DOM
-  structure to make sure it can cater both the legacy splitter style and the
-  refresh23 style. In file_manager_ui.js we will remove the legacy ".splitter"
-  element if the jelly flag is on, this sudden removal will cause a flickering
-  issue due to position change, hence setting a width here for the legacy
-  splitter to prevent that.  */
-div.splitter {
-  width: 24px;
-}
-
-div.splitter .splitter-button {
-  display: none;
-}
-
-.jelly-splitter {
-  --xf-splitter-tracker-offset: 16px;
-  --xf-splitter-z-index: 500;  /* Must be below the contextmenu (600). */
-}
-
-html.pointer-active .jelly-splitter:not(.splitter-active):hover {
-  --xf-splitter-cursor: default;
-  --xf-splitter-hover-color: none;
-}
-
-html.col-resize .jelly-splitter:not(.splitter-active):hover {
-  --xf-splitter-cursor: col-resize;
-  --xf-splitter-hover-color: none;
-}
-
-/* Breadcrumbs and things under the title but above the list view. */
-.dialog-header {
-  align-items: center;
-  background: none;
-  border-bottom: 1px solid transparent;
-  box-sizing: border-box;
-  color: var(--cros-sys-on_surface_variant);
-  display: flex;
-  flex: none;
-  flex-direction: row;
-  height: 57px;
-  overflow: hidden;
-  transition: background 220ms ease;
-}
-
-body.check-select .dialog-header {
-  border-bottom: 1px solid transparent;
-  border-top: 1px solid transparent;
-  color: var(--cros-sys-on_primary_container);
-}
-
-/* Display a border during check-select mode if we're in a dialog. (This
-   can only happen in an open-multi-file dialog). */
-body[type='open-multi-file'].check-select .dialog-header {
-  border-top: 1px solid var(--cros-sys-app_base);
-}
-
-.dialog-header > .spacer {
-  flex: 1 0 8px;
-}
-
-.dialog-header cr-button {
-  --hover-bg-color: var(--cros-sys-hover_on_subtle);
-  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
-  --ripple-opacity: 100%;
-  --text-color: currentColor;
-  border: none;
-  border-radius: 18px;
-  box-sizing: border-box;
-  color: var(--cros-sys-on_surface);
-  cursor: pointer;
-  height: 36px;
-  min-width: 48px;
-  position: relative;
-  z-index: 1;
-}
-
-html.pointer-active .dialog-header cr-button:not(:active):hover {
-  --hover-bg-color: none;
-  cursor: default;
-}
-
-.dialog-header cr-button::after {
-  content: '';
-  height: 48px;
-  position: absolute;
-  width: 48px;
-}
-
-.dialog-header cr-button[menu-shown] {
-  background-color: var(--cros-sys-primary_container);
-  color: var(--cros-sys-on_primary_container);
-}
-
-.dialog-header cr-button:not([aria-haspopup]):active {
-  background-color: var(--cros-sys-pressed_on_subtle);
-}
-
-html.focus-outline-visible .dialog-header cr-button:not(:active):focus {
-  outline: 2px solid var(--cros-sys-focus_ring);
-}
-
-/** Avoid highlighting if element doesn't have focus by tab (tabindex=-1)
- *  or if focusing during mouse click event ":active" pseudo-selector. */
-html.focus-outline-visible .dialog-header
-    .menu-button:focus:not([tabindex='-1']):not(:active) {
-  background-color: transparent;
-}
-
-body.check-select .dialog-header
-    .menu-button:focus:not([tabindex='-1']):not(:active) {
-  background-color: var(--cros-sys-ripple_neutral_on_subtle);
-}
-
-.dialog-header iron-icon,
-.dialog-header .icon {
-  height: 16px;
-  width: 16px;
-}
-
-.dialog-header cr-button.icon-button {
-  border-radius: 12px;
-  height: 40px;
-  margin: 4px;
-  min-width: 40px;
-  padding: 10px;
-  width: 40px;
-}
-
-.dialog-header cr-button.icon-button[aria-haspopup] {
-  --ink-color: var(--cros-sys-ripple_primary);
-}
-
-.dialog-header cr-button.icon-button > .icon {
-  background-position: center;
-  background-repeat: no-repeat;
-  height: 20px;
-  position: absolute;
-  width: 20px;
-}
-
-.dialog-header cr-button.icon-button > xf-icon {
-  position: absolute;
-}
-
-.dialog-header #tasks {
-  color: var(--cros-sys-primary);
-  font: var(--cros-button-2-font);
-  margin: 0 8px;
-  padding-bottom: 0;
-  padding-inline: 16px;
-  padding-top: 0;
-}
-
-.dialog-header #tasks[multiple] {
-  padding-inline-end: 12px;
-}
-
-.dialog-header cr-button > .icon,
-.dialog-header #search-box .clear,
-.dialog-header #read-only-icon {
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  background-color: currentColor;
-  background-image: none;
-}
-
-.dialog-header #search-wrapper {
-  display: flex;
-}
-
-.dialog-header.files-ng #search-wrapper {
-  align-items: center;
-  border-radius: 8px;
-  height: 48px;
-  transition: background-color 200ms ease;
-}
-
-.dialog-header.files-ng #search-wrapper.has-cursor,
-.dialog-header.files-ng #search-wrapper.has-text,
-.dialog-header.files-ng #search-wrapper.hide-pending {
-  background-color: var(--cros-sys-input_field_on_base);
-}
-
-.dialog-header #search-box cr-input {
-  --cr-input-background-color: transparent;
-  --cr-input-border-bottom: transparent;
-  --cr-input-border-radius: 0;
-  --cr-input-color: var(--cros-sys-on_surface);
-  --cr-input-error-display: none;
-  --cr-input-focus-color: transparent;
-  --cr-input-min-height: 20px;
-  --cr-input-placeholder-color: var(--cros-sys-secondary);
-  --cr-input-padding-end: 0;
-  --cr-input-padding-start: 0;
-  display: inline-block;
-  transition: width 200ms ease;
-  vertical-align: middle;
-  width: 0;
-}
-
-.dialog-header.files-ng #search-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/search.svg);
-}
-
-.dialog-header.files-ng #sharesheet-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/share_ng.svg);
-}
-
-.dialog-header.files-ng #delete-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/delete_ng.svg);
-}
-
-body.check-select .dialog-header #delete-button > .icon {
-  background-image: url(../images/files/ui/delete.svg);
-}
-
-.dialog-header #move-to-trash-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/delete_ng.svg);
-}
-
-.dialog-header #restore-from-trash-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/restore.svg);
-}
-
-.dialog-header.files-ng #refresh-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/refresh.svg);
-}
-
-.dialog-header.files-ng #view-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/view_list.svg);
-}
-
-body.check-select #view-button {
-  display: none;
-}
-
-.dialog-header.files-ng #view-button.thumbnail > .icon {
-  -webkit-mask-image: url(../images/files/ui/view_thumbnail.svg);
-}
-
-body.check-select #view-button.thumbnail {
-  display: none;
-}
-
-.dialog-header.files-ng #sort-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/sorting_ng.svg);
-}
-
-body.check-select #sort-button {
-  display: none;
-}
-
-.dialog-header.files-ng #gear-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/menu_ng.svg);
-}
-body.check-select #gear-button {
-  display: none;
-}
-
-.dialog-header.files-ng #selection-menu-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/menu_ng.svg);
-}
-
-body:not(.check-select) #selection-menu-button {
-  display: none;
-}
-
-#files-selected-label {
-  display: none;
-  font: var(--cros-button-1-font);
-}
-
-body.files-ng #files-selected-label {
-  margin-inline: 8px 12px;
-}
-
-body.check-select #files-selected-label {
-  display: block;
-}
-
-#cancel-selection-button {
-  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
-  border: none;
-  box-shadow: none;
-  color: currentColor;
-  display: flex;
-  text-transform: none;
-}
-
-body.files-ng #cancel-selection-button {
-  height: 32px;
-  margin-inline-start: 12px;
-  min-width: 32px;
-  padding: 6px;
-  width: 32px;
-}
-
-html.focus-outline-visible body.files-ng #cancel-selection-button:focus:not([tabindex='-1']):not(:active) {
-  outline: 2px solid var(--cros-sys-focus_ring);
-}
-
-body.files-ng #cancel-selection-button > span#cancel-selection-label {
-  display: none;
-}
-
-body.files-ng #cancel-selection-button .icon-arrow-back {
-  -webkit-mask-image: url(../images/files/ui/list_check.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  background-color: currentColor;
-  flex: none;
-  height: 20px;
-  width: 20px;
-}
-
-#cancel-selection-button-wrapper {
-  display: none;
-}
-
-#cancel-selection-button > iron-icon {
-  margin-inline-end: 6px;
-}
-
-#cancel-selection-label {
-  flex: auto;
-  line-height: 31px;
-  overflow: hidden;
-  padding-top: 1px;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-body.check-select #cancel-selection-button-wrapper {
-  display: block;
-}
-
-/* Search button */
-body.check-select-v1 #search-button {
-  border: 0;
-  margin: 0;
-  min-width: 0;
-  padding: 0;
-  visibility: hidden;
-  width: 0;
-}
-
-/* Search box */
-#search-box {
-  display: flex;
-  flex: none;
-  font: var(--cros-body-2-font);
-}
-
-.dialog-header.files-ng #search-box cr-input::part(input) {
-  caret-color: var(--cros-sys-primary);
-  margin-inline-end: 16px;
-}
-
-body.check-select-v1 #search-box {
-  visibility: hidden;
-}
-
-.dialog-header.files-ng #search-box.has-cursor,
-.dialog-header.files-ng #search-box.has-text,
-.dialog-header.files-ng #search-box.hide-pending {
-  margin-inline-end: 6px;
-}
-
-.dialog-header.files-ng #search-box.has-cursor cr-input,
-.dialog-header.files-ng #search-box.has-text cr-input,
-.dialog-header.files-ng #search-box.hide-pending cr-input {
-  --cr-input-width: calc(288px - 74px);
-  width: calc(288px - 54px);
-}
-
-#search-box .clear {
-  cursor: pointer;
-  display: none;
-  margin: 0;
-  min-width: 0;
-  position: absolute;
-  right: 0;
-  visibility: hidden;
-}
-
-.dialog-header.files-ng #search-box .clear {
-  background: none;
-  height: 32px;
-  margin-inline-end: 4px;
-  padding: 0;
-  width: 32px;
-}
-
-html:not(.pointer-active) .dialog-header.files-ng #search-box .clear:hover {
-  background-color: var(--cros-sys-hover_on_subtle);
-}
-
-.dialog-header.files-ng #search-box .clear > .icon {
-  -webkit-mask-image: url(../images/files/ui/search_clear_filled.svg);
-}
-
-html[dir='rtl'] #search-box .clear {
-  left: 0;
-  right: auto;
-}
-
-.dialog-header.files-ng #search-box.has-cursor .clear,
-.dialog-header.files-ng #search-box.has-text .clear {
-  display: flex;
-}
-
-#search-box.has-text .clear {
-  visibility: visible;
-}
-
-/* Pinned file toggle */
-.dialog-header.files-ng #pinned-toggle-wrapper {
-  display: flex;
-  flex: none;
-}
-
-.dialog-header.files-ng #pinned-toggle-label {
-  color: var(--cros-sys-on_surface);
-  font: var(--cros-button-2-font);
-  margin-inline-end: 16px;
-  margin-inline-start: 12px;
-}
-
-.dialog-header.files-ng cr-toggle {
-  --cr-toggle-checked-bar-color: var(--cros-sys-primary_container);
-  /* bar color above already defines the opacity, so use 100% here */
-  --cr-toggle-checked-bar-opacity: 100%;
-  --cr-toggle-checked-button-color: var(--cros-sys-primary);
-  --cr-toggle-checked-ripple-color: transparent;
-  --cr-toggle-unchecked-bar-color: var(--cros-sys-secondary);
-  --cr-toggle-unchecked-button-color: var(--cros-sys-surface_variant);
-  --cr-toggle-unchecked-ripple-color: transparent;
-  --cr-toggle-box-shadow: var(--cros-elevation-1-shadow);
-  --cr-toggle-ripple-diameter: 32px;
-  margin-inline: 6px;
-  margin-top: 2px;
-}
-
-/* only show the ripple ring for tab navigation */
-html.focus-outline-visible .dialog-header.files-ng cr-toggle:focus {
-  --cr-toggle-ripple-ring: 2px solid var(--cros-sys-focus_ring);
-}
-
-/* Container for the detail and thumbnail list views. */
-.dialog-body {
-  flex: auto;
-  position: relative;
-  transition: all 180ms ease;
-}
-
-.main-panel {
-  bottom: 0;
-  display: flex;
-  left: 0;
-  position: absolute;
-  right: 0;
-  top: 0;
-}
-
-.dialog-middlebar-contents {
-  display: flex;
-  flex: none;
-  max-width: 50%;
-  min-width: 45px;
-  position: relative;
-  width: 180px;
-}
-
-/* Container for the ok/cancel buttons. */
-.dialog-footer {
-  align-items: center;
-  background-color: var(--cros-sys-app_base);
-  border-top: 1px solid var(--cros-sys-separator);
-  display: flex;
-  flex: none;
-  flex-direction: row;
-  outline: none;
-  padding: 16px 24px;
-}
-
-.dialog-footer #filename-input-box {
-  margin-inline-end: 16px;
-  margin-inline-start: 16px;
-  max-width: 320px;
-  min-width: 123px;
-}
-
-.dialog-footer cr-input {
-  --cr-input-background-color: var(--cros-sys-input_field_on_base);
-  --cr-input-border-radius: 8px;
-  --cr-input-color: var(--cros-sys-on_surface);
-  --cr-input-error-color: var(--cros-sys-error);
-  --cr-input-error-display: none;
-  --cr-input-focus-color: var(--cros-sys-primary);
-  --cr-input-min-height: 36px;
-  --cr-input-padding-end: 16px;
-  --cr-input-padding-start: 16px;
-  --cr-input-placeholder-color: var(--cros-sys-secondary);
-  font: var(--cros-body-2-font);
-  width: 100%;
-}
-
-cr-input::part(input)::selection {
-  background-color: var(--cros-sys-highlight_text);
-}
-
-.dialog-footer .buttonbar {
-  display: flex;
-  height: 36px;
-}
-
-.dialog-footer .select {
-  background-color: var(--cros-sys-input_field_on_base);
-  border: 0;
-  border-radius: 8px;
-  cursor: pointer;
-  margin-inline-start: 16px;
-  max-width: 152px;
-  min-height: 36px;
-  min-width: 104px;
-  outline: none;
-  padding: 0 48px 0 16px;
-  position: relative;
-}
-
-.dialog-footer .select::after {
-  -webkit-mask-image: url(../images/files/ui/sort_desc.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-sys-secondary);
-  content: '';
-  height: 36px;
-  position: absolute;
-  right: 0;
-  width: 36px;
-}
-
-.dialog-footer div.select:not(:active):focus {
-  outline: 2px solid var(--cros-sys-focus_ring);
-}
-
-.dialog-footer div.select > span {
-  display: inline-block;
-  line-height: 36px;
-  max-width: 100%;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  vertical-align: middle;
-  white-space: nowrap;
-}
-
-.dialog-footer div.select > div.options {
-  background-color: var(--cros-sys-base_elevated);
-  border-radius: 8px;
-  bottom: calc(100% + 2px);
-  box-shadow: var(--cros-elevation-2-shadow);
-  left: 0;
-  min-width: max-content;
-  padding: 8px 0;
-  position: absolute;
-  right: 0;
-  z-index: 550;
-}
-
-.dialog-footer div.select > div.options:not([expanded]) {
-  display: none;
-}
-
-.dialog-footer div.select > div.options option {
-  color: var(--cros-sys-on_surface);
-  font: var(--cros-button-2-font);
-  line-height: 36px;
-  min-height: 36px;
-  padding: 0 16px;
-  vertical-align: middle;
-}
-
-.dialog-footer div.select > div.options option:hover,
-.dialog-footer div.select > div.options:not(:hover) option.selected {
-  background-color: var(--cros-sys-hover_on_subtle);
-}
-
-.dialog-footer select:hover {
-  border-image: none;
-}
-
-html.focus-outline-visible .dialog-footer select:focus {
-  outline: 2px solid var(--cros-sys-focus_ring);
-  outline-offset: 2px;
-}
-
-/** Reset the hover color when using keyboard to navigate the dropdown items. */
-html.focus-outline-visible .dialog-footer div.select > div.options option:hover,
-html.focus-outline-visible
-    .dialog-footer div.select > div.options:not(:hover) option.selected {
-  background-color: unset;
-}
-
-html.focus-outline-visible
-    .dialog-footer div.select > div.options option:hover::after,
-html.focus-outline-visible
-    .dialog-footer div.select > div.options:not(:hover) option.selected::after {
-  border: 2px solid var(--cros-sys-focus_ring);
-  border-radius: 8px;
-  content: '';
-  height: 32px; /* option height - 2 x border width */
-  left: 0;
-  position: absolute;
-  width: calc(100% - 4px); /* 2 x border width */
-}
-
-.progressable:not([progress]) .progress-bar,
-.progressable:not([progress]) .preparing-label {
-  display: none;
-}
-
-.progressable[progress] .ok,
-.progressable[progress] #filename-input-box,
-.progressable[progress] .file-type {
-  display: none;
-}
-
-.progressable .preparing-label {
-  margin-inline-start: 20px;
-}
-
-.progressable .progress-bar {
-  flex: auto;
-  margin-inline-end: 20px;
-  margin-inline-start: 20px;
-}
-
-/* The container for breadcrumb elements. */
-.breadcrumbs {
-  align-items: center;
-  display: flex;
-  flex-direction: row;
-  overflow: hidden;
-  padding-bottom: 4px;
-  padding-top: 4px;
-}
-
-body.check-select .breadcrumbs {
-  display: none;
-}
-
-/* The toolbar indicator that means the current directory is read only. */
-#read-only-indicator {
-  align-items: center;
-  background-color: var(--cros-sys-disabled_container);
-  border: 1px solid var(--cros-sys-separator);
-  border-radius: 8px;
-  display: flex;
-  flex: none;
-  height: 32px;
-  padding-inline: 8px 12px;
-}
-
-body.check-select #read-only-indicator {
-  display: none;
-}
-
-.dialog-header.files-ng #read-only-icon {
-  -webkit-mask-image: url(../images/files/ui/visibility_ng.svg);
-  height: 20px;
-  margin-inline-end: 8px;
-  width: 20px;
-}
-
-#read-only-label {
-  flex: none;
-  font: var(--cros-button-1-font);
-}
-
-.filelist-panel {
-  display: flex;
-  flex: auto;
-  flex-direction: column;
-  min-width: 0;
-}
-
-#list-container {
-  display: flex;
-  flex: auto;
-  flex-direction: column;
-  min-height: 0;
-  position: relative;
-}
-
-#empty-folder {
-  align-items: center;
-  display: flex;
-  flex-direction: column;
-  height: 100%;
-  left: 0;
-  position: absolute;
-  top: 0;
-  width: 100%;
-}
-
-#empty-folder > .image {
-  --empty-folder-svg-dot-color: var(--cros-sys-illo-color1-1);
-  --empty-folder-svg-file-color: var(--cros-sys-illo-secondary);
-  --empty-folder-svg-ellipse-color: var(--cros-sys-illo-color1);
-  --empty-folder-svg-folder-color: var(--cros-sys-illo-color1-2);
-  margin-top: 64px;
-}
-
-.list-view #empty-folder > .image {
-  /* The list view has a .table-header at the top, the margin-top should also
-  cover that, hence the desired margin plus the .table-header height. */
-  margin-top: calc(64px + 49px);
-}
-
-#empty-folder > .label {
-  color: var(--cros-sys-on_surface);
-  font: var(--cros-body-2-font);
-  margin-top: 16px;
-  text-align: center;
-  width: 320px;
-  /* Ensure links in label are on top when not hidden so a click is not
-  absorbed by an empty file-list. */
-  z-index: 500;  /* Must be below the contextmenu (600). */
-}
-
-#empty-folder #empty-folder-title {
-  font: var(--cros-button-2-font);
-}
-
-#empty-folder > .label > span#empty-folder-desc > a {
-  color: var(--cros-sys-primary);
-  font: var(--cros-body-1-font);
-}
-
-#detail-table {
-  display: flex;
-  flex: auto;
-  flex-direction: column;
-  min-height: 0;
-  outline: none;
-}
-
-#detail-table > list,
-.thumbnail-grid {
-  flex: auto;
-}
-
-#file-list .drag-selection-border {
-  background-color: var(--cros-sys-highlight_shape);
-  border: 2px solid var(--cros-sys-primary);
-  border-radius: 4px;
-  box-sizing: border-box;
-  display: flex;
-  outline: 1px solid var(--cros-sys-separator);
-  position: absolute;
-  z-index: 2;
-}
-
-.spinner {
-  background: url(chrome://resources/images/throbber_small.svg) center/100%
-      no-repeat;
-  height: 16px;
-  left: 50%;
-  margin-inline-start: -8px;
-  margin-top: -8px;
-  opacity: 0.5;
-  position: absolute;
-  top: 50%;
-  width: 16px;
-}
-
-.loading-indicator {
-  left: calc(50% - 24px);
-  position: absolute;
-  right: calc(50% - 24px);
-  top: 64px;
-}
-
-.list-view .loading-indicator {
-  /* The list view has a .table-header at the top, the top should also
-  cover that, hence the desired top plus the .table-header height. */
-  top: calc(64px + 49px);
-}
-
-@keyframes heightAnimation {
-  0% {
-    display: flex;
-    height: 0;
-  }
-}
-
-body.files-ng .button-group {
-  display: flex;
-  flex: 0 0 auto;
-  flex-direction: row-reverse;
-  margin-inline-start: auto;
-  padding-inline-start: 48px;
-}
-
-body.files-ng .button-group > a {
-  text-decoration-line: none;
-}
-
-body.files-ng .banner-close {
-  border: 0;
-  height: 32px;
-  margin-inline-end: 20px;
-  padding-inline-end: 16px;
-  padding-inline-start: 16px;
-  position: relative;
-}
-
-/* The cr.ui.Grid representing the detailed file list. */
-.thumbnail-grid {
-  /* On the right side, we have less margin to pack items as long as they are
-     fully visible. */
-  box-sizing: border-box;
-  overflow-y: auto;
-  padding-inline: calc(20px - 16px); /* 16px is the padding of the thumbnail. */
-  width: 100%;
-}
-
-body.files-ng grid .grid-title {
-  box-sizing: border-box;
-  color: var(--cros-sys-on_surface);
-  font: var(--cros-button-2-font);
-  padding-bottom: 6px;
-  padding-inline-start: 16px;
-  padding-top: 14px;
-  /* Make sure clicking this area can unselect file grids. */
-  pointer-events: none;
-  width: 100%;
-}
-
-/* Only add margin-top for non-first grid-title, this is mainly because
-   we don't have separator between the action bar and list container, which
-   makes the first group heading in the list container looks higher than
-   others (because of action bar's bottom padding), so in order to make all
-   group headings looks in the same height, we manually add a margin-top for
-   non-first group headings. */
-grid .grid-title ~ .grid-title {
-  margin-top: 16px;
-}
-
-grid .grid-title.group-by-isDirectory {
-  /* Folders/Files heading doesn't have border bottom, so having a padding
-   * bottom together with grid item's margin-top will make the gap too big.
-   * To prevent that, we can treat grid item (.thumbnail-item)'s margin-top
-   * (16px) as heading's padding bottom, that's why we use the desired height
-   * to minus the margin-top value here.
-   */
-  height: calc(56px - 16px);
-}
-
-grid .grid-title.group-by-modificationTime {
-  border-bottom: 1px solid var(--cros-separator-color);
-  /* The desired height plus the border width. */
-  height: calc(56px + 1px);
-  padding-bottom: 16px;
-}
-
-body.files-ng .thumbnail-frame > .img-container {
-  position: relative;
-}
-
-#list-container.thumbnail-view li xf-inline-status {
-  align-items: center;
-  color: var(--cros-sys-secondary);
-  display: flex;
-  position: absolute;
-  right: 5px;
-  top: 5px;
-}
-
-#list-container.thumbnail-view li.directory xf-inline-status {
-  height: 100%;
-  right: 10px;
-  top: 0;
-}
-
-#list-container.thumbnail-view .thumbnail-grid:focus .thumbnail-item[selected] xf-inline-status,
-#list-container.thumbnail-view .thumbnail-grid:focus .thumbnail-item[lead] xf-inline-status {
-  color: var(--cros-sys-on_secondary_container);
-}
-
-#list-container.thumbnail-view .thumbnail-grid .thumbnail-item[selected] xf-inline-status,
-#list-container.thumbnail-view .thumbnail-grid .thumbnail-item[lead] xf-inline-status {
-  color: var(--cros-sys-on_surface);
-}
-
-body.check-select #list-container.thumbnail-view .thumbnail-grid:focus .thumbnail-item[selected] xf-inline-status,
-body.check-select #list-container.thumbnail-view .thumbnail-grid:focus .thumbnail-item[selected] xf-inline-status {
-  color: var(--cros-sys-on_primary_container);
-}
-
-/* Hide inline status when renaming directories in grid view. */
-#list-container.thumbnail-view li.directory[renaming] xf-inline-status {
-  display: none;
-}
-
-/* Only display outlines for entries with thumbnails. */
-#list-container.thumbnail-view li:has(.thumbnail) xf-inline-status {
-  --xf-icon-color-outline: var(--cros-sys-app_base);
-}
-
-html:not(.pointer-active) body[type='full-page'] .thumbnail-frame > .img-container,
-body[type='full-page'] .thumbnail-frame > .img-container:active,
-html:not(.pointer-active) body[type='full-page'] .detail-name .detail-icon,
-body[type='full-page'] .detail-name .detail-icon:active {
-  cursor: pointer;
-}
-
-.thumbnail-bottom {
-  align-items: center;
-  bottom: 0;
-  cursor: auto;
-  display: flex;
-  flex-direction: row;
-  left: 0;
-  padding: 0;
-  position: absolute;
-  right: 0;
-}
-
-.thumbnail-bottom .detail-icon {
-  flex: none;
-  height: 16px;
-  width: 16px;
-}
-
-.thumbnail-bottom .filename-label {
-  flex: auto;
-  font: var(--cros-body-2-font);
-  padding-inline-end: 8px;
-}
-
-/* Styles specific for the grid view. */
-
-.thumbnail-grid .thumbnail-item {
-  background-color: var(--cros-sys-app_base);
-  border-radius: 12px;
-  height: 160px;
-  margin-inline-start: 16px;
-  margin-top: 16px;
-  overflow: hidden;
-  position: relative;
-  vertical-align: top;  /* Prevent vertical spacing for wrapped inline box. */
-  width: 160px;
-}
-
-.thumbnail-grid .thumbnail-item.directory.pinned .filename-label {
-  padding-inline-end: 24px;
-}
-
-.thumbnail-item.directory   {
-  box-shadow: none;
-  height: 48px;
-}
-
-#list-container .thumbnail-grid li {
-  border: 1px solid var(--cros-sys-separator);
-}
-
-grid .thumbnail-bottom .detail-icon {
-  height: 48px;
-  padding-inline-end: 6px;
-  padding-inline-start: 6px;
-  width: 32px;
-}
-
-html:not(.pointer-active) grid .thumbnail-bottom .detail-icon,
-grid .thumbnail-bottom .detail-icon:active {
-  cursor: pointer;
-}
-
-.thumbnail-grid .thumbnail-frame {
-  background-color: var(--cros-sys-app_base_shaded);
-  height: 100%;
-  width: 100%;
-}
-
-.thumbnail-grid .img-container {
-  color: var(--cros-sys-on_surface_bodytext);
-  height: 112px;
-  width: 100%;
-}
-
-.thumbnail-grid .img-container > .thumbnail {
-  -webkit-user-drag: none;
-  background-position: center;
-  background-repeat: no-repeat;
-  height: 100%;
-  opacity: 1;
-  position: absolute;
-  width: 100%;
-}
-
-.thumbnail-grid .thumbnail-bottom {
-  background-color: var(--cros-sys-app_base);
-  color: var(--cros-sys-on_surface);
-  height: 48px;
-}
-
-.thumbnail-grid .thumbnail-item[selected] .thumbnail-bottom,
-.thumbnail-grid .thumbnail-item[lead] .thumbnail-bottom,
-.thumbnail-grid .thumbnail-item[selected].directory
-    .thumbnail-bottom,
-.thumbnail-grid .thumbnail-item[lead].directory
-    .thumbnail-bottom,
-.thumbnail-grid .thumbnail-item[selected] .thumbnail-bottom .icon-badge,
-.thumbnail-grid .thumbnail-item[lead] .thumbnail-bottom .icon-badge {
-  background-color: var(--cros-sys-surface_variant);
-}
-
-.thumbnail-grid:focus .thumbnail-item[selected] .thumbnail-bottom,
-.thumbnail-grid:focus .thumbnail-item[lead] .thumbnail-bottom,
-.thumbnail-grid:focus .thumbnail-item[selected].directory
-    .thumbnail-bottom,
-.thumbnail-grid:focus .thumbnail-item[lead].directory
-    .thumbnail-bottom,
-.thumbnail-grid:focus .thumbnail-item[selected] .thumbnail-bottom .icon-badge,
-.thumbnail-grid:focus .thumbnail-item[lead] .thumbnail-bottom .icon-badge {
-  background-color: var(--cros-sys-secondary_container);
-}
-
-.thumbnail-grid:focus .thumbnail-item[selected] .thumbnail-bottom,
-.thumbnail-grid:focus .thumbnail-item[lead] .thumbnail-bottom,
-.thumbnail-grid:focus .thumbnail-item[selected].directory
-    .thumbnail-bottom,
-.thumbnail-grid:focus .thumbnail-item[lead].directory
-    .thumbnail-bottom {
-  color: var(--cros-sys-on_secondary_container);
-}
-
-body.check-select .thumbnail-grid:focus .thumbnail-item[selected]
-    .thumbnail-bottom,
-body.check-select .thumbnail-grid:focus .thumbnail-item[lead]
-    .thumbnail-bottom,
-body.check-select .thumbnail-grid:focus
-    .thumbnail-item[selected].directory .thumbnail-bottom,
-body.check-select .thumbnail-grid:focus .thumbnail-item[lead].directory
-    .thumbnail-bottom {
-  background-color: var(--cros-sys-primary_container);
-  color: var(--cros-sys-on_primary_container);
-}
-
-body.check-select #list-container .thumbnail-grid:focus
-    .thumbnail-item[lead],
-#list-container .thumbnail-grid:focus
-    .thumbnail-item[lead]:not([selected]) {
-  /* 2px border: 1px via box-shadow + 1px via border, to accommodate
-     the difference between regular border 1px and selected border 2px.*/
-  border-color: var(--cros-sys-focus_ring);
-  box-shadow: 0 0 0 1px var(--cros-sys-focus_ring);
-}
-
-body.check-select #list-container .thumbnail-grid
-    .thumbnail-item[lead],
-#list-container .thumbnail-grid
-    .thumbnail-item[lead]:not([selected]) {
-  /* 2px border: 1px via box-shadow + 1px via border, to accommodate
-     the difference between regular border 1px and selected border 2px.*/
-  border-color: var(--cros-sys-on_surface_variant);
-  box-shadow: 0 0 0 1px var(--cros-sys-on_surface_variant);
-}
-
-.thumbnail-grid > .spacer.folder-spacer {
-  height: 5px;
-}
-
-.thumbnail-grid > .spacer {
-  height: 0;
-}
-
-body:not(.check-select) .thumbnail-grid.image-dominant
-    .can-hide-filename.thumbnail-loaded:not([selected]) .thumbnail-bottom {
-  display: none;
-}
-
-/* Padding counterweights negative margins of items, thus eliminating scroll
-   bar when it's not needed. Max height is set to fit 8 items before showing
-   scroll bar. */
-body.files-ng #default-tasks-list {
-  height: 240px;
-  margin-bottom: 32px;
-  margin-top: 20px;
-  padding-inline: 32px;
-}
-
-#default-task-dialog.bottom-shadow::after {
-  background:
-      linear-gradient(transparent 0, var(--cros-sys-base_elevated) 100%);
-  bottom: 24px;
-  content: '';
-  height: 40px;
-  left: 0;
-  pointer-events: none;
-  position: absolute;
-  width: 100%
-}
-
-#default-tasks-list li {
-  border-radius: 8px;
-  height: 40px;
-  line-height: 40px;
-}
-
-#default-tasks-list > li > .icon {
-  -webkit-mask-position: 16px center;
-  -webkit-mask-repeat: no-repeat;
-  background-position: 16px center;
-  background-repeat: no-repeat;
-  background-size: 20px;
-  height: 100%;
-}
-
-#default-tasks-list > li > .label {
-  left: 52px;
-  overflow: hidden;
-  position: absolute;
-  right: 52px;
-  text-overflow: ellipsis;
-}
-
-html[dir='rtl'] #default-tasks-list > li > .icon {
-  -webkit-mask-position-x: calc(100% - 16px);
-  background-position-x: calc(100% - 16px);
-}
-
-body.files-ng #list-container list > li[selected],
-body.files-ng #list-container list > li:active,
-body.files-ng #list-container list > li.accepts,
-body.files-ng #list-container list > li[lead],
-body.files-ng #list-container list > li[selected] .icon-badge,
-body.files-ng #list-container list > li:active .icon-badge,
-body.files-ng #list-container list > li.accepts .icon-badge,
-body.files-ng #list-container list > li[lead] .icon-badge {
-  background-color: var(--cros-sys-surface_variant);
-}
-
-body.files-ng #list-container list:focus > li[selected],
-body.files-ng #list-container list:focus > li.accepts[selected],
-body.files-ng #list-container list:focus > li[lead],
-body.files-ng #list-container list:focus > li[selected] .icon-badge,
-body.files-ng #list-container list:focus > li.accepts[selected] .icon-badge,
-body.files-ng #list-container list:focus > li[lead] .icon-badge {
-  background-color: var(--cros-sys-secondary_container);
-}
-
-body.files-ng #default-tasks-list:focus > li[selected],
-body.files-ng #default-tasks-list > li[selected] {
-  background-color: var(--cros-sys-primary_container);
-  color: var(--cros-sys-on_primary_container);
-  outline: none;
-}
-
-body.files-ng #default-tasks-list li[selected]::after {
-  -webkit-mask-image: url(../images/common/ic_selected.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-sys-on_primary_container);
-  content: ' ';
-  height: 40px;
-  position: absolute;
-  right: 6px;
-  top: 0;
-  width: 40px;
-}
-
-html[dir='rtl'] body.files-ng #default-tasks-list li[selected]::after {
-  left: 6px;
-  right: unset;
-}
-
-#list-container li {
-  border: 2px solid transparent;
-}
-
-/* Modify GROUP_HEADING_HEIGHT in file_table_list.js if this height changes. */
-#list-container .group-heading {
-  border-bottom: 1px solid var(--cros-separator-color);
-  box-sizing: border-box;
-  color: var(--cros-sys-on_surface);
-  font: var(--cros-button-2-font);
-  /* The desired height plus the border width. */
-  height: calc(56px + 1px);
-  padding-inline-start: 20px;
-  padding-top: 20px;
-  /* Make sure clicking this area can unselect file items. */
-  pointer-events: none;
-  width: 100%;
-}
-
-/*
- * selector "li[lead]" is for the row just being operated on,
- * e.g. with mouse: click/select/unselect
- *      with keyboard: Ctrl + ArrowUp/ArrowDown to move
- */
-body.check-select #list-container list:focus > li[lead],
-body.check-select #list-container list:focus > li[selected] {
-  background-color: var(--cros-sys-primary_container);
-}
-
-body.check-select #list-container list:focus > li[lead] {
-  border: 2px solid var(--cros-sys-focus_ring);
-}
-
-body.check-select #list-container list > li[lead],
-body.check-select #list-container list > li[selected] {
-  background-color: var(--cros-sys-surface_variant);
-}
-
-body.check-select #list-container list > li[lead] {
-  border: 2px solid var(--cros-sys-on_surface_variant);
-}
-
-#list-container grid > .accepts .thumbnail-bottom {
-  background-color: var(--cros-sys-surface_variant);
-}
-
-#directory-tree .tree-item.accepts > .tree-row,
-#list-container list > li.accepts,
-#list-container grid > li.accepts {
-  animation: acceptsBlink 200ms linear 1s 3;
-}
-
-@keyframes acceptsBlink {
-  0% {
-    background-color: transparent;
-    color: var(--cros-sys-hover_on_prominent);
-  }
-}
-
-.table-row-cell .filename-label,
-.thumbnail-item .filename-label,
-/* Show ellipsis in cells. The name column has different structure and overrides
-   this rule. */
-.table-row-cell > div {
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: pre;
-}
-
-/* Text box used for renaming in the detail list. */
-.table-row-cell input.rename {
-  border-width: 0;
-  min-width: 0;
-  padding: 2px 0;
-}
-
-input.rename:focus,
-#directory-tree .tree-row > .file-row .rename-placeholder > input:focus,
-#directory-tree .tree-row > .file-row > input:focus {
-  background-color: var(--cros-sys-app_base);
-  border: none;
-  border-radius: 2px;
-  color: var(--cros-sys-on_surface);
-  outline: 2px solid var(--cros-sys-focus_ring);
-}
-
-input.rename::selection,
-#directory-tree .tree-row > .file-row .rename-placeholder > input::selection,
-#directory-tree .tree-row > .file-row > input::selection {
-  background-color: var(--cros-sys-highlight_text);
-}
-
-input.rename {
-  font: var(--cros-body-2-font);
-  line-height: 1;
-  text-align: inherit;
-}
-
-.table-row-cell .filename-label {
-  flex: initial;
-}
-
-.table-row-cell input.rename {
-  flex: auto;
-}
-
-#list-container input.rename {
-  margin-inline-end: 12px;
-}
-
-/* The file name's direction is always LTR even in RTL mode
-   (.entry-name in common.css), so the inline-end above won't work in RTL
-   mode, we need to have the inline-start here. */
-html[dir='rtl'] #list-container input.rename {
-  margin-inline-end: 0;
-  margin-inline-start: 12px;
-}
-
-li[renaming=''] .filename-label {
-  display: none;
-}
-
-/* Text box used for renaming in the thumbnail list. */
-.thumbnail-grid input.rename {
-  box-sizing: border-box;
-  width: 100%;
-}
-
-/* The cr.ui.Table representing the detailed file list. */
-.detail-table {
-  width: 100%;
-}
-
-.dialog-footer > .left {
-  align-items: center;
-  display: flex;
-  flex: auto;
-  flex-direction: row;
-}
-
-.dialog-footer > .right {
-  align-items: center;
-  flex: none;
-  justify-content: flex-end;
-}
-
-@keyframes fadeOut {
-  from {
-    opacity: 1;
-  }
-  to {
-    opacity: 0;
-  }
-}
-
-/* Table splitter element */
-.table-header-splitter:last-child {
-  display: none;
-}
-
-/* Container for a table header. */
-.table-header {
-  border-bottom: 1px solid var(--cros-separator-color);
-  box-sizing: border-box;
-  color: var(--cros-sys-on_surface);
-  flex: none;
-  /* The desired height plus the border bottom. */
-  height: calc(48px + 1px);
-  line-height: 20px;
-}
-
-/* Text label in a table header. */
-.table-header-label {
-  color: inherit;
-  font: var(--cros-button-2-font);
-  margin: 0 10px;
-  margin-inline-end: 0;
-  margin-inline-start: 32px;
-}
-
-.table-row-cell > * {
-  align-items: center;
-  flex: auto;
-  flex-direction: row;
-  padding: 0 10px;
-}
-
-.table-row-cell > .detail-name {
-  display: flex;
-}
-
-.table-row-cell {
-  align-items: center;
-}
-
-/* The icon in the name column. See file_types.css for specific icons. */
-.detail-icon {
-  height: 24px;
-  width: 24px;
-}
-
-.status-icon {
-  height: 24px;
-  margin-inline-end: 10px;
-  width: 24px;
-}
-
-/* The managed icon in the details list for DLP restricted files. */
-.dlp-managed-icon {
-  -webkit-mask-image: url(chrome://resources/images/business.svg);
-}
-
-/* The encrypted icon in the details list for Google Drive CSE files. */
-.encrypted-icon {
-  -webkit-mask-image: url(../images/files/ui/encrypted.svg);
-}
-
-.dlp-managed-icon,
-.encrypted-icon {
-  -webkit-mask-position: right center;
-  -webkit-mask-repeat: no-repeat;
-  -webkit-mask-size: 16px 16px;
-  background-color: currentColor;
-  height: 24px;
-  margin-inline-start: auto;
-  padding-inline-start: 8px;
-  width: 24px;
-}
-
-.dlp-managed-icon {
-  visibility: hidden;
-}
-
-.dlp-managed-icon.is-dlp-restricted {
-  visibility: visible;
-}
-
-#list-container list li .detail-icon {
-  height: 48px;
-  margin-inline-end: 20px;
-  margin-inline-start: calc(18px - 2px); /* 2px is the border width of li. */
-  width: 24px;
-}
-
-#list-container li .detail-checkmark {
-  background-position: center;
-  background-repeat: no-repeat;
-  isolation: isolate;
-  opacity: 0;
-  position: absolute;
-  /* TODO(b/298339491) Temporary fix for the colored square issue after deselecting file row. */
-  /* transition: opacity 220ms ease; */
-}
-
-body.check-select #list-container li[selected] .detail-checkmark {
-  opacity: 1;
-}
-
-#list-container list li .detail-thumbnail {
-  overflow: hidden;
-}
-
-#list-container list li .detail-thumbnail > .thumbnail {
-  -webkit-user-drag: none;
-  background-position: center;
-  background-size: cover;
-  border-radius: 14px;
-  height: 100%;
-  isolation: isolate;
-  opacity: 1;
-  width: 100%;
-}
-
-body.check-select #list-container list li[selected] .detail-thumbnail
-> .thumbnail {
-  /* Fade out after checkmark fades in. */
-  animation: fadeOut 0ms 220ms ease backwards;
-  opacity: 0;
-}
-
-#tasks-menu cr-menu-item.change-default .icon.start {
-  display: none;
-}
-
-#action-bar {
-  display: flex;
-  flex: none;
-}
-
-.dialog-header.files-ng #action-bar {
-  align-items: center;
-  height: 48px;
-}
-
-.detail-name > * {
-  align-items: center;
-  display: flex;
-  flex: none;
-}
-
-#filename-input-box {
-  align-items: center;
-  display: flex;
-  flex: auto;
-  margin-inline-end: 30px;
-  margin-inline-start: 30px;
-}
-
-body:not([type='saveas-file']) #filename-input-box {
-  display: none;
-}
-
-/* Dimmed items */
-
-body[type='folder'] .file > *,
-body[type='upload-folder'] .file > *,
-.dialog-container[connection='OFFLINE'] .dim-offline > *,
-body[block-hosted-docs] .file.dim-hosted > *,
-body[block-encrypted] .file.dim-encrypted > *,
-.thumbnail-grid [disabled] > *,
-#detail-table [disabled] > *,
-#directory-tree .tree-item[disabled] > .tree-row > .file-row  {
-  opacity: 0.38; /* TODO: no token for this right now. */
-}
-
-/* Invisible container for elements representing files while dragging. */
-body.files-ng #drag-container {
-  background-color: transparent;
-  height: calc(12px + 40px + 8px + 8px);
-  left: 0;
-  position: fixed;
-  top: 0;
-  width: calc(8px + 192px + 8px + 8px);
-  z-index: -1;  /* below .dialog-container */
-}
-
-body.files-ng #drag-container .drag-box {
-  background-color: var(--cros-sys-base_elevated);
-  border-radius: 8px;
-  box-shadow: var(--cros-elevation-2-shadow);
-  box-sizing: border-box;
-  height: 40px;
-  position: absolute;
-  width: 192px;
-}
-
-body.files-ng #drag-container .drag-contents {
-  align-items: center;
-  display: flex;
-  left: 8px;
-  padding-inline-start: 8px;
-  right: 8px;
-  top: 12px;
-}
-
-body.files-ng #drag-container .drag-multiple {
-  left: calc(8px + 8px);
-  right: calc(8px + 8px);
-  top: calc(12px + 8px);
-}
-
-body.files-ng #drag-container .detail-icon {
-  border-radius: 50%;
-  flex: none;
-}
-
-body.files-ng #drag-container .detail-icon[file-type-icon] {
-  color: var(--cros-sys-on_surface);
-}
-
-body.files-ng #drag-container .label {
-  color: var(--cros-sys-on_surface);
-  font: var(--cros-body-2-font);
-  overflow: hidden;
-  padding: 0 10px;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-body.files-ng #drag-container .drag-bubble {
-  background-color: var(--cros-sys-tertiary_container);
-  border-radius: 12px;
-  color: var(--cros-sys-on_tertiary_container);
-  font: var(--cros-button-1-font);
-  height: 24px;
-  line-height: 24px;
-  max-width: fit-content;
-  padding: 0 8px;
-  position: absolute;
-  right: calc(8px * 0.5);
-  white-space: nowrap;
-}
-
-html[dir=rtl] body.files-ng #drag-container .drag-bubble {
-  left: calc(8px * 0.5);
-  right: unset;
-}
-
-body[drive='unmounted'] .dialog-container #list-container,
-body[drive='mounting'] .dialog-container #list-container,
-body[drive='error'] .dialog-container #list-container,
-body[unformatted] .dialog-container #list-container {
-  opacity: 0;
-}
-
-.buttonbar > * {
-  position: relative;
-}
-
-#list-container .table-header-inner {
-  height: 100%;
-}
-
-#list-container .table-header-cell:hover {
-  background-color: inherit;
-}
-
-#list-container .table-header-cell:first-child {
-  box-sizing: border-box;
-  display: flex;
-  padding-inline-start: 8px;
-}
-
-#list-container .table-header-cell:first-child {
-  padding-inline-start: 0;
-}
-
-.table-header-cell {
-  padding-bottom: 8px;
-  padding-top: 8px;
-}
-
-html:not(.pointer-active) .table-header-cell,
-.table-header-cell:active {
-  cursor: pointer;
-}
-
-#list-container .table-header-cell:first-child
-.table-header-label {
-  margin-inline-start: 20px;
-}
-
-.table-header-label .sort-icon {
-  --cr-icon-button-fill-color: var(--cros-sys-on_surface);
-  --cr-icon-button-icon-size: 16px;
-  --cr-icon-button-focus-outline-color: var(--cros-sys-focus_ring);
-  --cr-icon-button-hover-background-color: var(--cros-sys-hover_on_subtle);
-  --cr-icon-button-size: 32px;
-  border-radius: 50%;
-  cursor: default;
-}
-
-.table-header-label .sort-icon:active {
-  background: var(--cros-sys-pressed_on_subtle);
-}
-
-html:not(.pointer-active) .table-header-label .sort-icon:hover,
-.table-header-label .sort-icon:active {
-  cursor: pointer;
-}
-
-.table-header-label .not-sorted .sort-icon {
-  display: none;
-}
-
-html.pointer-active .table-header-label .sort-icon:not(:active):hover,
-html.col-resize .table-header-label .sort-icon:not(:active):hover {
-  --cr-icon-button-hover-background-color: none;
-}
-
-.table-label-container {
-  align-items: center;
-  display: flex;
-  height: 32px;
-}
-
-/* Text in the column header */
-.table-label-container > span {
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-#list-container li.table-row {
-  background-color: var(--cros-sys-app_base);
-  box-sizing: border-box;
-  font: var(--cros-body-2-font);
-  height: 48px;
-}
-
-.check-select #list-container list li[selected] .detail-thumbnail
-> .thumbnail {
-  animation: none;
-}
-
-#list-container list li .detail-thumbnail > .thumbnail {
-  border-radius: 50%;
-  height: 24px;
-  width: 24px;
-}
-
-.table-row-cell > * {
-  color: var(--cros-sys-on_surface);
-  padding: 0;
-  padding-inline-start: 32px;
-  padding-top: 0 !important;
-}
-
-.table-row-cell .dlp-managed-icon,
-.table-row-cell .encrypted-icon,
-.table-row-cell xf-inline-status {
-  color: var(--cros-sys-secondary);
-}
-
-list:focus li[selected] .table-row-cell > * {
-  color: var(--cros-sys-on_secondary_container);
-}
-
-list:focus li[selected] .table-row-cell .dlp-managed-icon,
-list:focus li[selected] .table-row-cell .encrypted-icon,
-list:focus li[selected] .table-row-cell xf-inline-status {
-  color: var(--cros-sys-on_secondary_container);
-}
-
-.check-select list:focus li[selected] .table-row-cell > * {
-  color: var(--cros-sys-on_primary_container);
-}
-
-.check-select list:focus li[selected] .table-row-cell .dlp-managed-icon,
-.check-select list:focus li[selected] .table-row-cell .encrypted-icon,
-.check-select list:focus li[selected] .table-row-cell xf-inline-status {
-  color: var(--cros-sys-on_primary_container);
-}
-
-.table-row-cell > .dateholder {
-  display: flex;
-  margin-inline-end: 14px;
-}
-
-.table-row-cell > .dateholder > .date {
-  flex: 1 1;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: pre;
-}
-
-.table-row-cell > .dateholder > .dlp-managed-icon,
-.table-row-cell > .dateholder > .encrypted-icon {
-  flex: 0 0 24px;
-  margin-inline-start: 8px;
-}
-
-.table-header-splitter  {
-  background: none;
-  height: 32px;
-  margin-top: 8px;
-  width: auto;
-}
-
-.table-header-splitter .splitter-icon {
-  /*
-   * TODO(crbug.com/1268206): the icon is not in disabled state, a new css
-   * variable needs to be created and applied here.
-   */
-  --cr-icon-button-fill-color: var(--cros-sys-outline);
-  --cr-icon-button-hover-background-color: var(--cros-sys-hover_on_subtle);
-  --cr-icon-button-icon-size: 32px;
-  --cr-icon-button-margin-start: 0px;
-  --cr-icon-button-size: 32px;
-  --cr-icon-button-stroke-color: var(--cros-sys-outline);
-  cursor: default;
-  height: 32px;
-}
-
-.table-header-splitter .splitter-icon:active {
-  background: var(--cros-sys-pressed_on_subtle);
-}
-
-html:not(.pointer-active) .table-header-splitter .splitter-icon:hover {
-  cursor: col-resize;
-}
-
-html.pointer-active .table-header-splitter .splitter-icon:not(:active):hover,
-html.col-resize .table-header-splitter .splitter-icon:not(:active):hover {
-  --cr-icon-button-hover-background-color: none;
-}
-
-#list-container .table-row-cell .size {
-  padding-inline-end: 5px;
-  padding-inline-start: 32px;
-}
-
-.table-row-cell:first-child > * {
-  padding-inline-start: 0;
-}
-
-.table-row-cell .filename-label {
-  flex-grow: 1;
-  margin-inline-end: 8px;
-  padding-top: 0;
-}
-
-.check-select li[selected] .filename-label {
-  font: var(--cros-button-2-font);
-}
-
-body.files-ng #list-container li .detail-checkmark {
-  -webkit-mask-image: url(../images/files/ui/list_check.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  background-color: currentColor;
-  background-image: none;
-  height: 20px;
-  width: 20px;
-}
-
-list li .detail-checkmark {
-  margin-inline-start: 2px;
-}
-
-grid li .detail-checkmark {
-  margin-inline-start: 6px;
-  margin-top: 14px;
-}
-
-body.files-ng #list-container :focus li .detail-checkmark {
-  color: var(--cros-sys-on_primary_container);
-}
-
-body.files-ng #list-container li .detail-checkmark {
-  color: var(--cros-sys-on_surface);
-}
-
-/* Hide inline status when renaming in the list view. */
-#list-container .list li[renaming] xf-inline-status {
-  display: none;
-}
-
-#new-folder-button {
-  flex: none;
-}
-
-/* Default task dialog has its own background color for title and text
-   section. */
-.cr-dialog-container #default-task-dialog {
-  /* Override the default padding so we can have background color for different
-     sections in the dialog. */
-  padding: 0;
-  width: 352px;
-}
-
-.cr-dialog-container #default-task-dialog .cr-dialog-title {
-  background-color: var(--cros-sys-surface1);
-  border-radius: 20px 20px 0 0;
-  margin-bottom: 0;
-  padding: 32px 32px 16px;
-}
-
-.cr-dialog-container #default-task-dialog .cr-dialog-text {
-  background-color: var(--cros-sys-surface1);
-  padding: 0 32px 20px;
-}
-
-.install-linux-package-details-frame {
-  border: 1px solid var(--cros-sys-separator);
-  display: block;
-  height: 150px;
-  overflow: scroll;
-  padding: 8px 10px;
-  user-select: text;
-}
-
-.files-ng .install-linux-package-details-frame {
-  margin-top: 16px;
-}
-
-.cr-dialog-container.files-ng .install-linux-package-details-label {
-  margin-bottom: 10px;
-}
-
-.cr-dialog-container.files-ng .install-linux-package-detail-label {
-  color: var(--cros-sys-on_surface);
-  display: inline;
-  margin-inline-end: 5px;
-}
-
-.cr-dialog-container.files-ng .install-linux-package-detail-value {
-  color: var(--cros-sys-secondary);
-  display: inline;
-  margin-bottom: 5px;
-  white-space: pre-wrap;
-}
-
-list.autocomplete-suggestions {
-  background-color: var(--cros-bg-color-elevation-2);
-  border-radius: 3px;
-  box-shadow: var(--cros-elevation-2-shadow);
-  box-sizing: border-box;  /* To match the width with the search box's. */
-  color: var(--cros-menu-label-color);
-  flex: none;
-  margin-inline-start: -47px;
-  margin-top: 7px;
-  overflow: hidden;
-  padding: 8px 0;
-  position: fixed;
-  /* TODO(crbug.com/1289086): Remove the hard-code with, use JS to set it. */
-  width: 286px !important; /* This overrides the value specified by script. */
-  z-index: 550;
-}
-
-list.autocomplete-suggestions > li {
-  align-items: center;
-  display: flex;
-  height: 32px;
-}
-
-/* "search drive" row */
-list.autocomplete-suggestions > li:first-of-type {
-  color: var(--cros-text-color-secondary);
-}
-
-list.autocomplete-suggestions > li > div.detail-icon {
-  flex: none;
-  height: 32px;
-  width: 32px;
-}
-
-list.autocomplete-suggestions > li > div.detail-text {
-  flex: auto;
-  overflow-x: hidden;
-  text-overflow: ellipsis;
-}
-
-list.autocomplete-suggestions > li > div.detail-text em {
-  font-style: normal;
-}
-
-list.autocomplete-suggestions > li > div[search-icon] {
-  -webkit-mask-image: url(../images/files/ui/search.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  background-color: currentColor;
-}
-
-list.autocomplete-suggestions > [selected],
-list.autocomplete-suggestions > [lead] {
-  background-color: var(--cros-menu-item-background-hover);
-}
-
-.error-dialog-frame .error-dialog-img {
-  background-image: -webkit-image-set(
-    url(chrome://theme/IDR_ERROR_NETWORK_GENERIC) 1x,
-    url(chrome://theme/IDR_ERROR_NETWORK_GENERIC@2x) 2x);
-  background-position: center;
-  background-repeat: no-repeat;
-  height: 40px;
-}
-
-.error-dialog-frame .cr-dialog-cancel {
-  display: none;
-}
-
-.error-dialog-frame .cr-dialog-close,
-.error-dialog-frame .cr-dialog-title {
-  display: none;
-}
-
-.error-dialog-frame .cr-dialog-text {
-  text-align: center;
-}
-
-/* Feedback panels */
-
-.files-feedback-panels {
-  align-items: flex-end;
-  bottom: 24px;
-  display: flex;
-  flex-direction: column;
-  position: absolute;
-  right: 24px;
-  z-index: 502; /* Above splitter, but below quickview. */
-}
-
-.signals-overscroll {
-  min-height: calc(68px + 24px);
-}
-
-#quick-view {
-  z-index: 505; /* Must be above the scroll bar (500). */
-}
-
-files-toast {
-  /* Must be above the splitter (500) but below menu-like UI (550). */
-  z-index: 520;
-}
-
-/* File type filter buttons in Recents view. */
-#file-type-filter-container {
-  display: flex;
-  padding-bottom: 12px;
-  padding-inline: 20px;
-  padding-top: 12px;
-}
-
-.file-type-filter-button {
-  --border-color: var(--cros-sys-separator);
-  --cr-button-height: 32px;
-  --hover-bg-color: var(--cros-sys-hover_on_subtle);
-  --hover-border-color: var(--cros-sys-separator);
-  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
-  --ripple-opacity: 100%;
-  --text-color: var(--cros-sys-on_surface);
-  border-radius: 8px;
-  font: var(--cros-button-1-font);
-  margin-inline: 4px;
-  min-width: auto;
-  padding-inline: 12px;
-}
-
-.file-type-filter-button:first-child {
-  margin-inline-start: 0;
-}
-
-.file-type-filter-button.active {
-  --text-color: var(--cros-sys-on_secondary_container);
-  background-color: var(--cros-sys-secondary_container);
-}
-
-html.pointer-active .file-type-filter-button:not(:active) {
-  --hover-bg-color: none;
-  cursor: default;
-}
-
-html.focus-outline-visible .file-type-filter-button:focus {
-  outline: 2px solid var(--cros-sys-focus_ring);
-  outline-offset: 2px;
-}
-
-/*
- * Preventing FOUC
- */
-cr-input:not(:defined),
-files-tooltip:not(:defined) {
-  display: none;
-}
-
-/*
- * Banner styles.
- */
-#banners > * {
-  align-items: center;
-  display: flex !important;
-  max-height: 0;
-  opacity: 0;
-  transition: max-height 300ms cubic-bezier(0.4, 0, 0.2, 1),
-              opacity 150ms ease 50ms;
-  visibility: hidden;
-}
-
-#banners > *:not([hidden]) {
-  background-color: var(--cros-sys-app_base_shaded);
-  border-radius: 8px;
-  height: auto;
-  margin-inline-end: 16px;
-  margin-inline-start: 16px;
-  max-height: 300px;
-  min-height: 46px;
-  opacity: 1;
-  padding-bottom: 13px;
-  padding-inline-end: 8px;
-  padding-inline-start: 0;
-  padding-top: 13px;
-  visibility: visible;
-}
-
-#path-display-container {
-  background-color: var(--cros-sys-app_base);
-}
diff --git a/ui/file_manager/file_manager/foreground/css/file_types.css b/ui/file_manager/file_manager/foreground/css/file_types.css
index e70e2c7..8fc3aef 100644
--- a/ui/file_manager/file_manager/foreground/css/file_types.css
+++ b/ui/file_manager/file_manager/foreground/css/file_types.css
@@ -1,4 +1,4 @@
-/* Copyright 2012 The Chromium Authors
+/* Copyright 2023 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
@@ -7,25 +7,12 @@
  is no real need for the root/volume icon distinction for the directory tree
  noting that file-type-icon is also used in lists and menus ;) */
 
- /* We are mixing background-image and -webkit-mask-image here for different
-  SVGs.
-   * For Microsoft office icons SVGs (e.g. word/ppt/excel), we need to use
-   background-image to keep the original color.
-   * For other icon SVGs , we need to use -webkit-mask-image together with
-   background-color to customize the color.
-   * By default -webkit-mask-image is used because the default SVG is
-   filetype_generic.svg. In order to use background-image to override,
-   we need to reset both -webkit-mask-image and background-color. */
-
 /* Small icons for file types, used in lists and menus. */
 [file-type-icon] {
   -webkit-mask-image: url(../images/filetype/filetype_generic.svg);
   -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-icon-color-primary);
-  background-position: center;
-  background-repeat: no-repeat;
-  background-size: 20px 20px;
+  background-color: currentColor;
 }
 
 [file-type-icon='archive'] {
@@ -37,9 +24,7 @@
 }
 
 [file-type-icon='excel'] {
-  -webkit-mask-image: none;
-  background-color: transparent;
-  background-image: url(../images/filetype/filetype_excel.svg);
+  -webkit-mask-image: url(../images/filetype/filetype_excel.svg);
 }
 
 [file-type-icon='folder'] {
@@ -47,7 +32,7 @@
 }
 
 
-/* File type icon's background-image/mask-image needs to be reset to none:
+/* File type icon's background/mask-image needs to be reset to none:
  *  * For [selected], checkmark icon will be displayed.
  *  * For .has-thumbnail, thumbnail background image will be set.
  */
@@ -88,8 +73,6 @@
 
 [file-type-icon='gdoc'] {
   -webkit-mask-image: url(../images/filetype/filetype_gdoc.svg);
-  /* TODO(crbug.com/1345818) Revert the first CL on that bug when it's fixed. */
-  background-color: var(--cros-icon-color-blue);
 }
 
 [file-type-icon='gdraw'] {
@@ -133,9 +116,7 @@
 }
 
 [file-type-icon='ppt'] {
-  -webkit-mask-image: none;
-  background-color: transparent;
-  background-image: url(../images/filetype/filetype_ppt.svg);
+  -webkit-mask-image: url(../images/filetype/filetype_ppt.svg);
 }
 
 [file-type-icon='script'] {
@@ -159,9 +140,7 @@
 }
 
 [file-type-icon='word'] {
-  -webkit-mask-image: none;
-  background-color: transparent;
-  background-image: url(../images/filetype/filetype_word.svg);
+  -webkit-mask-image: url(../images/filetype/filetype_word.svg);
 }
 
 /* Large generic thumbnails, used when a file does not have a thumbnail. */
@@ -170,10 +149,7 @@
   -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
   -webkit-mask-size: 48px;
-  background-color: var(--cros-icon-color-primary);
-  background-position: center;
-  background-repeat: no-repeat;
-  background-size: 48px;
+  background-color: currentColor;
 }
 
 .no-thumbnail[generic-thumbnail='encrypted'] {
@@ -203,9 +179,7 @@
 }
 
 .no-thumbnail[generic-thumbnail='excel'] {
-  -webkit-mask-image: none;
-  background-color: transparent;
-  background-image: url(../images/filetype/filetype_excel.svg);
+  -webkit-mask-image: url(../images/filetype/filetype_excel.svg);
 }
 
 .no-thumbnail[generic-thumbnail='gdoc'] {
@@ -245,9 +219,7 @@
 }
 
 .no-thumbnail[generic-thumbnail='ppt'] {
-  -webkit-mask-image: none;
-  background-color: transparent;
-  background-image: url(../images/filetype/filetype_ppt.svg);
+  -webkit-mask-image: url(../images/filetype/filetype_ppt.svg);
 }
 
 .no-thumbnail[generic-thumbnail='script'] {
@@ -259,18 +231,17 @@
 }
 
 .no-thumbnail[generic-thumbnail='word'] {
-  -webkit-mask-image: none;
-  background-color: transparent;
-  background-image: url(../images/filetype/filetype_word.svg);
+  -webkit-mask-image: url(../images/filetype/filetype_word.svg);
 }
 
 /* File type icon and thumbnail colors. */
+[file-type-icon='gdoc'],
 [file-type-icon='script'],
 [file-type-icon='tini'],
 .no-thumbnail[generic-thumbnail='gdoc'],
 .no-thumbnail[generic-thumbnail='script'],
 .no-thumbnail[generic-thumbnail='tini'] {
-  background-color: var(--cros-icon-color-blue);
+  background-color: var(--cros-sys-progress);
 }
 
 [file-type-icon='audio'],
@@ -286,46 +257,46 @@
 .no-thumbnail[generic-thumbnail='pdf'],
 .no-thumbnail[generic-thumbnail='raw'],
 .no-thumbnail[generic-thumbnail='video'] {
-  background-color: var(--cros-icon-color-red);
+  background-color: var(--cros-sys-error);
 }
 
 [file-type-icon='gsheet'],
 [file-type-icon='gtable'],
 .no-thumbnail[generic-thumbnail='gsheet'],
 .no-thumbnail[generic-thumbnail='gtable'] {
-  background-color: var(--cros-icon-color-green);
+  background-color: var(--cros-sys-positive);
 }
 
 [file-type-icon='gslides'],
 .no-thumbnail[generic-thumbnail='gslides'] {
-  background-color: var(--cros-icon-color-yellow);
+  background-color: var(--cros-sys-warning);
 }
 
-/* The following 4 colors are one off colors, not in the existing palette. */
 [file-type-icon='gform'],
 .no-thumbnail[generic-thumbnail='gform'] {
-  background-color: rgb(114, 72, 185);
+  background-color: var(--cros-sys-file_form);
 }
 
 [file-type-icon='gsite'],
 [file-type-icon='sites'],
 .no-thumbnail[generic-thumbnail='gsite'],
 .no-thumbnail[generic-thumbnail='sites'] {
-  background-color: rgb(121, 110, 238);
+  background-color: var(--cros-sys-file_site);
 }
 
-@media (prefers-color-theme: dark) {
-  [file-type-icon='gform'],
-  .no-thumbnail[generic-thumbnail='gform'] {
-    background-color: rgb(180, 140, 255);
-  }
+[file-type-icon='excel'],
+.no-thumbnail[generic-thumbnail='excel'] {
+  background-color: var(--cros-sys-file_ms_excel);
+}
 
-  [file-type-icon='gsite'],
-  [file-type-icon='sites'],
-  .no-thumbnail[generic-thumbnail='gsite'],
-  .no-thumbnail[generic-thumbnail='sites'] {
-    background-color: rgb(140, 158, 255);
-  }
+[file-type-icon='ppt'],
+.no-thumbnail[generic-thumbnail='ppt'] {
+  background-color: var(--cros-sys-file_ms_ppt);
+}
+
+[file-type-icon='word'],
+.no-thumbnail[generic-thumbnail='word'] {
+  background-color: var(--cros-sys-file_ms_word);
 }
 
 /* Icons for volume types. A ".tree-row > .file-row" component in any rules
@@ -481,7 +452,7 @@
 }
 
 .icon-badge {
-  background-color: var(--cros-bg-color);
+  background-color: var(--cros-sys-app_base);
   border-radius: 10px;
   display: none;
   height: 10px;
@@ -500,16 +471,16 @@
 }
 
 html[dir='ltr'] #list-container.list-view .icon-badge {
-  left: -40px;
+  left: -44px;
 }
 
 html[dir='rtl'] #list-container.list-view .icon-badge {
-  left: 40px;
+  left: 44px;
 }
 
 li.shortcut .icon-badge::before {
   -webkit-mask-image: url(../images/files/ui/shortcut.svg);
-  background-color: var(--cros-color-secondary);
+  background-color: var(--cros-sys-secondary);
 }
 
 li.shortcut .icon-badge {
diff --git a/ui/file_manager/file_manager/foreground/css/file_types_gm3.css b/ui/file_manager/file_manager/foreground/css/file_types_gm3.css
deleted file mode 100644
index 8fc3aef..0000000
--- a/ui/file_manager/file_manager/foreground/css/file_types_gm3.css
+++ /dev/null
@@ -1,492 +0,0 @@
-/* Copyright 2023 The Chromium Authors
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-/* TODO(crbug.com/992819): unify root-type-icon and volume-type-icon into one
- type if possible, called file-type-icon or entry-type-icon say, since there
- is no real need for the root/volume icon distinction for the directory tree
- noting that file-type-icon is also used in lists and menus ;) */
-
-/* Small icons for file types, used in lists and menus. */
-[file-type-icon] {
-  -webkit-mask-image: url(../images/filetype/filetype_generic.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  background-color: currentColor;
-}
-
-[file-type-icon='archive'] {
-  -webkit-mask-image: url(../images/filetype/filetype_archive.svg);
-}
-
-[file-type-icon='audio'] {
-  -webkit-mask-image: url(../images/filetype/filetype_audio.svg);
-}
-
-[file-type-icon='excel'] {
-  -webkit-mask-image: url(../images/filetype/filetype_excel.svg);
-}
-
-[file-type-icon='folder'] {
-  -webkit-mask-image: url(../images/filetype/filetype_folder.svg);
-}
-
-
-/* File type icon's background/mask-image needs to be reset to none:
- *  * For [selected], checkmark icon will be displayed.
- *  * For .has-thumbnail, thumbnail background image will be set.
- */
-body.check-select #list-container li[selected] [file-type-icon],
-#list-container li [file-type-icon].has-thumbnail {
-  -webkit-mask-image: none;
-  background: none;
-}
-
-.computers-root[file-type-icon='folder'] {
-  -webkit-mask-image: url(../images/volumes/computer.svg);
-}
-
-.external-media-root[file-type-icon='folder'] {
-  -webkit-mask-image: url(../images/volumes/usb.svg);
-}
-
-.shared[file-type-icon='folder'] {
-  -webkit-mask-image: url(../images/filetype/filetype_folder_shared.svg);
-}
-
-.team-drive-root[file-type-icon='folder'] {
-  -webkit-mask-image: url(../images/volumes/hard_drive.svg);
-}
-
-/* .tree-row > .file-row icon for files-ng.  */
-.tree-row > .file-row > [file-type-icon='folder'] {
-  -webkit-mask-image: url(../images/filetype/filetype_folder.svg);
-}
-
-.tree-row > .file-row > .shared[file-type-icon='folder'] {
-  -webkit-mask-image: url(../images/filetype/filetype_folder_shared.svg);
-}
-
-.tree-row > .file-row > .team-drive-root[file-type-icon='folder'] {
-  -webkit-mask-image: url(../images/filetype/filetype_team_drive.svg);
-}
-
-[file-type-icon='gdoc'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gdoc.svg);
-}
-
-[file-type-icon='gdraw'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gdraw.svg);
-}
-
-[file-type-icon='glink'] {
-  -webkit-mask-image: url(../images/filetype/filetype_generic.svg);
-}
-
-[file-type-icon='gsheet'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gsheet.svg);
-}
-
-[file-type-icon='gslides'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gslides.svg);
-}
-
-[file-type-icon='gtable'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gtable.svg);
-}
-
-[file-type-icon='gform'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gform.svg);
-}
-
-[file-type-icon='gmap'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gmap.svg);
-}
-
-[file-type-icon='gsite'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gsite.svg);
-}
-
-[file-type-icon='image'] {
-  -webkit-mask-image: url(../images/filetype/filetype_image.svg);
-}
-
-[file-type-icon='pdf'] {
-  -webkit-mask-image: url(../images/filetype/filetype_pdf.svg);
-}
-
-[file-type-icon='ppt'] {
-  -webkit-mask-image: url(../images/filetype/filetype_ppt.svg);
-}
-
-[file-type-icon='script'] {
-  -webkit-mask-image: url(../images/filetype/filetype_script.svg);
-}
-
-[file-type-icon='sites'] {
-  -webkit-mask-image: url(../images/filetype/filetype_sites.svg);
-}
-
-[file-type-icon='smb'] {
-  -webkit-mask-image: url(../images/volumes/smb.svg);
-}
-
-[file-type-icon='tini'] {
-  -webkit-mask-image: url(../images/filetype/filetype_tini.svg);
-}
-
-[file-type-icon='video'] {
-  -webkit-mask-image: url(../images/filetype/filetype_video.svg);
-}
-
-[file-type-icon='word'] {
-  -webkit-mask-image: url(../images/filetype/filetype_word.svg);
-}
-
-/* Large generic thumbnails, used when a file does not have a thumbnail. */
-.no-thumbnail[generic-thumbnail] {
-  -webkit-mask-image: url(../images/files/ui/filetype_placeholder_generic.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  -webkit-mask-size: 48px;
-  background-color: currentColor;
-}
-
-.no-thumbnail[generic-thumbnail='encrypted'] {
-  -webkit-mask-image: url(../images/files/ui/encrypted.svg);
-}
-
-.no-thumbnail[generic-thumbnail='audio'] {
-  -webkit-mask-image: url(../images/filetype/filetype_audio.svg);
-}
-
-.no-thumbnail[generic-thumbnail='image'],
-.no-thumbnail[generic-thumbnail='raw'] {
-  -webkit-mask-image: url(../images/filetype/filetype_image.svg);
-}
-
-.no-thumbnail[generic-thumbnail='video'] {
-  -webkit-mask-image: url(../images/filetype/filetype_video.svg);
-}
-
-/* grid view large icons for known types. */
-.no-thumbnail[generic-thumbnail='archive'] {
-  -webkit-mask-image: url(../images/filetype/filetype_archive.svg);
-}
-
-.no-thumbnail[generic-thumbnail='tini'] {
-  -webkit-mask-image: url(../images/filetype/filetype_tini.svg);
-}
-
-.no-thumbnail[generic-thumbnail='excel'] {
-  -webkit-mask-image: url(../images/filetype/filetype_excel.svg);
-}
-
-.no-thumbnail[generic-thumbnail='gdoc'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gdoc.svg);
-}
-
-.no-thumbnail[generic-thumbnail='gdraw'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gdraw.svg);
-}
-
-.no-thumbnail[generic-thumbnail='gsheet'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gsheet.svg);
-}
-
-.no-thumbnail[generic-thumbnail='gslides'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gslides.svg);
-}
-
-.no-thumbnail[generic-thumbnail='gtable'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gtable.svg);
-}
-
-.no-thumbnail[generic-thumbnail='gform'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gform.svg);
-}
-
-.no-thumbnail[generic-thumbnail='gmap'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gmap.svg);
-}
-
-.no-thumbnail[generic-thumbnail='gsite'] {
-  -webkit-mask-image: url(../images/filetype/filetype_gsite.svg);
-}
-
-.no-thumbnail[generic-thumbnail='pdf'] {
-  -webkit-mask-image: url(../images/filetype/filetype_pdf.svg);
-}
-
-.no-thumbnail[generic-thumbnail='ppt'] {
-  -webkit-mask-image: url(../images/filetype/filetype_ppt.svg);
-}
-
-.no-thumbnail[generic-thumbnail='script'] {
-  -webkit-mask-image: url(../images/filetype/filetype_script.svg);
-}
-
-.no-thumbnail[generic-thumbnail='sites'] {
-  -webkit-mask-image: url(../images/filetype/filetype_sites.svg);
-}
-
-.no-thumbnail[generic-thumbnail='word'] {
-  -webkit-mask-image: url(../images/filetype/filetype_word.svg);
-}
-
-/* File type icon and thumbnail colors. */
-[file-type-icon='gdoc'],
-[file-type-icon='script'],
-[file-type-icon='tini'],
-.no-thumbnail[generic-thumbnail='gdoc'],
-.no-thumbnail[generic-thumbnail='script'],
-.no-thumbnail[generic-thumbnail='tini'] {
-  background-color: var(--cros-sys-progress);
-}
-
-[file-type-icon='audio'],
-[file-type-icon='gdraw'],
-[file-type-icon='image'],
-[file-type-icon='gmap'],
-[file-type-icon='pdf'],
-[file-type-icon='video'],
-.no-thumbnail[generic-thumbnail='audio'],
-.no-thumbnail[generic-thumbnail='gdraw'],
-.no-thumbnail[generic-thumbnail='image'],
-.no-thumbnail[generic-thumbnail='gmap'],
-.no-thumbnail[generic-thumbnail='pdf'],
-.no-thumbnail[generic-thumbnail='raw'],
-.no-thumbnail[generic-thumbnail='video'] {
-  background-color: var(--cros-sys-error);
-}
-
-[file-type-icon='gsheet'],
-[file-type-icon='gtable'],
-.no-thumbnail[generic-thumbnail='gsheet'],
-.no-thumbnail[generic-thumbnail='gtable'] {
-  background-color: var(--cros-sys-positive);
-}
-
-[file-type-icon='gslides'],
-.no-thumbnail[generic-thumbnail='gslides'] {
-  background-color: var(--cros-sys-warning);
-}
-
-[file-type-icon='gform'],
-.no-thumbnail[generic-thumbnail='gform'] {
-  background-color: var(--cros-sys-file_form);
-}
-
-[file-type-icon='gsite'],
-[file-type-icon='sites'],
-.no-thumbnail[generic-thumbnail='gsite'],
-.no-thumbnail[generic-thumbnail='sites'] {
-  background-color: var(--cros-sys-file_site);
-}
-
-[file-type-icon='excel'],
-.no-thumbnail[generic-thumbnail='excel'] {
-  background-color: var(--cros-sys-file_ms_excel);
-}
-
-[file-type-icon='ppt'],
-.no-thumbnail[generic-thumbnail='ppt'] {
-  background-color: var(--cros-sys-file_ms_ppt);
-}
-
-[file-type-icon='word'],
-.no-thumbnail[generic-thumbnail='word'] {
-  background-color: var(--cros-sys-file_ms_word);
-}
-
-/* Icons for volume types. A ".tree-row > .file-row" component in any rules
-   means the rule only matches in files-ng. */
-.tree-row > .file-row > [volume-type-icon='archive'] {
-  -webkit-mask-image: url(../images/volumes/archive.svg);
-}
-
-.tree-row > .file-row > [root-type-icon='my_files'] {
-  -webkit-mask-image: url(../images/volumes/my_files.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='downloads'],
-.tree-row > .file-row > [file-type-icon='downloads'] {
-  -webkit-mask-image: url(../images/volumes/downloads.svg);
-}
-
-[file-type-icon='downloads'] {
-  -webkit-mask-image: url(../images/volumes/downloads.svg);
-}
-
-[file-type-icon='camera-folder'] {
-  -webkit-mask-image: url(../images/volumes/camera.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='drive'] {
-  -webkit-mask-image: url(../images/volumes/drive.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='shortcut'] {
-  -webkit-mask-image: url(../images/volumes/shortcut.svg);
-}
-
-.drive-volume > .tree-row > .file-row > [volume-type-icon='drive'],
-.tree-row > .file-row > [root-type-icon='drive'] {
-  -webkit-mask-image: url(../images/volumes/service_drive.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='shared_drives_grand_root'] {
-  -webkit-mask-image: url(../images/volumes/team_drive.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='team_drive'] {
-  -webkit-mask-image: url(../images/volumes/hard_drive.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='computers_grand_root'] {
-  -webkit-mask-image: url(../images/volumes/devices.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='computer'] {
-  -webkit-mask-image: url(../images/volumes/computer.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='drive_offline'] {
-  -webkit-mask-image: url(../images/volumes/offline.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='drive_shared_with_me'] {
-  -webkit-mask-image: url(../images/volumes/shared.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='drive_recent'] {
-  -webkit-mask-image: url(../images/volumes/recent.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='external_media'],
-.tree-row > .file-row > [volume-type-icon='removable'],
-.tree-row > .file-row > [root-type-icon='removable'] {
-  -webkit-mask-image: url(../images/volumes/usb.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='removable'][volume-subtype='sd'] {
-  -webkit-mask-image: url(../images/volumes/sd.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='removable'][volume-subtype='optical'] {
-  -webkit-mask-image: url(../images/volumes/cd.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='mtp'] {
-  -webkit-mask-image: url(../images/volumes/phone.svg);
-}
-
-[file-type-icon='removable'] {
-  -webkit-mask-image: url(../images/volumes/hard_drive.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='removable'][volume-subtype='unknown'],
-.tree-item .tree-item > .tree-row > .file-row > [volume-type-icon='removable'] {
-  -webkit-mask-image: url(../images/volumes/hard_drive.svg);
-}
-
-.tree-row > .file-row > [root-type-icon='recent'] {
-  -webkit-mask-image: url(../images/volumes/recent.svg);
-}
-
-[file-type-icon='crostini'] {
-  -webkit-mask-image: url(../images/volumes/linux_files.svg);
-}
-
-.tree-row > .file-row > [root-type-icon='crostini'],
-.tree-row > .file-row > [volume-type-icon='crostini'] {
-  -webkit-mask-image: url(../images/volumes/linux_files.svg);
-}
-
-[file-type-icon='bruschetta'] {
-  -webkit-mask-image: url(../images/volumes/bruschetta.svg);
-}
-
-.tree-row > .file-row > [root-type-icon='bruschetta'],
-.tree-row > .file-row > [volume-type-icon='bruschetta'] {
-  -webkit-mask-image: url(../images/volumes/bruschetta.svg);
-}
-
-[file-type-icon='android_files'] {
-  -webkit-mask-image: url(../images/volumes/android.svg);
-}
-
-.tree-row > .file-row > [root-type-icon='android_files'],
-.tree-row > .file-row > [volume-type-icon='android_files'] {
-  -webkit-mask-image: url(../images/volumes/android.svg);
-}
-
-[file-type-icon='plugin_vm'] {
-  -webkit-mask-image: url(../images/volumes/plugin_vm_ng.svg);
-}
-
-.tree-row > .file-row > [file-type-icon='plugin_vm'] {
-  -webkit-mask-image: url(../images/volumes/plugin_vm_ng.svg);
-}
-
-.tree-row > .file-row > [volume-type-icon='smb'] {
-  -webkit-mask-image: url(../images/volumes/smb.svg);
-}
-
-[file-type-icon='trash'] {
-  -webkit-mask-image: url(../images/files/ui/delete_ng.svg);
-}
-
-.tree-row > .file-row > [root-type-icon='trash'],
-.tree-row > .file-row > [volume-type-icon='trash'] {
-  -webkit-mask-image: url(../images/files/ui/delete_ng.svg);
-}
-
-.icon-badge::before {
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  content: '';
-  display: block;
-  height: 10px;
-  width: 10px;
-}
-
-.icon-badge {
-  background-color: var(--cros-sys-app_base);
-  border-radius: 10px;
-  display: none;
-  height: 10px;
-  margin-inline-end: -10px;
-  position: relative;
-  top: 6px;
-  width: 10px;
-}
-
-html[dir='ltr'] #list-container.thumbnail-view .icon-badge {
-  left: -32px;
-}
-
-html[dir='rtl'] #list-container.thumbnail-view .icon-badge {
-  left: 32px;
-}
-
-html[dir='ltr'] #list-container.list-view .icon-badge {
-  left: -44px;
-}
-
-html[dir='rtl'] #list-container.list-view .icon-badge {
-  left: 44px;
-}
-
-li.shortcut .icon-badge::before {
-  -webkit-mask-image: url(../images/files/ui/shortcut.svg);
-  background-color: var(--cros-sys-secondary);
-}
-
-li.shortcut .icon-badge {
-  display: block;
-}
-
-body.check-select li[selected] .icon-badge {
-  display: none;
-}
diff --git a/ui/file_manager/file_manager/foreground/css/menu.css b/ui/file_manager/file_manager/foreground/css/menu.css
index c93a99b..d8cea37 100644
--- a/ui/file_manager/file_manager/foreground/css/menu.css
+++ b/ui/file_manager/file_manager/foreground/css/menu.css
@@ -1,4 +1,4 @@
-/* Copyright 2013 The Chromium Authors
+/* Copyright 2023 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
@@ -31,14 +31,14 @@
 }
 
 cr-menu > [shortcutText]::after {
-  color: var(--cros-menu-shortcut-color);
+  color: var(--cros-sys-secondary);
   content: attr(shortcutText);
   float: right;
   padding-inline-start: 30px;
 }
 
 cr-menu > [shortcutText][disabled]::after {
-  color: var(--cros-text-color-disabled);
+  color: var(--cros-sys-disabled);
 }
 
 html[dir='rtl'] cr-menu > [shortcutText]::after {
@@ -49,10 +49,12 @@
   -webkit-mask-image: url(../images/files/ui/arrow_right.svg);
   -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
-  background-color: var(--cros-icon-color-primary);
+  background-color: currentColor;
   content: '';
   float: right;
-  height: 32px;
+  height: 20px;
+  /* Trailing icon has a different padding than its container padding (16px). */
+  margin-inline-end: calc(12px - 16px);
   width: 20px;
 }
 
@@ -62,10 +64,10 @@
 }
 
 cr-menu > [sub-menu][disabled]::after {
-  background-color: var(--cros-text-color-disabled);
+  background-color: var(--cros-sys-disabled);
 }
 
-/* Keeps menu visibile while animating. Fade out animation is performed by
+/* Keeps menu visible while animating. Fade out animation is performed by
    Javascript. */
 cr-menu[hidden].files-menu.animating {
   opacity: 1;
@@ -84,18 +86,17 @@
 cr-menu.files-menu cr-menu-item .icon {
   -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
-  -webkit-mask-size: 16px 16px;
+  -webkit-mask-size: 20px 20px;
   background-position: center;
   background-repeat: no-repeat;
-  background-size: 16px 16px;
-  height: 32px;
-  vertical-align: middle;
-  width: 16px;
+  background-size: 20px 20px;
+  height: 36px;
+  width: 20px;
 }
 
 cr-menu.files-menu cr-menu-item .icon.start {
   align-self: flex-start;
-  margin-inline-end: 8px;
+  margin-inline-end: 16px;
 }
 
 cr-menu.files-menu:not(.has-icon-start) cr-menu-item .icon.start {
@@ -104,12 +105,14 @@
 
 cr-menu.files-menu cr-menu-item .icon.managed {
   background-image: url(chrome://resources/images/business.svg);
-  margin-inline-start: 8px;
+  margin-inline-start: 16px;
 }
 
 cr-menu.files-menu cr-menu-item .icon.end {
   align-self: flex-end;
-  margin-inline-start: 8px;
+  /* Trailing icon has a different padding than its container padding (16px). */
+  margin-inline-end: calc(12px - 16px);
+  margin-inline-start: 16px;
 }
 
 cr-menu.files-menu > cr-menu-item > .icon {
@@ -126,20 +129,38 @@
   z-index: 0;
 }
 
-html.files-ng cr-menu.files-menu > cr-menu-item {
+cr-menu.files-menu > cr-menu-item {
   padding: 0 16px;
 }
 
-html.files-ng.pointer-active cr-menu-item > paper-ripple {
+html.pointer-active cr-menu-item > paper-ripple {
   --paper-ripple-opacity: 100%;
-  color: var(--cros-ripple-color);
+  color: var(--cros-sys-ripple_neutral_on_subtle);
 }
 
-html.files-ng cr-menu.files-menu > cr-menu-item:not([disabled])[selected],
-html.files-ng cr-menu.files-menu > cr-menu-item:not([disabled]):active {
-  background-color: var(--cros-menu-item-background-hover);
+cr-menu.files-menu > cr-menu-item:not([disabled])[selected],
+cr-menu.files-menu > cr-menu-item:not([disabled]):active {
+  background-color: var(--cros-sys-hover_on_subtle);
 }
 
-html.files-ng:not(.pointer-active) cr-menu.files-menu > cr-menu-item:not([disabled]):active[selected] {
-  background-color: var(--cros-menu-item-background-hover);
+html:not(.pointer-active)
+    cr-menu.files-menu > cr-menu-item:not([disabled]):active[selected] {
+  background-color: var(--cros-sys-hover_on_subtle);
+}
+
+html.focus-outline-visible
+    cr-menu.files-menu > cr-menu-item:not([disabled])[selected] {
+  background-color: unset;
+}
+
+html.focus-outline-visible
+    cr-menu.files-menu > cr-menu-item:not([disabled])[selected]::before {
+  border: 2px solid var(--cros-sys-focus_ring);
+  border-radius: 8px;
+  content: '';
+  height: 100%;
+  left: 0;
+  position: absolute;
+  top: -2px; /* border-width offset */
+  width: calc(100% - 4px); /* 2 x border width */
 }
diff --git a/ui/file_manager/file_manager/foreground/css/menu_gm3.css b/ui/file_manager/file_manager/foreground/css/menu_gm3.css
deleted file mode 100644
index d8cea37..0000000
--- a/ui/file_manager/file_manager/foreground/css/menu_gm3.css
+++ /dev/null
@@ -1,166 +0,0 @@
-/* Copyright 2023 The Chromium Authors
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-/* Derived from /ui/webui/resources/css/menu.css. */
-
-cr-menu {
-  position: fixed;
-  white-space: nowrap;
-  z-index: 3;
-}
-
-cr-menu:not(.decorated) {
-  display: none;
-}
-
-cr-menu > * {
-  box-sizing: border-box;
-  display: block;
-  text-align: start;
-  width: 100%;
-}
-
-cr-menu > hr {
-  border: 0;
-  height: 1px;
-}
-
-cr-menu > [hidden] {
-  display: none;
-}
-
-cr-menu > [shortcutText]::after {
-  color: var(--cros-sys-secondary);
-  content: attr(shortcutText);
-  float: right;
-  padding-inline-start: 30px;
-}
-
-cr-menu > [shortcutText][disabled]::after {
-  color: var(--cros-sys-disabled);
-}
-
-html[dir='rtl'] cr-menu > [shortcutText]::after {
-  float: left;
-}
-
-cr-menu > [sub-menu]::after {
-  -webkit-mask-image: url(../images/files/ui/arrow_right.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  background-color: currentColor;
-  content: '';
-  float: right;
-  height: 20px;
-  /* Trailing icon has a different padding than its container padding (16px). */
-  margin-inline-end: calc(12px - 16px);
-  width: 20px;
-}
-
-html[dir='rtl'] cr-menu > [sub-menu]::after {
-  float: left;
-  transform: scaleX(-1);
-}
-
-cr-menu > [sub-menu][disabled]::after {
-  background-color: var(--cros-sys-disabled);
-}
-
-/* Keeps menu visible while animating. Fade out animation is performed by
-   Javascript. */
-cr-menu[hidden].files-menu.animating {
-  opacity: 1;
-  visibility: visible;
-}
-
-cr-menu.files-menu > cr-menu-item {
-  align-items: center;
-  display: flex;
-  flex-direction: row;
-  position: relative;
-}
-
-/* Icon on the left of the item label for cr.ui.FilesMenuItem.
-   TODO(mtomasz): Upstream to cr.ui.MenuItem. */
-cr-menu.files-menu cr-menu-item .icon {
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  -webkit-mask-size: 20px 20px;
-  background-position: center;
-  background-repeat: no-repeat;
-  background-size: 20px 20px;
-  height: 36px;
-  width: 20px;
-}
-
-cr-menu.files-menu cr-menu-item .icon.start {
-  align-self: flex-start;
-  margin-inline-end: 16px;
-}
-
-cr-menu.files-menu:not(.has-icon-start) cr-menu-item .icon.start {
-  display: none;
-}
-
-cr-menu.files-menu cr-menu-item .icon.managed {
-  background-image: url(chrome://resources/images/business.svg);
-  margin-inline-start: 16px;
-}
-
-cr-menu.files-menu cr-menu-item .icon.end {
-  align-self: flex-end;
-  /* Trailing icon has a different padding than its container padding (16px). */
-  margin-inline-end: calc(12px - 16px);
-  margin-inline-start: 16px;
-}
-
-cr-menu.files-menu > cr-menu-item > .icon {
-  z-index: 1;
-}
-
-cr-menu.files-menu > cr-menu-item > span,
-cr-menu.files-menu > cr-menu-item > div:not(.icon) {
-  flex-grow: 1;
-  z-index: 1;
-}
-
-cr-menu.files-menu > cr-menu-item > paper-ripple {
-  z-index: 0;
-}
-
-cr-menu.files-menu > cr-menu-item {
-  padding: 0 16px;
-}
-
-html.pointer-active cr-menu-item > paper-ripple {
-  --paper-ripple-opacity: 100%;
-  color: var(--cros-sys-ripple_neutral_on_subtle);
-}
-
-cr-menu.files-menu > cr-menu-item:not([disabled])[selected],
-cr-menu.files-menu > cr-menu-item:not([disabled]):active {
-  background-color: var(--cros-sys-hover_on_subtle);
-}
-
-html:not(.pointer-active)
-    cr-menu.files-menu > cr-menu-item:not([disabled]):active[selected] {
-  background-color: var(--cros-sys-hover_on_subtle);
-}
-
-html.focus-outline-visible
-    cr-menu.files-menu > cr-menu-item:not([disabled])[selected] {
-  background-color: unset;
-}
-
-html.focus-outline-visible
-    cr-menu.files-menu > cr-menu-item:not([disabled])[selected]::before {
-  border: 2px solid var(--cros-sys-focus_ring);
-  border-radius: 8px;
-  content: '';
-  height: 100%;
-  left: 0;
-  position: absolute;
-  top: -2px; /* border-width offset */
-  width: calc(100% - 4px); /* 2 x border width */
-}
diff --git a/ui/file_manager/file_manager/foreground/elements/files_quick_view.css b/ui/file_manager/file_manager/foreground/elements/files_quick_view.css
index 4c257ff4..d991167 100644
--- a/ui/file_manager/file_manager/foreground/elements/files_quick_view.css
+++ b/ui/file_manager/file_manager/foreground/elements/files_quick_view.css
@@ -1,4 +1,4 @@
-/* Copyright 2016 The Chromium Authors
+/* Copyright 2023 The Chromium Authors
  * Use of this source code is governed by a BSD-style license that can be
  * found in the LICENSE file. */
 
@@ -58,9 +58,7 @@
   margin: 0;
   padding: 0;
   position: absolute;
-  /* The top value here should be the total height of the #toolbar including
-  the height and the border-width */
-  top: 57px;
+  top: 56px; /* toolbar height */
   width: 100%;
 }
 
@@ -82,10 +80,11 @@
 }
 
 #innerContentPanel {
-  background-color: var(--cros-app-shield-80);
-  color: var(--cros-text-color-primary);
+  background-color: var(--cros-sys-scrim);
+  color: var(--cros-sys-on_surface);
   display: flex;
   flex-direction: column;
+  font: var(--cros-body-1-font);
   height: calc(100% - 64px);
   justify-content: center;
   outline: none;
@@ -106,18 +105,12 @@
   width: 100%;
 }
 
-.text-content {
-  background-color: var(--cros-bg-color);
-}
-
 #toolbar {
   align-items: center;
-  background-color: var(--cros-bg-color);
-  border-bottom: 1px solid var(--cros-separator-color);
-  color: var(--cros-text-color-primary);
+  background-color: var(--cros-sys-app_base);
+  color: var(--cros-sys-on_surface);
   display: flex;
-  font-family: 'Roboto Medium';
-  font-size: 14px;
+  font: var(--cros-title-1-font);
   height: 56px;
   margin: 0;
   opacity: 1;
@@ -127,6 +120,7 @@
 
 #file-path {
   flex: 1;
+  margin-inline-end: 8px;
   margin-inline-start: 8px;
   max-width: 100%;
   overflow: hidden;
@@ -138,19 +132,19 @@
 }
 
 cr-button {
-  --hover-bg-color:var(--cros-ripple-color);
-  --ink-color: var(--cros-ripple-color);
+  --hover-bg-color: var(--cros-sys-hover_on_subtle);
+  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
   --ripple-opacity: 100%;
-  --text-color: var(--cros-icon-color-primary);
-  border: 2px solid transparent;
-  border-radius: 50%;
+  --text-color: currentColor;
+  border: none;
+  border-radius: 12px;
   box-shadow: none;
   box-sizing: border-box;
-  height: 36px;
-  margin: 0 6px;
-  min-width: 36px;
-  padding: calc(6px - 2px);
-  width: 36px;
+  height: 40px;
+  margin: 4px;
+  min-width: 40px;
+  padding: 0;
+  width: 40px;
 }
 
 :host-context(html.pointer-active) cr-button:not(:active):hover {
@@ -200,8 +194,13 @@
   width: 16px;
 }
 
+#info-button {
+  --ink-color: var(--cros-sys-ripple_primary);
+}
+
 #info-button[aria-pressed=true] {
-  background-color: var(--cros-ripple-color);
+  background-color: var(--cros-sys-primary_container);
+  color: var(--cros-sys-on_primary_container);
 }
 
 #info-button > .icon {
@@ -209,11 +208,11 @@
 }
 
 :host-context(html.focus-outline-visible) cr-button:not(:active):focus {
-  border: 2px solid var(--cros-focus-ring-color);
+  outline: 2px solid var(--cros-sys-focus_ring);
 }
 
 #metadata-box {
-  background-color: var(--cros-bg-color-dropped-elevation-1);
+  background-color: var(--cros-sys-app_base);
   bottom: 0;
   height: 100%;
   margin: 0;
@@ -229,13 +228,13 @@
 }
 
 ::-webkit-scrollbar {
-  background-color: var(--cros-app-scrollbar-color);
+  background-color: var(--cros-sys-scrollbar);
   width: 10px;
 }
 
 ::-webkit-scrollbar-thumb {
   background-clip: content-box;
-  background-color: var(--cros-app-scrollbar-color-hover);
+  background-color: var(--cros-sys-scrollbar_hover);
   border: 2.5px solid transparent;
   width: 5px;
 }
@@ -245,17 +244,21 @@
 }
 
 .no-preview {
-  margin-top: 16px;
+  max-width: 130px;
 }
 
-@media only screen and (max-width: 720px) {
-  #contentPanel[metadata-box-active] #innerContentPanel {
-    padding-inline-end: 4px;
-    padding-inline-start: 4px;
-  }
-  #contentPanel[metadata-box-active] {
-    margin-inline-end: 250px;
-  }
+.no-preview-container {
+  -webkit-mask-image: url(../images/files/ui/quickview_star.svg);
+  -webkit-mask-position: center;
+  -webkit-mask-repeat: no-repeat;
+  -webkit-mask-size: 224px;
+  align-items: center;
+  background-color: var(--cros-sys-primary_container);
+  color: var(--cros-sys-on_primary_container);
+  display: flex;
+  flex-direction: column;
+  height: 224px;
+  justify-content: center;
 }
 
 /* Large generic thumbnails, used when a file does not have a thumbnail. */
@@ -263,34 +266,28 @@
   -webkit-mask-image: url(../images/filetype/filetype_generic.svg);
   -webkit-mask-position: center;
   -webkit-mask-repeat: no-repeat;
-  -webkit-mask-size: auto 88px;
+  -webkit-mask-size: 80px;
   background-color: currentColor;
-  background-position: center;
-  background-repeat: no-repeat;
-  background-size: auto 88px;
-  height: 88px;
+  height: 80px;
+  margin-bottom: 8px;
+  width: 80px;
 }
 
 [generic-thumbnail='.folder'] {
   -webkit-mask-image: url(../images/filetype/filetype_folder.svg);
-  -webkit-mask-size: auto 72px;
 }
 
 [generic-thumbnail='audio'] {
-  -webkit-mask-image: none;
-  background-color: transparent;
-  background-image: url(../images/filetype/filetype_audio.svg);
+  -webkit-mask-image: url(../images/filetype/filetype_audio.svg);
+  background-color: var(--cros-sys-error);
 }
 
 [generic-thumbnail='image'] {
-  -webkit-mask-image: none;
-  background-color: transparent;
-  background-image: url(../images/filetype/filetype_image.svg);
+  -webkit-mask-image: url(../images/filetype/filetype_image.svg);
+  background-color: var(--cros-sys-error);
 }
 
 [generic-thumbnail='video'] {
-  -webkit-mask-image: none;
-  background-color: transparent;
-  background-image: url(../images/filetype/filetype_video.svg);
-  background-size: auto 72px;
+  -webkit-mask-image: url(../images/filetype/filetype_video.svg);
+  background-color: var(--cros-sys-error);
 }
diff --git a/ui/file_manager/file_manager/foreground/elements/files_quick_view_gm3.css b/ui/file_manager/file_manager/foreground/elements/files_quick_view_gm3.css
deleted file mode 100644
index d991167..0000000
--- a/ui/file_manager/file_manager/foreground/elements/files_quick_view_gm3.css
+++ /dev/null
@@ -1,293 +0,0 @@
-/* Copyright 2023 The Chromium Authors
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file. */
-
-:host > ::content > * {
-  margin: 0;
-  padding: 0;
-}
-
-dialog {
-  background-color: transparent;
-  border: none;
-  font-size: 100%;
-  height: 100%;
-  margin: 0;
-  max-height: initial;
-  max-width: initial;
-  opacity: 0;
-  outline: none;
-  overflow: hidden;
-  padding: 0;
-  width: 100%;
-}
-
-dialog[open] {
-  opacity: 1;
-  transition: opacity 200ms;
-}
-
-dialog:focus {
-  outline: none;
-}
-
-dialog#delete-confirm-dialog::backdrop {
-  background-color: transparent;
-}
-
-.thumbnail {
-  flex: none;
-  height: 100%;
-  width: 100%;
-}
-
-#video-poster {
-  max-height: 100%;
-  max-width: 100%;
-}
-
-#audio-artwork {
-  height: 100%;
-  margin: 0 auto;
-  width: 100%;
-}
-
-#mainPanel {
-  background-color: transparent;
-  bottom: 0;
-  margin: 0;
-  padding: 0;
-  position: absolute;
-  top: 56px; /* toolbar height */
-  width: 100%;
-}
-
-#contentPanel {
-  background-color: transparent;
-  display: flex;
-  height: 100%;
-  justify-content: center;
-  position: relative;
-}
-
-#contentPanel[metadata-box-active] {
-  margin-inline-end: 320px;
-}
-
-:host-context(html[dir='rtl']) #contentPanel[metadata-box-active] {
-  margin-inline-end: 320px;
-  margin-inline-start: auto;
-}
-
-#innerContentPanel {
-  background-color: var(--cros-sys-scrim);
-  color: var(--cros-sys-on_surface);
-  display: flex;
-  flex-direction: column;
-  font: var(--cros-body-1-font);
-  height: calc(100% - 64px);
-  justify-content: center;
-  outline: none;
-  padding: 32px;
-  position: relative;
-  text-align: center;
-  width: 100%;
-}
-
-#innerContentPanel[type='audio'],
-#innerContentPanel[type='image'],
-#innerContentPanel[type='video'] {
-  align-self: center;
-}
-
-.content {
-  height: 100%;
-  width: 100%;
-}
-
-#toolbar {
-  align-items: center;
-  background-color: var(--cros-sys-app_base);
-  color: var(--cros-sys-on_surface);
-  display: flex;
-  font: var(--cros-title-1-font);
-  height: 56px;
-  margin: 0;
-  opacity: 1;
-  padding: 0;
-  z-index: 1;
-}
-
-#file-path {
-  flex: 1;
-  margin-inline-end: 8px;
-  margin-inline-start: 8px;
-  max-width: 100%;
-  overflow: hidden;
-  text-overflow: ellipsis;
-}
-
-.buttons-group {
-  display: flex;
-}
-
-cr-button {
-  --hover-bg-color: var(--cros-sys-hover_on_subtle);
-  --ink-color: var(--cros-sys-ripple_neutral_on_subtle);
-  --ripple-opacity: 100%;
-  --text-color: currentColor;
-  border: none;
-  border-radius: 12px;
-  box-shadow: none;
-  box-sizing: border-box;
-  height: 40px;
-  margin: 4px;
-  min-width: 40px;
-  padding: 0;
-  width: 40px;
-}
-
-:host-context(html.pointer-active) cr-button:not(:active):hover {
-  --hover-bg-color: none;
-  cursor: unset;
-}
-
-cr-button::after {
-  content: '';
-  height: 48px;
-  position: absolute;
-  width: 48px;
-}
-
-#back-button > .icon,
-#open-button > .icon,
-#delete-button > .icon,
-#info-button > .icon {
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  background-color: currentColor;
-  background-image: none;
-  height: 36px;
-  width: 36px;
-}
-
-iron-icon {
-  height: 16px;
-  width: 16px;
-}
-
-#back-button > iron-icon {
-  display: none;
-}
-
-#back-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/back.svg);
-}
-
-#open-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/external_link.svg);
-}
-
-#delete-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/delete_ng.svg);
-  height: 16px;
-  width: 16px;
-}
-
-#info-button {
-  --ink-color: var(--cros-sys-ripple_primary);
-}
-
-#info-button[aria-pressed=true] {
-  background-color: var(--cros-sys-primary_container);
-  color: var(--cros-sys-on_primary_container);
-}
-
-#info-button > .icon {
-  -webkit-mask-image: url(../images/files/ui/info.svg);
-}
-
-:host-context(html.focus-outline-visible) cr-button:not(:active):focus {
-  outline: 2px solid var(--cros-sys-focus_ring);
-}
-
-#metadata-box {
-  background-color: var(--cros-sys-app_base);
-  bottom: 0;
-  height: 100%;
-  margin: 0;
-  opacity: 1;
-  overflow-y: auto;
-  position: absolute;
-  right: 0;
-}
-
-:host-context(html[dir='rtl']) #metadata-box {
-  left: 0;
-  right: auto;
-}
-
-::-webkit-scrollbar {
-  background-color: var(--cros-sys-scrollbar);
-  width: 10px;
-}
-
-::-webkit-scrollbar-thumb {
-  background-clip: content-box;
-  background-color: var(--cros-sys-scrollbar_hover);
-  border: 2.5px solid transparent;
-  width: 5px;
-}
-
-[hidden] {
-  display: none;
-}
-
-.no-preview {
-  max-width: 130px;
-}
-
-.no-preview-container {
-  -webkit-mask-image: url(../images/files/ui/quickview_star.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  -webkit-mask-size: 224px;
-  align-items: center;
-  background-color: var(--cros-sys-primary_container);
-  color: var(--cros-sys-on_primary_container);
-  display: flex;
-  flex-direction: column;
-  height: 224px;
-  justify-content: center;
-}
-
-/* Large generic thumbnails, used when a file does not have a thumbnail. */
-[generic-thumbnail] {
-  -webkit-mask-image: url(../images/filetype/filetype_generic.svg);
-  -webkit-mask-position: center;
-  -webkit-mask-repeat: no-repeat;
-  -webkit-mask-size: 80px;
-  background-color: currentColor;
-  height: 80px;
-  margin-bottom: 8px;
-  width: 80px;
-}
-
-[generic-thumbnail='.folder'] {
-  -webkit-mask-image: url(../images/filetype/filetype_folder.svg);
-}
-
-[generic-thumbnail='audio'] {
-  -webkit-mask-image: url(../images/filetype/filetype_audio.svg);
-  background-color: var(--cros-sys-error);
-}
-
-[generic-thumbnail='image'] {
-  -webkit-mask-image: url(../images/filetype/filetype_image.svg);
-  background-color: var(--cros-sys-error);
-}
-
-[generic-thumbnail='video'] {
-  -webkit-mask-image: url(../images/filetype/filetype_video.svg);
-  background-color: var(--cros-sys-error);
-}
diff --git a/ui/file_manager/file_manager/state/ducks/all_entries.ts b/ui/file_manager/file_manager/state/ducks/all_entries.ts
index dd893772..d2c0b78 100644
--- a/ui/file_manager/file_manager/state/ducks/all_entries.ts
+++ b/ui/file_manager/file_manager/state/ducks/all_entries.ts
@@ -516,9 +516,11 @@
       // Also remove it from the children field.
       myFilesFileData.children = myFilesFileData.children.filter(
           childKey => childKey !== uiEntryPlaceholder.toURL());
-      // And remove it from the uiEntries if existed.
-      state.uiEntries = state.uiEntries.filter(
-          uiEntryKey => uiEntryKey !== uiEntryPlaceholder.toURL());
+      // Do not remove the placeholder ui entry from the store. Removing it from
+      // the MyFiles is sufficient to prevent it from showing in the directory
+      // tree. We keep it in the store (`state["uiEntries"]`) because when
+      // the corresponding volume unmounts, we need to use its existence to
+      // decide if we need to re-add the placeholder back to MyFiles.
     }
     appendChildIfNotExisted(myFilesEntry, newVolumeEntry);
     // Push the new entry to the children of FileData and sort them.
diff --git a/ui/file_manager/file_manager/state/ducks/ui_entries_unittest.ts b/ui/file_manager/file_manager/state/ducks/ui_entries_unittest.ts
index 0a6fc0a..9e6d830 100644
--- a/ui/file_manager/file_manager/state/ducks/ui_entries_unittest.ts
+++ b/ui/file_manager/file_manager/state/ducks/ui_entries_unittest.ts
@@ -270,8 +270,7 @@
 }
 
 /**
- * Tests removing UI entry from MyFiles will reset the children field of
- * MyFiles entry.
+ * Tests removing UI entry from MyFiles will also update MyFiles entry.
  */
 export async function testRemoveUiEntryFromMyFiles(done: () => void) {
   const initialState = getEmptyState();
@@ -291,7 +290,7 @@
 
   const store = setupStore(initialState);
 
-  // Dispatch an action to
+  // Dispatch an action to remove ui entry.
   store.dispatch(removeUiEntry({key: uiEntry.toURL()}));
 
   // Expect the entry has been removed from MyFiles.
diff --git a/ui/file_manager/file_manager/state/ducks/volumes.ts b/ui/file_manager/file_manager/state/ducks/volumes.ts
index 8575c4ec..85aa686c 100644
--- a/ui/file_manager/file_manager/state/ducks/volumes.ts
+++ b/ui/file_manager/file_manager/state/ducks/volumes.ts
@@ -4,14 +4,16 @@
 
 import {assert} from 'chrome://resources/ash/common/assert.js';
 
+import {isVolumeEntry, sortEntries} from '../../common/js/entry_utils.js';
 import {EntryList, VolumeEntry} from '../../common/js/files_app_entry_types.js';
 import {util} from '../../common/js/util.js';
 import {VolumeManagerCommon} from '../../common/js/volume_manager_types.js';
+import {FakeEntry} from '../../externs/files_app_entry_interfaces.js';
 import {PropStatus, State, Volume, VolumeId} from '../../externs/ts/state.js';
 import {VolumeInfo} from '../../externs/volume_info.js';
 import {Slice} from '../../lib/base_store.js';
 import {cacheEntries, getMyFiles, updateFileData, volumeNestingEntries} from '../ducks/all_entries.js';
-import {getEntry} from '../store.js';
+import {getEntry, getFileData} from '../store.js';
 
 import {updateDeviceConnectionState} from './device.js';
 
@@ -203,14 +205,56 @@
 function removeVolumeReducer(currentState: State, payload: {
   volumeId: VolumeId,
 }): State {
+  const volumeToRemove: Volume = currentState.volumes[payload.volumeId];
+  const volumeEntry = getEntry(currentState, volumeToRemove.rootKey!)!;
   delete currentState.volumes[payload.volumeId];
-  const volumes = {
+  currentState.volumes = {
     ...currentState.volumes,
   };
 
+  // We also need to check if the removed volume is a child of My files.
+  const volumeTypesNestedInMyFiles = getVolumeTypesNestedInMyFiles();
+  if (volumeTypesNestedInMyFiles.has(volumeToRemove.volumeType)) {
+    const {myFilesEntry} = getMyFiles(currentState);
+    const children = myFilesEntry.getUIChildren();
+    const volumeEntryExistsInMyFiles = !!children.find(
+        childEntry => isVolumeEntry(childEntry) &&
+            util.isSameEntry(childEntry, volumeEntry));
+    if (volumeEntryExistsInMyFiles) {
+      // Remove it from the MyFiles UI children.
+      myFilesEntry.removeChildEntry(volumeEntry);
+      // Re-add the corresponding placeholder ui entry to the UI children.
+      const uiEntryKey = currentState.uiEntries.find(entryKey => {
+        const uiEntry = getEntry(currentState, entryKey)! as FakeEntry;
+        return uiEntry.name === volumeEntry.name;
+      });
+      if (uiEntryKey) {
+        const uiEntry = getEntry(currentState, uiEntryKey)!;
+        myFilesEntry.addEntry(uiEntry);
+      }
+      // Remove it from the MyFiles file data.
+      const fileData = getFileData(currentState, myFilesEntry.toURL());
+      if (fileData) {
+        let newChildren =
+            fileData.children.filter(child => child !== volumeEntry.toURL());
+        // Re-add the corresponding placeholder ui entry to the file data.
+        if (uiEntryKey) {
+          newChildren = newChildren.concat(uiEntryKey);
+          const childEntries =
+              newChildren.map(childKey => getEntry(currentState, childKey)!);
+          newChildren = sortEntries(myFilesEntry, childEntries)
+                            .map(entry => entry.toURL());
+        }
+        currentState.allEntries[myFilesEntry.toURL()] = {
+          ...fileData,
+          children: newChildren,
+        };
+      }
+    }
+  }
+
   return {
     ...currentState,
-    volumes,
   };
 }
 
diff --git a/ui/file_manager/file_manager/state/ducks/volumes_unittest.ts b/ui/file_manager/file_manager/state/ducks/volumes_unittest.ts
index 930fcfe..64be3bf5 100644
--- a/ui/file_manager/file_manager/state/ducks/volumes_unittest.ts
+++ b/ui/file_manager/file_manager/state/ducks/volumes_unittest.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {assertTrue} from 'chrome://webui-test/chromeos/chai_assert.js';
+import {assertEquals, assertTrue} from 'chrome://webui-test/chromeos/chai_assert.js';
 
 import {MockVolumeManager} from '../../background/js/mock_volume_manager.js';
 import {EntryList, FakeEntryImpl, VolumeEntry} from '../../common/js/files_app_entry_types.js';
@@ -143,7 +143,7 @@
   }));
 
   // Expect the new play file volume will be nested inside MyFiles and the old
-  // placeholder will be removed.
+  // placeholder will be removed from MyFiles children but still in the store.
   const playFilesVolumeEntry = new VolumeEntry(playFilesVolumeInfo);
   myFilesVolumeEntry.addEntry(playFilesVolumeEntry);
   const want: Partial<State> = {
@@ -152,6 +152,7 @@
         ...fileData,
         children: [playFilesVolumeEntry.toURL()],
       },
+      [playFilesUiEntry.toURL()]: convertEntryToFileData(playFilesUiEntry),
       [playFilesVolumeEntry.toURL()]:
           convertEntryToFileData(playFilesVolumeEntry),
     },
@@ -163,7 +164,7 @@
         prefixKey: myFilesVolumeEntry.toURL(),
       },
     },
-    uiEntries: [],
+    uiEntries: [playFilesUiEntry.toURL()],
   };
   await waitDeepEquals(store, want, (state) => ({
                                       allEntries: state.allEntries,
@@ -424,6 +425,72 @@
   done();
 }
 
+/**
+ * Tests removing volume from MyFiles will also update the MyFiles entry.
+ */
+export async function testRemoveVolumeFromMyFiles(done: () => void) {
+  const initialState = getEmptyState();
+  // Put MyFiles in the store.
+  const {fileData, volumeInfo} = createMyFilesDataWithVolumeEntry();
+  const myFilesVolumeEntry = fileData.entry as VolumeEntry;
+  const myFilesVolume = convertVolumeInfoAndMetadataToVolume(
+      volumeInfo, createFakeVolumeMetadata(volumeInfo));
+  initialState.allEntries[myFilesVolumeEntry.toURL()] = fileData;
+  initialState.volumes[volumeInfo.volumeId] = myFilesVolume;
+  // Put Crostini in the store.
+  const {volumeManager} = window.fileManager;
+  const crostiniVolumeInfo = MockVolumeManager.createMockVolumeInfo(
+      VolumeManagerCommon.VolumeType.CROSTINI, 'crostiniId', 'Linux files');
+  volumeManager.volumeInfoList.add(crostiniVolumeInfo);
+  const crostiniVolume = convertVolumeInfoAndMetadataToVolume(
+      crostiniVolumeInfo, createFakeVolumeMetadata(crostiniVolumeInfo));
+  const crostiniVolumeEntry = new VolumeEntry(crostiniVolumeInfo);
+  const crostiniFileData = convertEntryToFileData(crostiniVolumeEntry);
+  initialState.allEntries[crostiniVolumeEntry.toURL()] = crostiniFileData;
+  initialState.volumes[crostiniVolume.volumeId] = crostiniVolume;
+  fileData.children.push(crostiniVolumeEntry.toURL());
+  myFilesVolumeEntry.addEntry(crostiniVolumeEntry);
+  // Put Linux files placeholder in the store.
+  const linuxFilesUiEntry = new FakeEntryImpl(
+      crostiniVolume.label, VolumeManagerCommon.RootType.CROSTINI);
+  initialState.uiEntries.push(linuxFilesUiEntry.toURL());
+  initialState.allEntries[linuxFilesUiEntry.toURL()] =
+      convertEntryToFileData(linuxFilesUiEntry);
+
+  const store = setupStore(initialState);
+
+  // Dispatch an action to remove volume entry.
+  store.dispatch(removeVolume({volumeId: crostiniVolume.volumeId}));
+
+  // Expect the volume entry has been removed from MyFiles and the UI entry has
+  // been added back.
+  const want: Partial<State> = {
+    allEntries: {
+      [myFilesVolumeEntry.toURL()]: {
+        ...convertEntryToFileData(myFilesVolumeEntry),
+        children: [linuxFilesUiEntry.toURL()],
+      },
+      [crostiniVolumeEntry.toURL()]:
+          convertEntryToFileData(crostiniVolumeEntry),
+      [linuxFilesUiEntry.toURL()]: convertEntryToFileData(linuxFilesUiEntry),
+    },
+    volumes: {
+      [myFilesVolume.volumeId]: myFilesVolume,
+    },
+  };
+  await waitDeepEquals(store, want, (state) => ({
+                                      allEntries: state.allEntries,
+                                      volumes: state.volumes,
+                                    }));
+
+  // Check the volume entry has also been removed from MyFiles entry.
+  const uiChildren = myFilesVolumeEntry.getUIChildren();
+  assertEquals(1, uiChildren.length);
+  assertTrue(util.isSameEntry(linuxFilesUiEntry, uiChildren[0]!));
+
+  done();
+}
+
 export async function testUpdateIsInteractiveVolume(done: () => void) {
   const initialState = getEmptyState();
   const {volumeManager} = window.fileManager;
diff --git a/ui/file_manager/file_manager_resources.grd b/ui/file_manager/file_manager_resources.grd
index 7ef727a..422d873 100644
--- a/ui/file_manager/file_manager_resources.grd
+++ b/ui/file_manager/file_manager_resources.grd
@@ -13,7 +13,6 @@
     <includes>
       <!-- Polymer elements -->
       <include name="IDR_FILE_MANAGER_ELEMENTS_FILES_QUICK_PREVIEW_CSS" file="file_manager/foreground/elements/files_quick_view.css" type="BINDATA" />
-      <include name="IDR_FILE_MANAGER_ELEMENTS_FILES_QUICK_PREVIEW_GM3_CSS" file="file_manager/foreground/elements/files_quick_view_gm3.css" type="BINDATA" />
 
       <!-- Images referenced from the manifest or the code -->
       <include name="IDR_FILE_MANAGER_ICON_16" file="file_manager/common/images/icon16.png" type="BINDATA" />
diff --git a/ui/file_manager/integration_tests/file_manager/file_display.js b/ui/file_manager/integration_tests/file_manager/file_display.js
index 9d5926c..6561dc4 100644
--- a/ui/file_manager/integration_tests/file_manager/file_display.js
+++ b/ui/file_manager/integration_tests/file_manager/file_display.js
@@ -133,7 +133,10 @@
   const appId = await setupAndWaitUntilReady(RootPath.DRIVE, [], driveFiles);
 
   // Retrieve all file list entries that could be rendered 'offline'.
-  const offlineEntry = '#file-list .table-row.file.dim-offline';
+  // Use "first-child" here because opacity for offline only applies on the
+  // children elements.
+  const offlineEntry =
+      '#file-list .table-row.file.dim-offline > div:first-child';
   let elements = await remoteCall.callRemoteTestUtil(
       'queryAllElements', appId, [offlineEntry, ['opacity']]);
 
@@ -145,7 +148,10 @@
   chrome.test.assertEq('0.38', elements[0].styles.opacity);
 
   // Retrieve file entries that are 'available offline' (not dimmed).
-  const availableEntry = '#file-list .table-row:not(.dim-offline)';
+  // Use "first-child" here because opacity for offline only applies on the
+  // children elements.
+  const availableEntry =
+      '#file-list .table-row:not(.dim-offline) > div:first-child';
   elements = await remoteCall.callRemoteTestUtil(
       'queryAllElements', appId, [availableEntry, ['opacity']]);
 
diff --git a/ui/views/controls/menu/menu_controller.cc b/ui/views/controls/menu/menu_controller.cc
index b02f255..de9b95fe 100644
--- a/ui/views/controls/menu/menu_controller.cc
+++ b/ui/views/controls/menu/menu_controller.cc
@@ -1413,6 +1413,9 @@
   owner_->RemoveObserver(this);
   owner_ = nullptr;
   native_view_for_gestures_ = nullptr;
+  // Exit menu to ensure that we are not holding on to resources when the
+  // widget has been destroyed.
+  ExitMenu();
 }
 
 bool MenuController::IsCancelAllTimerRunningForTest() {
diff --git a/url/BUILD.gn b/url/BUILD.gn
index 245623eb..fab07e7 100644
--- a/url/BUILD.gn
+++ b/url/BUILD.gn
@@ -69,6 +69,8 @@
     "//build:robolectric_buildflags",
   ]
 
+  configs += [ "//build/config/compiler:wexit_time_destructors" ]
+
   if (is_android || is_robolectric) {
     deps += [ ":url_jni_headers" ]
     if (!is_cronet_build) {
diff --git a/url/ipc/BUILD.gn b/url/ipc/BUILD.gn
index d7801af..36fba9a 100644
--- a/url/ipc/BUILD.gn
+++ b/url/ipc/BUILD.gn
@@ -18,6 +18,7 @@
     "//url",
   ]
   deps = [ "//base" ]
+  configs += [ "//build/config/compiler:wexit_time_destructors" ]
 }
 
 # IPC unit tests aren't build on iOS.
diff --git a/url/mojom/BUILD.gn b/url/mojom/BUILD.gn
index a936a43..6d105c2 100644
--- a/url/mojom/BUILD.gn
+++ b/url/mojom/BUILD.gn
@@ -138,4 +138,6 @@
     "//mojo/public/cpp/base:shared_typemap_traits",
     "//url",
   ]
+
+  configs += [ "//build/config/compiler:wexit_time_destructors" ]
 }
diff --git a/v8 b/v8
index f5bfe42..3591441 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit f5bfe4277fa97d5632eb54b3a6bce32f8869d233
+Subproject commit 3591441627c5a100ab574cdc1ffa94910e7a9507