diff --git a/DEPS b/DEPS
index 8dd57439..82e36c3 100644
--- a/DEPS
+++ b/DEPS
@@ -306,15 +306,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': '50346ff52bbbb2e32a4cd1ba8ef45dae9ae55f34',
+  'skia_revision': 'fe04635b125f29a98ac8a15decef3f6bf3eb9aa3',
   # 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': '7cf5e4a343da8afd4f89d546262bace90837b7d7',
+  'v8_revision': 'a7b74e0cfb1b4f57a04daafddc4b99ee65ac6925',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': 'de591cff03161df5601291ac3deef54933d209a4',
+  'angle_revision': '398cfb4b1421901b8c18be07faf5f54bf14c7633',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -381,7 +381,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling chromium_variations
   # and whatever else without interference from each other.
-  'chromium_variations_revision': '83da81f7b150105c5bc7deeb206c60576d2bb4f9',
+  'chromium_variations_revision': '3d6311ac2b77b8ce42aaa6615461799232690bc9',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -397,7 +397,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': 'e7d1fadae747d4974f42eedd5f1c5acaa23dcd7f',
+  'devtools_frontend_revision': '86df0dbc1c17c368aea743d13c2633506c299fe8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -421,7 +421,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'cebf22738909498596d4c7ede83d229addbd5e9e',
+  'dawn_revision': 'bc8b99afc68f8c7f452df858f7e452913bbee5a6',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -465,7 +465,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'cros_components_revision': '7ce7469fd80bcc8710d36caddc894c9a7ef13194',
+  'cros_components_revision': '4d5c5a69d68bd814b9857800c594f5895cd1204e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -821,7 +821,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '11181f4251073bcd9247a6e263ddaf9e44cc78a3',
+    '3d55fc4f1877714a5aefaf5ca58e533d53b61244',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1199,7 +1199,7 @@
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'f459cb5acc7db0f2e01f5f03478eea9081990d30',
+      'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + 'a7ff080ac0f4814640a0921bc9e0a1da4c419a0e',
     'condition': 'checkout_src_internal',
   },
 
@@ -1664,7 +1664,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + 'fa59d7989d624785db9b505e1832854bb7ff7431',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '3e779d277b408b64778b247b824c5790072e428f',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1849,7 +1849,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '7a6ef7301b5d84f751b483f9d5466b3696749c26',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'bb91f77858607536b4a6ea7edb64caba9cb629d7',
+    Var('webrtc_git') + '/src.git' + '@' + '601ac2eea89a496ff32923aab0666376464eba8b',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -2016,7 +2016,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': '0V84ZOhaolwMo8r_4gC0apHwVVusBo6qV8QkxOcN65YC',
+        'version': 'FTl2iAAP0OjIKhfi-fpg36FwZwxgLzNFMNRn1JM_iVcC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -4006,7 +4006,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        '605708f6f2746b002967aeb2fe96650a4d65890b',
+        '53bb5db494be728395d42498edc5e395652b20f9',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/android_webview/browser/aw_cookie_access_policy.cc b/android_webview/browser/aw_cookie_access_policy.cc
index fb76b58..8daa2b7 100644
--- a/android_webview/browser/aw_cookie_access_policy.cc
+++ b/android_webview/browser/aw_cookie_access_policy.cc
@@ -68,17 +68,20 @@
     const GURL& url,
     const net::SiteForCookies& site_for_cookies,
     base::optional_ref<const content::GlobalRenderFrameHostToken>
-        global_frame_token) {
+        global_frame_token,
+    bool has_storage_access) {
   DCHECK_CURRENTLY_ON(BrowserThread::IO);
   bool third_party = GetShouldAcceptThirdPartyCookies(
       global_frame_token, content::RenderFrameHost::kNoFrameTreeNodeId);
-  return CanAccessCookies(url, site_for_cookies, third_party);
+  return CanAccessCookies(url, site_for_cookies, third_party,
+                          has_storage_access);
 }
 
 bool AwCookieAccessPolicy::CanAccessCookies(
     const GURL& url,
     const net::SiteForCookies& site_for_cookies,
-    bool accept_third_party_cookies) {
+    bool accept_third_party_cookies,
+    bool has_storage_access) {
   if (!accept_cookies_)
     return false;
 
@@ -92,6 +95,10 @@
   if (url.SchemeIsFile())
     return true;
 
+  if (has_storage_access) {
+    return true;
+  }
+
   // Otherwise, block third-party cookies.
   return net::StaticCookiePolicy(
              net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES)
diff --git a/android_webview/browser/aw_cookie_access_policy.h b/android_webview/browser/aw_cookie_access_policy.h
index f965405..f03ab443 100644
--- a/android_webview/browser/aw_cookie_access_policy.h
+++ b/android_webview/browser/aw_cookie_access_policy.h
@@ -48,7 +48,8 @@
       const GURL& url,
       const net::SiteForCookies& site_for_cookies,
       base::optional_ref<const content::GlobalRenderFrameHostToken>
-          global_frame_token);
+          global_frame_token,
+      bool has_storage_access);
 
  private:
   friend class base::NoDestructor<AwCookieAccessPolicy>;
@@ -59,7 +60,8 @@
 
   bool CanAccessCookies(const GURL& url,
                         const net::SiteForCookies& site_for_cookies,
-                        bool accept_third_party_cookies);
+                        bool accept_third_party_cookies,
+                        bool has_storage_access);
   bool accept_cookies_;
   base::Lock lock_;
 };
diff --git a/android_webview/browser/network_service/aw_proxying_restricted_cookie_manager.cc b/android_webview/browser/network_service/aw_proxying_restricted_cookie_manager.cc
index e0727c9..7f8d239 100644
--- a/android_webview/browser/network_service/aw_proxying_restricted_cookie_manager.cc
+++ b/android_webview/browser/network_service/aw_proxying_restricted_cookie_manager.cc
@@ -30,21 +30,30 @@
       const net::SiteForCookies& site_for_cookies,
       base::WeakPtr<AwProxyingRestrictedCookieManager>
           aw_restricted_cookie_manager,
-      mojo::PendingRemote<network::mojom::CookieChangeListener> client_listener)
+      mojo::PendingRemote<network::mojom::CookieChangeListener> client_listener,
+      bool has_storage_access)
       : url_(url),
         site_for_cookies_(site_for_cookies),
+        has_storage_access_(has_storage_access),
         aw_restricted_cookie_manager_(aw_restricted_cookie_manager),
         client_listener_(std::move(client_listener)) {}
 
   void OnCookieChange(const net::CookieChangeInfo& change) override {
     if (aw_restricted_cookie_manager_ &&
-        aw_restricted_cookie_manager_->AllowCookies(url_, site_for_cookies_))
+        aw_restricted_cookie_manager_->AllowCookies(url_, site_for_cookies_,
+                                                    has_storage_access_)) {
       client_listener_->OnCookieChange(change);
+    }
   }
 
  private:
   const GURL url_;
   const net::SiteForCookies site_for_cookies_;
+  // restricted_cookie_manager in services/network follows a similar pattern of
+  // using the state of "has_storage_access" at the time of the listener being
+  // added so we are matching that behaviour. If the storage access was enabled
+  // _after_ the listener was added, it will not be updated here.
+  bool has_storage_access_;
   base::WeakPtr<AwProxyingRestrictedCookieManager>
       aw_restricted_cookie_manager_;
   mojo::Remote<network::mojom::CookieChangeListener> client_listener_;
@@ -87,8 +96,7 @@
     bool is_ad_tagged,
     GetAllForUrlCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-
-  if (AllowCookies(url, site_for_cookies)) {
+  if (AllowCookies(url, site_for_cookies, has_storage_access)) {
     underlying_restricted_cookie_manager_->GetAllForUrl(
         url, site_for_cookies, top_frame_origin, has_storage_access,
         std::move(options), is_ad_tagged, std::move(callback));
@@ -107,7 +115,7 @@
     SetCanonicalCookieCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
 
-  if (AllowCookies(url, site_for_cookies)) {
+  if (AllowCookies(url, site_for_cookies, has_storage_access)) {
     underlying_restricted_cookie_manager_->SetCanonicalCookie(
         cookie, url, site_for_cookies, top_frame_origin, has_storage_access,
         status, std::move(callback));
@@ -130,7 +138,7 @@
   auto proxy_listener =
       std::make_unique<AwProxyingRestrictedCookieManagerListener>(
           url, site_for_cookies, weak_factory_.GetWeakPtr(),
-          std::move(listener));
+          std::move(listener), has_storage_access);
 
   mojo::MakeSelfOwnedReceiver(
       std::move(proxy_listener),
@@ -150,7 +158,7 @@
     SetCookieFromStringCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
 
-  if (AllowCookies(url, site_for_cookies)) {
+  if (AllowCookies(url, site_for_cookies, has_storage_access)) {
     underlying_restricted_cookie_manager_->SetCookieFromString(
         url, site_for_cookies, top_frame_origin, has_storage_access, cookie,
         std::move(callback));
@@ -169,7 +177,7 @@
     GetCookiesStringCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
 
-  if (AllowCookies(url, site_for_cookies)) {
+  if (AllowCookies(url, site_for_cookies, has_storage_access)) {
     // In Android Webview the access to cookies can change dynamically. For
     // now never request a shared memory region so that a full IPC is issued
     // every time. This prevents a client retaining access to the cookie value
@@ -191,7 +199,8 @@
     bool has_storage_access,
     CookiesEnabledForCallback callback) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::IO);
-  std::move(callback).Run(AllowCookies(url, site_for_cookies));
+  std::move(callback).Run(
+      AllowCookies(url, site_for_cookies, has_storage_access));
 }
 
 AwProxyingRestrictedCookieManager::AwProxyingRestrictedCookieManager(
@@ -222,14 +231,15 @@
 
 bool AwProxyingRestrictedCookieManager::AllowCookies(
     const GURL& url,
-    const net::SiteForCookies& site_for_cookies) const {
+    const net::SiteForCookies& site_for_cookies,
+    bool has_storage_access) const {
   if (is_service_worker_) {
     // Service worker cookies are always first-party, so only need to check
     // the global toggle.
     return AwCookieAccessPolicy::GetInstance()->GetShouldAcceptCookies();
   } else {
     return AwCookieAccessPolicy::GetInstance()->AllowCookies(
-        url, site_for_cookies, global_frame_token_);
+        url, site_for_cookies, global_frame_token_, has_storage_access);
   }
 }
 
diff --git a/android_webview/browser/network_service/aw_proxying_restricted_cookie_manager.h b/android_webview/browser/network_service/aw_proxying_restricted_cookie_manager.h
index 0f0aad02..3c0ed93 100644
--- a/android_webview/browser/network_service/aw_proxying_restricted_cookie_manager.h
+++ b/android_webview/browser/network_service/aw_proxying_restricted_cookie_manager.h
@@ -89,7 +89,8 @@
 
   // This one is internal.
   bool AllowCookies(const GURL& url,
-                    const net::SiteForCookies& site_for_cookies) const;
+                    const net::SiteForCookies& site_for_cookies,
+                    bool has_storage_access) const;
 
  private:
   AwProxyingRestrictedCookieManager(
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc
index 49f0052..aab6a5ad 100644
--- a/ash/accelerators/accelerator_controller_impl.cc
+++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -131,8 +131,11 @@
 }
 
 void RecordToggleAppList(const ui::Accelerator& accelerator) {
-  if (accelerator.key_code() == ui::VKEY_LWIN)
+  if (accelerator.key_code() == ui::VKEY_LWIN) {
     base::RecordAction(UserMetricsAction("Accel_Search_LWin"));
+  } else if (accelerator.key_code() == ui::VKEY_RWIN) {
+    base::RecordAction(UserMetricsAction("Accel_Search_RWin"));
+  }
 }
 
 void RecordSwitchToNextIme(const ui::Accelerator& accelerator) {
@@ -191,24 +194,25 @@
   }
 
   for (auto key : currently_pressed_keys) {
-    // The AppList accelerator is triggered on search(VKEY_LWIN) key release.
-    // Sometimes users will press and release the search key while holding other
-    // keys in an attempt to trigger a different accelerator. We should not
-    // toggle the AppList in that case. Check for VKEY_SHIFT because this is
-    // used to show fullscreen app list.
-    if (key != ui::VKEY_LWIN && key != ui::VKEY_SHIFT &&
+    // The AppList accelerator is triggered on search(VKEY_LWIN, VKEY_RWIN) key
+    // release. Sometimes users will press and release the search key while
+    // holding other keys in an attempt to trigger a different accelerator.
+    // We should not toggle the AppList in that case. Check for VKEY_SHIFT
+    // because this is used to show fullscreen app list.
+    if (key != ui::VKEY_LWIN && key != ui::VKEY_RWIN && key != ui::VKEY_SHIFT &&
         key != ui::VKEY_BROWSER_SEARCH && key != ui::VKEY_ALL_APPLICATIONS) {
       return false;
     }
   }
 
-  if (accelerator.key_code() == ui::VKEY_LWIN) {
+  if (accelerator.key_code() == ui::VKEY_LWIN ||
+      accelerator.key_code() == ui::VKEY_RWIN) {
     // If something else was pressed between the Search key (LWIN)
     // being pressed and released, then ignore the release of the
     // Search key.
     if (previous_accelerator.key_state() !=
             ui::Accelerator::KeyState::PRESSED ||
-        previous_accelerator.key_code() != ui::VKEY_LWIN ||
+        previous_accelerator.key_code() != accelerator.key_code() ||
         previous_accelerator.interrupted_by_mouse_event()) {
       return false;
     }
@@ -257,14 +261,16 @@
   // should not be triggered. Otherwise, CapsLock may be triggered accidentally.
   // See issue 789283 (https://crbug.com/789283)
   for (const auto& pressed_key : currently_pressed_keys) {
-    if (pressed_key != ui::VKEY_LWIN && pressed_key != ui::VKEY_MENU) {
+    if (pressed_key != ui::VKEY_LWIN && pressed_key != ui::VKEY_RWIN &&
+        pressed_key != ui::VKEY_MENU) {
       return false;
     }
   }
 
   // This shortcut is set to be trigger on release. Either the current
   // accelerator is a Search release or Alt release.
-  if (accelerator.key_code() == ui::VKEY_LWIN &&
+  if ((accelerator.key_code() == ui::VKEY_LWIN ||
+       accelerator.key_code() == ui::VKEY_RWIN) &&
       accelerator.key_state() == ui::Accelerator::KeyState::RELEASED) {
     // The previous must be either an Alt press or Search press:
     // 1. Press Alt, Press Search, Release Search, Release Alt.
@@ -272,6 +278,7 @@
     if (previous_accelerator.key_state() ==
             ui::Accelerator::KeyState::PRESSED &&
         (previous_accelerator.key_code() == ui::VKEY_LWIN ||
+         previous_accelerator.key_code() == ui::VKEY_RWIN ||
          previous_accelerator.key_code() == ui::VKEY_MENU)) {
       return true;
     }
@@ -286,6 +293,7 @@
     if (previous_accelerator.key_state() ==
             ui::Accelerator::KeyState::PRESSED &&
         (previous_accelerator.key_code() == ui::VKEY_LWIN ||
+         previous_accelerator.key_code() == ui::VKEY_RWIN ||
          previous_accelerator.key_code() == ui::VKEY_MENU)) {
       return true;
     }
diff --git a/ash/accelerators/accelerator_controller_unittest.cc b/ash/accelerators/accelerator_controller_unittest.cc
index b467ad3..ecd76e4 100644
--- a/ash/accelerators/accelerator_controller_unittest.cc
+++ b/ash/accelerators/accelerator_controller_unittest.cc
@@ -1515,6 +1515,21 @@
       CreateReleaseAccelerator(ui::VKEY_LWIN, ui::EF_NONE)));
   base::RunLoop().RunUntilIdle();
   GetAppListTestHelper()->CheckVisibility(true);
+
+  // Verifies VKEY_RWIN triggers AppList, too. This happens if modifier
+  // keys are swapped.
+  GetAppListTestHelper()->DismissAndRunLoop();
+  EXPECT_FALSE(
+      ProcessInController(ui::Accelerator(ui::VKEY_RWIN, ui::EF_NONE)));
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(ui::VKEY_RWIN, GetCurrentAccelerator().key_code());
+  GetAppListTestHelper()->CheckVisibility(false);
+
+  EXPECT_TRUE(ProcessInController(
+      CreateReleaseAccelerator(ui::VKEY_RWIN, ui::EF_NONE)));
+  base::RunLoop().RunUntilIdle();
+  GetAppListTestHelper()->CheckVisibility(true);
+  EXPECT_EQ(ui::VKEY_RWIN, GetPreviousAccelerator().key_code());
 }
 
 TEST_F(AcceleratorControllerTest, GlobalAcceleratorsToggleQuickSettings) {
diff --git a/ash/accelerators/accelerator_table_unittest.cc b/ash/accelerators/accelerator_table_unittest.cc
index 4bb83bc1..eb036f4 100644
--- a/ash/accelerators/accelerator_table_unittest.cc
+++ b/ash/accelerators/accelerator_table_unittest.cc
@@ -16,10 +16,10 @@
 namespace {
 
 // The number of non-Search-based accelerators.
-constexpr int kNonSearchAcceleratorsNum = 107;
+constexpr int kNonSearchAcceleratorsNum = 110;
 // The hash of non-Search-based accelerators. See HashAcceleratorData().
 constexpr char kNonSearchAcceleratorsHash[] =
-    "fb4ed36bdb78ed9f9767adb03adc4909";
+    "4502a93279023a25b83dc6345cda35bf";
 
 struct Cmp {
   bool operator()(const AcceleratorData& lhs,
diff --git a/ash/accessibility/sticky_keys/sticky_keys_controller.cc b/ash/accessibility/sticky_keys/sticky_keys_controller.cc
index f0815ea..9aef323 100644
--- a/ash/accessibility/sticky_keys/sticky_keys_controller.cc
+++ b/ash/accessibility/sticky_keys/sticky_keys_controller.cc
@@ -335,7 +335,7 @@
     is_target_key = (modifier_flag_ == ui::EF_ALTGR_DOWN);
   } else if (key_code == ui::VKEY_OEM_8) {
     is_target_key = (modifier_flag_ == ui::EF_MOD3_DOWN);
-  } else if (key_code == ui::VKEY_LWIN) {
+  } else if (key_code == ui::VKEY_LWIN || key_code == ui::VKEY_RWIN) {
     is_target_key = (modifier_flag_ == ui::EF_COMMAND_DOWN);
   } else {
     return type == ui::ET_KEY_PRESSED ? NORMAL_KEY_DOWN : NORMAL_KEY_UP;
diff --git a/ash/events/accessibility_event_rewriter.cc b/ash/events/accessibility_event_rewriter.cc
index 2f684c6c4..7752d21 100644
--- a/ash/events/accessibility_event_rewriter.cc
+++ b/ash/events/accessibility_event_rewriter.cc
@@ -155,7 +155,8 @@
 
     // Always capture the Search key.
     capture |= rewritten_key_event->IsCommandDown() ||
-               rewritten_key_event->key_code() == ui::VKEY_LWIN;
+               rewritten_key_event->key_code() == ui::VKEY_LWIN ||
+               rewritten_key_event->key_code() == ui::VKEY_RWIN;
 
     // Don't capture tab as it gets consumed by Blink so never comes back
     // unhandled. In third_party/WebKit/Source/core/input/EventHandler.cpp, a
diff --git a/ash/events/select_to_speak_event_handler.cc b/ash/events/select_to_speak_event_handler.cc
index f4ab178a..7210c8a 100644
--- a/ash/events/select_to_speak_event_handler.cc
+++ b/ash/events/select_to_speak_event_handler.cc
@@ -62,7 +62,7 @@
 
   ui::KeyboardCode key_code = event->key_code();
   if (key_code != kSpeakSelectionKey && key_code != ui::VKEY_LWIN &&
-      key_code != ui::VKEY_CONTROL) {
+      key_code != ui::VKEY_RWIN && key_code != ui::VKEY_CONTROL) {
     // No need to track keys besides search, control and s.
     if (state_ == SEARCH_DOWN) {
       // If some other key was pressed and we were in SEARCH_DOWN state,
@@ -87,7 +87,7 @@
 
   bool cancel_event = false;
   // Update the state when pressing and releasing the Search key (VKEY_LWIN).
-  if (key_code == ui::VKEY_LWIN) {
+  if (key_code == ui::VKEY_LWIN || key_code == ui::VKEY_RWIN) {
     if (pressed && state_ == INACTIVE) {
       state_ = SEARCH_DOWN;
     } else if (event->type() == ui::ET_KEY_RELEASED) {
diff --git a/ash/public/cpp/accelerators.cc b/ash/public/cpp/accelerators.cc
index 7423ea58..c86ff3c 100644
--- a/ash/public/cpp/accelerators.cc
+++ b/ash/public/cpp/accelerators.cc
@@ -129,6 +129,7 @@
     // The following is triggered when Search is released while Alt is still
     // down. The key_code here is LWIN (for search) and Alt is a modifier.
     {false, ui::VKEY_LWIN, ui::EF_ALT_DOWN, AcceleratorAction::kToggleCapsLock},
+    {false, ui::VKEY_RWIN, ui::EF_ALT_DOWN, AcceleratorAction::kToggleCapsLock},
     // The following is triggered when Alt is released while search is still
     // down. The key_code here is MENU (for Alt) and Search is a modifier
     // (EF_COMMAND_DOWN is used for Search as a modifier).
@@ -177,6 +178,9 @@
     {false, ui::VKEY_LWIN, ui::EF_NONE, AcceleratorAction::kToggleAppList},
     {false, ui::VKEY_LWIN, ui::EF_SHIFT_DOWN,
      AcceleratorAction::kToggleAppList},
+    {false, ui::VKEY_RWIN, ui::EF_NONE, AcceleratorAction::kToggleAppList},
+    {false, ui::VKEY_RWIN, ui::EF_SHIFT_DOWN,
+     AcceleratorAction::kToggleAppList},
     {true, ui::VKEY_ZOOM, ui::EF_NONE, AcceleratorAction::kToggleFullscreen},
     {true, ui::VKEY_ZOOM, ui::EF_SHIFT_DOWN,
      AcceleratorAction::kToggleFullscreen},
diff --git a/ash/webui/media_app_ui/BUILD.gn b/ash/webui/media_app_ui/BUILD.gn
index 6ecdf95..0373139 100644
--- a/ash/webui/media_app_ui/BUILD.gn
+++ b/ash/webui/media_app_ui/BUILD.gn
@@ -79,6 +79,27 @@
   ]
 }
 
+# All files in the rollup for the untrusted context should be here.
+ts_library("build_ts") {
+  root_dir = ts_root_dir
+
+  in_files = media_app_converted_ts_sources + media_app_unconverted_js_sources +
+             media_app_static_js_sources + media_app_external_js_staged
+  definitions =
+      media_app_definitions_staged + media_app_defs_for_external_js_staged
+
+  composite = true
+  deps = [
+    "//ui/webui/resources/cr_components/color_change_listener:build_ts",
+    "//ui/webui/resources/mojo:build_ts",
+  ]
+  extra_deps = [
+    "//ash/webui/media_app_ui/resources/js:generate_definitions",
+    "//ash/webui/media_app_ui/resources/js:stage_for_tsc",
+  ]
+  path_mappings = [ "//resources/*|$root_gen_dir/ui/webui/resources/*" ]
+}
+
 # Supporting files for tests have historically been in ./test. That becomes a
 # problem when using `ts_library` because we want to stage everything in
 # ./gen/resources/js. In order for those paths to be merged, the `ts_library`
@@ -87,14 +108,12 @@
 ts_library("test_media_app_guest_ui_browsertest_ts") {
   root_dir = ts_root_dir
   testonly = true
-  in_files = media_app_test_ts + media_app_converted_ts_sources +
-             media_app_unconverted_js_sources +
-             media_app_test_unconverted_js_sources + [ "receiver.js" ]
-
+  in_files = media_app_test_ts + media_app_test_unconverted_js_sources
   definitions = media_app_definitions_staged + media_app_test_definitions_staged
+  deps = [ ":build_ts" ]
   extra_deps = [
     "//ash/webui/media_app_ui/resources/js:generate_definitions",
-    "//ash/webui/media_app_ui/resources/js:stage_static_ts",
+    "//ash/webui/media_app_ui/resources/js:stage_for_tsc",
     "//ash/webui/media_app_ui/test:stage_for_test_tsc",
   ]
 }
@@ -145,7 +164,6 @@
   deps = [
     ":test_driver_api_js",
     ":test_driver_js",
-    ":test_guest_query_receiver_js",
   ]
 }
 
@@ -162,17 +180,6 @@
   sources = [ "test/driver_api.js" ]
 }
 
-js_library("test_guest_query_receiver_js") {
-  testonly = true
-  sources = [ "test/guest_query_receiver.js" ]
-  deps = [
-    ":test_driver_api_js",
-    "//ash/webui/media_app_ui/resources/js:receiver",
-    "//ash/webui/system_apps/public/js:dom_testing_helpers",
-    "//ash/webui/system_apps/public/js:message_pipe",
-  ]
-}
-
 js_library("test_driver_js") {
   testonly = true
   sources = [ "test/driver.js" ]
diff --git a/ash/webui/media_app_ui/media_app_files.gni b/ash/webui/media_app_ui/media_app_files.gni
index 2a6f8da..7e62e784 100644
--- a/ash/webui/media_app_ui/media_app_files.gni
+++ b/ash/webui/media_app_ui/media_app_files.gni
@@ -14,10 +14,27 @@
   "piex_module_loader.js",
 ]
 
-media_app_converted_ts_sources = []
+# Files converted to TS.
+media_app_converted_ts_sources = [ "receiver.ts" ]
+
+# Corresponding .js outputs of compiled .ts that are consumed by rollup.
+media_app_compiled_sources =
+    process_file_template(
+        media_app_converted_ts_sources,
+        "$root_gen_dir/ash/webui/media_app_ui/{{source_name_part}}.js")
+
+# Inputs to rollup with no additional deps. These are also fed to tsc in case
+# they ever get converted to .ts in future.
+media_app_static_js_sources = [
+  "error_reporter.js",
+  "launch.js",
+  "mojo_api_bootstrap.js",
+  "piex_module.js",
+]
+
 media_app_static_defs = [
+  "extra_types.d.ts",
   "media_app.d.ts",
-  "receiver.d.ts",
 ]
 
 # Definitions corresponding to unconverted JS.
@@ -30,6 +47,14 @@
         media_app_static_defs + media_app_defs_for_unconverted_js,
         "$ts_root_dir/{{source_file_part}}")
 
+# Extend with external .js and .d.ts that is fed to both .tsc and rollup. .js
+# that is only fed to rollup is listed in resources/js/BUILD.gn.
+media_app_external_js = [ "//ash/webui/system_apps/public/js/message_pipe.js" ]
+media_app_external_js_staged = [ "message_pipe.js" ]
+media_app_defs_for_external_js =
+    [ "$root_gen_dir/ash/webui/system_apps/public/js/message_pipe.d.ts" ]
+media_app_defs_for_external_js_staged = [ "$ts_root_dir/message_pipe.d.ts" ]
+
 # Unconverted test JS sources. Since these may potentially be .ts in future,
 # they must be fed to `ts_library` rules to avoid a .ts file potentially
 # poisioning the build folder when rolling back to an earlier commit. Doing this
diff --git a/ash/webui/media_app_ui/resources/js/BUILD.gn b/ash/webui/media_app_ui/resources/js/BUILD.gn
index d2123cf..50bebec 100644
--- a/ash/webui/media_app_ui/resources/js/BUILD.gn
+++ b/ash/webui/media_app_ui/resources/js/BUILD.gn
@@ -18,20 +18,12 @@
 # JS bundling with rollup.
 # This is for files direct from the src/:  input_folder="./".
 copy("stage_static") {
-  sources = [
-    "../../../../../ui/file_manager/image_loader/piex_loader.js",
-    "//ash/webui/system_apps/public/js/message_pipe.js",
-    "//ash/webui/system_apps/public/js/sandboxed_load_time_data.js",
-    "app_context_test_support.js",
-    "error_reporter.js",
-    "launch.js",
-    "message_types.js",
-    "mojo_api_bootstrap.js",
-    "mojo_api_bootstrap_untrusted.js",
-    "piex_module.js",
-    "piex_module_loader.js",
-    "receiver.js",
-  ]
+  sources = media_app_static_js_sources + media_app_unconverted_js_sources +
+            media_app_external_js +
+            [
+              "//ash/webui/system_apps/public/js/sandboxed_load_time_data.js",
+              "//ui/file_manager/image_loader/piex_loader.js",
+            ]
   outputs = [ stage_folder + "/{{source_file_part}}" ]
 }
 
@@ -54,15 +46,28 @@
   ]
 }
 
-copy("stage_static_ts") {
+# Takes the JS emitted by the `ts_library` targets and places it with other JS
+# files in the staging folder for `rollup` to consume.
+copy("stage_compiled_ts") {
+  sources = media_app_compiled_sources
+  outputs = [ stage_folder + "/{{source_file_part}}" ]
+  deps = [ "//ash/webui/media_app_ui:build_ts" ]
+}
+
+copy("stage_for_tsc") {
   # Note only converted .ts and handcrafted .d.ts files are staged here.
   # Generated .d.ts emit directly to `ts_root_dir`. Confusingly, unconverted JS
   # files must also appear here even though tsc ignores them: this is necessary
   # to engage logic in ts_library.py that handles clearing out old build
   # dependencies.
+  # External JS that is not consumed as a module (and that requires a .d.ts -
+  # generated or static) must also be staged here for tsc consumption within
+  # media_app.
   sources = media_app_converted_ts_sources + media_app_static_defs +
-            media_app_unconverted_js_sources + [ "receiver.js" ]
+            media_app_unconverted_js_sources + media_app_static_js_sources +
+            media_app_external_js + media_app_defs_for_external_js
   outputs = [ ts_root_dir + "/{{source_file_part}}" ]
+  deps = [ "//ash/webui/system_apps/public/js:generate_definitions" ]
 }
 
 ts_definitions("generate_definitions") {
@@ -86,6 +91,7 @@
   js_module_in_files = [ "receiver.js" ]
   input = rebase_path(stage_folder, root_build_dir)
   deps = [
+    ":stage_compiled_ts",
     ":stage_generated",
     ":stage_static",
     "//ui/webui/resources/cr_components/color_change_listener:build_ts",
@@ -118,7 +124,6 @@
 
 group("closure_compile") {
   deps = [
-    ":closure_compile_app",
     ":closure_compile_index",
     ":closure_compile_piex_module",
   ]
@@ -129,11 +134,6 @@
   deps = [ ":launch" ]
 }
 
-js_type_check("closure_compile_app") {
-  closure_flags = media_closure_flags
-  deps = [ ":receiver" ]
-}
-
 js_type_check("closure_compile_piex_module") {
   closure_flags = media_closure_flags
   deps = [ ":piex_module" ]
@@ -176,18 +176,6 @@
   deps = [ "//ui/file_manager/image_loader:piex_loader" ]
 }
 
-js_library("receiver") {
-  externs_list = [ "media_app.externs.js" ]
-  deps = [
-    ":app_context_test_support",
-    ":message_types",
-    ":mojo_api_bootstrap_untrusted",
-    ":piex_module_loader",
-    "//ash/webui/system_apps/public/js:message_pipe",
-    "//ash/webui/system_apps/public/js:sandboxed_load_time_data",
-  ]
-}
-
 js_library("mojo_api_bootstrap") {
   sources = [
     "$root_gen_dir/third_party/blink/public/mojom/file_system_access/file_system_access_transfer_token.mojom-lite-for-compile.js",
diff --git a/ash/webui/media_app_ui/resources/js/extra_types.d.ts b/ash/webui/media_app_ui/resources/js/extra_types.d.ts
new file mode 100644
index 0000000..115e64e
--- /dev/null
+++ b/ash/webui/media_app_ui/resources/js/extra_types.d.ts
@@ -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.
+
+/**
+ * @fileoverview Additional chrome types used by the media app that are not yet
+ * available in the TypeScript toolchain.
+ */
+
+interface LaunchParams {
+  readonly files: readonly FileSystemHandle[];
+}
+
+interface LaunchQueue {
+  setConsumer(consumer: (params: LaunchParams) => void): void;
+}
+
+interface Window {
+  readonly launchQueue: LaunchQueue;
+}
diff --git a/ash/webui/media_app_ui/resources/js/media_app.d.ts b/ash/webui/media_app_ui/resources/js/media_app.d.ts
index 9079db6..46be097 100644
--- a/ash/webui/media_app_ui/resources/js/media_app.d.ts
+++ b/ash/webui/media_app_ui/resources/js/media_app.d.ts
@@ -264,3 +264,7 @@
   delegate?: ClientApiDelegate;
   files: AbstractFileList;
 }
+
+interface Window {
+  customLaunchData: CustomLaunchData;
+}
diff --git a/ash/webui/media_app_ui/resources/js/receiver.d.ts b/ash/webui/media_app_ui/resources/js/receiver.d.ts
deleted file mode 100644
index 48aae1b4..0000000
--- a/ash/webui/media_app_ui/resources/js/receiver.d.ts
+++ /dev/null
@@ -1,62 +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.
-
-/// <reference path="media_app.d.ts" />
-
-/**
- * @fileoverview
- * Temporary types for receiver.js until it is converted to TypeScript. Seeded
- * from generated .d.ts and updated to be compatible with media_app.d.ts.
- */
-
-export class ReceivedFileList {
-  constructor(filesMessage: LoadFilesMessage);
-  currentFileIndex: number;
-  length: number;
-  files: ReceivedFile[];
-  observers: Array<(arg0: any) => void>;
-  item(index: any): ReceivedFile;
-  loadNext(currentFileToken: any): Promise<void>;
-  loadPrev(currentFileToken: any): Promise<void>;
-  addObserver(observer: any): void;
-  openFilesWithFilePicker(
-      acceptTypeKeys: string[], startInFolder: AbstractFile,
-      isSingleFile: boolean|null): Promise<undefined>;
-  filterInPlace(filter: (arg0: AbstractFile) => boolean): void;
-  addFiles(files: ReceivedFile[]): void;
-}
-export namespace TEST_ONLY {
-  export {RenameResult};
-  export {DELEGATE};
-  export {parentMessagePipe};
-  export {loadFiles};
-  export function setLoadFiles(spy: any): void;
-}
-declare class ReceivedFile implements AbstractFile {
-  constructor(file: FileContext);
-  blob: Blob;
-  name: string;
-  size: number;
-  mimeType: string;
-  token: number;
-  error: string;
-  fromClipboard: boolean;
-  deleteOriginalFile: () => Promise<void>;
-  renameOriginalFile: (newName: any) => Promise<number>;
-  isArcWritable(): Promise<boolean>;
-  isBrowserWritable(): Promise<boolean>;
-  editInPhotos(): Promise<void>;
-  overwriteOriginal(blob: Blob): Promise<void>;
-  deleteOriginalFileImpl(): Promise<number>;
-  renameOriginalFileImpl(newName: string): Promise<number>;
-  saveAs(blob: Blob, pickedFileToken: number): Promise<undefined>;
-  getExportFile(accept: string[]): Promise<AbstractFile>;
-  openFile(): Promise<File>;
-  private updateFile;
-}
-import {LoadFilesMessage, RenameResult, FileContext} from './message_types.js';
-declare const DELEGATE: ClientApiDelegate;
-declare const parentMessagePipe: any;
-declare function loadFiles(fileList: ReceivedFileList): Promise<undefined>;
-export {};
diff --git a/ash/webui/media_app_ui/resources/js/receiver.js b/ash/webui/media_app_ui/resources/js/receiver.js
deleted file mode 100644
index 5be75aa6..0000000
--- a/ash/webui/media_app_ui/resources/js/receiver.js
+++ /dev/null
@@ -1,524 +0,0 @@
-// Copyright 2019 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-import './sandboxed_load_time_data.js';
-
-import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
-
-import {assertCast, MessagePipe} from './message_pipe.js';
-import {EditInPhotosMessage, FileContext, IsFileArcWritableMessage, IsFileArcWritableResponse, IsFileBrowserWritableMessage, IsFileBrowserWritableResponse, LoadFilesMessage, Message, OpenAllowedFileMessage, OpenAllowedFileResponse, OpenFilesWithPickerMessage, OverwriteFileMessage, OverwriteViaFilePickerResponse, RenameFileResponse, RenameResult, RequestSaveFileMessage, RequestSaveFileResponse, SaveAsMessage, SaveAsResponse} from './message_types.js';
-import {connectToOcrHandler, ocrCallbackRouter} from './mojo_api_bootstrap_untrusted.js';
-import {loadPiex} from './piex_module_loader.js';
-
-/** A pipe through which we can send messages to the parent frame. */
-const parentMessagePipe = new MessagePipe('chrome://media-app', window.parent);
-
-/**
- * Placeholder Blob used when a null file is received. For null files we only
- * know the name until the file is navigated to.
- */
-const PLACEHOLDER_BLOB = new Blob([]);
-
-/**
- * A file received from the privileged context, and decorated with IPC methods
- * added in the untrusted (this) context to communicate back.
- * @implements {mediaApp.AbstractFile}
- */
-class ReceivedFile {
-  /** @param {!FileContext} file */
-  constructor(file) {
-    this.blob = file.file || PLACEHOLDER_BLOB;
-    this.name = file.name;
-    this.size = this.blob.size;
-    this.mimeType = this.blob.type;
-    this.token = file.token;
-    this.error = file.error;
-    this.fromClipboard = false;
-    if (file.canDelete) {
-      this.deleteOriginalFile = () => this.deleteOriginalFileImpl();
-    }
-    if (file.canRename) {
-      this.renameOriginalFile = (/** string */ newName) =>
-          this.renameOriginalFileImpl(newName);
-    }
-  }
-
-  /**
-   * @override
-   * @return {!Promise<boolean>}
-   */
-  async isArcWritable() {
-    /** @type {!IsFileArcWritableMessage} */
-    const message = {token: this.token};
-
-    const {writable} = /** @type {!IsFileArcWritableResponse} */ (
-        await parentMessagePipe.sendMessage(
-            Message.IS_FILE_ARC_WRITABLE, message));
-    return writable;
-  }
-
-  /**
-   * @override
-   * @return {!Promise<boolean>}
-   */
-  async isBrowserWritable() {
-    /** @type {!IsFileBrowserWritableMessage} */
-    const message = {token: this.token};
-
-    const {writable} = /** @type {!IsFileBrowserWritableResponse} */ (
-        await parentMessagePipe.sendMessage(
-            Message.IS_FILE_BROWSER_WRITABLE, message));
-    return writable;
-  }
-
-  /**
-   * @override
-   */
-  async editInPhotos() {
-    /** @type {!EditInPhotosMessage} */
-    const message = {token: this.token, mimeType: this.mimeType};
-
-    await parentMessagePipe.sendMessage(Message.EDIT_IN_PHOTOS, message);
-  }
-
-  /**
-   * @override
-   * @param{!Blob} blob
-   */
-  async overwriteOriginal(blob) {
-    /** @type {!OverwriteFileMessage} */
-    const message = {token: this.token, blob: blob};
-
-    const result = /** @type {!OverwriteViaFilePickerResponse} */ (
-        await parentMessagePipe.sendMessage(Message.OVERWRITE_FILE, message));
-    // Note the following are skipped if an exception is thrown above.
-    if (result.renamedTo) {
-      this.name = result.renamedTo;
-      // Assume a rename could have moved the file to a new folder via a file
-      // picker, which will break rename/delete functionality.
-      delete this.deleteOriginalFile;
-      delete this.renameOriginalFile;
-    }
-    this.error = result.errorName || '';
-    this.updateFile(blob, this.name);
-  }
-
-  /**
-   * @return {!Promise<undefined>}
-   */
-  async deleteOriginalFileImpl() {
-    await parentMessagePipe.sendMessage(
-        Message.DELETE_FILE, {token: this.token});
-  }
-
-  /**
-   * @param {string} newName
-   * @return {!Promise<number>}
-   */
-  async renameOriginalFileImpl(newName) {
-    const renameResponse =
-        /** @type {!RenameFileResponse} */ (await parentMessagePipe.sendMessage(
-            Message.RENAME_FILE, {token: this.token, newFilename: newName}));
-    if (renameResponse.renameResult === RenameResult.SUCCESS) {
-      this.name = newName;
-    }
-    return renameResponse.renameResult;
-  }
-
-  /**
-   * @override
-   * @param {!Blob} blob
-   * @param {number} pickedFileToken
-   * @return {!Promise<undefined>}
-   */
-  async saveAs(blob, pickedFileToken) {
-    /** @type {!SaveAsMessage} */
-    const message = {blob, oldFileToken: this.token, pickedFileToken};
-    const result = /** @type {!SaveAsResponse} */ (
-        await parentMessagePipe.sendMessage(Message.SAVE_AS, message));
-    this.updateFile(blob, result.newFilename);
-    // Files obtained by a file picker currently can not be renamed/deleted.
-    // TODO(b/163285659): Detect when the new file is in the same folder as an
-    // on-launch file. Those should still be able to be renamed/deleted.
-    delete this.deleteOriginalFile;
-    delete this.renameOriginalFile;
-  }
-
-  /**
-   * @override
-   * @param {!Array<string>} accept
-   * @return {!Promise<!mediaApp.AbstractFile>}
-   */
-  async getExportFile(accept) {
-    /** @type {!RequestSaveFileMessage} */
-    const msg = {
-      suggestedName: this.name,
-      mimeType: this.mimeType,
-      startInToken: this.token,
-      accept,
-    };
-    const response =
-        /** @type {!RequestSaveFileResponse} */ (
-            await parentMessagePipe.sendMessage(
-                Message.REQUEST_SAVE_FILE, msg));
-    return new ReceivedFile(response.pickedFileContext);
-  }
-
-  /**
-   * @override
-   * @return {!Promise<!File>}
-   */
-  async openFile() {
-    /** @type {!OpenAllowedFileMessage} */
-    const msg = {
-      fileToken: this.token,
-    };
-    const response =
-        /** @type {!OpenAllowedFileResponse} */ (
-            await parentMessagePipe.sendMessage(
-                Message.OPEN_ALLOWED_FILE, msg));
-    return response.file;
-  }
-
-  /**
-   * Updates the wrapped file to reflect a change written to disk.
-   * @private
-   * @param {!Blob} blob
-   * @param {string} name
-   */
-  updateFile(blob, name) {
-    // Wrap the blob to acquire "now()" as the lastModified time. Note this may
-    // differ from the actual mtime recorded on the inode.
-    this.blob = new File([blob], name, {type: blob.type});
-    this.size = blob.size;
-    this.mimeType = blob.type;
-    this.name = name;
-  }
-}
-
-/**
- * Source of truth for what files are loaded in the app. This can be appended to
- * via `ReceivedFileList.addFiles()`.
- * @type {?ReceivedFileList}
- */
-let lastLoadedReceivedFileList = null;
-
-/**
- * A file list consisting of all files received from the parent. Exposes all
- * readable files in the directory, some of which may be writable.
- * @implements mediaApp.AbstractFileList
- */
-export class ReceivedFileList {
-  /** @param {!LoadFilesMessage} filesMessage */
-  constructor(filesMessage) {
-    const {files, currentFileIndex} = filesMessage;
-    if (files.length) {
-      // If we were not provided with a currentFileIndex, default to making the
-      // first file the current file.
-      this.currentFileIndex = currentFileIndex >= 0 ? currentFileIndex : 0;
-    } else {
-      // If we are empty we have no current file.
-      this.currentFileIndex = -1;
-    }
-
-    this.length = files.length;
-    /** @type {!Array<!ReceivedFile>} */
-    this.files = files.map(f => new ReceivedFile(f));
-    /** @type {!Array<function(!mediaApp.AbstractFileList): void>} */
-    this.observers = [];
-  }
-
-  /** @override */
-  item(index) {
-    return this.files[index] || null;
-  }
-
-  /** @override */
-  async loadNext(currentFileToken) {
-    // Awaiting this message send allows callers to wait for the full effects of
-    // the navigation to complete. This may include a call to load a new set of
-    // files, and the initial decode, which replaces this AbstractFileList and
-    // alters other app state.
-    await parentMessagePipe.sendMessage(
-        Message.NAVIGATE, {currentFileToken, direction: 1});
-  }
-
-  /** @override */
-  async loadPrev(currentFileToken) {
-    await parentMessagePipe.sendMessage(
-        Message.NAVIGATE, {currentFileToken, direction: -1});
-  }
-
-  /** @override */
-  addObserver(observer) {
-    this.observers.push(observer);
-  }
-
-  /**
-   * @override
-   * @param {!Array<string>} acceptTypeKeys
-   * @param {?mediaApp.AbstractFile} startInFolder
-   * @param {?boolean} isSingleFile
-   * @return {!Promise<undefined>}
-   */
-  async openFilesWithFilePicker(acceptTypeKeys, startInFolder, isSingleFile) {
-    // AbstractFile doesn't guarantee tokens. Use one from a ReceivedFile if
-    // there is one, after ensuring it is valid.
-    const fileRep = /** @type {{token: (number|undefined)}} */ (startInFolder);
-    const startInToken = startInFolder ? (fileRep.token || 0) : 0;
-    /** @type {!OpenFilesWithPickerMessage} */
-    const msg = {
-      startInToken: startInToken > 0 ? startInToken : 0,
-      accept: acceptTypeKeys,
-      isSingleFile,
-    };
-    await parentMessagePipe.sendMessage(Message.OPEN_FILES_WITH_PICKER, msg);
-  }
-
-  /**
-   * @override
-   * @param {!function(!mediaApp.AbstractFile): boolean} filter
-   */
-  filterInPlace(filter) {
-    this.files = this.files.filter(filter);
-    this.length = this.files.length;
-    this.currentFileIndex = this.length > 0 ? 0 : -1;
-  }
-
-  /** @param {!Array<!ReceivedFile>} files */
-  addFiles(files) {
-    if (files.length === 0) {
-      return;
-    }
-    this.files = [...this.files, ...files];
-    this.length = this.files.length;
-    // Call observers with the new underlying files.
-    this.observers.map(o => o(this));
-  }
-}
-
-parentMessagePipe.registerHandler(Message.LOAD_FILES, async (message) => {
-  const filesMessage = /** @type {!LoadFilesMessage} */ (message);
-  lastLoadedReceivedFileList = new ReceivedFileList(filesMessage);
-  await loadFiles(lastLoadedReceivedFileList);
-});
-
-// Load extra files by appending to the current `ReceivedFileList`.
-parentMessagePipe.registerHandler(Message.LOAD_EXTRA_FILES, async (message) => {
-  if (!lastLoadedReceivedFileList) {
-    return;
-  }
-  const extraFilesMessage = /** @type {!LoadFilesMessage} */ (message);
-  const newFiles = extraFilesMessage.files.map(f => new ReceivedFile(f));
-  lastLoadedReceivedFileList.addFiles(newFiles);
-});
-
-// As soon as the LOAD_FILES handler is installed, signal readiness to the
-// parent frame (privileged context).
-parentMessagePipe.sendMessage(Message.IFRAME_READY);
-
-let ocrUntrustedPageHandler;
-
-ocrCallbackRouter.setViewport.addListener(
-    (viewportBox) => {
-      const app = getApp();
-      if (app) {
-        app.setViewport(/** @type {!mediaApp.Rect} */ ({
-          left: viewportBox.x,
-          top: viewportBox.y,
-          width: viewportBox.width,
-          height: viewportBox.height,
-        }));
-      }
-    },
-);
-
-/**
- * A delegate which exposes privileged WebUI functionality to the media
- * app.
- * @type {!mediaApp.ClientApiDelegate}
- */
-const DELEGATE = {
-  async openFeedbackDialog() {
-    const response =
-        await parentMessagePipe.sendMessage(Message.OPEN_FEEDBACK_DIALOG);
-    return /** @type {?string} */ (response['errorMessage']);
-  },
-  async toggleBrowserFullscreenMode() {
-    await parentMessagePipe.sendMessage(Message.TOGGLE_BROWSER_FULLSCREEN_MODE);
-  },
-  /**
-   * @param {string} suggestedName
-   * @param {string} mimeType
-   * @param {!Array<string>} accept
-   * @return {!Promise<!mediaApp.AbstractFile>}
-   */
-  async requestSaveFile(suggestedName, mimeType, accept) {
-    /** @type {!RequestSaveFileMessage} */
-    const msg = {suggestedName, mimeType, startInToken: 0, accept};
-    const response =
-        /** @type {!RequestSaveFileResponse} */ (
-            await parentMessagePipe.sendMessage(
-                Message.REQUEST_SAVE_FILE, msg));
-    return new ReceivedFile(response.pickedFileContext);
-  },
-  /**
-   * @param {string|undefined} name
-   * @param {string|undefined} type
-   */
-  notifyCurrentFile(name, type) {
-    parentMessagePipe.sendMessage(Message.NOTIFY_CURRENT_FILE, {name, type});
-    if (type === 'application/pdf') {
-      ocrUntrustedPageHandler = connectToOcrHandler();
-    }
-  },
-  /**
-   * @param {!Blob} file
-   * @return {!Promise<!File>}
-   */
-  async extractPreview(file) {
-    try {
-      const bufferPromise = file.arrayBuffer();
-      const extractFromRawImageBuffer = await loadPiex();
-      return await extractFromRawImageBuffer(await bufferPromise);
-    } catch (/** @type {!Error} */ e) {
-      console.warn(e);
-      if (e.name === 'Error') {
-        e.name = 'JpegNotFound';
-      }
-      throw e;
-    }
-  },
-  /**
-   * @param {string} title
-   * @param {string} blobUuid
-   */
-  openInSandboxedViewer(title, blobUuid) {
-    parentMessagePipe.sendMessage(
-        Message.OPEN_IN_SANDBOXED_VIEWER, {title, blobUuid});
-  },
-  reloadMainFrame() {
-    parentMessagePipe.sendMessage(Message.RELOAD_MAIN_FRAME);
-  },
-  maybeTriggerPdfHats() {
-    parentMessagePipe.sendMessage(Message.MAYBE_TRIGGER_PDF_HATS);
-  },
-  // TODO(b/219631600): Implement openUrlInBrowserTab() for LacrOS if needed.
-};
-
-/**
- * Returns the media app if it can find it in the DOM.
- * @return {?mediaApp.ClientApi}
- */
-function getApp() {
-  return /** @type {?mediaApp.ClientApi} */ (
-      document.querySelector('backlight-app'));
-}
-
-/**
- * Loads a file list into the media app.
- * @param {!ReceivedFileList} fileList
- * @return {!Promise<undefined>}
- */
-async function loadFiles(fileList) {
-  const app = getApp();
-  if (app) {
-    await app.loadFiles(fileList);
-  } else {
-    // Note we don't await in this case, which may affect b/152729704.
-    window.customLaunchData.files = fileList;
-  }
-}
-
-/**
- * Runs any initialization code on the media app once it is in the dom.
- * @param {!mediaApp.ClientApi} app
- */
-function initializeApp(app) {
-  app.setDelegate(DELEGATE);
-}
-
-/**
- * Called when a mutation occurs on document.body to check if the media app is
- * available.
- * @param {!Array<!MutationRecord>} mutationsList
- * @param {!MutationObserver} observer
- */
-function mutationCallback(mutationsList, observer) {
-  const app = getApp();
-  if (!app) {
-    return;
-  }
-  // The media app now exists so we can initialize it.
-  initializeApp(app);
-  observer.disconnect();
-}
-
-window.addEventListener('DOMContentLoaded', () => {
-  // Start listening to color change events. These events get picked up by logic
-  // in ts_helpers.ts on the google3 side.
-  /** @suppress {checkTypes} */
-  (function() {
-    ColorChangeUpdater.forDocument().start();
-  })();
-
-  const app = getApp();
-  if (app) {
-    initializeApp(app);
-    return;
-  }
-  // If translations need to be fetched, the app element may not be added yet.
-  // In that case, observe <body> until it is.
-  const observer = new MutationObserver(mutationCallback);
-  observer.observe(document.body, {childList: true});
-});
-
-// Ensure that if no files are loaded into the media app there is a default
-// empty file list available.
-window.customLaunchData = {
-  delegate: DELEGATE,
-  files: new ReceivedFileList({files: [], currentFileIndex: -1}),
-};
-
-// Attempting to show file pickers in the sandboxed <iframe> is guaranteed to
-// result in a SecurityError: hide them.
-// TODO(crbug/1040328): Remove this when we have a polyfill that allows us to
-// talk to the privileged frame.
-window['chooseFileSystemEntries'] = null;
-window['showOpenFilePicker'] = null;
-window['showSaveFilePicker'] = null;
-window['showDirectoryPicker'] = null;
-
-// Expose functions to bind to color change events to window so they can be
-// automatically picked up by installColors(). See ts_helpers.ts in google3.
-window['addColorChangeListener'] =
-    /** @suppress {checkTypes} */ function(listener) {
-      ColorChangeUpdater.forDocument().eventTarget.addEventListener(
-          COLOR_PROVIDER_CHANGED, listener);
-    };
-window['removeColorChangeListener'] =
-    /** @suppress {checkTypes} */ function(listener) {
-      ColorChangeUpdater.forDocument().eventTarget.removeEventListener(
-          COLOR_PROVIDER_CHANGED, listener);
-    };
-
-export const TEST_ONLY = {
-  RenameResult,
-  DELEGATE,
-  assertCast,
-  parentMessagePipe,
-  loadFiles,
-  setLoadFiles: spy => {
-    loadFiles = spy;
-  },
-};
-
-// Small, auxiliary file that adds hooks to support test cases relying on the
-// "real" app context (e.g. for stack traces).
-import './app_context_test_support.js';
-
-// Temporarily expose lastLoadedReceivedFileList on `window` for
-// MediaAppIntegrationWithFilesAppAllProfilesTest.RenameFile.
-// TODO(b/185957537): Convert the test case to a JS module.
-window['lastLoadedReceivedFileList'] = () => lastLoadedReceivedFileList;
diff --git a/ash/webui/media_app_ui/resources/js/receiver.ts b/ash/webui/media_app_ui/resources/js/receiver.ts
new file mode 100644
index 0000000..2f7106d
--- /dev/null
+++ b/ash/webui/media_app_ui/resources/js/receiver.ts
@@ -0,0 +1,475 @@
+// 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.
+
+/// <reference path="media_app.d.ts" />
+
+import './sandboxed_load_time_data.js';
+
+import {COLOR_PROVIDER_CHANGED, ColorChangeUpdater} from '//resources/cr_components/color_change_listener/colors_css_updater.js';
+import type {RectF} from '//resources/mojo/ui/gfx/geometry/mojom/geometry.mojom-webui.js';
+
+import {assertCast, MessagePipe} from './message_pipe.js';
+import {EditInPhotosMessage, FileContext, IsFileArcWritableMessage, IsFileArcWritableResponse, IsFileBrowserWritableMessage, IsFileBrowserWritableResponse, LoadFilesMessage, Message, OpenAllowedFileMessage, OpenAllowedFileResponse, OpenFilesWithPickerMessage, OverwriteFileMessage, OverwriteViaFilePickerResponse, RenameFileResponse, RenameResult, RequestSaveFileMessage, RequestSaveFileResponse, SaveAsMessage, SaveAsResponse} from './message_types.js';
+import {connectToOcrHandler, ocrCallbackRouter} from './mojo_api_bootstrap_untrusted.js';
+import {loadPiex} from './piex_module_loader.js';
+
+/** A pipe through which we can send messages to the parent frame. */
+const parentMessagePipe = new MessagePipe('chrome://media-app', window.parent);
+
+/**
+ * Placeholder Blob used when a null file is received. For null files we only
+ * know the name until the file is navigated to.
+ */
+const PLACEHOLDER_BLOB = new Blob([]);
+
+/**
+ * A file received from the privileged context, and decorated with IPC methods
+ * added in the untrusted (this) context to communicate back.
+ * @implements {mediaApp.AbstractFile}
+ */
+class ReceivedFile implements AbstractFile {
+  blob: Blob;
+  name: string;
+  token: number;
+  size: number;
+  mimeType: string;
+  fromClipboard: boolean;
+  error: string;
+
+  deleteOriginalFile?: () => Promise<void>;
+  renameOriginalFile?: (newName: string) => Promise<number>;
+
+  constructor(file: FileContext) {
+    this.blob = file.file || PLACEHOLDER_BLOB;
+    this.name = file.name;
+    this.size = this.blob.size;
+    this.mimeType = this.blob.type;
+    this.token = file.token;
+    this.error = file.error;
+    this.fromClipboard = false;
+    if (file.canDelete) {
+      this.deleteOriginalFile = () => this.deleteOriginalFileImpl();
+    }
+    if (file.canRename) {
+      this.renameOriginalFile = (newName) =>
+          this.renameOriginalFileImpl(newName);
+    }
+  }
+
+  async isArcWritable() {
+    const message: IsFileArcWritableMessage = {token: this.token};
+
+    const {writable} = (await parentMessagePipe.sendMessage(
+                           Message.IS_FILE_ARC_WRITABLE, message)) as
+        IsFileArcWritableResponse;
+    return writable;
+  }
+
+  async isBrowserWritable() {
+    const message: IsFileBrowserWritableMessage = {token: this.token};
+
+    const {writable} = (await parentMessagePipe.sendMessage(
+                           Message.IS_FILE_BROWSER_WRITABLE, message)) as
+        IsFileBrowserWritableResponse;
+    return writable;
+  }
+
+  async editInPhotos() {
+    const message: EditInPhotosMessage = {
+      token: this.token,
+      mimeType: this.mimeType,
+    };
+
+    await parentMessagePipe.sendMessage(Message.EDIT_IN_PHOTOS, message);
+  }
+
+  async overwriteOriginal(blob: Blob) {
+    const message: OverwriteFileMessage = {token: this.token, blob: blob};
+
+    const result: OverwriteViaFilePickerResponse =
+        await parentMessagePipe.sendMessage(Message.OVERWRITE_FILE, message);
+    // Note the following are skipped if an exception is thrown above.
+    if (result.renamedTo) {
+      this.name = result.renamedTo;
+      // Assume a rename could have moved the file to a new folder via a file
+      // picker, which will break rename/delete functionality.
+      delete this.deleteOriginalFile;
+      delete this.renameOriginalFile;
+    }
+    this.error = result.errorName || '';
+    this.updateFile(blob, this.name);
+  }
+
+  async deleteOriginalFileImpl() {
+    await parentMessagePipe.sendMessage(
+        Message.DELETE_FILE, {token: this.token});
+  }
+
+  async renameOriginalFileImpl(newName: string) {
+    const renameResponse: RenameFileResponse =
+        await parentMessagePipe.sendMessage(Message.RENAME_FILE, {
+          token: this.token,
+          newFilename: newName,
+        });
+    if (renameResponse.renameResult === RenameResult.SUCCESS) {
+      this.name = newName;
+    }
+    return renameResponse.renameResult;
+  }
+
+  async saveAs(blob: Blob, pickedFileToken: number) {
+    const message: SaveAsMessage = {
+      blob,
+      oldFileToken: this.token,
+      pickedFileToken,
+    };
+    const result: SaveAsResponse = await parentMessagePipe.sendMessage(
+        Message.SAVE_AS,
+        message,
+    );
+    this.updateFile(blob, result.newFilename);
+    // Files obtained by a file picker currently can not be renamed/deleted.
+    // TODO(b/163285659): Detect when the new file is in the same folder as an
+    // on-launch file. Those should still be able to be renamed/deleted.
+    delete this.deleteOriginalFile;
+    delete this.renameOriginalFile;
+  }
+
+  async getExportFile(accept: string[]) {
+    const msg: RequestSaveFileMessage = {
+      suggestedName: this.name,
+      mimeType: this.mimeType,
+      startInToken: this.token,
+      accept,
+    };
+    const response: RequestSaveFileResponse =
+        await parentMessagePipe.sendMessage(Message.REQUEST_SAVE_FILE, msg);
+    return new ReceivedFile(response.pickedFileContext);
+  }
+
+  async openFile() {
+    const msg: OpenAllowedFileMessage = {
+      fileToken: this.token,
+    };
+    const response: OpenAllowedFileResponse =
+        await parentMessagePipe.sendMessage(Message.OPEN_ALLOWED_FILE, msg);
+    return response.file;
+  }
+
+  /**
+   * Updates the wrapped file to reflect a change written to disk.
+   */
+  private updateFile(blob: Blob, name: string) {
+    // Wrap the blob to acquire "now()" as the lastModified time. Note this may
+    // differ from the actual mtime recorded on the inode.
+    this.blob = new File([blob], name, {type: blob.type});
+    this.size = blob.size;
+    this.mimeType = blob.type;
+    this.name = name;
+  }
+}
+
+/**
+ * Source of truth for what files are loaded in the app. This can be appended to
+ * via `ReceivedFileList.addFiles()`.
+ */
+let lastLoadedReceivedFileList: ReceivedFileList|null = null;
+
+/**
+ * A file list consisting of all files received from the parent. Exposes all
+ * readable files in the directory, some of which may be writable.
+ */
+export class ReceivedFileList implements AbstractFileList {
+  length: number;
+  currentFileIndex: number;
+
+  private files: ReceivedFile[];
+  private observers: Array<(files: AbstractFileList) => unknown> = [];
+
+  constructor(filesMessage: LoadFilesMessage) {
+    const {files, currentFileIndex} = filesMessage;
+    if (files.length) {
+      // If we were not provided with a currentFileIndex, default to making the
+      // first file the current file.
+      this.currentFileIndex = currentFileIndex >= 0 ? currentFileIndex : 0;
+    } else {
+      // If we are empty we have no current file.
+      this.currentFileIndex = -1;
+    }
+
+    this.length = files.length;
+    this.files = files.map((f) => new ReceivedFile(f));
+  }
+
+  item(index: number) {
+    return this.files[index] || null;
+  }
+
+  async loadNext(currentFileToken: number) {
+    // Awaiting this message send allows callers to wait for the full effects of
+    // the navigation to complete. This may include a call to load a new set of
+    // files, and the initial decode, which replaces this AbstractFileList and
+    // alters other app state.
+    await parentMessagePipe.sendMessage(
+        Message.NAVIGATE, {currentFileToken, direction: 1});
+  }
+
+  async loadPrev(currentFileToken: number) {
+    await parentMessagePipe.sendMessage(
+        Message.NAVIGATE, {currentFileToken, direction: -1});
+  }
+
+  addObserver(observer: (files: AbstractFileList) => unknown) {
+    this.observers.push(observer);
+  }
+
+  async openFilesWithFilePicker(
+      acceptTypeKeys: string[],
+      startInFolder?: AbstractFile,
+      isSingleFile?: boolean,
+  ) {
+    // AbstractFile doesn't guarantee tokens. Use one from a ReceivedFile if
+    // there is one, after ensuring it is valid.
+    const startInToken = startInFolder?.token || 0;
+    const msg: OpenFilesWithPickerMessage = {
+      startInToken: startInToken > 0 ? startInToken : 0,
+      accept: acceptTypeKeys,
+      isSingleFile: !!isSingleFile,
+    };
+    await parentMessagePipe.sendMessage(Message.OPEN_FILES_WITH_PICKER, msg);
+  }
+
+  filterInPlace(filter: (file: AbstractFile) => boolean) {
+    this.files = this.files.filter(filter);
+    this.length = this.files.length;
+    this.currentFileIndex = this.length > 0 ? 0 : -1;
+  }
+
+  addFiles(files: ReceivedFile[]) {
+    if (files.length === 0) {
+      return;
+    }
+    this.files = [...this.files, ...files];
+    this.length = this.files.length;
+    // Call observers with the new underlying files.
+    this.observers.map((o) => o(this));
+  }
+}
+
+parentMessagePipe.registerHandler(
+    Message.LOAD_FILES, async (filesMessage: LoadFilesMessage) => {
+      lastLoadedReceivedFileList = new ReceivedFileList(filesMessage);
+      await loadFiles(lastLoadedReceivedFileList);
+    });
+
+// Load extra files by appending to the current `ReceivedFileList`.
+parentMessagePipe.registerHandler(
+    Message.LOAD_EXTRA_FILES, async (extraFilesMessage: LoadFilesMessage) => {
+      if (!lastLoadedReceivedFileList) {
+        return;
+      }
+      const newFiles = extraFilesMessage.files.map((f) => new ReceivedFile(f));
+      lastLoadedReceivedFileList.addFiles(newFiles);
+    });
+
+// As soon as the LOAD_FILES handler is installed, signal readiness to the
+// parent frame (privileged context).
+parentMessagePipe.sendMessage(Message.IFRAME_READY);
+
+ocrCallbackRouter.setViewport.addListener(
+    (viewportBox: RectF) => {
+      const app = getApp();
+      if (app) {
+        app.setViewport({
+          left: viewportBox.x,
+          top: viewportBox.y,
+          width: viewportBox.width,
+          height: viewportBox.height,
+        });
+      }
+    },
+);
+
+/**
+ * A delegate which exposes privileged WebUI functionality to the media
+ * app.
+ */
+const DELEGATE: ClientApiDelegate = {
+  async openFeedbackDialog() {
+    const response =
+        await parentMessagePipe.sendMessage(Message.OPEN_FEEDBACK_DIALOG);
+    return response['errorMessage'] as string;
+  },
+  async toggleBrowserFullscreenMode() {
+    await parentMessagePipe.sendMessage(Message.TOGGLE_BROWSER_FULLSCREEN_MODE);
+  },
+  async requestSaveFile(
+      suggestedName: string,
+      mimeType: string,
+      accept: string[],
+  ) {
+    const msg: RequestSaveFileMessage = {
+      suggestedName,
+      mimeType,
+      startInToken: 0,
+      accept,
+    };
+    const response: RequestSaveFileResponse =
+        await parentMessagePipe.sendMessage(Message.REQUEST_SAVE_FILE, msg);
+    return new ReceivedFile(response.pickedFileContext);
+  },
+  notifyCurrentFile(name?: string, type?: string) {
+    parentMessagePipe.sendMessage(Message.NOTIFY_CURRENT_FILE, {name, type});
+    if (type === 'application/pdf') {
+      connectToOcrHandler();
+    }
+  },
+  async extractPreview(file: Blob) {
+    try {
+      const bufferPromise = file.arrayBuffer();
+      const extractFromRawImageBuffer = await loadPiex();
+      return await extractFromRawImageBuffer(await bufferPromise);
+    } catch (e: unknown) {
+      console.warn(e);
+      if ((e as Error).name === 'Error') {
+        (e as Error).name = 'JpegNotFound';
+      }
+      throw e;
+    }
+  },
+  openInSandboxedViewer(title: string, blobUuid: string) {
+    parentMessagePipe.sendMessage(
+        Message.OPEN_IN_SANDBOXED_VIEWER, {title, blobUuid});
+  },
+  reloadMainFrame() {
+    parentMessagePipe.sendMessage(Message.RELOAD_MAIN_FRAME);
+  },
+  maybeTriggerPdfHats() {
+    parentMessagePipe.sendMessage(Message.MAYBE_TRIGGER_PDF_HATS);
+  },
+  // TODO(b/219631600): Implement openUrlInBrowserTab() for LacrOS if needed.
+};
+
+/**
+ * Returns the media app if it can find it in the DOM.
+ */
+function getApp(): ClientApi {
+  return document.querySelector('backlight-app') as unknown as ClientApi;
+}
+
+/**
+ * Loads a file list into the media app.
+ */
+async function loadFilesImpl(fileList: ReceivedFileList) {
+  const app = getApp();
+  if (app) {
+    await app.loadFiles(fileList);
+  } else {
+    // Note we don't await in this case, which may affect b/152729704.
+    window.customLaunchData.files = fileList;
+  }
+}
+
+/** Store `loadFilesImpl` into a variable so that tests may spy on it. */
+let loadFiles = loadFilesImpl;
+
+/**
+ * Runs any initialization code on the media app once it is in the dom.
+ */
+function initializeApp(app: ClientApi) {
+  app.setDelegate(DELEGATE);
+}
+
+/**
+ * Called when a mutation occurs on document.body to check if the media app is
+ * available.
+ */
+function mutationCallback(
+    _mutationsList: MutationRecord[], observer: MutationObserver) {
+  const app = getApp();
+  if (!app) {
+    return;
+  }
+  // The media app now exists so we can initialize it.
+  initializeApp(app);
+  observer.disconnect();
+}
+
+window.addEventListener('DOMContentLoaded', () => {
+  // Start listening to color change events. These events get picked up by logic
+  // in ts_helpers.ts on the google3 side.
+  /** @suppress {checkTypes} */
+  (function() {
+    ColorChangeUpdater.forDocument().start();
+  })();
+
+  const app = getApp();
+  if (app) {
+    initializeApp(app);
+    return;
+  }
+  // If translations need to be fetched, the app element may not be added yet.
+  // In that case, observe <body> until it is.
+  const observer = new MutationObserver(mutationCallback);
+  observer.observe(document.body, {childList: true});
+});
+
+declare global {
+  interface Window {
+    chooseFileSystemEntries: null;
+    showOpenFilePicker: null;
+    showSaveFilePicker: null;
+    showDirectoryPicker: null;
+    addColorChangeListener: (listener: EventListenerOrEventListenerObject|
+                             null) => unknown;
+    removeColorChangeListener: (listener: EventListenerOrEventListenerObject|
+                                null) => unknown;
+    lastLoadedReceivedFileList: () => ReceivedFileList | null;
+  }
+}
+
+// Ensure that if no files are loaded into the media app there is a default
+// empty file list available.
+window.customLaunchData = {
+  delegate: DELEGATE,
+  files: new ReceivedFileList({files: [], currentFileIndex: -1}),
+};
+
+// Attempting to show file pickers in the sandboxed <iframe> is guaranteed to
+// result in a SecurityError: hide them.
+window.chooseFileSystemEntries = null;
+window.showOpenFilePicker = null;
+window.showSaveFilePicker = null;
+window.showDirectoryPicker = null;
+
+// Expose functions to bind to color change events to window so they can be
+// automatically picked up by installColors(). See ts_helpers.ts in google3.
+window.addColorChangeListener = function(listener) {
+  ColorChangeUpdater.forDocument().eventTarget.addEventListener(
+      COLOR_PROVIDER_CHANGED, listener);
+};
+window.removeColorChangeListener = function(listener) {
+  ColorChangeUpdater.forDocument().eventTarget.removeEventListener(
+      COLOR_PROVIDER_CHANGED, listener);
+};
+
+export const TEST_ONLY = {
+  RenameResult,
+  DELEGATE,
+  assertCast,
+  parentMessagePipe,
+  loadFiles,
+  setLoadFiles: (spy: any) => {
+    loadFiles = spy;
+  },
+};
+
+// Small, auxiliary file that adds hooks to support test cases relying on the
+// "real" app context (e.g. for stack traces).
+import './app_context_test_support.js';
+
+// Temporarily expose lastLoadedReceivedFileList on `window` for
+// MediaAppIntegrationWithFilesAppAllProfilesTest.RenameFile.
+// TODO(b/185957537): Convert the test case to a JS module.
+window.lastLoadedReceivedFileList = () => lastLoadedReceivedFileList;
diff --git a/ash/webui/media_app_ui/test/media_app_guest_ui_browsertest.ts b/ash/webui/media_app_ui/test/media_app_guest_ui_browsertest.ts
index 514e837..70730c5fc 100644
--- a/ash/webui/media_app_ui/test/media_app_guest_ui_browsertest.ts
+++ b/ash/webui/media_app_ui/test/media_app_guest_ui_browsertest.ts
@@ -10,14 +10,6 @@
 import {GUEST_TEST} from './guest_query_receiver.js';
 import {ReceivedFileList} from './receiver.js';
 
-// TODO(b/314827247): Move this somewhere sharable. `declare global` can't
-// appear in the "ambient" modules we use while converting to TS.
-declare global {
-  interface Window {
-    customLaunchData: CustomLaunchData;
-  }
-}
-
 export function eventToPromise(eventType: string, target: EventTarget) {
   return new Promise<Event>(function (resolve) {
     target.addEventListener(eventType, function f(e: Event) {
@@ -128,8 +120,8 @@
 
   assertEquals(fileList.length, 2);
   assertEquals(fileList.currentFileIndex, 0);
-  assertEquals(fileList.item(0).name, '0');
-  assertEquals(fileList.item(1).name, '2');
+  assertEquals(fileList.item(0)!.name, '0');
+  assertEquals(fileList.item(1)!.name, '2');
 
   fileList.filterInPlace(() => false);
 
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
index b345e9b..e26c250 100644
--- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
+++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
@@ -200,12 +200,22 @@
 // times in the frontend. GetHiddenAcceleratorMap() is used to collect such
 // accelerators and hide them from display.
 const HiddenAcceleratorMap& GetHiddenAcceleratorMap() {
+  // TODO(jimmyxgong): nice to remove entries for positional modifiers.
   static const auto kHiddenAcceleratorMap =
       base::NoDestructor<HiddenAcceleratorMap>({
           {AcceleratorAction::kToggleAppList,
            {ui::Accelerator(ui::VKEY_BROWSER_SEARCH, ui::EF_SHIFT_DOWN,
                             ui::Accelerator::KeyState::PRESSED),
             ui::Accelerator(ui::VKEY_LWIN, ui::EF_SHIFT_DOWN,
+                            ui::Accelerator::KeyState::RELEASED),
+            ui::Accelerator(ui::VKEY_RWIN, ui::EF_NONE,
+                            ui::Accelerator::KeyState::RELEASED),
+            ui::Accelerator(ui::VKEY_RWIN, ui::EF_SHIFT_DOWN,
+                            ui::Accelerator::KeyState::RELEASED)}},
+          {AcceleratorAction::kToggleCapsLock,
+           {ui::Accelerator(ui::VKEY_RWIN, ui::EF_ALT_DOWN,
+                            ui::Accelerator::KeyState::RELEASED),
+            ui::Accelerator(ui::VKEY_MENU, ui::EF_COMMAND_DOWN,
                             ui::Accelerator::KeyState::RELEASED)}},
           {AcceleratorAction::kShowShortcutViewer,
            {ui::Accelerator(ui::VKEY_F14, ui::EF_NONE,
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table_unittest.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table_unittest.cc
index c408d6b..59a0d6d 100644
--- a/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table_unittest.cc
+++ b/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table_unittest.cc
@@ -22,9 +22,9 @@
 namespace {
 
 // The total number of Ash accelerators.
-constexpr int kAshAcceleratorsTotalNum = 148;
+constexpr int kAshAcceleratorsTotalNum = 151;
 // The hash of Ash accelerators.
-constexpr char kAshAcceleratorsHash[] = "9dc7c4b4097c3e8d3f091e5e5e32a763";
+constexpr char kAshAcceleratorsHash[] = "7246ad43f69748fb249bc35f5ecd5265";
 
 std::string ToActionName(ash::AcceleratorAction action) {
   return base::StrCat(
diff --git a/ash/webui/system_apps/public/js/BUILD.gn b/ash/webui/system_apps/public/js/BUILD.gn
index 511c0f3..cdd3c51 100644
--- a/ash/webui/system_apps/public/js/BUILD.gn
+++ b/ash/webui/system_apps/public/js/BUILD.gn
@@ -6,9 +6,14 @@
 import("//build/config/chromeos/ui_mode.gni")
 import("//chrome/test/base/ash/js2gtest.gni")
 import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/typescript/ts_definitions.gni")
 
 assert(is_chromeos_ash)
 
+ts_definitions("generate_definitions") {
+  js_files = [ "message_pipe.js" ]
+}
+
 js_library("sandboxed_load_time_data") {
 }
 
diff --git a/ash/wm/cursor_manager_chromeos.cc b/ash/wm/cursor_manager_chromeos.cc
index 8be220f..a13ae88 100644
--- a/ash/wm/cursor_manager_chromeos.cc
+++ b/ash/wm/cursor_manager_chromeos.cc
@@ -99,6 +99,7 @@
     case ui::VKEY_MENU:
     // Search key == VKEY_LWIN.
     case ui::VKEY_LWIN:
+    case ui::VKEY_RWIN:
     case ui::VKEY_WLAN:
     case ui::VKEY_POWER:
     case ui::VKEY_BRIGHTNESS_DOWN:
diff --git a/base/immediate_crash.h b/base/immediate_crash.h
index 6abafade..17e9257 100644
--- a/base/immediate_crash.h
+++ b/base/immediate_crash.h
@@ -17,7 +17,7 @@
 // before we immediately exit. We provide a weak symbol so that
 // this causes no link problems on configurations that don't involve
 // coverage.
-extern "C" void __attribute__((weak)) __llvm_profile_write_file() {}
+extern "C" int __attribute__((weak)) __llvm_profile_write_file(void);
 #endif  // BUILDFLAG(IS_LINUX)
 
 #endif  // BUILDFLAG(USE_FUZZING_ENGINE)
diff --git a/base/tracing/stdlib/chrome/interactions.sql b/base/tracing/stdlib/chrome/interactions.sql
index ab8365d..78600dc1 100644
--- a/base/tracing/stdlib/chrome/interactions.sql
+++ b/base/tracing/stdlib/chrome/interactions.sql
@@ -8,6 +8,7 @@
 
 INCLUDE PERFETTO MODULE chrome.page_loads;
 INCLUDE PERFETTO MODULE chrome.startups;
+INCLUDE PERFETTO MODULE chrome.web_content_interactions;
 
 -- All critical user interaction events, including type and table with
 -- associated metrics.
@@ -46,4 +47,12 @@
       THEN first_visible_content_ts - startup_begin_ts
     ELSE 0
   END AS dur
-FROM chrome_startups;
+FROM chrome_startups
+UNION ALL
+SELECT
+  id AS scoped_id,
+  'chrome_web_content_interactions' AS type,
+  'InteractionToFirstPaint' AS name,
+  ts,
+  dur
+FROM chrome_web_content_interactions;
diff --git a/base/tracing/stdlib/chrome/perfetto_sql_files.gni b/base/tracing/stdlib/chrome/perfetto_sql_files.gni
index 5edf42c..afe718b 100644
--- a/base/tracing/stdlib/chrome/perfetto_sql_files.gni
+++ b/base/tracing/stdlib/chrome/perfetto_sql_files.gni
@@ -14,6 +14,7 @@
   "speedometer.sql",
   "tasks.sql",
   "vsync_intervals.sql",
+  "web_content_interactions.sql",
   "scroll_jank/scroll_jank_cause_map.sql",
   "scroll_jank/scroll_jank_cause_utils.sql",
   "scroll_jank/scroll_jank_intervals.sql",
diff --git a/base/tracing/stdlib/chrome/web_content_interactions.sql b/base/tracing/stdlib/chrome/web_content_interactions.sql
new file mode 100644
index 0000000..bb9d961
--- /dev/null
+++ b/base/tracing/stdlib/chrome/web_content_interactions.sql
@@ -0,0 +1,44 @@
+-- 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 PERFETTO MODULE common.slices;
+
+-- Chrome web content interactions (InteractionToFirstPaint), including
+-- associated high-level metrics and properties.
+--
+-- Multiple events may occur for the same interaction; each row in this table
+-- represents the primary (longest) event for the interaction.
+--
+-- Web content interactions are discrete, as opposed to sustained (e.g.
+-- scrolling); and only occur with the web content itself, as opposed to other
+-- parts of Chrome (e.g. omnibox). Interaction events include taps, clicks,
+-- keyboard input (typing), and drags.
+CREATE PERFETTO TABLE chrome_web_content_interactions(
+  -- Unique id for this interaction.
+  id INT,
+  -- Start timestamp of the event. Because multiple events may occur for the
+  -- same interaction, this is the start timestamp of the longest event.
+  ts INT,
+  -- Duration of the event. Because multiple events may occur for the same
+  -- interaction, this is the duration of the longest event.
+  dur INT,
+  -- The interaction type.
+  interaction_type STRING,
+  -- The total duration of all events that occurred for the same interaction.
+  total_duration_ms INT,
+  -- The process id this event occurred on.
+  renderer_upid INT
+) AS
+SELECT
+  id,
+  ts,
+  dur,
+  EXTRACT_ARG(arg_set_id, 'web_content_interaction.type') AS interaction_type,
+  EXTRACT_ARG(
+    arg_set_id,
+    'web_content_intaraction.total_duration_ms'
+  ) AS total_duration_ms,
+  upid AS renderer_upid
+FROM process_slice
+WHERE name = 'Web Interaction';
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryIPHUtils.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryIPHUtils.java
index 657209ca..13d418c 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryIPHUtils.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryIPHUtils.java
@@ -45,6 +45,7 @@
             case FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_FILLING_FEATURE:
             case FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_OFFER_FEATURE:
             case FeatureConstants.KEYBOARD_ACCESSORY_PAYMENT_VIRTUAL_CARD_FEATURE:
+            case FeatureConstants.KEYBOARD_ACCESSORY_VIRTUAL_CARD_CVC_FILL_FEATURE:
                 tracker.notifyEvent(EventConstants.KEYBOARD_ACCESSORY_PAYMENT_AUTOFILLED);
                 return;
             case FeatureConstants.KEYBOARD_ACCESSORY_EXTERNAL_ACCOUNT_PROFILE_FEATURE:
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java
index 131f279..18dfbe8d 100644
--- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java
+++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryMediator.java
@@ -159,7 +159,6 @@
             case PopupItemId.PASSWORD_ENTRY:
             case PopupItemId.DATALIST_ENTRY:
             case PopupItemId.SCAN_CREDIT_CARD:
-            case PopupItemId.TITLE:
             case PopupItemId.USERNAME_ENTRY:
             case PopupItemId.ACCOUNT_STORAGE_PASSWORD_ENTRY:
             case PopupItemId.ACCOUNT_STORAGE_USERNAME_ENTRY:
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIncognitoReauthPromoTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIncognitoReauthPromoTest.java
index 666fef7..63f88b9 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIncognitoReauthPromoTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridIncognitoReauthPromoTest.java
@@ -119,6 +119,7 @@
 
     @Test
     @MediumTest
+    @DisabledTest(message = "https://crbug.com/1510419")
     public void testIncognitoPromoNotShownInRegularMode_WhenTogglingFromIncognito() {
         final ChromeTabbedActivity cta = mActivityTestRule.getActivity();
         createTabs(cta, false, 1);
diff --git a/chrome/android/java/res/layout/auto_sign_in_first_run_dialog.xml b/chrome/android/java/res/layout/auto_sign_in_first_run_dialog.xml
index 2ec9a838..4520c73 100644
--- a/chrome/android/java/res/layout/auto_sign_in_first_run_dialog.xml
+++ b/chrome/android/java/res/layout/auto_sign_in_first_run_dialog.xml
@@ -12,5 +12,5 @@
     style="@style/AlertDialogContent">
     <org.chromium.ui.widget.TextViewWithClickableSpans
         android:id="@+id/summary"
-        style="@style/AlertDialogSummaryViewItem" />
+        style="@style/AlertDialogSummaryViewItem"/>
 </LinearLayout>
diff --git a/chrome/android/profiles/newest.txt b/chrome/android/profiles/newest.txt
index fc26772b..8b7e798 100644
--- a/chrome/android/profiles/newest.txt
+++ b/chrome/android/profiles/newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-122.0.6177.0_rc-r1-merged.afdo.bz2
+chromeos-chrome-amd64-122.0.6179.0_rc-r1-merged.afdo.bz2
diff --git a/chrome/app/password_manager_ui_strings.grdp b/chrome/app/password_manager_ui_strings.grdp
index a2e1e2f..bbaafce 100644
--- a/chrome/app/password_manager_ui_strings.grdp
+++ b/chrome/app/password_manager_ui_strings.grdp
@@ -597,7 +597,10 @@
     Learn how to get started on &lt;a target='_blank' href='<ph name="LINK_ANDROID">$1</ph>'&gt;Android&lt;/a&gt; and &lt;a target='_blank' href='<ph name="LINK_IOS">$2</ph>'&gt;iOS&lt;/a&gt;
   </message>
   <message name="IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_LABEL" desc="The label of an account storage opt-in banner.">
-    Show passwords from your Google Account
+    Use and save passwords in your Google Account
+  </message>
+  <message name="IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_SUB_LABEL" desc="The sub label of an account storage opt-in banner.">
+    When on, passwords are saved in <ph name="EMAIL">$1<ex>your account</ex></ph>. When off, passwords are saved only to this device.
   </message>
   <message name="IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_WITH_PASSKEYS_TOGGLE_LABEL" desc="The label of an account storage opt-in banner. Do not translate “passkey“ as “password”, “passkey” is a unique concept.">
     Show passwords and passkeys from your Google Account
@@ -687,6 +690,11 @@
   <message name="IDS_PASSWORD_MANAGER_UI_PASSWORD_LIST_ARIA_LABEL" is_accessibility_with_no_ui="true" desc="The ARIA (accessibility) message for the password list containing the list of user's persisted passwords.">
     Password
   </message>
+  <message name="IDS_PASSWORD_MANAGER_UI_DEVICE_ONLY_PASSWORDS_ICON_TOOLTIP" desc="Text for the tooltip that is shown while hovering over the icon saying, that for this entry you have some passwords saved only to this device.">
+    {COUNT, plural,
+    =1 {{COUNT} password is saved only to this device}
+    other {{COUNT} passwords are saved only to this device}}
+  </message>
   <if expr="is_macosx">
     <message name="IDS_PASSWORD_MANAGER_UI_RELAUNCH_CHROME_PROMO_CARD_TITLE" desc="Title for the Relaunch Chrome promo card.">
       Google Password Manager needs access to MacOS Keychain
diff --git a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_LABEL.png.sha1 b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_LABEL.png.sha1
index 9ab937a0..a5e8ff2 100644
--- a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_LABEL.png.sha1
+++ b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_LABEL.png.sha1
@@ -1 +1 @@
-d6067bf369224ad157c0c8d46baf40cc28ba2635
\ No newline at end of file
+6a8deaefeb1eb45f1055f01e22efdaf2dd92cc7e
\ No newline at end of file
diff --git a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_SUB_LABEL.png.sha1 b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_SUB_LABEL.png.sha1
new file mode 100644
index 0000000..a5e8ff2
--- /dev/null
+++ b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_SUB_LABEL.png.sha1
@@ -0,0 +1 @@
+6a8deaefeb1eb45f1055f01e22efdaf2dd92cc7e
\ No newline at end of file
diff --git a/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_DEVICE_ONLY_PASSWORDS_ICON_TOOLTIP.png.sha1 b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_DEVICE_ONLY_PASSWORDS_ICON_TOOLTIP.png.sha1
new file mode 100644
index 0000000..d38431b
--- /dev/null
+++ b/chrome/app/password_manager_ui_strings_grdp/IDS_PASSWORD_MANAGER_UI_DEVICE_ONLY_PASSWORDS_ICON_TOOLTIP.png.sha1
@@ -0,0 +1 @@
+c227f06b89bbe6cb7d9d0df7f1cb34f44d9f89e8
\ No newline at end of file
diff --git a/chrome/browser/android/signin/web_signin_bridge.cc b/chrome/browser/android/signin/web_signin_bridge.cc
index ba39341..976417b 100644
--- a/chrome/browser/android/signin/web_signin_bridge.cc
+++ b/chrome/browser/android/signin/web_signin_bridge.cc
@@ -72,9 +72,12 @@
   bool is_auth_error =
       identity_manager_->HasAccountWithRefreshTokenInPersistentErrorState(
           signin_account_.account_id);
-  OnSigninCompleted(GoogleServiceAuthError(
-      is_auth_error ? GoogleServiceAuthError::State::INVALID_GAIA_CREDENTIALS
-                    : GoogleServiceAuthError::State::CONNECTION_FAILED));
+  OnSigninCompleted(
+      is_auth_error ? GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
+                          GoogleServiceAuthError::InvalidGaiaCredentialsReason::
+                              CREDENTIALS_REJECTED_BY_SERVER)
+                    : GoogleServiceAuthError(
+                          GoogleServiceAuthError::State::CONNECTION_FAILED));
 }
 
 void WebSigninBridge::OnSigninCompleted(const GoogleServiceAuthError& error) {
diff --git a/chrome/browser/android/signin/web_signin_bridge_unittest.cc b/chrome/browser/android/signin/web_signin_bridge_unittest.cc
index d2db163..76812bb 100644
--- a/chrome/browser/android/signin/web_signin_bridge_unittest.cc
+++ b/chrome/browser/android/signin/web_signin_bridge_unittest.cc
@@ -115,8 +115,9 @@
       CreateWebSigninBridge(account, callback.Get());
 
   EXPECT_CALL(callback,
-              Run(GoogleServiceAuthError(
-                  GoogleServiceAuthError::State::INVALID_GAIA_CREDENTIALS)));
+              Run(GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
+                  GoogleServiceAuthError::InvalidGaiaCredentialsReason::
+                      CREDENTIALS_REJECTED_BY_SERVER)));
   identity_test_env_.SetPrimaryAccount(account.email,
                                        signin::ConsentLevel::kSync);
   identity_test_env_.SetInvalidRefreshTokenForAccount(account.account_id);
@@ -160,8 +161,9 @@
   std::unique_ptr<WebSigninBridge> web_signin_bridge =
       CreateWebSigninBridge(account, callback.Get());
   EXPECT_CALL(callback,
-              Run(GoogleServiceAuthError(
-                  GoogleServiceAuthError::State::INVALID_GAIA_CREDENTIALS)));
+              Run(GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
+                  GoogleServiceAuthError::InvalidGaiaCredentialsReason::
+                      CREDENTIALS_REJECTED_BY_SERVER)));
 
   identity_test_env_.SetPrimaryAccount(account.email,
                                        signin::ConsentLevel::kSync);
diff --git a/chrome/browser/android/vr/gvr_scheduler_delegate.cc b/chrome/browser/android/vr/gvr_scheduler_delegate.cc
index 78746bb..e1d74dd 100644
--- a/chrome/browser/android/vr/gvr_scheduler_delegate.cc
+++ b/chrome/browser/android/vr/gvr_scheduler_delegate.cc
@@ -985,9 +985,9 @@
 
   const gfx::BufferFormat format = gfx::BufferFormat::RGBA_8888;
   const gfx::BufferUsage usage = gfx::BufferUsage::SCANOUT;
-  uint32_t shared_image_usage = gpu::SHARED_IMAGE_USAGE_SCANOUT |
-                                gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
-                                gpu::SHARED_IMAGE_USAGE_GLES2;
+  uint32_t shared_image_usage =
+      gpu::SHARED_IMAGE_USAGE_SCANOUT | gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
+      gpu::SHARED_IMAGE_USAGE_GLES2_READ | gpu::SHARED_IMAGE_USAGE_GLES2_WRITE;
   buffer->scoped_ahb_handle =
       gpu::CreateScopedHardwareBufferHandle(size, format, usage);
 
diff --git a/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.cc b/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.cc
index 7eb0dcc..f90ce4a 100644
--- a/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.cc
+++ b/chrome/browser/ash/arc/screen_capture/arc_screen_capture_session.cc
@@ -227,7 +227,8 @@
   auto client_shared_image = sii->CreateSharedImage(
       si_format, size_, gfx::ColorSpace(), kTopLeft_GrSurfaceOrigin,
       kPremul_SkAlphaType,
-      gpu::SHARED_IMAGE_USAGE_RASTER | gpu::SHARED_IMAGE_USAGE_GLES2,
+      gpu::SHARED_IMAGE_USAGE_RASTER | gpu::SHARED_IMAGE_USAGE_GLES2_READ |
+          gpu::SHARED_IMAGE_USAGE_GLES2_WRITE,
       "ArcScreenCapture", std::move(handle));
   CHECK(client_shared_image);
   ri->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData());
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn
index 6ba00403..9b91b6ae 100644
--- a/chrome/browser/ash/crosapi/BUILD.gn
+++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -67,6 +67,8 @@
     "cert_database_ash.h",
     "cert_provisioning_ash.cc",
     "cert_provisioning_ash.h",
+    "chaps_service_ash.cc",
+    "chaps_service_ash.h",
     "chrome_app_kiosk_service_ash.cc",
     "chrome_app_kiosk_service_ash.h",
     "chrome_app_window_tracker_ash.cc",
@@ -320,6 +322,7 @@
     "//chromeos/ash/components/cryptohome",
     "//chromeos/ash/components/dbus",
     "//chromeos/ash/components/dbus/attestation:attestation_proto",
+    "//chromeos/ash/components/dbus/chaps",
     "//chromeos/ash/components/dbus/cros_disks",
     "//chromeos/ash/components/dbus/lorgnette_manager:lorgnette_proto",
     "//chromeos/ash/components/dbus/resourced",
@@ -492,6 +495,7 @@
     "browser_util_unittest.cc",
     "browser_version_service_ash_unittest.cc",
     "cert_provisioning_ash_unittest.cc",
+    "chaps_service_ash_unittest.cc",
     "chrome_app_window_tracker_ash_unittest.cc",
     "clipboard_history_ash_unittest.cc",
     "crosapi_util_unittest.cc",
@@ -545,6 +549,7 @@
     ":fake_device_ownership_waiter",
     ":test_support",
     "//ash",
+    "//ash:test_support",
     "//ash/components/arc:arc_test_support",
     "//ash/public/cpp/external_arc:test_support",
     "//base",
@@ -556,6 +561,7 @@
     "//chrome/test:test_support",
     "//chromeos/ash/components/cryptohome",
     "//chromeos/ash/components/dbus/audio",
+    "//chromeos/ash/components/dbus/chaps:test_support",
     "//chromeos/ash/components/dbus/shill",
     "//chromeos/ash/components/dbus/upstart",
     "//chromeos/ash/components/login/login_state",
diff --git a/chrome/browser/ash/crosapi/chaps_service_ash.cc b/chrome/browser/ash/crosapi/chaps_service_ash.cc
new file mode 100644
index 0000000..e866c27
--- /dev/null
+++ b/chrome/browser/ash/crosapi/chaps_service_ash.cc
@@ -0,0 +1,293 @@
+// 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/ash/crosapi/chaps_service_ash.h"
+
+#include "chromeos/ash/components/dbus/chaps/chaps_client.h"
+#include "chromeos/constants/pkcs11_definitions.h"
+#include "chromeos/crosapi/mojom/chaps_service.mojom.h"
+#include "third_party/cros_system_api/dbus/chaps/dbus-constants.h"
+
+namespace crosapi {
+
+ChapsServiceAsh::ChapsServiceAsh() = default;
+ChapsServiceAsh::~ChapsServiceAsh() = default;
+
+void ChapsServiceAsh::BindReceiver(
+    mojo::PendingReceiver<mojom::ChapsService> receiver) {
+  receivers_.Add(this, std::move(receiver));
+}
+
+void ChapsServiceAsh::GetSlotList(bool token_present,
+                                  GetSlotListCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(/*slot_list=*/std::vector<uint64_t>(),
+                                   chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->GetSlotList(token_present, std::move(callback));
+}
+
+void ChapsServiceAsh::GetMechanismList(uint64_t slot_id,
+                                       GetMechanismListCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(/*slot_list=*/std::vector<uint64_t>(),
+                                   chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->GetMechanismList(slot_id, std::move(callback));
+}
+
+void ChapsServiceAsh::OpenSession(uint64_t slot_id,
+                                  uint64_t flags,
+                                  OpenSessionCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(
+        /*session_id=*/chromeos::PKCS11_INVALID_SESSION_ID,
+        chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->OpenSession(slot_id, flags, std::move(callback));
+}
+
+void ChapsServiceAsh::CloseSession(uint64_t session_id,
+                                   CloseSessionCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->CloseSession(session_id, std::move(callback));
+}
+
+void ChapsServiceAsh::CreateObject(uint64_t session_id,
+                                   const std::vector<uint8_t>& attributes,
+                                   CreateObjectCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(/*new_object_handle=*/0,
+                                   chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->CreateObject(session_id, attributes,
+                                         std::move(callback));
+}
+
+void ChapsServiceAsh::DestroyObject(uint64_t session_id,
+                                    uint64_t object_handle,
+                                    DestroyObjectCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->DestroyObject(session_id, object_handle,
+                                          std::move(callback));
+}
+
+void ChapsServiceAsh::GetAttributeValue(
+    uint64_t session_id,
+    uint64_t object_handle,
+    const std::vector<uint8_t>& attributes_in,
+    GetAttributeValueCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(/*attributes_out=*/std::vector<uint8_t>(),
+                                   chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->GetAttributeValue(
+      session_id, object_handle, attributes_in, std::move(callback));
+}
+
+void ChapsServiceAsh::SetAttributeValue(uint64_t session_id,
+                                        uint64_t object_handle,
+                                        const std::vector<uint8_t>& attributes,
+                                        SetAttributeValueCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->SetAttributeValue(session_id, object_handle,
+                                              attributes, std::move(callback));
+}
+
+void ChapsServiceAsh::FindObjectsInit(uint64_t session_id,
+                                      const std::vector<uint8_t>& attributes,
+                                      FindObjectsInitCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->FindObjectsInit(session_id, attributes,
+                                            std::move(callback));
+}
+
+void ChapsServiceAsh::FindObjects(uint64_t session_id,
+                                  uint64_t max_object_count,
+                                  FindObjectsCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(/*object_list=*/std::vector<uint64_t>(),
+                                   chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->FindObjects(session_id, max_object_count,
+                                        std::move(callback));
+}
+
+void ChapsServiceAsh::FindObjectsFinal(uint64_t session_id,
+                                       FindObjectsFinalCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->FindObjectsFinal(session_id, std::move(callback));
+}
+
+void ChapsServiceAsh::EncryptInit(
+    uint64_t session_id,
+    uint64_t mechanism_type,
+    const std::vector<uint8_t>& mechanism_parameter,
+    uint64_t key_handle,
+    EncryptInitCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->EncryptInit(session_id, mechanism_type,
+                                        mechanism_parameter, key_handle,
+                                        std::move(callback));
+}
+
+void ChapsServiceAsh::Encrypt(uint64_t session_id,
+                              const std::vector<uint8_t>& data,
+                              uint64_t max_out_length,
+                              EncryptCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(0, {}, chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->Encrypt(session_id, data, max_out_length,
+                                    std::move(callback));
+}
+
+void ChapsServiceAsh::DecryptInit(
+    uint64_t session_id,
+    uint64_t mechanism_type,
+    const std::vector<uint8_t>& mechanism_parameter,
+    uint64_t key_handle,
+    DecryptInitCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->DecryptInit(session_id, mechanism_type,
+                                        mechanism_parameter, key_handle,
+                                        std::move(callback));
+}
+
+void ChapsServiceAsh::Decrypt(uint64_t session_id,
+                              const std::vector<uint8_t>& data,
+                              uint64_t max_out_length,
+                              DecryptCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(0, {}, chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->Decrypt(session_id, data, max_out_length,
+                                    std::move(callback));
+}
+
+void ChapsServiceAsh::SignInit(uint64_t session_id,
+                               uint64_t mechanism_type,
+                               const std::vector<uint8_t>& mechanism_parameter,
+                               uint64_t key_handle,
+                               SignInitCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->SignInit(session_id, mechanism_type,
+                                     mechanism_parameter, key_handle,
+                                     std::move(callback));
+}
+
+void ChapsServiceAsh::Sign(uint64_t session_id,
+                           const std::vector<uint8_t>& data,
+                           uint64_t max_out_length,
+                           SignCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(0, {}, chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->Sign(session_id, data, max_out_length,
+                                 std::move(callback));
+}
+
+void ChapsServiceAsh::GenerateKeyPair(
+    uint64_t session_id,
+    uint64_t mechanism_type,
+    const std::vector<uint8_t>& mechanism_parameter,
+    const std::vector<uint8_t>& public_attributes,
+    const std::vector<uint8_t>& private_attributes,
+    GenerateKeyPairCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(/*public_key_handle=*/0,
+                                   /*private_key_handle=*/0,
+                                   chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->GenerateKeyPair(
+      session_id, mechanism_type, mechanism_parameter, public_attributes,
+      private_attributes, std::move(callback));
+}
+
+void ChapsServiceAsh::WrapKey(uint64_t session_id,
+                              uint64_t mechanism_type,
+                              const std::vector<uint8_t>& mechanism_parameter,
+                              uint64_t wrapping_key_handle,
+                              uint64_t key_handle,
+                              uint64_t max_out_length,
+                              WrapKeyCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(/*actual_out_length=*/0,
+                                   /*wrapped_key=*/{},
+                                   chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->WrapKey(
+      session_id, mechanism_type, mechanism_parameter, wrapping_key_handle,
+      key_handle, max_out_length, std::move(callback));
+}
+
+void ChapsServiceAsh::UnwrapKey(uint64_t session_id,
+                                uint64_t mechanism_type,
+                                const std::vector<uint8_t>& mechanism_parameter,
+                                uint64_t wrapping_key_handle,
+                                const std::vector<uint8_t>& wrapped_key,
+                                const std::vector<uint8_t>& attributes,
+                                UnwrapKeyCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(/*key_handle=*/0,
+                                   chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->UnwrapKey(
+      session_id, mechanism_type, mechanism_parameter, wrapping_key_handle,
+      wrapped_key, attributes, std::move(callback));
+}
+
+void ChapsServiceAsh::DeriveKey(uint64_t session_id,
+                                uint64_t mechanism_type,
+                                const std::vector<uint8_t>& mechanism_parameter,
+                                uint64_t base_key_handle,
+                                const std::vector<uint8_t>& attributes,
+                                DeriveKeyCallback callback) {
+  ash::ChapsClient* chaps_dbus_client = ash::ChapsClient::Get();
+  if (!chaps_dbus_client) {
+    return std::move(callback).Run(/*key_handle=*/0,
+                                   chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  return chaps_dbus_client->DeriveKey(session_id, mechanism_type,
+                                      mechanism_parameter, base_key_handle,
+                                      attributes, std::move(callback));
+}
+
+}  // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/chaps_service_ash.h b/chrome/browser/ash/crosapi/chaps_service_ash.h
new file mode 100644
index 0000000..494bfc6
--- /dev/null
+++ b/chrome/browser/ash/crosapi/chaps_service_ash.h
@@ -0,0 +1,114 @@
+// 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_ASH_CROSAPI_CHAPS_SERVICE_ASH_H_
+#define CHROME_BROWSER_ASH_CROSAPI_CHAPS_SERVICE_ASH_H_
+
+#include "chromeos/crosapi/mojom/chaps_service.mojom.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+
+namespace crosapi {
+
+class ChapsServiceAsh : public mojom::ChapsService {
+ public:
+  ChapsServiceAsh();
+  ChapsServiceAsh(const ChapsServiceAsh&) = delete;
+  ChapsServiceAsh& operator=(const ChapsServiceAsh&) = delete;
+  ~ChapsServiceAsh() override;
+
+  void BindReceiver(mojo::PendingReceiver<mojom::ChapsService> receiver);
+
+  // Implements mojom::ChapsService.
+  void GetSlotList(bool token_present, GetSlotListCallback callback) override;
+  void GetMechanismList(uint64_t slot_id,
+                        GetMechanismListCallback callback) override;
+  void OpenSession(uint64_t slot_id,
+                   uint64_t flags,
+                   OpenSessionCallback callback) override;
+  void CloseSession(uint64_t session_id,
+                    CloseSessionCallback callback) override;
+  void CreateObject(uint64_t session_id,
+                    const std::vector<uint8_t>& attributes,
+                    CreateObjectCallback callback) override;
+  void DestroyObject(uint64_t session_id,
+                     uint64_t object_handle,
+                     DestroyObjectCallback callback) override;
+  void GetAttributeValue(uint64_t session_id,
+                         uint64_t object_handle,
+                         const std::vector<uint8_t>& attributes,
+                         GetAttributeValueCallback callback) override;
+  void SetAttributeValue(uint64_t session_id,
+                         uint64_t object_handle,
+                         const std::vector<uint8_t>& attributes,
+                         SetAttributeValueCallback callback) override;
+  void FindObjectsInit(uint64_t session_id,
+                       const std::vector<uint8_t>& attributes,
+                       FindObjectsInitCallback callback) override;
+  void FindObjects(uint64_t session_id,
+                   uint64_t max_object_count,
+                   FindObjectsCallback callback) override;
+  void FindObjectsFinal(uint64_t session_id,
+                        FindObjectsFinalCallback callback) override;
+  void EncryptInit(uint64_t session_id,
+                   uint64_t mechanism_type,
+                   const std::vector<uint8_t>& mechanism_parameter,
+                   uint64_t key_handle,
+                   EncryptInitCallback callback) override;
+  void Encrypt(uint64_t session_id,
+               const std::vector<uint8_t>& data,
+               uint64_t max_out_length,
+               EncryptCallback callback) override;
+  void DecryptInit(uint64_t session_id,
+                   uint64_t mechanism_type,
+                   const std::vector<uint8_t>& mechanism_parameter,
+                   uint64_t key_handle,
+                   DecryptInitCallback callback) override;
+  void Decrypt(uint64_t session_id,
+               const std::vector<uint8_t>& data,
+               uint64_t max_out_length,
+               DecryptCallback callback) override;
+  void SignInit(uint64_t session_id,
+                uint64_t mechanism_type,
+                const std::vector<uint8_t>& mechanism_parameter,
+                uint64_t key_handle,
+                SignInitCallback callback) override;
+  void Sign(uint64_t session_id,
+            const std::vector<uint8_t>& data,
+            uint64_t max_out_length,
+            SignCallback callback) override;
+  void GenerateKeyPair(uint64_t session_id,
+                       uint64_t mechanism_type,
+                       const std::vector<uint8_t>& mechanism_parameter,
+                       const std::vector<uint8_t>& public_attributes,
+                       const std::vector<uint8_t>& private_attributes,
+                       GenerateKeyPairCallback callback) override;
+  void WrapKey(uint64_t session_id,
+               uint64_t mechanism_type,
+               const std::vector<uint8_t>& mechanism_parameter,
+               uint64_t wrapping_key_handle,
+               uint64_t key_handle,
+               uint64_t max_out_length,
+               WrapKeyCallback callback) override;
+  void UnwrapKey(uint64_t session_id,
+                 uint64_t mechanism_type,
+                 const std::vector<uint8_t>& mechanism_parameter,
+                 uint64_t wrapping_key_handle,
+                 const std::vector<uint8_t>& wrapped_key,
+                 const std::vector<uint8_t>& attributes,
+                 UnwrapKeyCallback callback) override;
+  void DeriveKey(uint64_t session_id,
+                 uint64_t mechanism_type,
+                 const std::vector<uint8_t>& mechanism_parameter,
+                 uint64_t base_key_handle,
+                 const std::vector<uint8_t>& attributes,
+                 DeriveKeyCallback callback) override;
+
+ private:
+  mojo::ReceiverSet<mojom::ChapsService> receivers_;
+};
+
+}  // namespace crosapi
+
+#endif  // CHROME_BROWSER_ASH_CROSAPI_CHAPS_SERVICE_ASH_H_
diff --git a/chrome/browser/ash/crosapi/chaps_service_ash_unittest.cc b/chrome/browser/ash/crosapi/chaps_service_ash_unittest.cc
new file mode 100644
index 0000000..be312ac
--- /dev/null
+++ b/chrome/browser/ash/crosapi/chaps_service_ash_unittest.cc
@@ -0,0 +1,607 @@
+// 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/ash/crosapi/chaps_service_ash.h"
+
+#include <stdint.h>
+
+#include <memory>
+#include <vector>
+
+#include "base/test/gmock_callback_support.h"
+#include "base/test/test_future.h"
+#include "chromeos/ash/components/dbus/chaps/mock_chaps_client.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/cros_system_api/dbus/chaps/dbus-constants.h"
+
+namespace crosapi {
+namespace {
+
+using ::base::test::RunOnceCallback;
+using ::testing::_;
+
+class ChapsServiceAshTest : public ::testing::Test {
+ protected:
+  // This instance will be returned from ChapsClient::Get().
+  std::unique_ptr<ash::MockChapsClient> dbus_client_ =
+      std::make_unique<ash::MockChapsClient>();
+  ChapsServiceAsh service_;
+};
+
+// Test that GetSlotList correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, GetSlotList) {
+  bool token_present = true;
+  const std::vector<uint64_t> slot_list = {1, 2, 3};
+  const uint32_t result_code = 111;
+
+  {
+    EXPECT_CALL(*dbus_client_, GetSlotList(token_present, _))
+        .WillOnce(RunOnceCallback<1>(slot_list, result_code));
+
+    base::test::TestFuture<const std::vector<uint64_t>&, uint32_t> waiter;
+    service_.GetSlotList(/*token_present=*/token_present, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<std::vector<uint64_t>>(), slot_list);
+    EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+  }
+
+  token_present = false;
+
+  {
+    EXPECT_CALL(*dbus_client_, GetSlotList(token_present, _))
+        .WillOnce(RunOnceCallback<1>(slot_list, result_code));
+
+    base::test::TestFuture<const std::vector<uint64_t>&, uint32_t> waiter;
+    service_.GetSlotList(/*token_present=*/token_present, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<std::vector<uint64_t>>(), slot_list);
+    EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+  }
+}
+
+// Test that GetMechanismList correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, GetMechanismList) {
+  const uint64_t slot_id = 111;
+  const std::vector<uint64_t> mechanism_list = {2, 2, 2};
+  const uint32_t result_code = 444;
+
+  EXPECT_CALL(*dbus_client_, GetMechanismList(slot_id, _))
+      .WillOnce(RunOnceCallback<1>(mechanism_list, result_code));
+
+  base::test::TestFuture<const std::vector<uint64_t>&, uint32_t> waiter;
+  service_.GetMechanismList(slot_id, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<std::vector<uint64_t>>(), mechanism_list);
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that OpenSession correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, OpenSession) {
+  const uint64_t slot_id = 111;
+  const uint64_t flags = 222;
+  const uint64_t session_id = 333;
+  const uint32_t result_code = 444;
+
+  EXPECT_CALL(*dbus_client_, OpenSession(slot_id, flags, _))
+      .WillOnce(RunOnceCallback<2>(session_id, result_code));
+
+  base::test::TestFuture<uint64_t, uint32_t> waiter;
+  service_.OpenSession(slot_id, flags, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint64_t>(), session_id);
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that CloseSession correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, CloseSession) {
+  const uint64_t session_id = 111;
+  const uint32_t result_code = 222;
+
+  EXPECT_CALL(*dbus_client_, CloseSession(session_id, _))
+      .WillOnce(RunOnceCallback<1>(result_code));
+
+  base::test::TestFuture<uint32_t> waiter;
+  service_.CloseSession(session_id, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that CreateObject correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, CreateObject) {
+  const uint64_t session_id = 111;
+  const std::vector<uint8_t> attributes = {2, 2, 2};
+  const uint64_t new_object_handle = 333;
+  const uint32_t result_code = 444;
+
+  EXPECT_CALL(*dbus_client_, CreateObject(session_id, attributes, _))
+      .WillOnce(RunOnceCallback<2>(new_object_handle, result_code));
+
+  base::test::TestFuture<uint64_t, uint32_t> waiter;
+  service_.CreateObject(session_id, attributes, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint64_t>(), new_object_handle);
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that DestroyObject correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, DestroyObject) {
+  const uint64_t session_id = 111;
+  const uint64_t object_handle = 222;
+  const uint32_t result_code = 333;
+
+  EXPECT_CALL(*dbus_client_, DestroyObject(session_id, object_handle, _))
+      .WillOnce(RunOnceCallback<2>(result_code));
+
+  base::test::TestFuture<uint32_t> waiter;
+  service_.DestroyObject(session_id, object_handle, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that GetAttributeValue correctly forwards the arguments to the dbus
+// layer and the result back from it.
+TEST_F(ChapsServiceAshTest, GetAttributeValue) {
+  const uint64_t session_id = 111;
+  const uint64_t object_handle = 222;
+  const std::vector<uint8_t> attrs_in = {3, 3, 3};
+  const std::vector<uint8_t> attrs_out = {4, 4, 4};
+  const uint32_t result_code = 555;
+
+  EXPECT_CALL(*dbus_client_,
+              GetAttributeValue(session_id, object_handle, attrs_in, _))
+      .WillOnce(RunOnceCallback<3>(attrs_out, result_code));
+
+  base::test::TestFuture<const std::vector<uint8_t>&, uint32_t> waiter;
+  service_.GetAttributeValue(session_id, object_handle, attrs_in,
+                             waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<std::vector<uint8_t>>(), attrs_out);
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that SetAttributeValue correctly forwards the arguments to the dbus
+// layer and the result back from it.
+TEST_F(ChapsServiceAshTest, SetAttributeValue) {
+  const uint64_t session_id = 111;
+  const uint64_t object_handle = 222;
+  const std::vector<uint8_t> attributes = {3, 3, 3};
+  const uint32_t result_code = 444;
+
+  EXPECT_CALL(*dbus_client_,
+              SetAttributeValue(session_id, object_handle, attributes, _))
+      .WillOnce(RunOnceCallback<3>(result_code));
+
+  base::test::TestFuture<uint32_t> waiter;
+  service_.SetAttributeValue(session_id, object_handle, attributes,
+                             waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that FindObjectsInit correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, FindObjectsInit) {
+  const uint64_t session_id = 111;
+  const std::vector<uint8_t> attributes = {2, 2, 2};
+  const uint32_t result_code = 333;
+
+  EXPECT_CALL(*dbus_client_, FindObjectsInit(session_id, attributes, _))
+      .WillOnce(RunOnceCallback<2>(result_code));
+
+  base::test::TestFuture<uint32_t> waiter;
+  service_.FindObjectsInit(session_id, attributes, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that FindObjects correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, FindObjects) {
+  const uint64_t session_id = 111;
+  const uint64_t max_object_count = 222;
+  const std::vector<uint64_t> object_list = {3, 3, 3};
+  const uint32_t result_code = 444;
+
+  EXPECT_CALL(*dbus_client_, FindObjects(session_id, max_object_count, _))
+      .WillOnce(RunOnceCallback<2>(object_list, result_code));
+
+  base::test::TestFuture<const std::vector<uint64_t>&, uint32_t> waiter;
+  service_.FindObjects(session_id, max_object_count, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<std::vector<uint64_t>>(), object_list);
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that FindObjectsFinal correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, FindObjectsFinal) {
+  const uint64_t session_id = 111;
+  const uint32_t result_code = 222;
+
+  EXPECT_CALL(*dbus_client_, FindObjectsFinal(session_id, _))
+      .WillOnce(RunOnceCallback<1>(result_code));
+
+  base::test::TestFuture<uint32_t> waiter;
+  service_.FindObjectsFinal(session_id, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that EncryptInit correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, EncryptInit) {
+  const uint64_t session_id = 111;
+  const uint64_t mechanism_type = 222;
+  const std::vector<uint8_t> mechanism_parameter = {3, 3, 3};
+  const uint64_t key_handle = 444;
+  const uint64_t result_code = 555;
+
+  EXPECT_CALL(*dbus_client_, EncryptInit(session_id, mechanism_type,
+                                         mechanism_parameter, key_handle, _))
+      .WillOnce(RunOnceCallback<4>(result_code));
+
+  base::test::TestFuture<uint32_t> waiter;
+  service_.EncryptInit(session_id, mechanism_type, mechanism_parameter,
+                       key_handle, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that Encrypt correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, Encrypt) {
+  const uint64_t session_id = 11;
+  const std::vector<uint8_t> data = {2, 2, 2};
+  const uint64_t max_out_length = 33;
+  const uint64_t actual_out_length = 44;
+  const std::vector<uint8_t> out_data = {5, 5, 5};
+  const uint64_t result_code = 66;
+
+  EXPECT_CALL(*dbus_client_, Encrypt(session_id, data, max_out_length, _))
+      .WillOnce(RunOnceCallback<3>(actual_out_length, out_data, result_code));
+
+  base::test::TestFuture<uint64_t, const std::vector<uint8_t>&, uint32_t>
+      waiter;
+  service_.Encrypt(session_id, data, max_out_length, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<0>(), actual_out_length);
+  EXPECT_EQ(waiter.Get<1>(), out_data);
+  EXPECT_EQ(waiter.Get<2>(), result_code);
+}
+
+// Test that DecryptInit correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, DecryptInit) {
+  const uint64_t session_id = 111;
+  const uint64_t mechanism_type = 222;
+  const std::vector<uint8_t> mechanism_parameter = {3, 3, 3};
+  const uint64_t key_handle = 444;
+  const uint64_t result_code = 555;
+
+  EXPECT_CALL(*dbus_client_, DecryptInit(session_id, mechanism_type,
+                                         mechanism_parameter, key_handle, _))
+      .WillOnce(RunOnceCallback<4>(result_code));
+
+  base::test::TestFuture<uint32_t> waiter;
+  service_.DecryptInit(session_id, mechanism_type, mechanism_parameter,
+                       key_handle, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that Decrypt correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, Decrypt) {
+  const uint64_t session_id = 11;
+  const std::vector<uint8_t> data = {2, 2, 2};
+  const uint64_t max_out_length = 33;
+  const uint64_t actual_out_length = 44;
+  const std::vector<uint8_t> out_data = {5, 5, 5};
+  const uint64_t result_code = 66;
+
+  EXPECT_CALL(*dbus_client_, Decrypt(session_id, data, max_out_length, _))
+      .WillOnce(RunOnceCallback<3>(actual_out_length, out_data, result_code));
+
+  base::test::TestFuture<uint64_t, const std::vector<uint8_t>&, uint32_t>
+      waiter;
+  service_.Decrypt(session_id, data, max_out_length, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<0>(), actual_out_length);
+  EXPECT_EQ(waiter.Get<1>(), out_data);
+  EXPECT_EQ(waiter.Get<2>(), result_code);
+}
+
+// Test that SignInit correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, SignInit) {
+  const uint64_t session_id = 111;
+  const uint64_t mechanism_type = 222;
+  const std::vector<uint8_t> mechanism_parameter = {3, 3, 3};
+  const uint64_t key_handle = 444;
+  const uint64_t result_code = 555;
+
+  EXPECT_CALL(*dbus_client_, SignInit(session_id, mechanism_type,
+                                      mechanism_parameter, key_handle, _))
+      .WillOnce(RunOnceCallback<4>(result_code));
+
+  base::test::TestFuture<uint32_t> waiter;
+  service_.SignInit(session_id, mechanism_type, mechanism_parameter, key_handle,
+                    waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that Sign correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, Sign) {
+  const uint64_t session_id = 11;
+  const std::vector<uint8_t> data = {2, 2, 2};
+  const uint64_t max_out_length = 33;
+  const uint64_t actual_out_length = 44;
+  const std::vector<uint8_t> signature = {5, 5, 5};
+  const uint64_t result_code = 66;
+
+  EXPECT_CALL(*dbus_client_, Sign(session_id, data, max_out_length, _))
+      .WillOnce(RunOnceCallback<3>(actual_out_length, signature, result_code));
+
+  base::test::TestFuture<uint64_t, const std::vector<uint8_t>&, uint32_t>
+      waiter;
+  service_.Sign(session_id, data, max_out_length, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<0>(), actual_out_length);
+  EXPECT_EQ(waiter.Get<1>(), signature);
+  EXPECT_EQ(waiter.Get<2>(), result_code);
+}
+
+// Test that GenerateKeyPair correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, GenerateKeyPair) {
+  const uint64_t session_id = 111;
+  const uint64_t mechanism_type = 222;
+  const std::vector<uint8_t> mechanism_parameter = {3, 3, 3};
+  const std::vector<uint8_t> public_attributes = {4, 4, 4};
+  const std::vector<uint8_t> private_attributes = {5, 5, 5};
+  const uint64_t public_key_handle = 777;
+  const uint64_t private_key_handle = 888;
+  const uint32_t result_code = 999;
+
+  EXPECT_CALL(*dbus_client_,
+              GenerateKeyPair(session_id, mechanism_type, mechanism_parameter,
+                              public_attributes, private_attributes, _))
+      .WillOnce(RunOnceCallback<5>(public_key_handle, private_key_handle,
+                                   result_code));
+
+  base::test::TestFuture<uint64_t, uint64_t, uint32_t> waiter;
+  service_.GenerateKeyPair(session_id, mechanism_type, mechanism_parameter,
+                           public_attributes, private_attributes,
+                           waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<0>(), public_key_handle);
+  EXPECT_EQ(waiter.Get<1>(), private_key_handle);
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that WrapKey correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, WrapKey) {
+  uint64_t session_id = 11;
+  uint64_t mechanism_type = 22;
+  std::vector<uint8_t> mechanism_parameter = {3, 3, 3};
+  uint64_t wrapping_key_handle = 44;
+  uint64_t key_handle = 55;
+  uint64_t max_out_length = 66;
+  uint64_t actual_out_length = 77;
+  std::vector<uint8_t> out_wrapped_key = {8, 8, 8};
+  uint32_t result_code = 99;
+
+  EXPECT_CALL(*dbus_client_,
+              WrapKey(session_id, mechanism_type, mechanism_parameter,
+                      wrapping_key_handle, key_handle, max_out_length, _))
+      .WillOnce(
+          RunOnceCallback<6>(actual_out_length, out_wrapped_key, result_code));
+
+  base::test::TestFuture<uint64_t, const std::vector<uint8_t>&, uint32_t>
+      waiter;
+  service_.WrapKey(session_id, mechanism_type, mechanism_parameter,
+                   wrapping_key_handle, key_handle, max_out_length,
+                   waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<0>(), actual_out_length);
+  EXPECT_EQ(waiter.Get<1>(), out_wrapped_key);
+  EXPECT_EQ(waiter.Get<2>(), result_code);
+}
+
+// Test that UnwrapKey correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, UnwrapKey) {
+  const uint64_t session_id = 11;
+  const uint64_t mechanism_type = 22;
+  const std::vector<uint8_t> mechanism_parameter = {3, 3};
+  const uint64_t wrapping_key_handle = 44;
+  const std::vector<uint8_t> wrapped_key = {5, 5};
+  const std::vector<uint8_t> attributes = {6, 6};
+  const uint64_t key_handle = 77;
+  const uint32_t result_code = 88;
+
+  EXPECT_CALL(*dbus_client_,
+              UnwrapKey(session_id, mechanism_type, mechanism_parameter,
+                        wrapping_key_handle, wrapped_key, attributes, _))
+      .WillOnce(RunOnceCallback<6>(key_handle, result_code));
+
+  base::test::TestFuture<uint64_t, uint32_t> waiter;
+  service_.UnwrapKey(session_id, mechanism_type, mechanism_parameter,
+                     wrapping_key_handle, wrapped_key, attributes,
+                     waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint64_t>(), key_handle);
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that DeriveKey correctly forwards the arguments to the dbus layer
+// and the result back from it.
+TEST_F(ChapsServiceAshTest, DeriveKey) {
+  const uint64_t session_id = 11;
+  const uint64_t mechanism_type = 22;
+  const std::vector<uint8_t> mechanism_parameter = {3, 3};
+  const uint64_t base_key_handle = 44;
+  const std::vector<uint8_t> attributes = {6, 6};
+  const uint64_t key_handle = 77;
+  const uint32_t result_code = 88;
+
+  EXPECT_CALL(*dbus_client_,
+              DeriveKey(session_id, mechanism_type, mechanism_parameter,
+                        base_key_handle, attributes, _))
+      .WillOnce(RunOnceCallback<5>(key_handle, result_code));
+
+  base::test::TestFuture<uint64_t, uint32_t> waiter;
+  service_.DeriveKey(session_id, mechanism_type, mechanism_parameter,
+                     base_key_handle, attributes, waiter.GetCallback());
+
+  EXPECT_EQ(waiter.Get<uint64_t>(), key_handle);
+  EXPECT_EQ(waiter.Get<uint32_t>(), result_code);
+}
+
+// Test that all methods correctly fail when dbus is not initialized.
+TEST_F(ChapsServiceAshTest, AllMethodsDbusClientIsNull) {
+  dbus_client_.reset();
+  {
+    base::test::TestFuture<const std::vector<uint64_t>&, uint32_t> waiter;
+    service_.GetSlotList(/*token_present=*/true, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<const std::vector<uint64_t>&, uint32_t> waiter;
+    service_.GetMechanismList(/*slot_id=*/0, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint64_t, uint32_t> waiter;
+    service_.OpenSession(/*slot_id=*/0, /*flags=*/0, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint32_t> waiter;
+    service_.CloseSession(/*session_id=*/0, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint64_t, uint32_t> waiter;
+    service_.CreateObject(/*session_id=*/0, /*attributes=*/{},
+                          waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint32_t> waiter;
+    service_.DestroyObject(/*session_id=*/0, /*object_handle=*/0,
+                           waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<const std::vector<uint8_t>&, uint32_t> waiter;
+    service_.GetAttributeValue(/*session_id=*/0, /*object_handle=*/0,
+                               /*attributes=*/{}, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint32_t> waiter;
+    service_.SetAttributeValue(/*session_id=*/0, /*object_handle=*/0,
+                               /*attributes=*/{}, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint32_t> waiter;
+    service_.FindObjectsInit(/*session_id=*/0, /*attributes=*/{},
+                             waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<const std::vector<uint64_t>&, uint32_t> waiter;
+    service_.FindObjects(/*session_id=*/0, /*max_object_count=*/0,
+                         waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint32_t> waiter;
+    service_.FindObjectsFinal(/*session_id=*/0, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint32_t> waiter;
+    service_.EncryptInit(/*session_id=*/0, /*mechanism_type=*/0,
+                         /*mechanism_parameter=*/{},
+                         /*key_handle=*/0, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint64_t, const std::vector<uint8_t>&, uint32_t>
+        waiter;
+    service_.Encrypt(/*session_id=*/0,
+                     /*data=*/{},
+                     /*max_out_length=*/0, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint32_t> waiter;
+    service_.DecryptInit(/*session_id=*/0, /*mechanism_type=*/0,
+                         /*mechanism_parameter=*/{},
+                         /*key_handle=*/0, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint64_t, const std::vector<uint8_t>&, uint32_t>
+        waiter;
+    service_.Decrypt(/*session_id=*/0,
+                     /*data=*/{},
+                     /*max_out_length=*/0, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint32_t> waiter;
+    service_.SignInit(/*session_id=*/0, /*mechanism_type=*/0,
+                      /*mechanism_parameter=*/{},
+                      /*key_handle=*/0, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint64_t, const std::vector<uint8_t>&, uint32_t>
+        waiter;
+    service_.Sign(/*session_id=*/0,
+                  /*data=*/{},
+                  /*max_out_length=*/0, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint64_t, uint64_t, uint32_t> waiter;
+    service_.GenerateKeyPair(/*session_id=*/0, /*mechanism_type=*/0,
+                             /*mechanism_parameter=*/{},
+                             /*public_attributes=*/{},
+                             /*private_attributes=*/{}, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint64_t, uint32_t> waiter;
+    service_.UnwrapKey(/*session_id=*/0, /*mechanism_type=*/0,
+                       /*mechanism_parameter=*/{},
+                       /*wrapping_key_handle=*/0,
+                       /*wrapped_key=*/{},
+                       /*attributes=*/{}, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+  {
+    base::test::TestFuture<uint64_t, uint32_t> waiter;
+    service_.DeriveKey(/*session_id=*/0, /*mechanism_type=*/0,
+                       /*mechanism_parameter=*/{},
+                       /*base_key_handle=*/0,
+                       /*attributes=*/{}, waiter.GetCallback());
+    EXPECT_EQ(waiter.Get<uint32_t>(), chaps::CKR_DBUS_CLIENT_IS_NULL);
+  }
+}
+
+}  // namespace
+}  // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.cc b/chrome/browser/ash/crosapi/crosapi_ash.cc
index e56bb83..afedba4 100644
--- a/chrome/browser/ash/crosapi/crosapi_ash.cc
+++ b/chrome/browser/ash/crosapi/crosapi_ash.cc
@@ -31,6 +31,7 @@
 #include "chrome/browser/ash/crosapi/browser_version_service_ash.h"
 #include "chrome/browser/ash/crosapi/cert_database_ash.h"
 #include "chrome/browser/ash/crosapi/cert_provisioning_ash.h"
+#include "chrome/browser/ash/crosapi/chaps_service_ash.h"
 #include "chrome/browser/ash/crosapi/chrome_app_kiosk_service_ash.h"
 #include "chrome/browser/ash/crosapi/chrome_app_window_tracker_ash.h"
 #include "chrome/browser/ash/crosapi/clipboard_ash.h"
@@ -211,6 +212,7 @@
           std::make_unique<GuestOsSkForwarderFactoryAsh>()),
       cert_database_ash_(std::make_unique<CertDatabaseAsh>()),
       cert_provisioning_ash_(std::make_unique<CertProvisioningAsh>()),
+      chaps_service_ash_(std::make_unique<ChapsServiceAsh>()),
       chrome_app_kiosk_service_ash_(
           std::make_unique<ChromeAppKioskServiceAsh>()),
       chrome_app_window_tracker_ash_(
@@ -419,6 +421,11 @@
   cert_provisioning_ash_->BindReceiver(std::move(receiver));
 }
 
+void CrosapiAsh::BindChapsService(
+    mojo::PendingReceiver<mojom::ChapsService> receiver) {
+  chaps_service_ash_->BindReceiver(std::move(receiver));
+}
+
 void CrosapiAsh::BindChromeAppKioskService(
     mojo::PendingReceiver<mojom::ChromeAppKioskService> receiver) {
   chrome_app_kiosk_service_ash_->BindReceiver(std::move(receiver));
diff --git a/chrome/browser/ash/crosapi/crosapi_ash.h b/chrome/browser/ash/crosapi/crosapi_ash.h
index e6d260f4..fbcea73 100644
--- a/chrome/browser/ash/crosapi/crosapi_ash.h
+++ b/chrome/browser/ash/crosapi/crosapi_ash.h
@@ -52,6 +52,7 @@
 class GuestOsSkForwarderFactoryAsh;
 class CertDatabaseAsh;
 class CertProvisioningAsh;
+class ChapsServiceAsh;
 class ChromeAppKioskServiceAsh;
 class ChromeAppWindowTrackerAsh;
 class ClipboardAsh;
@@ -180,6 +181,8 @@
       mojo::PendingReceiver<mojom::CertDatabase> receiver) override;
   void BindCertProvisioning(
       mojo::PendingReceiver<mojom::CertProvisioning> receiver) override;
+  void BindChapsService(
+      mojo::PendingReceiver<mojom::ChapsService> receiver) override;
   void BindChromeAppKioskService(
       mojo::PendingReceiver<mojom::ChromeAppKioskService> receiver) override;
   void BindChromeAppPublisher(
@@ -423,6 +426,8 @@
     return cert_provisioning_ash_.get();
   }
 
+  ChapsServiceAsh* chaps_service_ash() { return chaps_service_ash_.get(); }
+
   ChromeAppKioskServiceAsh* chrome_app_kiosk_service() {
     return chrome_app_kiosk_service_ash_.get();
   }
@@ -598,6 +603,7 @@
       guest_os_sk_forwarder_factory_ash_;
   std::unique_ptr<CertDatabaseAsh> cert_database_ash_;
   std::unique_ptr<CertProvisioningAsh> cert_provisioning_ash_;
+  std::unique_ptr<ChapsServiceAsh> chaps_service_ash_;
   std::unique_ptr<ChromeAppKioskServiceAsh> chrome_app_kiosk_service_ash_;
   std::unique_ptr<ChromeAppWindowTrackerAsh> chrome_app_window_tracker_ash_;
   std::unique_ptr<ClipboardAsh> clipboard_ash_;
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc
index 3a0418f..e29f96b 100644
--- a/chrome/browser/ash/crosapi/crosapi_util.cc
+++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -58,6 +58,7 @@
 #include "chromeos/crosapi/mojom/browser_app_instance_registry.mojom.h"
 #include "chromeos/crosapi/mojom/cert_database.mojom.h"
 #include "chromeos/crosapi/mojom/cert_provisioning.mojom.h"
+#include "chromeos/crosapi/mojom/chaps_service.mojom.h"
 #include "chromeos/crosapi/mojom/chrome_app_kiosk_service.mojom.h"
 #include "chromeos/crosapi/mojom/clipboard.mojom.h"
 #include "chromeos/crosapi/mojom/clipboard_history.mojom.h"
@@ -303,7 +304,7 @@
   return {T::Uuid_, T::Version_};
 }
 
-static_assert(crosapi::mojom::Crosapi::Version_ == 124,
+static_assert(crosapi::mojom::Crosapi::Version_ == 125,
               "If you add a new crosapi, please add it to "
               "kInterfaceVersionEntries below.");
 
@@ -328,6 +329,7 @@
     MakeInterfaceVersionEntry<crosapi::mojom::BrowserVersionService>(),
     MakeInterfaceVersionEntry<crosapi::mojom::CertDatabase>(),
     MakeInterfaceVersionEntry<crosapi::mojom::CertProvisioning>(),
+    MakeInterfaceVersionEntry<crosapi::mojom::ChapsService>(),
     MakeInterfaceVersionEntry<crosapi::mojom::ChromeAppKioskService>(),
     MakeInterfaceVersionEntry<crosapi::mojom::Clipboard>(),
     MakeInterfaceVersionEntry<crosapi::mojom::ClipboardHistory>(),
diff --git a/chrome/browser/ash/events/event_rewriter_unittest.cc b/chrome/browser/ash/events/event_rewriter_unittest.cc
index f7f782f..12a2e9d 100644
--- a/chrome/browser/ash/events/event_rewriter_unittest.cc
+++ b/chrome/browser/ash/events/event_rewriter_unittest.cc
@@ -1204,12 +1204,8 @@
     EXPECT_EQ(LWinPressed(ui::EF_ALT_DOWN),
               RunRewriter(LWinPressed(ui::EF_ALT_DOWN)));
 
-    // TODO(b/312578988): This should be an identity transformation with
-    // RWinPressed as both the before and after event.
     // VKEY_RWIN (right Windows key), Alt modifier.
-    EXPECT_EQ(TestKeyEvent(ui::ET_KEY_PRESSED, ui::DomCode::META_RIGHT,
-                           ui::DomKey::META, ui::VKEY_LWIN,
-                           ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN),
+    EXPECT_EQ(RWinPressed(ui::EF_ALT_DOWN),
               RunRewriter(RWinPressed(ui::EF_ALT_DOWN)));
   }
 }
@@ -1261,12 +1257,8 @@
     EXPECT_EQ(LWinPressed(ui::EF_ALT_DOWN),
               RunRewriter(LWinPressed(ui::EF_ALT_DOWN)));
 
-    // TODO(b/312578988): This should be an identity transformation with
-    // RWinPressed as both the before and after event.
     // VKEY_RWIN (right Windows key), Alt modifier.
-    EXPECT_EQ(TestKeyEvent(ui::ET_KEY_PRESSED, ui::DomCode::META_RIGHT,
-                           ui::DomKey::META, ui::VKEY_LWIN,
-                           ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN),
+    EXPECT_EQ(RWinPressed(ui::EF_ALT_DOWN),
               RunRewriter(RWinPressed(ui::EF_ALT_DOWN)));
   }
 
diff --git a/chrome/browser/ash/extensions/file_manager/system_notification_manager.cc b/chrome/browser/ash/extensions/file_manager/system_notification_manager.cc
index 5b67ee4..2f94cff 100644
--- a/chrome/browser/ash/extensions/file_manager/system_notification_manager.cc
+++ b/chrome/browser/ash/extensions/file_manager/system_notification_manager.cc
@@ -1113,9 +1113,10 @@
 SystemNotificationManager::MakeDataProtectionPolicyProgressNotification(
     const std::string& notification_id,
     const ProgressStatus& status) {
-  // TODO(b/279435843): Replace with translation strings.
   std::u16string message =
-      u"Checking files with your organization's security policies.";
+      status.sources.size() > 1
+          ? GetStringUTF16(IDS_FILE_BROWSER_SCANNING_LABEL_PLURAL)
+          : GetStringUTF16(IDS_FILE_BROWSER_SCANNING_LABEL);
   int progress = status.sources_scanned * 100.0 / status.sources.size();
   return CreateIOTaskProgressNotification(status.task_id, notification_id,
                                           app_name_, message, /*paused=*/false,
diff --git a/chrome/browser/ash/extensions/file_manager/system_notification_manager_unittest.cc b/chrome/browser/ash/extensions/file_manager/system_notification_manager_unittest.cc
index 763536c8..6e5d76b2 100644
--- a/chrome/browser/ash/extensions/file_manager/system_notification_manager_unittest.cc
+++ b/chrome/browser/ash/extensions/file_manager/system_notification_manager_unittest.cc
@@ -45,6 +45,8 @@
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/storage_key/storage_key.h"
+#include "ui/base/l10n/l10n_util.h"
+#include "ui/chromeos/strings/grit/ui_chromeos_strings.h"
 
 namespace file_manager {
 namespace {
@@ -1116,7 +1118,7 @@
   // Check: the expected strings match.
   EXPECT_EQ(strings.title, u"Files");
   EXPECT_EQ(strings.message,
-            u"Checking files with your organization's security policies.");
+            l10n_util::GetStringUTF16(IDS_FILE_BROWSER_SCANNING_LABEL));
 
   // Send the success progress status.
   status.bytes_transferred = 100;
diff --git a/chrome/browser/ash/file_manager/copy_or_move_io_task_policy_impl.cc b/chrome/browser/ash/file_manager/copy_or_move_io_task_policy_impl.cc
index 1e2c100..db183792 100644
--- a/chrome/browser/ash/file_manager/copy_or_move_io_task_policy_impl.cc
+++ b/chrome/browser/ash/file_manager/copy_or_move_io_task_policy_impl.cc
@@ -360,6 +360,8 @@
 
   progress_->state = State::kScanning;
   progress_->sources_scanned = idx + 1;
+  // TODO(b/315783871): recursively count the files in directories and pass this
+  // value to the js side to show the proper singular/plural scanning label.
   progress_callback_.Run(*progress_);
 
   DCHECK_EQ(file_transfer_analysis_delegates_.size(),
diff --git a/chrome/browser/ash/file_manager/file_manager_string_util.cc b/chrome/browser/ash/file_manager/file_manager_string_util.cc
index fe4349a6..d832ee1 100644
--- a/chrome/browser/ash/file_manager/file_manager_string_util.cc
+++ b/chrome/browser/ash/file_manager/file_manager_string_util.cc
@@ -861,6 +861,7 @@
   SET_STRING("RENAME_BUTTON_LABEL", IDS_FILE_BROWSER_RENAME_BUTTON_LABEL);
   SET_STRING("SAVE_LABEL", IDS_FILE_BROWSER_SAVE_LABEL);
   SET_STRING("SCANNING_LABEL", IDS_FILE_BROWSER_SCANNING_LABEL);
+  SET_STRING("SCANNING_LABEL_PLURAL", IDS_FILE_BROWSER_SCANNING_LABEL_PLURAL);
   SET_STRING("SEARCH_DRIVE_HTML", IDS_FILE_BROWSER_SEARCH_DRIVE_HTML);
   SET_STRING("SEARCH_NO_MATCHING_FILES_HTML",
              IDS_FILE_BROWSER_SEARCH_NO_MATCHING_FILES_HTML);
diff --git a/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc b/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc
index f040b2a..6d119f3 100644
--- a/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc
+++ b/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc
@@ -418,6 +418,18 @@
   EXPECT_TRUE(InstallAttributes::Get()->IsCloudManaged());
 }
 
+IN_PROC_BROWSER_TEST_F(EnrollmentEmbeddedPolicyServerBase, GetDeviceId) {
+  host()->HandleAccelerator(LoginAcceleratorAction::kStartEnrollment);
+  OobeScreenWaiter(EnrollmentScreenView::kScreenId).Wait();
+  WaitForGaiaPageBackButtonUpdate();
+
+  SigninFrameJS().ExecuteAsync("gaia.chromeOSLogin.sendGetDeviceId()");
+  SigninFrameJS().CreateWaiter("gaia.chromeOSLogin.receivedDeviceId")->Wait();
+  std::string received_device_id =
+      SigninFrameJS().GetString("gaia.chromeOSLogin.receivedDeviceId");
+  EXPECT_TRUE(!received_device_id.empty());
+}
+
 // The test case is the same as
 // EnrollmentEmbeddedPolicyServerBase.ManualEnrollment but the environment is
 // different (simulate reven board, simulate state keys not being available).
diff --git a/chrome/browser/ash/policy/dlp/dlp_files_controller_ash.cc b/chrome/browser/ash/policy/dlp/dlp_files_controller_ash.cc
index f128ac36..947b8bfa 100644
--- a/chrome/browser/ash/policy/dlp/dlp_files_controller_ash.cc
+++ b/chrome/browser/ash/policy/dlp/dlp_files_controller_ash.cc
@@ -84,16 +84,6 @@
 // TODO(crbug.com/1366299): determine the value to use.
 constexpr size_t kEntriesLimit = 100;
 
-// Returns true if `file_path` is in My Files directory.
-bool IsInLocalFileSystem(Profile* profile, const base::FilePath& file_path) {
-  auto my_files_folder =
-      file_manager::util::GetMyFilesFolderForProfile(profile);
-  if (my_files_folder == file_path || my_files_folder.IsParent(file_path)) {
-    return true;
-  }
-  return false;
-}
-
 // Returns a `DlpFileDestination` with a source URL or component, based on
 // |app_update|. If neither URL nor component can be found, returns nullopt.
 std::optional<DlpFileDestination> GetFileDestinationForApp(
@@ -271,7 +261,7 @@
 
   // If the destination file path is in My Files, all files transfers should be
   // allowed.
-  if (IsInLocalFileSystem(profile_, destination.path())) {
+  if (IsInLocalFileSystem(destination.path())) {
     std::move(result_callback).Run(std::vector<storage::FileSystemURL>());
     return;
   }
@@ -280,7 +270,7 @@
   // If the copied file isn't in the local file system, or the file is in the
   // same file system as the destination, no restrictions should be applied.
   for (const auto& file : transferred_files) {
-    if (!IsInLocalFileSystem(profile_, file.path()) ||
+    if (!IsInLocalFileSystem(file.path()) ||
         file.IsInSameFileSystem(destination)) {
       continue;
     }
@@ -316,7 +306,7 @@
 
   ::dlp::GetFilesSourcesRequest request;
   for (const auto& file : files) {
-    if (IsInLocalFileSystem(profile_, file.path())) {
+    if (IsInLocalFileSystem(file.path())) {
       request.add_files_paths(file.path().value());
     }
   }
@@ -756,6 +746,16 @@
   return {};
 }
 
+bool DlpFilesControllerAsh::IsInLocalFileSystem(
+    const base::FilePath& file_path) {
+  auto my_files_folder =
+      file_manager::util::GetMyFilesFolderForProfile(profile_);
+  if (my_files_folder == file_path || my_files_folder.IsParent(file_path)) {
+    return true;
+  }
+  return false;
+}
+
 void DlpFilesControllerAsh::ShowDlpBlockedFiles(
     std::optional<file_manager::io_task::IOTaskId> task_id,
     std::vector<base::FilePath> blocked_files,
diff --git a/chrome/browser/ash/policy/dlp/dlp_files_controller_ash.h b/chrome/browser/ash/policy/dlp/dlp_files_controller_ash.h
index 6d979bc..bcd1baba 100644
--- a/chrome/browser/ash/policy/dlp/dlp_files_controller_ash.h
+++ b/chrome/browser/ash/policy/dlp/dlp_files_controller_ash.h
@@ -193,6 +193,8 @@
       Profile* profile,
       const base::FilePath& file_path) override;
 
+  bool IsInLocalFileSystem(const base::FilePath& file_path) override;
+
   void ShowDlpBlockedFiles(
       std::optional<file_manager::io_task::IOTaskId> task_id,
       std::vector<base::FilePath> blocked_files,
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc
index 3b36b5d..4c70533 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.cc
@@ -37,6 +37,7 @@
 #include "chrome/browser/ash/policy/reporting/metrics_reporting/cros_healthd_sampler_handlers/cros_healthd_sampler_handler.h"
 #include "chrome/browser/ash/policy/reporting/metrics_reporting/device_activity/device_activity_sampler.h"
 #include "chrome/browser/ash/policy/reporting/metrics_reporting/fatal_crash/fatal_crash_events_observer.h"
+#include "chrome/browser/ash/policy/reporting/metrics_reporting/kiosk_heartbeat/kiosk_heartbeat_telemetry_sampler.h"
 #include "chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_prefs.h"
 #include "chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_event_detector.h"
 #include "chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler.h"
@@ -86,6 +87,7 @@
 constexpr char kDelayedPeripheralTelemetry[] = "delayed_peripheral_telemetry";
 constexpr char kDisplaysTelemetry[] = "displays_telemetry";
 constexpr char kDeviceActivityTelemetry[] = "device_activity_telemetry";
+constexpr char kKioskHeartbeatTelemetry[] = "kiosk_heartbeat_telemetry";
 constexpr char kWebsiteTelemetry[] = "website_telemetry";
 
 }  // namespace
@@ -379,6 +381,7 @@
   InitAudioCollectors();
   InitDisplayCollectors();
   InitDeviceActivityCollector();
+  InitKioskHeartbeatTelemetryCollector();
 
   initial_upload_timer_.Start(FROM_HERE, GetUploadDelay(), this,
                               &MetricReportingManager::UploadTelemetry);
@@ -786,6 +789,24 @@
   samplers_.push_back(std::move(device_activity_sampler));
 }
 
+void MetricReportingManager::InitKioskHeartbeatTelemetryCollector() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  auto heartbeat_sampler = std::make_unique<KioskHeartbeatTelemetrySampler>();
+  InitPeriodicTelemetryCollector(
+      /*name=*/kKioskHeartbeatTelemetry,
+      /*sampler=*/heartbeat_sampler.get(),
+      /*queue=*/kiosk_heartbeat_telemetry_report_queue_.get(),
+      /*enable_setting_path=*/::ash::kHeartbeatEnabled,
+      /*enable_default_value=*/metrics::kHeartbeatTelemetryDefaultValue,
+      /*rate_setting_path=*/::ash::kHeartbeatFrequency,
+      /*default_rate=*/
+      metrics::GetDefaultCollectionRate(
+          metrics::kDefaultHeartbeatTelemetryCollectionRate),
+      /*rate_unit_to_ms=*/1,
+      /*init_delay=*/metrics::kDefaultHeartbeatTelemetryCollectionRate);
+  samplers_.push_back(std::move(heartbeat_sampler));
+}
+
 std::vector<CollectorBase*>
 MetricReportingManager::GetTelemetryCollectorsFromSetting(
     std::string_view setting_name) {
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.h b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.h
index 0efaaed..c68b8600 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.h
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager.h
@@ -283,6 +283,9 @@
   // Initializes a periodic collector that collects device activity state.
   void InitDeviceActivityCollector();
 
+  // Initializes a periodic collector that sends out heartbeat signals.
+  void InitKioskHeartbeatTelemetryCollector();
+
   base::TimeDelta GetUploadDelay() const;
 
   std::vector<CollectorBase*> GetTelemetryCollectorsFromSetting(
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager_unittest.cc
index e2e4dfb4..c7267be 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/metric_reporting_manager_unittest.cc
@@ -48,11 +48,14 @@
 #include "testing/gtest/include/gtest/gtest.h"
 
 using testing::_;
+using testing::AnyNumber;
 using testing::ByMove;
 using testing::Eq;
 using testing::IsNull;
 using testing::Ne;
+using testing::Not;
 using testing::NotNull;
+using testing::Pointer;
 using testing::Return;
 using testing::SizeIs;
 using testing::StrEq;
@@ -1100,14 +1103,47 @@
  protected:
   void SetUp() override {
     MetricReportingManagerTest::SetUp();
+    collector_count_ = 0;
     auto* const mock_delegate_ptr = mock_delegate_.get();
+
     ON_CALL(*mock_delegate_ptr, IsUserAffiliated).WillByDefault(Return(true));
     // Mock app service unavailability to eliminate noise.
     ON_CALL(*mock_delegate_ptr, IsAppServiceAvailableForProfile)
         .WillByDefault(Return(false));
+    ON_CALL(
+        *mock_delegate_ptr,
+        CreatePeriodicCollector(
+            /*sampler=*/_,
+            /*queue=*/heartbeat_queue_ptr_.get(),
+            /*report_settings=*/_,
+            /*enable_setting_path=*/::ash::kHeartbeatEnabled,
+            /*setting_enabled_default_value=*/
+            metrics::kHeartbeatTelemetryDefaultValue,
+            /*rate_setting_path=*/::ash::kHeartbeatFrequency, _, 1,
+            /*init_delay=*/metrics::kDefaultHeartbeatTelemetryCollectionRate))
+        .WillByDefault([&]() {
+          return std::make_unique<FakeCollector>(&collector_count_);
+        });
   }
+
+  int collector_count_;
 };
 
+TEST_F(KioskHeartbeatTelemetryTest, Disabled) {
+  auto* const mock_delegate_ptr = mock_delegate_.get();
+  auto metric_reporting_manager = MetricReportingManager::CreateForTesting(
+      std::move(mock_delegate_), nullptr);
+
+  // MetricReportQueue for KIOSK_HEARTBEAT_EVENTS must not be created for
+  // disabled flag kKioskHeartbeatsViaERP
+  EXPECT_CALL(*mock_delegate_ptr,
+              CreatePeriodicUploadReportQueue(
+                  _, Destination::KIOSK_HEARTBEAT_EVENTS, _, _, _, _, _, _))
+      .Times(0);
+
+  metric_reporting_manager->OnLogin(profile());
+}
+
 TEST_F(KioskHeartbeatTelemetryTest, Init) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
@@ -1123,21 +1159,41 @@
               CreatePeriodicUploadReportQueue(
                   _, Destination::KIOSK_HEARTBEAT_EVENTS, _, _, _, _, _, _))
       .Times(1);
-  metric_reporting_manager->OnLogin(profile());
-}
 
-TEST_F(KioskHeartbeatTelemetryTest, Disabled) {
-  auto* const mock_delegate_ptr = mock_delegate_.get();
-  auto metric_reporting_manager = MetricReportingManager::CreateForTesting(
-      std::move(mock_delegate_), nullptr);
+  // Ignore any other call to CreatePeriodicCollector -> irrelevant. Should
+  // be covered in other places.
+  EXPECT_CALL(
+      *mock_delegate_ptr,
+      CreatePeriodicCollector(_, Not(Pointer(heartbeat_queue_ptr_.get())), _, _,
+                              _, _, _, _, _))
+      .Times(AnyNumber());
+  // PeriodicCollector should be created here.
+  EXPECT_CALL(
+      *mock_delegate_ptr,
+      CreatePeriodicCollector(
+          /*sampler=*/_,
+          /*queue=*/heartbeat_queue_ptr_.get(),
+          /*report_settings=*/_,
+          /*enable_setting_path=*/::ash::kHeartbeatEnabled,
+          /*setting_enabled_default_value=*/
+          metrics::kHeartbeatTelemetryDefaultValue,
+          /*rate_setting_path=*/::ash::kHeartbeatFrequency, _, 1,
+          /*init_delay=*/metrics::kDefaultHeartbeatTelemetryCollectionRate))
+      .Times(1);
 
-  // MetricReportQueue for KIOSK_HEARTBEAT_EVENTS must not be created for
-  // disabled flag kKioskHeartbeatsViaERP
-  EXPECT_CALL(*mock_delegate_ptr,
-              CreatePeriodicUploadReportQueue(
-                  _, Destination::KIOSK_HEARTBEAT_EVENTS, _, _, _, _, _, _))
-      .Times(0);
   metric_reporting_manager->OnLogin(profile());
+  EXPECT_EQ(collector_count_, 1);
+
+  // Call Flush after initial delay
+  task_environment_.FastForwardBy(mock_delegate_->GetInitialUploadDelay() +
+                                  metrics::kInitialCollectionDelay);
+  EXPECT_EQ(telemetry_queue_ptr_->GetNumFlush(), 1);
+
+  // deprovision -> destruction
+  ON_CALL(*mock_delegate_ptr, IsDeprovisioned).WillByDefault(Return(true));
+  metric_reporting_manager->DeviceSettingsUpdated();
+
+  EXPECT_EQ(collector_count_, 0);
 }
 
 struct EventDrivenTelemetryCollectorPoolTestCase {
diff --git a/chrome/browser/autofill/autofill_across_iframes_browsertest.cc b/chrome/browser/autofill/autofill_across_iframes_browsertest.cc
index 57f18c59f..710e132 100644
--- a/chrome/browser/autofill/autofill_across_iframes_browsertest.cc
+++ b/chrome/browser/autofill/autofill_across_iframes_browsertest.cc
@@ -872,6 +872,14 @@
  public:
   bool submission_happens_in_main_frame() const { return GetParam(); }
 
+  void TearDownOnMainThread() override {
+    // RunUntilIdle() is necessary because otherwise, under the hood
+    // PasswordFormManager::OnFetchComplete() callback is run after this test is
+    // destroyed meaning that OsCryptImpl will be used instead of OsCryptMocker,
+    // causing this test to fail.
+    base::RunLoop().RunUntilIdle();
+  }
+
   // Creates a simple cross-frame form with <form> elements so we can submit the
   // form in the iframe and the main frame.
   //
@@ -906,14 +914,8 @@
                          ::testing::Bool());
 
 // Tests that submission of a cross-frame form is detected in the main frame.
-// TODO(crbug.com/1510056): Test is flaky on Linux.
-#if BUILDFLAG(IS_LINUX)
-#define MAYBE_SubmissionGetsDetected DISABLED_SubmissionGetsDetected
-#else
-#define MAYBE_SubmissionGetsDetected SubmissionGetsDetected
-#endif
 IN_PROC_BROWSER_TEST_P(AutofillAcrossIframesTest_Submission,
-                       MAYBE_SubmissionGetsDetected) {
+                       SubmissionGetsDetected) {
   const FormStructure* form = LoadForm({"$2", "$2", "$2"});
   ASSERT_TRUE(form);
   ASSERT_THAT(FillForm(*form, *form->field(1)),
diff --git a/chrome/browser/autofill/autofill_autocomplete_browsertest.cc b/chrome/browser/autofill/autofill_autocomplete_browsertest.cc
index 5cd488d..2e141f7 100644
--- a/chrome/browser/autofill/autofill_autocomplete_browsertest.cc
+++ b/chrome/browser/autofill/autofill_autocomplete_browsertest.cc
@@ -67,6 +67,10 @@
   }
 
   void TearDownOnMainThread() override {
+    // RunUntilIdle() is necessary because otherwise, under the hood
+    // PasswordFormManager::OnFetchComplete() callback is run after this test is
+    // destroyed meaning that OsCryptImpl will be used instead of OsCryptMocker,
+    // causing this test to fail.
     base::RunLoop().RunUntilIdle();
     // Make sure to close any showing popups prior to tearing down the UI.
     content::WebContents* web_contents =
diff --git a/chrome/browser/autofill/autofill_browsertest.cc b/chrome/browser/autofill/autofill_browsertest.cc
index 357a1f5..639c5a95 100644
--- a/chrome/browser/autofill/autofill_browsertest.cc
+++ b/chrome/browser/autofill/autofill_browsertest.cc
@@ -113,6 +113,10 @@
   }
 
   void TearDownOnMainThread() override {
+    // RunUntilIdle() is necessary because otherwise, under the hood
+    // PasswordFormManager::OnFetchComplete() callback is run after this test is
+    // destroyed meaning that OsCryptImpl will be used instead of OsCryptMocker,
+    // causing this test to fail.
     base::RunLoop().RunUntilIdle();
     // Make sure to close any showing popups prior to tearing down the UI.
     ContentAutofillDriverFactory::FromWebContents(web_contents())
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_copy_or_move_hook_delegate_unittest.cc b/chrome/browser/chromeos/policy/dlp/dlp_copy_or_move_hook_delegate_unittest.cc
index 681849e..234aab178 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_copy_or_move_hook_delegate_unittest.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_copy_or_move_hook_delegate_unittest.cc
@@ -52,6 +52,11 @@
               (Profile * profile, const base::FilePath& file_path),
               (override));
 
+  MOCK_METHOD(bool,
+              IsInLocalFileSystem,
+              (const base::FilePath& file_path),
+              (override));
+
   MOCK_METHOD(void,
               ShowDlpBlockedFiles,
               (absl::optional<uint64_t> task_id,
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_files_controller.cc b/chrome/browser/chromeos/policy/dlp/dlp_files_controller.cc
index a4da498..c08730d7 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_files_controller.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_files_controller.cc
@@ -16,7 +16,6 @@
 #include "chrome/browser/chromeos/policy/dlp/dlp_scoped_file_access_delegate.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/common/chrome_paths.h"
 #include "chromeos/dbus/dlp/dlp_client.h"
 #include "chromeos/dbus/dlp/dlp_service.pb.h"
 #include "components/enterprise/data_controls/component.h"
@@ -104,16 +103,6 @@
                                                 std::move(add_file_callback));
 }
 
-// Returns true if `file_path` is in My Files directory.
-bool IsInLocalFileSystem(const base::FilePath& file_path) {
-  base::FilePath my_files_folder;
-  base::PathService::Get(chrome::DIR_USER_DOCUMENTS, &my_files_folder);
-  if (my_files_folder == file_path || my_files_folder.IsParent(file_path)) {
-    return true;
-  }
-  return false;
-}
-
 // Converts DataTransferEndpoint object to DlpFileDestination.
 DlpFileDestination DTEndpointToFileDestination(
     const ui::DataTransferEndpoint* endpoint) {
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_files_controller.h b/chrome/browser/chromeos/policy/dlp/dlp_files_controller.h
index 2d803dd2..daba967 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_files_controller.h
+++ b/chrome/browser/chromeos/policy/dlp/dlp_files_controller.h
@@ -176,6 +176,9 @@
                                    std::vector<base::FilePath> blocked_files,
                                    dlp::FileAction action) = 0;
 
+  // Returns true if `file_path` is in My Files directory.
+  virtual bool IsInLocalFileSystem(const base::FilePath& file_path) = 0;
+
   // Checks whether pasting or dropping the given `files` to `destination` is
   // allowed by constructing a CheckFilesTransfer request that is forwarded  to
   // the DLP daemon.
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_files_controller_lacros.cc b/chrome/browser/chromeos/policy/dlp/dlp_files_controller_lacros.cc
index af87bde..0363c86 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_files_controller_lacros.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_files_controller_lacros.cc
@@ -8,6 +8,7 @@
 #include "chrome/browser/chromeos/policy/dlp/dlp_file_destination.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h"
 #include "chrome/browser/profiles/profile_manager.h"
+#include "chrome/common/chrome_paths.h"
 #include "chrome/common/chrome_paths_lacros.h"
 
 namespace policy {
@@ -47,6 +48,16 @@
   return {};
 }
 
+bool DlpFilesControllerLacros::IsInLocalFileSystem(
+    const base::FilePath& file_path) {
+  base::FilePath my_files_folder;
+  base::PathService::Get(chrome::DIR_USER_DOCUMENTS, &my_files_folder);
+  if (my_files_folder == file_path || my_files_folder.IsParent(file_path)) {
+    return true;
+  }
+  return false;
+}
+
 void DlpFilesControllerLacros::ShowDlpBlockedFiles(
     absl::optional<uint64_t> task_id,
     std::vector<base::FilePath> blocked_files,
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_files_controller_lacros.h b/chrome/browser/chromeos/policy/dlp/dlp_files_controller_lacros.h
index a29cd7a..354c4b3 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_files_controller_lacros.h
+++ b/chrome/browser/chromeos/policy/dlp/dlp_files_controller_lacros.h
@@ -23,6 +23,7 @@
   absl::optional<data_controls::Component> MapFilePathToPolicyComponent(
       Profile* profile,
       const base::FilePath& file_path) override;
+  bool IsInLocalFileSystem(const base::FilePath& file_path) override;
   void ShowDlpBlockedFiles(absl::optional<uint64_t> task_id,
                            std::vector<base::FilePath> blocked_files,
                            dlp::FileAction action) override;
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_files_controller_unittest.cc b/chrome/browser/chromeos/policy/dlp/dlp_files_controller_unittest.cc
index cb45808..1b378296 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_files_controller_unittest.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_files_controller_unittest.cc
@@ -46,6 +46,11 @@
               (Profile * profile, const base::FilePath& file_path),
               (override));
 
+  MOCK_METHOD(bool,
+              IsInLocalFileSystem,
+              (const base::FilePath& file_path),
+              (override));
+
   MOCK_METHOD(void,
               ShowDlpBlockedFiles,
               (absl::optional<uint64_t> task_id,
@@ -171,6 +176,9 @@
   EXPECT_CALL(*files_controller_, MapFilePathToPolicyComponent)
       .WillOnce(testing::Return(absl::nullopt))
       .WillOnce(testing::Return(absl::nullopt));
+  EXPECT_CALL(*files_controller_, IsInLocalFileSystem)
+      .WillOnce(testing::Return(true))
+      .WillOnce(testing::Return(true));
   files_controller_->RequestCopyAccess(source, destination,
                                        file_access_future.GetCallback());
   std::unique_ptr<file_access::ScopedFileAccess> file_access =
@@ -243,6 +251,9 @@
       file_access_future;
 
   ASSERT_TRUE(files_controller_);
+  EXPECT_CALL(*files_controller_, IsInLocalFileSystem)
+      .WillOnce(testing::Return(true))
+      .WillOnce(testing::Return(true));
   files_controller_->RequestCopyAccess(source, destination,
                                        file_access_future.GetCallback());
   EXPECT_TRUE(file_access_future.Get()->is_allowed());
@@ -288,6 +299,9 @@
       file_access_future;
 
   ASSERT_TRUE(files_controller_);
+  EXPECT_CALL(*files_controller_, IsInLocalFileSystem)
+      .WillOnce(testing::Return(true))
+      .WillOnce(testing::Return(true));
   files_controller_->RequestCopyAccess(source, destination,
                                        file_access_future.GetCallback());
   EXPECT_TRUE(file_access_future.Get()->is_allowed());
@@ -381,6 +395,8 @@
 
   base::test::TestFuture<std::unique_ptr<file_access::ScopedFileAccess>> future;
   ASSERT_TRUE(files_controller_);
+  EXPECT_CALL(*files_controller_, IsInLocalFileSystem)
+      .WillOnce(testing::Return(true));
   files_controller_->RequestCopyAccess(source, storage::FileSystemURL(),
                                        future.GetCallback());
   EXPECT_TRUE(future.Get()->is_allowed());
@@ -429,6 +445,8 @@
 
   base::test::TestFuture<std::unique_ptr<file_access::ScopedFileAccess>> future;
   ASSERT_TRUE(files_controller_);
+  EXPECT_CALL(*files_controller_, IsInLocalFileSystem)
+      .WillOnce(testing::Return(true));
   files_controller_->RequestCopyAccess(source, storage::FileSystemURL(),
                                        future.GetCallback());
   EXPECT_FALSE(future.Get()->is_allowed());
@@ -462,6 +480,9 @@
 
   base::test::TestFuture<std::unique_ptr<file_access::ScopedFileAccess>> future;
   ASSERT_TRUE(files_controller_);
+  EXPECT_CALL(*files_controller_, IsInLocalFileSystem)
+      .WillOnce(testing::Return(true))
+      .WillOnce(testing::Return(false));
   files_controller_->RequestCopyAccess(source, destination,
                                        future.GetCallback());
   EXPECT_FALSE(future.Get()->is_allowed());
@@ -487,6 +508,9 @@
 
   base::test::TestFuture<bool> future;
   ASSERT_TRUE(files_controller_);
+  EXPECT_CALL(*files_controller_, IsInLocalFileSystem)
+      .WillOnce(testing::Return(true));
+
   files_controller_->CheckIfPasteOrDropIsAllowed({file_path1}, &data_dst,
                                                  future.GetCallback());
 
@@ -533,6 +557,9 @@
               ShowDlpBlockedFiles(/*task_id=*/{absl::nullopt},
                                   std::vector<base::FilePath>{file_path2},
                                   dlp::FileAction::kCopy));
+  EXPECT_CALL(*files_controller_, IsInLocalFileSystem)
+      .WillOnce(testing::Return(false))
+      .WillOnce(testing::Return(true));
 
   const ui::DataTransferEndpoint data_dst((GURL(kExampleUrl1)));
 
@@ -568,6 +595,8 @@
 
   base::test::TestFuture<bool> future;
   ASSERT_TRUE(files_controller_);
+  EXPECT_CALL(*files_controller_, IsInLocalFileSystem)
+      .WillOnce(testing::Return(true));
   files_controller_->SetFileSystemContextForTesting(nullptr);
   files_controller_->CheckIfPasteOrDropIsAllowed({file_path1}, &data_dst,
                                                  future.GetCallback());
diff --git a/chrome/browser/chromeos/policy/dlp/dlp_scoped_file_access_delegate_browsertest.cc b/chrome/browser/chromeos/policy/dlp/dlp_scoped_file_access_delegate_browsertest.cc
index 0a160cc..aa3c61e 100644
--- a/chrome/browser/chromeos/policy/dlp/dlp_scoped_file_access_delegate_browsertest.cc
+++ b/chrome/browser/chromeos/policy/dlp/dlp_scoped_file_access_delegate_browsertest.cc
@@ -471,6 +471,11 @@
               (Profile * profile, const base::FilePath& file_path),
               (override));
 
+  MOCK_METHOD(bool,
+              IsInLocalFileSystem,
+              (const base::FilePath& file_path),
+              (override));
+
   MOCK_METHOD(void,
               ShowDlpBlockedFiles,
               (absl::optional<uint64_t> task_id,
diff --git a/chrome/browser/chromeos/reporting/metric_default_utils.h b/chrome/browser/chromeos/reporting/metric_default_utils.h
index f0f1d94f..7577620 100644
--- a/chrome/browser/chromeos/reporting/metric_default_utils.h
+++ b/chrome/browser/chromeos/reporting/metric_default_utils.h
@@ -28,6 +28,10 @@
 constexpr base::TimeDelta kDefaultDeviceActivityHeartbeatCollectionRate =
     base::Minutes(15);
 
+// Default Kiosk Heartbeat activity collecation rate
+constexpr base::TimeDelta kDefaultHeartbeatTelemetryCollectionRate =
+    base::Minutes(2);
+
 // Default event checking rate for testing purposes.
 constexpr base::TimeDelta kDefaultEventCheckingRateForTesting =
     base::Minutes(1);
@@ -123,6 +127,9 @@
 // reporting is disabled by default.
 constexpr bool kReportWebsiteActivityEnabledDefaultValue = false;
 
+// Default value for kHeartbeatTelemetry heartbeats to be sent
+constexpr bool kHeartbeatTelemetryDefaultValue = false;
+
 // Returns the default report upload frequency for the current environment.
 const base::TimeDelta GetDefaultReportUploadFrequency();
 
diff --git a/chrome/browser/devtools/protocol/autofill_handler.cc b/chrome/browser/devtools/protocol/autofill_handler.cc
index 8a57c13..f19a758 100644
--- a/chrome/browser/devtools/protocol/autofill_handler.cc
+++ b/chrome/browser/devtools/protocol/autofill_handler.cc
@@ -264,9 +264,9 @@
             autofill_field->Type().GetStorableType();
     filled_fields_to_be_sent_to_devtools->push_back(
         protocol::Autofill::FilledField::Create()
-            .SetId(base::UTF16ToASCII(autofill_field->id_attribute))
-            .SetName(base::UTF16ToASCII(autofill_field->name_attribute))
-            .SetValue(base::UTF16ToASCII(field->value))
+            .SetId(base::UTF16ToUTF8(autofill_field->id_attribute))
+            .SetName(base::UTF16ToUTF8(autofill_field->name_attribute))
+            .SetValue(base::UTF16ToUTF8(field->value))
             .SetHtmlType(std::string(
                 autofill::FormControlTypeToString(field->form_control_type)))
             .SetAutofillType(
@@ -286,7 +286,7 @@
   // Devtools is already in english, so we can default the local to en-US.
   const std::string locale = "en-US";
   autofill::GetAddressComponents(
-      base::UTF16ToASCII(profile_used_to_fill_form->GetInfo(
+      base::UTF16ToUTF8(profile_used_to_fill_form->GetInfo(
           autofill::ServerFieldType::ADDRESS_HOME_COUNTRY, locale)),
       locale,
       /*include_literals=*/false, &components, nullptr);
@@ -311,7 +311,7 @@
       profile_values->push_back(
           protocol::Autofill::AddressField::Create()
               .SetName(FieldTypeToString(component.field))
-              .SetValue(base::UTF16ToASCII(
+              .SetValue(base::UTF16ToUTF8(
                   profile_used_to_fill_form->GetInfo(component.field, locale)))
               .Build());
     }
diff --git a/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc b/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc
index 8cdf2a2d2..fc4a779d 100644
--- a/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc
+++ b/chrome/browser/devtools/protocol/devtools_autofill_browsertest.cc
@@ -47,12 +47,12 @@
 auto FilledFieldHasAttributeWithValue16(const std::string& attribute,
                                         const std::u16string& expected_value) {
   return FilledFieldHasAttributeWithValue(attribute,
-                                          base::UTF16ToASCII(expected_value));
+                                          base::UTF16ToUTF8(expected_value));
 }
 
 std::string GetProfileInfoFromAddressField(const AutofillProfile profile,
                                            const base::Value& address_field) {
-  return base::UTF16ToASCII(profile.GetRawInfo(TypeNameToFieldType(
+  return base::UTF16ToUTF8(profile.GetRawInfo(TypeNameToFieldType(
       *address_field.GetDict().FindStringByDottedPath("name"))));
 }
 
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 8c669807..0f58a70 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2163,11 +2163,6 @@
     "expiry_milestone": -1
   },
   {
-    "name": "enable-bookmarks-account-storage",
-    "owners": [ "jlebel@chromium.org", "bsazonov@chromium.org", "chrome-signin-team@google.com" ],
-    "expiry_milestone": 118
-  },
-  {
     "name": "enable-borderless-printing",
     "owners": [ "bryancain@chromium.org", "project-bolton-eng@google.com" ],
     "expiry_milestone": 122
diff --git a/chrome/browser/lacros/chaps_service_lacros_browsertest.cc b/chrome/browser/lacros/chaps_service_lacros_browsertest.cc
new file mode 100644
index 0000000..99aed8f
--- /dev/null
+++ b/chrome/browser/lacros/chaps_service_lacros_browsertest.cc
@@ -0,0 +1,227 @@
+// 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/in_process_browser_test.h"
+#include "chromeos/constants/pkcs11_definitions.h"
+#include "chromeos/crosapi/mojom/chaps_service.mojom-test-utils.h"
+#include "chromeos/lacros/lacros_service.h"
+#include "content/public/test/browser_test.h"
+#include "third_party/cros_system_api/dbus/chaps/dbus-constants.h"
+
+using crosapi::mojom::ChapsService;
+using crosapi::mojom::Crosapi;
+
+namespace {
+
+class ChapsLacrosBrowserTest : public InProcessBrowserTest {
+ public:
+ protected:
+  bool ShouldSkip() {
+    chromeos::LacrosService* service = chromeos::LacrosService::Get();
+    const int required_version = static_cast<int>(
+        Crosapi::MethodMinVersions::kBindChapsServiceMinVersion);
+    if ((service->GetInterfaceVersion<Crosapi>() < required_version) &&
+        !service->IsSupported<ChapsService>()) {
+      return true;
+    }
+    return false;
+  }
+
+  mojo::Remote<ChapsService>& chaps_remote() {
+    return chromeos::LacrosService::Get()->GetRemote<ChapsService>();
+  }
+};
+
+// Test that all mojom::ChapsService methods are callable from Lacros. All of
+// them are expected to fail in the browser test because Ash-on-Linux doesn't
+// have a way to actually talk to Chaps (the FakeChapsClient is used instead and
+// at the moment it always returns errors).
+IN_PROC_BROWSER_TEST_F(ChapsLacrosBrowserTest, AllMethodsAreCallable) {
+  if (ShouldSkip()) {
+    GTEST_SKIP();
+  }
+
+  crosapi::mojom::ChapsServiceAsyncWaiter async_waiter(chaps_remote().get());
+
+  {
+    std::vector<uint64_t> out_slot_list;
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.GetSlotList(/*token_present=*/true, &out_slot_list,
+                             &out_result);
+    EXPECT_TRUE(out_slot_list.empty());
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    std::vector<uint64_t> out_mechanism_list;
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.GetMechanismList(/*token_present=*/true, &out_mechanism_list,
+                                  &out_result);
+    EXPECT_TRUE(out_mechanism_list.empty());
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint64_t out_session_id = static_cast<uint64_t>(-1);
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.OpenSession(/*slot_id=*/0, /*flags=*/0, &out_session_id,
+                             &out_result);
+    EXPECT_EQ(out_session_id, 0u);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.CloseSession(/*session_id=*/0, &out_result);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint64_t out_new_object_handle = static_cast<uint64_t>(-1);
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.CreateObject(
+        /*session_id=*/0, /*attributes=*/{}, &out_new_object_handle,
+        &out_result);
+    EXPECT_EQ(out_new_object_handle, 0u);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.DestroyObject(
+        /*session_id=*/0, /*object_handle=*/0, &out_result);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    std::vector<uint8_t> out_attributes_out;
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.GetAttributeValue(
+        /*session_id=*/0, /*object_handle=*/0,
+        /*attributes_in=*/{}, &out_attributes_out, &out_result);
+    EXPECT_TRUE(out_attributes_out.empty());
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.SetAttributeValue(
+        /*session_id=*/0, /*object_handle=*/0,
+        /*attributes=*/{}, &out_result);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.FindObjectsInit(
+        /*session_id=*/0, /*attributes=*/{}, &out_result);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    std::vector<uint64_t> out_object_list;
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.FindObjects(
+        /*session_id=*/0, /*max_object_count=*/0, &out_object_list,
+        &out_result);
+    EXPECT_TRUE(out_object_list.empty());
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.FindObjectsFinal(/*session_id=*/0, &out_result);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.EncryptInit(
+        /*session_id=*/0, /*mechanism_type=*/0, /*mechanism_parameter=*/{},
+        /*key_handle=*/0, &out_result);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint64_t actual_out_length = static_cast<uint64_t>(-1);
+    std::vector<uint8_t> data;
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.Encrypt(
+        /*session_id=*/0, /*data=*/{}, /*max_out_length=*/0, &actual_out_length,
+        &data, &out_result);
+    EXPECT_EQ(actual_out_length, 0u);
+    EXPECT_TRUE(data.empty());
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.DecryptInit(
+        /*session_id=*/0, /*mechanism_type=*/0, /*mechanism_parameter=*/{},
+        /*key_handle=*/0, &out_result);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint64_t actual_out_length = static_cast<uint64_t>(-1);
+    std::vector<uint8_t> data;
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.Decrypt(
+        /*session_id=*/0, /*data=*/{}, /*max_out_length=*/0, &actual_out_length,
+        &data, &out_result);
+    EXPECT_EQ(actual_out_length, 0u);
+    EXPECT_TRUE(data.empty());
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.SignInit(
+        /*session_id=*/0, /*mechanism_type=*/0, /*mechanism_parameter=*/{},
+        /*key_handle=*/0, &out_result);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint64_t actual_out_length = static_cast<uint64_t>(-1);
+    std::vector<uint8_t> signature;
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.Sign(
+        /*session_id=*/0, /*data=*/{}, /*max_out_length=*/0, &actual_out_length,
+        &signature, &out_result);
+    EXPECT_EQ(actual_out_length, 0u);
+    EXPECT_TRUE(signature.empty());
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint64_t out_public_key_handle = static_cast<uint64_t>(-1);
+    uint64_t out_private_key_handle = static_cast<uint64_t>(-1);
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.GenerateKeyPair(
+        /*session_id=*/0, /*mechanism_type=*/0,
+        /*mechanism_parameter=*/{},
+        /*public_attributes=*/{},
+        /*private_attributes=*/{}, &out_public_key_handle,
+        &out_private_key_handle, &out_result);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint64_t actual_out_length = static_cast<uint64_t>(-1);
+    std::vector<uint8_t> wrapped_key;
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.WrapKey(
+        /*session_id=*/0, /*mechanism_type=*/0, /*mechanism_parameter=*/{},
+        /*wrapping_key_handle=*/0, /*key_handle=*/0, /*max_out_length=*/0,
+        &actual_out_length, &wrapped_key, &out_result);
+    EXPECT_EQ(actual_out_length, 0u);
+    EXPECT_TRUE(wrapped_key.empty());
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint64_t out_key_handle = static_cast<uint64_t>(-1);
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.UnwrapKey(
+        /*session_id=*/0, /*mechanism_type=*/0,
+        /*mechanism_parameter=*/{},
+        /*wrapping_key_handle=*/0,
+        /*wrapped_key=*/{}, /*attributes=*/{}, &out_key_handle, &out_result);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+  {
+    uint64_t out_key_handle = static_cast<uint64_t>(-1);
+    uint32_t out_result = static_cast<uint32_t>(-1);
+    async_waiter.DeriveKey(
+        /*session_id=*/0, /*mechanism_type=*/0,
+        /*mechanism_parameter=*/{},
+        /*base_key_handle=*/0,
+        /*attributes=*/{}, &out_key_handle, &out_result);
+    EXPECT_EQ(out_result, chromeos::PKCS11_CKR_GENERAL_ERROR);
+  }
+}
+
+}  // namespace
diff --git a/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc b/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
index 32ee550..2d1ca32 100644
--- a/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
+++ b/chrome/browser/media/webrtc/webrtc_video_display_perf_browsertest.cc
@@ -118,59 +118,6 @@
   }
 }
 
-content::WebContents* OpenWebrtcInternalsTab(Browser* browser) {
-  chrome::AddTabAt(browser, GURL(url::kAboutBlankURL), -1, true);
-  EXPECT_TRUE(
-      ui_test_utils::NavigateToURL(browser, GURL("chrome://webrtc-internals")));
-  return browser->tab_strip_model()->GetActiveWebContents();
-}
-
-std::vector<double> ParseGoogMaxDecodeFromWebrtcInternalsTab(
-    const std::string& webrtc_internals_stats_json) {
-  std::vector<double> goog_decode_ms;
-
-  absl::optional<base::Value> parsed_json =
-      base::JSONReader::Read(webrtc_internals_stats_json);
-  if (!parsed_json || !parsed_json->is_dict())
-    return goog_decode_ms;
-  const base::Value::Dict& dictionary = parsed_json->GetDict();
-
-  // |dictionary| should have exactly two entries, one per ssrc.
-  if (dictionary.size() != 2u)
-    return goog_decode_ms;
-
-  // Only a given |dictionary| entry will have a "stats" entry that has a key
-  // that ends with "recv-googMaxDecodeMs" inside (it will start with the ssrc
-  // id, but we don't care about that). Then collect the string of "values" out
-  // of that key and convert those into the |goog_decode_ms| vector of doubles.
-  for (auto dictionary_entry : dictionary) {
-    for (auto ssrc_entry : dictionary_entry.second.GetDict()) {
-      if (ssrc_entry.first != "stats")
-        continue;
-
-      for (auto stat_entry : ssrc_entry.second.GetDict()) {
-        if (!base::EndsWith(stat_entry.first, "recv-googMaxDecodeMs",
-                            base::CompareCase::SENSITIVE)) {
-          continue;
-        }
-        const std::string* values_entry =
-            stat_entry.second.GetDict().FindString("values");
-        if (!values_entry) {
-          continue;
-        }
-        base::StringTokenizer values_tokenizer(*values_entry, "[,]");
-        while (values_tokenizer.GetNext()) {
-          if (values_tokenizer.token_is_delim())
-            continue;
-          goog_decode_ms.push_back(atof(values_tokenizer.token().c_str()) *
-                                   base::Time::kMicrosecondsPerMillisecond);
-        }
-      }
-    }
-  }
-  return goog_decode_ms;
-}
-
 }  // anonymous namespace
 
 // Tests the performance of Chrome displaying remote video.
@@ -215,13 +162,6 @@
 
   void TestVideoDisplayPerf(const std::string& video_codec) {
     ASSERT_TRUE(embedded_test_server()->Start());
-    // chrome:webrtc-internals doesn't start tracing anything until the
-    // connection(s) are up.
-    content::WebContents* webrtc_internals_tab =
-        OpenWebrtcInternalsTab(browser());
-    EXPECT_TRUE(
-        content::ExecJs(webrtc_internals_tab,
-                        "currentGetStatsMethod = OPTION_GETSTATS_LEGACY"));
 
     content::WebContents* left_tab =
         OpenPageAndGetUserMediaInNewTabWithConstraints(
@@ -264,12 +204,6 @@
     // Run the connection for 5 seconds to collect metrics.
     test::SleepInJavascript(left_tab, 5000);
 
-    const std::string webrtc_internals_stats_json = ExecuteJavascript(
-        "JSON.stringify(peerConnectionDataStore);", webrtc_internals_tab);
-    webrtc_decode_latencies_ =
-        ParseGoogMaxDecodeFromWebrtcInternalsTab(webrtc_internals_stats_json);
-    chrome::CloseWebContents(browser(), webrtc_internals_tab, false);
-
     std::string json_events;
     ASSERT_TRUE(tracing::EndTracing(&json_events));
     std::unique_ptr<trace_analyzer::TraceAnalyzer> analyzer(
@@ -439,8 +373,6 @@
 
     PrintMeanAndMax("Post-decode-to-raster latency", name_modifier,
                     video_frame_submmitter_latencies_);
-    PrintMeanAndMax("WebRTC decode latency", name_modifier,
-                    webrtc_decode_latencies_);
   }
 
   VideoDisplayPerfTestConfig test_config_;
@@ -457,7 +389,6 @@
   // These two put together represent the whole delay from encoded video frames
   // to OS swap buffers call (or callback, depending on the platform).
   std::vector<double> video_frame_submmitter_latencies_;
-  std::vector<double> webrtc_decode_latencies_;
 };
 
 INSTANTIATE_TEST_SUITE_P(WebRtcVideoDisplayPerfBrowserTests,
@@ -468,15 +399,14 @@
                                           testing::Values(30, 60),
                                           testing::Bool()));
 
-// TODO(crbug.com/1509755): Rewrite these tests to not use legacy GetStats API.
 IN_PROC_BROWSER_TEST_P(WebRtcVideoDisplayPerfBrowserTest,
-                       DISABLED_TestVideoDisplayPerfVP9) {
+                       TestVideoDisplayPerfVP9) {
   TestVideoDisplayPerf("VP9");
 }
 
 #if BUILDFLAG(RTC_USE_H264)
 IN_PROC_BROWSER_TEST_P(WebRtcVideoDisplayPerfBrowserTest,
-                       DISABLED_TestVideoDisplayPerfH264) {
+                       TestVideoDisplayPerfH264) {
   if (!base::FeatureList::IsEnabled(
           blink::features::kWebRtcH264WithOpenH264FFmpeg)) {
     LOG(WARNING) << "Run-time feature WebRTC-H264WithOpenH264FFmpeg disabled. "
diff --git a/chrome/browser/password_manager/password_generation_interactive_uitest.cc b/chrome/browser/password_manager/password_generation_interactive_uitest.cc
index 5d6a630b..9f4a9c3 100644
--- a/chrome/browser/password_manager/password_generation_interactive_uitest.cc
+++ b/chrome/browser/password_manager/password_generation_interactive_uitest.cc
@@ -80,6 +80,10 @@
   }
 
   void TearDownOnMainThread() override {
+    // RunUntilIdle() is necessary because otherwise, under the hood
+    // PasswordFormManager::OnFetchComplete() callback is run after this test is
+    // destroyed meaning that OsCryptImpl will be used instead of OsCryptMocker,
+    // causing this test to fail.
     base::RunLoop().RunUntilIdle();
     PasswordManagerBrowserTestBase::TearDownOnMainThread();
 
diff --git a/chrome/browser/private_network_access/chrome_private_network_access_browsertest.cc b/chrome/browser/private_network_access/chrome_private_network_access_browsertest.cc
index c4a50e9..8fcc079 100644
--- a/chrome/browser/private_network_access/chrome_private_network_access_browsertest.cc
+++ b/chrome/browser/private_network_access/chrome_private_network_access_browsertest.cc
@@ -324,8 +324,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ChromePrivateNetworkAccessOriginTrialTest,
-                       // TODO(crbug.com/1508819): Re-enable this test
-                       DISABLED_RequestDevicesWithTrialTokenOnRequestHeader) {
+                       RequestDevicesWithTrialTokenOnRequestHeader) {
   content::URLLoaderInterceptor interceptor(base::BindLambdaForTesting(
       [&](content::URLLoaderInterceptor::RequestParams* params) {
         if (params->url_request.url.DeprecatedGetOriginAsURL() ==
@@ -371,8 +370,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(ChromePrivateNetworkAccessOriginTrialTest,
-                       // TODO(crbug.com/1508819): Re-enable this test
-                       DISABLED_RequestDevicesWithTrialTokenOnMetaTag) {
+                       RequestDevicesWithTrialTokenOnMetaTag) {
   content::URLLoaderInterceptor interceptor(base::BindLambdaForTesting(
       [&](content::URLLoaderInterceptor::RequestParams* params) {
         if (params->url_request.url.DeprecatedGetOriginAsURL() ==
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js
index 2f63c84..2a6d6e4 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js
@@ -18,6 +18,7 @@
 import '../../components/dialogs/oobe_loading_dialog.js';
 
 import {assert} from '//resources/ash/common/assert.js';
+import {sendWithPromise} from '//resources/ash/common/cr.m.js';
 import {loadTimeData} from '//resources/ash/common/load_time_data.m.js';
 import {mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
@@ -298,6 +299,11 @@
     this.authenticator_.missingGaiaInfoCallback = () => {
       this.showError(loadTimeData.getString('fatalEnrollmentError'), false);
     };
+
+    this.authenticator_.addEventListener('getDeviceId', (e) => {
+      sendWithPromise('getDeviceIdForEnrollment')
+          .then(deviceId => this.authenticator_.getDeviceIdResponse(deviceId));
+    });
   }
 
   /**
diff --git a/chrome/browser/resources/password_manager/icons.html b/chrome/browser/resources/password_manager/icons.html
index f719c5cf..903f43ad 100644
--- a/chrome/browser/resources/password_manager/icons.html
+++ b/chrome/browser/resources/password_manager/icons.html
@@ -1,7 +1,7 @@
 <iron-iconset-svg name="passwords-icon" size="20">
   <svg>
     <defs>
-      <g id="password"><path d="M4.98517 3.82996C6.64608 3.82996 8.05563 4.94329 8.58063 6.49662H15.167V9.16329H13.8943V11.83H11.3488V9.16329H8.58063C8.05563 10.7166 6.64608 11.83 4.98517 11.83C2.87563 11.83 1.16699 10.04 1.16699 7.82996C1.16699 5.61996 2.87563 3.82996 4.98517 3.82996ZM3.71245 7.83996C3.71245 8.57662 4.28199 9.17329 4.98517 9.17329C5.68836 9.17329 6.2579 8.57662 6.2579 7.83996C6.2579 7.10329 5.68836 6.50662 4.98517 6.50662C4.28199 6.50662 3.71245 7.10329 3.71245 7.83996Z"></path></g>
+      <g id="password"><path d="M5.833 11.667c.458 0 .847-.16 1.167-.479.333-.333.5-.729.5-1.188s-.167-.847-.5-1.167a1.555 1.555 0 0 0-1.167-.5c-.458 0-.854.167-1.188.5A1.588 1.588 0 0 0 4.166 10c0 .458.16.854.479 1.188.333.319.729.479 1.188.479Zm0 3.333c-1.389 0-2.569-.486-3.542-1.458C1.319 12.569.833 11.389.833 10c0-1.389.486-2.569 1.458-3.542C3.264 5.486 4.444 5 5.833 5c.944 0 1.813.243 2.604.729a4.752 4.752 0 0 1 1.833 1.979h7.23c.458 0 .847.167 1.167.5.333.319.5.708.5 1.167v3.958c0 .458-.167.854-.5 1.188A1.588 1.588 0 0 1 17.5 15h-3.75a1.658 1.658 0 0 1-1.188-.479 1.658 1.658 0 0 1-.479-1.188v-1.042H10.27a4.59 4.59 0 0 1-1.813 2A5.1 5.1 0 0 1 5.833 15Zm3.292-4.375h4.625v2.708H15v-1.042a.592.592 0 0 1 .167-.438.623.623 0 0 1 .458-.188c.181 0 .327.063.438.188a.558.558 0 0 1 .188.438v1.042H17.5V9.375H9.125a3.312 3.312 0 0 0-1.167-1.938 3.203 3.203 0 0 0-2.125-.77 3.21 3.21 0 0 0-2.354.979C2.827 8.298 2.5 9.083 2.5 10s.327 1.702.979 2.354a3.21 3.21 0 0 0 2.354.979c.806 0 1.514-.25 2.125-.75.611-.514 1-1.167 1.167-1.958Z"></path></g>
       <g id="passkey"><path d="M9 10c1.66 0 3-1.34 3-3s-1.34-3-3-3-3 1.34-3 3 1.34 3 3 3zm0-4.5c.83 0 1.5.67 1.5 1.5S9.83 8.5 9 8.5 7.5 7.83 7.5 7 8.17 5.5 9 5.5zm6.5 7.5v-.13a2.497 2.497 0 001.75-2.37 2.5 2.5 0 00-5 0c0 1.12.74 2.05 1.75 2.37V16l1 1 1.5-1.5-.75-.75.75-.75-1-1zm-.75-1.5c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zM4.5 14.09c0-.18.09-.34.22-.42C6.02 12.9 7.5 12.5 9 12.5c.88 0 1.75.15 2.58.42-.39-.5-.65-1.09-.76-1.73A9.94 9.94 0 009 11c-1.84 0-3.56.5-5.03 1.37-.61.35-.97 1.02-.97 1.72V16h9.5v-1.5h-8v-.41z"></path></g>
       <g id="checkup"><path d="M3.83333 14.3333V4.33329H5.16667V6.33329H10.5V4.33329H11.8333V8.33329H13.1667V4.33329C13.1667 3.59996 12.5667 2.99996 11.8333 2.99996H9.71333C9.43333 2.22663 8.7 1.66663 7.83333 1.66663C6.96667 1.66663 6.23333 2.22663 5.95333 2.99996H3.83333C3.1 2.99996 2.5 3.59996 2.5 4.33329V14.3333C2.5 15.0666 3.1 15.6666 3.83333 15.6666H7.16667V14.3333H3.83333ZM7.83333 2.99996C8.2 2.99996 8.5 3.29996 8.5 3.66663C8.5 4.03329 8.2 4.33329 7.83333 4.33329C7.46667 4.33329 7.16667 4.03329 7.16667 3.66663C7.16667 3.29996 7.46667 2.99996 7.83333 2.99996ZM14.8333 10.3333L13.8333 9.33329L10.1733 13L8.16667 11L7.16667 12L10.1733 15L14.8333 10.3333Z"></path></g>
       <g id="settings"><path d="M12.9669 8.49998C12.9669 8.71598 12.9509 8.92398 12.9269 9.12398L14.2629 10.18C14.3909 10.276 14.4229 10.444 14.3429 10.588L13.0629 12.804C12.9829 12.948 12.8149 13.004 12.6709 12.948L11.0789 12.308C10.7509 12.556 10.3909 12.772 9.9989 12.932L9.7589 14.628C9.7429 14.788 9.6069 14.9 9.4469 14.9H6.8869C6.7269 14.9 6.5989 14.788 6.5669 14.628L6.3269 12.932C5.9349 12.772 5.5829 12.564 5.2469 12.308L3.6549 12.948C3.5109 12.996 3.3429 12.948 3.2629 12.804L1.9829 10.588C1.9109 10.452 1.9429 10.276 2.0629 10.18L3.4149 9.12398C3.3829 8.92398 3.3669 8.70798 3.3669 8.49998C3.3669 8.29198 3.3909 8.07598 3.4229 7.87598L2.0709 6.81998C1.9429 6.72398 1.9109 6.55598 1.9909 6.41198L3.2709 4.19598C3.3509 4.05198 3.5189 3.99598 3.6629 4.05198L5.2549 4.69198C5.5829 4.44398 5.9429 4.22798 6.3349 4.06798L6.5749 2.37198C6.5989 2.21198 6.7269 2.09998 6.8869 2.09998H9.4469C9.6069 2.09998 9.7429 2.21198 9.7669 2.37198L10.0069 4.06798C10.3989 4.22798 10.7509 4.43598 11.0869 4.69198L12.6789 4.05198C12.8229 4.00398 12.9909 4.05198 13.0709 4.19598L14.3509 6.41198C14.4229 6.54798 14.3909 6.72398 14.2709 6.81998L12.9189 7.87598C12.9509 8.07598 12.9669 8.28398 12.9669 8.49998ZM5.7669 8.49998C5.7669 9.81998 6.8469 10.9 8.1669 10.9C9.4869 10.9 10.5669 9.81998 10.5669 8.49998C10.5669 7.17998 9.4869 6.09998 8.1669 6.09998C6.8469 6.09998 5.7669 7.17998 5.7669 8.49998Z"></path></g>
diff --git a/chrome/browser/resources/password_manager/password_list_item.html b/chrome/browser/resources/password_manager/password_list_item.html
index bae09c47..5b901274 100644
--- a/chrome/browser/resources/password_manager/password_list_item.html
+++ b/chrome/browser/resources/password_manager/password_list_item.html
@@ -29,12 +29,17 @@
     margin-inline-start: 8px;
   }
 
-  #seePasswordDetails {
+  #endIcons {
     --cr-icon-button-margin-start: 0px;
     --cr-icon-button-margin-end: 10px;
     justify-self: end;
   }
 
+  paper-tooltip  {
+    overflow: hidden;
+    white-space: nowrap;
+  }
+
   span {
     color: var(--cr-secondary-text-color);
   }
@@ -54,8 +59,16 @@
         [[numberOfAccounts_]]
       </span>
     </div>
-    <cr-icon-button id="seePasswordDetails" class="subpage-arrow"
-        aria-label="[[getAriaLabel_(item)]]">
-    </cr-icon-button>
+
+    <div id="endIcons">
+      <iron-icon id="localPasswordsIcon" icon="cr20:cloud-off"
+          hidden="[[!shouldShowDeviceOnlyCredentialsIcon_()]]"></iron-icon>
+      <cr-icon-button id="seePasswordDetails" class="subpage-arrow"
+          aria-label="[[getAriaLabel_(item)]]">
+      </cr-icon-button>
+    </div>
   </div>
 </div>
+
+<paper-tooltip position="top"
+    for="localPasswordsIcon" offset="0">[[tooltipText_]]</paper-tooltip>
\ No newline at end of file
diff --git a/chrome/browser/resources/password_manager/password_list_item.ts b/chrome/browser/resources/password_manager/password_list_item.ts
index e8166e31..7da7429 100644
--- a/chrome/browser/resources/password_manager/password_list_item.ts
+++ b/chrome/browser/resources/password_manager/password_list_item.ts
@@ -4,11 +4,14 @@
 import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
 import 'chrome://resources/cr_elements/cr_icons.css.js';
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
+import 'chrome://resources/cr_elements/icons.html.js';
+import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js';
 import './site_favicon.js';
 import './searchable_label.js';
 import './shared_style.css.js';
 
 import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {PluralStringProxyImpl} from 'chrome://resources/js/plural_string_proxy.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
@@ -41,6 +44,8 @@
         observer: 'onItemChanged_',
       },
 
+      isAccountStoreUser: Boolean,
+
       first: Boolean,
 
       searchTerm: String,
@@ -54,13 +59,23 @@
        * The number of accounts in a group as a formatted string.
        */
       numberOfAccounts_: String,
+
+      enableButterOnDesktopFollowup_: {
+        type: Boolean,
+        value() {
+          return loadTimeData.getBoolean('enableButterOnDesktopFollowup');
+        },
+      },
     };
   }
 
   item: chrome.passwordsPrivate.CredentialGroup;
+  isAccountStoreUser: boolean;
   first: boolean;
   searchTerm: string;
   private numberOfAccounts_: string;
+  private tooltipText_: string;
+  private enableButterOnDesktopFollowup_: boolean;
 
   private computeElementClass_(): string {
     return this.first ? 'flex-centered' : 'flex-centered hr';
@@ -109,6 +124,12 @@
           await PluralStringProxyImpl.getInstance().getPluralString(
               'numberOfAccounts', this.item.entries.length);
     }
+    if (this.enableButterOnDesktopFollowup_) {
+      this.tooltipText_ =
+          await PluralStringProxyImpl.getInstance().getPluralString(
+              'deviceOnlyPasswordsIconTooltip',
+              this.getNumberOfCredentialsOnDevice_());
+    }
   }
 
   private showNumberOfAccounts_(): boolean {
@@ -144,6 +165,19 @@
     return this.item.name;
   }
 
+  private getNumberOfCredentialsOnDevice_(): number {
+    return this.item.entries
+        .filter(
+            entry => entry.storedIn ===
+                chrome.passwordsPrivate.PasswordStoreSet.DEVICE)
+        .length;
+  }
+
+  private shouldShowDeviceOnlyCredentialsIcon_(): boolean {
+    return this.enableButterOnDesktopFollowup_ && this.isAccountStoreUser &&
+        (this.getNumberOfCredentialsOnDevice_() > 0);
+  }
+
   private getAriaLabel_(): string {
     return this.i18n('viewPasswordAriaDescription', this.item.name);
   }
diff --git a/chrome/browser/resources/password_manager/passwords_section.html b/chrome/browser/resources/password_manager/passwords_section.html
index e6c8963a..35460658 100644
--- a/chrome/browser/resources/password_manager/passwords_section.html
+++ b/chrome/browser/resources/password_manager/passwords_section.html
@@ -68,6 +68,7 @@
       rendered-item-count="{{shownGroupsCount_::dom-change}}"
       sort="[[computeSortFunction_(searchTerm_)]]">
     <password-list-item item="[[item]]" first="[[!index]]"
+        is-account-store-user="[[isAccountStoreUser]]"
         on-password-details-shown="onPasswordDetailsShown_"
         search-term="[[searchTerm_]]" role="listitem">
     </password-list-item>
diff --git a/chrome/browser/resources/password_manager/settings_section.html b/chrome/browser/resources/password_manager/settings_section.html
index 2ff8369..0611b1d 100644
--- a/chrome/browser/resources/password_manager/settings_section.html
+++ b/chrome/browser/resources/password_manager/settings_section.html
@@ -84,7 +84,7 @@
   <template is="dom-if" if="[[isEligibleForAccountStorage]]">
     <pref-toggle-button id="accountStorageToggle" class="hr"
         label="$i18n{accountStorageToggleLabel}"
-        sub-label="[[accountEmail]]"
+        sub-label="[[getToggleSubLabelForAccountStorageOptIn_(accountEmail)]]"
         checked="[[isAccountStoreUser]]"
         change-requires-validation
         on-validate-and-change-pref="changeAccountStorageOptIn_">
diff --git a/chrome/browser/resources/password_manager/settings_section.ts b/chrome/browser/resources/password_manager/settings_section.ts
index 511b902..170ba48 100644
--- a/chrome/browser/resources/password_manager/settings_section.ts
+++ b/chrome/browser/resources/password_manager/settings_section.ts
@@ -111,6 +111,13 @@
           return loadTimeData.getBoolean('canAddShortcut');
         },
       },
+
+      enableButterOnDesktopFollowup_: {
+        type: Boolean,
+        value() {
+          return loadTimeData.getBoolean('enableButterOnDesktopFollowup');
+        },
+      },
     };
   }
 
@@ -119,6 +126,7 @@
   private hasPasswordsToExport_: boolean;
   private showPasswordsImporter_: boolean;
   private trustedVaultBannerState_: TrustedVaultBannerState;
+  private enableButterOnDesktopFollowup_: boolean;
 
   private setBlockedSitesListListener_: BlockedSitesListChangedListener|null =
       null;
@@ -287,6 +295,14 @@
     }
   }
 
+  private getToggleSubLabelForAccountStorageOptIn_(accountEmail: string):
+      string {
+    if (this.enableButterOnDesktopFollowup_) {
+      return this.i18n('accountStorageToggleSubLabel', accountEmail);
+    }
+    return accountEmail;
+  }
+
   // <if expr="is_win or is_macosx">
   private onManagePasskeysClick_() {
     PasskeysBrowserProxyImpl.getInstance().managePasskeys();
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.html b/chrome/browser/resources/settings/basic_page/basic_page.html
index 8263cdc..48de41ce6 100644
--- a/chrome/browser/resources/settings/basic_page/basic_page.html
+++ b/chrome/browser/resources/settings/basic_page/basic_page.html
@@ -82,7 +82,7 @@
           <settings-section page-title="[[$i18n{memoryPageTitle}]]"
 <if expr="_google_chrome">
               show-send-feedback-button
-              on-send-feedback="onSendHighEfficiencyFeedbackClick_"
+              on-send-feedback="onSendMemorySaverFeedbackClick_"
 </if>
               section="performance" id="performanceSettingsSection">
             <settings-performance-page prefs="{{prefs}}">
diff --git a/chrome/browser/resources/settings/basic_page/basic_page.ts b/chrome/browser/resources/settings/basic_page/basic_page.ts
index d210996..aaca351 100644
--- a/chrome/browser/resources/settings/basic_page/basic_page.ts
+++ b/chrome/browser/resources/settings/basic_page/basic_page.ts
@@ -376,9 +376,9 @@
         this.showPage_(visibility);
   }
 
-  private onSendHighEfficiencyFeedbackClick_(e: Event) {
+  private onMemorySaverFeedbackClick_(e: Event) {
     e.stopPropagation();
-    this.performanceBrowserProxy_.openHighEfficiencyFeedbackDialog();
+    this.performanceBrowserProxy_.openMemorySaverFeedbackDialog();
   }
 
   private onSendBatterySaverFeedbackClick_(e: Event) {
diff --git a/chrome/browser/resources/settings/performance_page/performance_browser_proxy.ts b/chrome/browser/resources/settings/performance_page/performance_browser_proxy.ts
index a0022175..f291ec5d 100644
--- a/chrome/browser/resources/settings/performance_page/performance_browser_proxy.ts
+++ b/chrome/browser/resources/settings/performance_page/performance_browser_proxy.ts
@@ -8,7 +8,7 @@
   getCurrentOpenSites(): Promise<string[]>;
   getDeviceHasBattery(): Promise<boolean>;
   openBatterySaverFeedbackDialog(): void;
-  openHighEfficiencyFeedbackDialog(): void;
+  openMemorySaverFeedbackDialog(): void;
   openSpeedFeedbackDialog(): void;
   validateTabDiscardExceptionRule(rule: string): Promise<boolean>;
 }
@@ -26,8 +26,8 @@
     chrome.send('openBatterySaverFeedbackDialog');
   }
 
-  openHighEfficiencyFeedbackDialog() {
-    chrome.send('openHighEfficiencyFeedbackDialog');
+  openMemorySaverFeedbackDialog() {
+    chrome.send('openMemorySaverFeedbackDialog');
   }
 
   openSpeedFeedbackDialog() {
diff --git a/chrome/browser/resources/settings/performance_page/performance_metrics_proxy.ts b/chrome/browser/resources/settings/performance_page/performance_metrics_proxy.ts
index 27f4847..237f544 100644
--- a/chrome/browser/resources/settings/performance_page/performance_metrics_proxy.ts
+++ b/chrome/browser/resources/settings/performance_page/performance_metrics_proxy.ts
@@ -18,7 +18,7 @@
 
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
-export enum HighEfficiencyModeExceptionListAction {
+export enum MemorySaverModeExceptionListAction {
   ADD_MANUAL = 0,
   EDIT = 1,
   REMOVE = 2,
@@ -30,9 +30,9 @@
 
 // These values are persisted to logs. Entries should not be renumbered and
 // numeric values should never be reused.
-// This must be kept in sync with HighEfficiencyModeState in
+// This must be kept in sync with MemorySaverModeState in
 // components/performance_manager/public/user_tuning/prefs.h
-export enum HighEfficiencyModeState {
+export enum MemorySaverModeState {
   DISABLED = 0,
   ENABLED = 1,
   ENABLED_ON_TIMER = 2,
@@ -43,9 +43,8 @@
 
 export interface PerformanceMetricsProxy {
   recordBatterySaverModeChanged(state: BatterySaverModeState): void;
-  recordHighEfficiencyModeChanged(state: HighEfficiencyModeState): void;
-  recordExceptionListAction(action: HighEfficiencyModeExceptionListAction):
-      void;
+  recordMemorySaverModeChanged(state: MemorySaverModeState): void;
+  recordExceptionListAction(action: MemorySaverModeExceptionListAction): void;
 }
 
 export class PerformanceMetricsProxyImpl implements PerformanceMetricsProxy {
@@ -55,16 +54,16 @@
         BatterySaverModeState.COUNT);
   }
 
-  recordHighEfficiencyModeChanged(state: HighEfficiencyModeState): void {
+  recordMemorySaverModeChanged(state: MemorySaverModeState): void {
     chrome.metricsPrivate.recordEnumerationValue(
         'PerformanceControls.MemorySaver.SettingsChangeMode', state,
-        HighEfficiencyModeState.COUNT);
+        MemorySaverModeState.COUNT);
   }
 
-  recordExceptionListAction(action: HighEfficiencyModeExceptionListAction) {
+  recordExceptionListAction(action: MemorySaverModeExceptionListAction) {
     chrome.metricsPrivate.recordEnumerationValue(
         'PerformanceControls.MemorySaver.SettingsChangeExceptionList', action,
-        HighEfficiencyModeExceptionListAction.COUNT);
+        MemorySaverModeExceptionListAction.COUNT);
   }
 
   static getInstance(): PerformanceMetricsProxy {
diff --git a/chrome/browser/resources/settings/performance_page/performance_page.html b/chrome/browser/resources/settings/performance_page/performance_page.html
index 8807990..e9ea47d8 100644
--- a/chrome/browser/resources/settings/performance_page/performance_page.html
+++ b/chrome/browser/resources/settings/performance_page/performance_page.html
@@ -32,38 +32,38 @@
 </style>
 <settings-toggle-button id="toggleButton" on-change="onChange_"
     pref="{{prefs.performance_tuning.high_efficiency_mode.state}}"
-    label="$i18n{highEfficiencyModeLabel}"
-    sub-label="$i18n{highEfficiencyModeDescription}"
-    learn-more-url="$i18n{highEfficiencyLearnMoreUrl}"
+    label="$i18n{memorySaverModeLabel}"
+    sub-label="$i18n{memorySaverModeDescription}"
+    learn-more-url="$i18n{memorySaverLearnMoreUrl}"
     numeric-unchecked-values="[[numericUncheckedValues_]]"
     numeric-checked-value="[[toggleButtonCheckedValue_(
-        isHighEfficiencyMultistateModeEnabled_)]]">
+        isMemorySaverMultistateModeEnabled_)]]">
 </settings-toggle-button>
-<template is="dom-if" if="[[isHighEfficiencyMultistateModeEnabled_]]">
+<template is="dom-if" if="[[isMemorySaverMultistateModeEnabled_]]">
   <iron-collapse id="radioGroupCollapse"
-      opened="[[isHighEfficiencyModeEnabled_(
+      opened="[[isMemorySaverModeEnabled_(
           prefs.performance_tuning.high_efficiency_mode.state.value)]]">
     <div class="high-efficiency-radio-group">
       <settings-radio-group id="radioGroup" on-change="onChange_"
           pref="{{prefs.performance_tuning.high_efficiency_mode.state}}"
-          group-aria-label="$i18n{highEfficiencyModeRadioGroupAriaLabel}">
+          group-aria-label="$i18n{memorySaverModeRadioGroupAriaLabel}">
         <controlled-radio-button
-            label="$i18n{highEfficiencyModeHeuristicsLabel}"
-            name="[[highEfficiencyModeStateEnum_.ENABLED]]"
+            label="$i18n{memorySaverModeHeuristicsLabel}"
+            name="[[memorySaverModeStateEnum_.ENABLED]]"
             pref="[[prefs.performance_tuning.high_efficiency_mode.state]]">
           <div class="badge"
-              hidden$="[[!showHighEfficiencyHeuristicModeRecommendedBadge_]]">
-            $i18n{highEfficiencyModeRecommendedBadge}
+              hidden$="[[!showMemorySaverHeuristicModeRecommendedBadge_]]">
+            $i18n{memorySaverModeRecommendedBadge}
           </div>
         </controlled-radio-button>
         <controlled-radio-button id="enabledOnTimerButton"
-            label="$i18n{highEfficiencyModeOnTimerLabel}"
-            name="[[highEfficiencyModeStateEnum_.ENABLED_ON_TIMER]]"
+            label="$i18n{memorySaverModeOnTimerLabel}"
+            name="[[memorySaverModeStateEnum_.ENABLED_ON_TIMER]]"
             pref="[[prefs.performance_tuning.high_efficiency_mode.state]]"
             exportparts="labelWrapper">
           <settings-dropdown-menu id="discardTimeDropdown"
-              label="$i18n{highEfficiencyChooseDiscardTimeAriaLabel}"
-              disabled="[[!isHighEfficiencyModeEnabledOnTimer_(
+              label="$i18n{memorySaverChooseDiscardTimeAriaLabel}"
+              disabled="[[!isMemorySaverModeEnabledOnTimer_(
                   prefs.performance_tuning.high_efficiency_mode.state.value)]]"
               pref="{{prefs.performance_tuning.high_efficiency_mode.time_before_discard_in_minutes}}"
               menu-options="[[discardTimerOptions_]]"
diff --git a/chrome/browser/resources/settings/performance_page/performance_page.ts b/chrome/browser/resources/settings/performance_page/performance_page.ts
index 5ed2bda..4c59d9f 100644
--- a/chrome/browser/resources/settings/performance_page/performance_page.ts
+++ b/chrome/browser/resources/settings/performance_page/performance_page.ts
@@ -18,11 +18,11 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getDiscardTimerOptions} from './discard_timer_options.js';
-import {HighEfficiencyModeState, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from './performance_metrics_proxy.js';
+import {MemorySaverModeState, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from './performance_metrics_proxy.js';
 import {getTemplate} from './performance_page.html.js';
 import {ExceptionListElement} from './tab_discard/exception_list.js';
 
-export const HIGH_EFFICIENCY_MODE_PREF =
+export const MEMORY_SAVER_MODE_PREF =
     'performance_tuning.high_efficiency_mode.state';
 
 const SettingsPerformancePageElementBase = PrefsMixin(PolymerElement);
@@ -55,61 +55,60 @@
         value: getDiscardTimerOptions,
       },
 
-      isHighEfficiencyMultistateModeEnabled_: {
+      isMemorySaverMultistateModeEnabled_: {
         readOnly: true,
         type: Boolean,
         value() {
-          return loadTimeData.getBoolean(
-              'isHighEfficiencyMultistateModeEnabled');
+          return loadTimeData.getBoolean('isMemorySaverMultistateModeEnabled');
         },
       },
 
-      showHighEfficiencyHeuristicModeRecommendedBadge_: {
+      showMemorySaverHeuristicModeRecommendedBadge_: {
         readOnly: true,
         type: Boolean,
         value() {
-          return loadTimeData.getBoolean('highEfficiencyShowRecommendedBadge');
+          return loadTimeData.getBoolean('memorySaverShowRecommendedBadge');
         },
       },
 
-      highEfficiencyModeStateEnum_: {
+      memorySaverModeStateEnum_: {
         readOnly: true,
         type: Object,
-        value: HighEfficiencyModeState,
+        value: MemorySaverModeState,
       },
 
       numericUncheckedValues_: {
         type: Array,
-        value: () => [HighEfficiencyModeState.DISABLED],
+        value: () => [MemorySaverModeState.DISABLED],
       },
     };
   }
 
-  private numericUncheckedValues_: HighEfficiencyModeState[];
+  private numericUncheckedValues_: MemorySaverModeState[];
   private metricsProxy_: PerformanceMetricsProxy =
       PerformanceMetricsProxyImpl.getInstance();
 
   private discardTimerOptions_: DropdownMenuOptionList;
-  private isHighEfficiencyMultistateModeEnabled_: boolean;
-  private showHighEfficiencyHeuristicModeRecommendedBadge_: boolean;
+  private isMemorySaverMultistateModeEnabled_: boolean;
+  private showMemorySaverHeuristicModeRecommendedBadge_: boolean;
 
   private onChange_() {
-    this.metricsProxy_.recordHighEfficiencyModeChanged(
-        this.getPref<number>(HIGH_EFFICIENCY_MODE_PREF).value);
+    this.metricsProxy_.recordMemorySaverModeChanged(
+        this.getPref<number>(MEMORY_SAVER_MODE_PREF).value);
   }
 
   private toggleButtonCheckedValue_() {
-    return this.isHighEfficiencyMultistateModeEnabled_ ?
-        HighEfficiencyModeState.ENABLED :
-        HighEfficiencyModeState.ENABLED_ON_TIMER;
+    return this.isMemorySaverMultistateModeEnabled_ ?
+        MemorySaverModeState.ENABLED :
+        MemorySaverModeState.ENABLED_ON_TIMER;
   }
 
-  private isHighEfficiencyModeEnabled_(value: number): boolean {
-    return value !== HighEfficiencyModeState.DISABLED;
+  private isMemorySaverModeEnabled_(value: number): boolean {
+    return value !== MemorySaverModeState.DISABLED;
   }
 
-  private isHighEfficiencyModeEnabledOnTimer_(value: number): boolean {
-    return value === HighEfficiencyModeState.ENABLED_ON_TIMER;
+  private isMemorySaverModeEnabledOnTimer_(value: number): boolean {
+    return value === MemorySaverModeState.ENABLED_ON_TIMER;
   }
 
   private onDropdownClick_(e: Event) {
diff --git a/chrome/browser/resources/settings/performance_page/tab_discard/exception_add_input.ts b/chrome/browser/resources/settings/performance_page/tab_discard/exception_add_input.ts
index f9f18ea1..e2651a5 100644
--- a/chrome/browser/resources/settings/performance_page/tab_discard/exception_add_input.ts
+++ b/chrome/browser/resources/settings/performance_page/tab_discard/exception_add_input.ts
@@ -11,9 +11,10 @@
 import {assert} from 'chrome://resources/js/assert.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {HighEfficiencyModeExceptionListAction, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from '../performance_metrics_proxy.js';
+import {MemorySaverModeExceptionListAction, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from '../performance_metrics_proxy.js';
+
 import {getTemplate} from './exception_add_input.html.js';
-import {TAB_DISCARD_EXCEPTIONS_PREF, ExceptionValidationMixin, ExceptionValidationMixinInterface} from './exception_validation_mixin.js';
+import {ExceptionValidationMixin, ExceptionValidationMixinInterface, TAB_DISCARD_EXCEPTIONS_PREF} from './exception_validation_mixin.js';
 
 export interface ExceptionAddInputElement {
   $: {
@@ -47,7 +48,7 @@
     const rule = this.rule.trim();
     this.appendPrefListItem(TAB_DISCARD_EXCEPTIONS_PREF, rule);
     this.metricsProxy_.recordExceptionListAction(
-        HighEfficiencyModeExceptionListAction.ADD_MANUAL);
+        MemorySaverModeExceptionListAction.ADD_MANUAL);
   }
 }
 
diff --git a/chrome/browser/resources/settings/performance_page/tab_discard/exception_current_sites_list.ts b/chrome/browser/resources/settings/performance_page/tab_discard/exception_current_sites_list.ts
index e21a611..b05e798 100644
--- a/chrome/browser/resources/settings/performance_page/tab_discard/exception_current_sites_list.ts
+++ b/chrome/browser/resources/settings/performance_page/tab_discard/exception_current_sites_list.ts
@@ -15,7 +15,8 @@
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {PerformanceBrowserProxy, PerformanceBrowserProxyImpl} from '../performance_browser_proxy.js';
-import {HighEfficiencyModeExceptionListAction, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from '../performance_metrics_proxy.js';
+import {MemorySaverModeExceptionListAction, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from '../performance_metrics_proxy.js';
+
 import {getTemplate} from './exception_current_sites_list.html.js';
 import {TAB_DISCARD_EXCEPTIONS_PREF} from './exception_validation_mixin.js';
 
@@ -188,7 +189,7 @@
       this.appendPrefListItem(TAB_DISCARD_EXCEPTIONS_PREF, rule);
     });
     this.metricsProxy_.recordExceptionListAction(
-        HighEfficiencyModeExceptionListAction.ADD_FROM_CURRENT);
+        MemorySaverModeExceptionListAction.ADD_FROM_CURRENT);
   }
 }
 
diff --git a/chrome/browser/resources/settings/performance_page/tab_discard/exception_edit_input.ts b/chrome/browser/resources/settings/performance_page/tab_discard/exception_edit_input.ts
index a452cee..a59f5de 100644
--- a/chrome/browser/resources/settings/performance_page/tab_discard/exception_edit_input.ts
+++ b/chrome/browser/resources/settings/performance_page/tab_discard/exception_edit_input.ts
@@ -11,9 +11,10 @@
 import {assert} from 'chrome://resources/js/assert.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {HighEfficiencyModeExceptionListAction, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from '../performance_metrics_proxy.js';
+import {MemorySaverModeExceptionListAction, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from '../performance_metrics_proxy.js';
+
 import {getTemplate} from './exception_edit_input.html.js';
-import {TAB_DISCARD_EXCEPTIONS_PREF, ExceptionValidationMixin, ExceptionValidationMixinInterface} from './exception_validation_mixin.js';
+import {ExceptionValidationMixin, ExceptionValidationMixinInterface, TAB_DISCARD_EXCEPTIONS_PREF} from './exception_validation_mixin.js';
 
 export interface ExceptionEditInputElement {
   $: {
@@ -73,7 +74,7 @@
       }
     }
     this.metricsProxy_.recordExceptionListAction(
-        HighEfficiencyModeExceptionListAction.EDIT);
+        MemorySaverModeExceptionListAction.EDIT);
   }
 
   setRuleToEditForTesting() {
diff --git a/chrome/browser/resources/settings/performance_page/tab_discard/exception_list.ts b/chrome/browser/resources/settings/performance_page/tab_discard/exception_list.ts
index 786f3e3..456d7d62 100644
--- a/chrome/browser/resources/settings/performance_page/tab_discard/exception_list.ts
+++ b/chrome/browser/resources/settings/performance_page/tab_discard/exception_list.ts
@@ -28,8 +28,8 @@
 import {DomRepeat, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {TooltipMixin, TooltipMixinInterface} from '../../tooltip_mixin.js';
+import {MemorySaverModeExceptionListAction, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from '../performance_metrics_proxy.js';
 
-import {HighEfficiencyModeExceptionListAction, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from '../performance_metrics_proxy.js';
 import {ExceptionEntry} from './exception_entry.js';
 import {getTemplate} from './exception_list.html.js';
 import {TAB_DISCARD_EXCEPTIONS_MANAGED_PREF, TAB_DISCARD_EXCEPTIONS_PREF} from './exception_validation_mixin.js';
@@ -115,7 +115,7 @@
   static get observers() {
     return [
       `onPrefsChanged_(prefs.${TAB_DISCARD_EXCEPTIONS_PREF}.value.*,` +
-          `prefs.${TAB_DISCARD_EXCEPTIONS_MANAGED_PREF}.value.*)`,
+          `prefs.${TAB_DISCARD_EXCEPTIONS_PREF}.value.*)`,
     ];
   }
 
@@ -175,7 +175,7 @@
   private onDeleteClick_() {
     this.deletePrefListItem(TAB_DISCARD_EXCEPTIONS_PREF, this.selectedRule_);
     this.metricsProxy_.recordExceptionListAction(
-        HighEfficiencyModeExceptionListAction.REMOVE);
+        MemorySaverModeExceptionListAction.REMOVE);
     this.$.menu.get().close();
   }
 
diff --git a/chrome/browser/resources/settings/settings.ts b/chrome/browser/resources/settings/settings.ts
index 2e3d2f8..7d0dc48 100644
--- a/chrome/browser/resources/settings/settings.ts
+++ b/chrome/browser/resources/settings/settings.ts
@@ -75,8 +75,8 @@
 export {MAX_SIGNIN_PROMO_IMPRESSION, SettingsSyncAccountControlElement} from './people_page/sync_account_control.js';
 export {BATTERY_SAVER_MODE_PREF, SettingsBatteryPageElement} from './performance_page/battery_page.js';
 export {PerformanceBrowserProxy, PerformanceBrowserProxyImpl} from './performance_page/performance_browser_proxy.js';
-export {BatterySaverModeState, HighEfficiencyModeExceptionListAction, HighEfficiencyModeState, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from './performance_page/performance_metrics_proxy.js';
-export {HIGH_EFFICIENCY_MODE_PREF, SettingsPerformancePageElement} from './performance_page/performance_page.js';
+export {BatterySaverModeState, MemorySaverModeExceptionListAction, MemorySaverModeState, PerformanceMetricsProxy, PerformanceMetricsProxyImpl} from './performance_page/performance_metrics_proxy.js';
+export {MEMORY_SAVER_MODE_PREF, SettingsPerformancePageElement} from './performance_page/performance_page.js';
 export {SpeedPageElement} from './performance_page/speed_page.js';
 export {ExceptionAddDialogElement} from './performance_page/tab_discard/exception_add_dialog.js';
 export {ExceptionEditDialogElement} from './performance_page/tab_discard/exception_edit_dialog.js';
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
index f48ecaf6e..8170b751 100644
--- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
+++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
@@ -72,7 +72,7 @@
 bool CanAccept(PopupItemId id) {
   return id != PopupItemId::kSeparator &&
          id != PopupItemId::kInsecureContextPaymentDisabledMessage &&
-         id != PopupItemId::kMixedFormMessage && id != PopupItemId::kTitle;
+         id != PopupItemId::kMixedFormMessage;
 }
 
 }  // namespace
diff --git a/chrome/browser/ui/views/autofill/popup/popup_row_view.h b/chrome/browser/ui/views/autofill/popup/popup_row_view.h
index 6c1ad41..d493ff8 100644
--- a/chrome/browser/ui/views/autofill/popup/popup_row_view.h
+++ b/chrome/browser/ui/views/autofill/popup/popup_row_view.h
@@ -204,10 +204,9 @@
   // Which (if any) cell of this row is currently selected.
   std::optional<CellType> selected_cell_;
 
-  // The cell wrapping the content area of the row.
+  // The view wrapping the content area of the row.
   raw_ptr<PopupRowContentView> content_view_ = nullptr;
-  // The cell wrapping the control area of the row.
-  // TODO(crbug.com/1411172): Add keyboard event handling.
+  // The view wrapping the control area of the row.
   raw_ptr<ExpandChildSuggestionsView> expand_child_suggestions_view_ = nullptr;
 
   // Overriding event handles for the content and control views.
diff --git a/chrome/browser/ui/views/autofill/popup/popup_view_utils.cc b/chrome/browser/ui/views/autofill/popup/popup_view_utils.cc
index 3ec20de..09d00af 100644
--- a/chrome/browser/ui/views/autofill/popup/popup_view_utils.cc
+++ b/chrome/browser/ui/views/autofill/popup/popup_view_utils.cc
@@ -575,7 +575,6 @@
     case PopupItemId::kSeePromoCodeDetails:
     case PopupItemId::kSeparator:
     case PopupItemId::kShowAccountCards:
-    case PopupItemId::kTitle:
     case PopupItemId::kUsernameEntry:
     case PopupItemId::kVirtualCreditCardEntry:
     case PopupItemId::kWebauthnCredential:
@@ -626,7 +625,6 @@
     case PopupItemId::kMixedFormMessage:
     case PopupItemId::kPasswordEntry:
     case PopupItemId::kSeparator:
-    case PopupItemId::kTitle:
     case PopupItemId::kUsernameEntry:
     case PopupItemId::kVirtualCreditCardEntry:
     case PopupItemId::kWebauthnCredential:
@@ -677,7 +675,6 @@
     case PopupItemId::kSeePromoCodeDetails:
     case PopupItemId::kSeparator:
     case PopupItemId::kShowAccountCards:
-    case PopupItemId::kTitle:
     case PopupItemId::kUsernameEntry:
     case PopupItemId::kVirtualCreditCardEntry:
     case PopupItemId::kWebauthnCredential:
diff --git a/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc b/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc
index bf32eff..70ebad5 100644
--- a/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc
+++ b/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc
@@ -79,7 +79,6 @@
     PopupItemId::kAutofillOptions,
     PopupItemId::kDatalistEntry,
     PopupItemId::kScanCreditCard,
-    PopupItemId::kTitle,
     PopupItemId::kUsernameEntry,
     PopupItemId::kAllSavedPasswordsEntry,
     PopupItemId::kPasswordAccountStorageOptIn,
diff --git a/chrome/browser/ui/views/media_preview/mic_preview/mic_coordinator_unittest.cc b/chrome/browser/ui/views/media_preview/mic_preview/mic_coordinator_unittest.cc
new file mode 100644
index 0000000..aa6b374
--- /dev/null
+++ b/chrome/browser/ui/views/media_preview/mic_preview/mic_coordinator_unittest.cc
@@ -0,0 +1,225 @@
+// 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/media_preview/mic_preview/mic_coordinator.h"
+
+#include <memory>
+#include <optional>
+#include <string>
+#include <vector>
+
+#include "base/functional/callback_forward.h"
+#include "base/run_loop.h"
+#include "base/system/system_monitor.h"
+#include "base/test/test_future.h"
+#include "chrome/browser/ui/views/frame/test_with_browser_view.h"
+#include "chrome/grit/generated_resources.h"
+#include "components/media_effects/test/fake_audio_service.h"
+#include "content/public/browser/audio_service.h"
+#include "media/audio/audio_device_description.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/l10n/l10n_util.h"
+
+using testing::_;
+
+namespace {
+
+constexpr char kDeviceId[] = "device_id";
+constexpr char kDeviceName[] = "device_name";
+constexpr char kGroupId[] = "group_id";
+constexpr char kDeviceId2[] = "device_id_2";
+constexpr char kDeviceName2[] = "device_name_2";
+constexpr char kGroupId2[] = "group_id2";
+
+MATCHER_P(HasItems, items, "") {
+  if (arg.GetItemCount() != items.size()) {
+    *result_listener << "item count is " << arg.GetItemCount();
+    return false;
+  }
+
+  for (size_t i = 0; i < items.size(); ++i) {
+    if (base::UTF8ToUTF16(items[i]) != arg.GetItemAt(i)) {
+      *result_listener << "item at index " << i << " is " << arg.GetItemAt(i);
+      return false;
+    }
+  }
+
+  return true;
+}
+
+}  // namespace
+
+class MicCoordinatorTest : public TestWithBrowserView {
+ protected:
+  void SetUp() override {
+    TestWithBrowserView::SetUp();
+    auto_reset_audio_service_.emplace(
+        content::OverrideAudioServiceForTesting(&fake_audio_service_));
+    fake_audio_service_.SetOnGetInputStreamParametersCallback(
+        on_input_stream_id_future_.GetRepeatingCallback());
+    fake_audio_service_.SetBindStreamFactoryCallback(
+        on_bind_stream_factory_future_.GetRepeatingCallback());
+
+    fake_audio_service_.SetOnRepliedWithInputDeviceDescriptionsCallback(
+        replied_with_device_descriptions_future_.GetCallback());
+
+    parent_view_ = std::make_unique<views::View>();
+    coordinator_ = std::make_unique<MicCoordinator>(*parent_view_,
+                                                    /*needs_borders=*/true);
+    ASSERT_TRUE(replied_with_device_descriptions_future_.WaitAndClear());
+  }
+
+  void TearDown() override {
+    coordinator_.reset();
+    TestWithBrowserView::TearDown();
+  }
+
+  const MicSelectorComboboxModel& GetComboboxModel() const {
+    return coordinator_->GetComboboxModelForTest();
+  }
+
+  void VerifyEmptyCombobox() const {
+    // Our combobox model size will always be >= 1. If no mics are connected,
+    // a message is shown to the user to connect a mic.
+    // Verify that there is precisely one item in the combobox model.
+    EXPECT_EQ(GetComboboxModel().GetItemCount(), 1u);
+    EXPECT_EQ(
+        GetComboboxModel().GetItemAt(/*index=*/0),
+        l10n_util::GetStringUTF16(IDS_MEDIA_PREVIEW_NO_MICS_FOUND_COMBOBOX));
+  }
+
+  base::SystemMonitor monitor_;
+  media_effects::FakeAudioService fake_audio_service_;
+  std::optional<base::AutoReset<audio::mojom::AudioService*>>
+      auto_reset_audio_service_;
+
+  base::test::TestFuture<const std::string&> on_input_stream_id_future_;
+  base::test::TestFuture<void> on_bind_stream_factory_future_;
+  base::test::TestFuture<void> replied_with_device_descriptions_future_;
+
+  std::unique_ptr<views::View> parent_view_;
+  std::unique_ptr<MicCoordinator> coordinator_;
+};
+
+TEST_F(MicCoordinatorTest, RelevantAudioInputDeviceInfoExtraction) {
+  VerifyEmptyCombobox();
+
+  // Add first mic, and connect to it.
+  // Mic connection is done automatically to the device at combobox's default
+  // index (i.e. 0).
+  fake_audio_service_.AddFakeInputDevice({kDeviceName, kDeviceId, kGroupId});
+  ASSERT_TRUE(on_bind_stream_factory_future_.WaitAndClear());
+  EXPECT_EQ(on_input_stream_id_future_.Take(), kDeviceId);
+  EXPECT_THAT(GetComboboxModel(), HasItems(std::vector{kDeviceName}));
+
+  // Add second mic and connection to the first is not affected.
+  fake_audio_service_.SetOnRepliedWithInputDeviceDescriptionsCallback(
+      replied_with_device_descriptions_future_.GetCallback());
+  fake_audio_service_.AddFakeInputDevice({kDeviceName2, kDeviceId2, kGroupId2});
+  ASSERT_TRUE(replied_with_device_descriptions_future_.WaitAndClear());
+  EXPECT_FALSE(on_input_stream_id_future_.IsReady());
+  EXPECT_THAT(GetComboboxModel(),
+              HasItems(std::vector{kDeviceName, kDeviceName2}));
+
+  // Remove first mic, and connect to the second one.
+  fake_audio_service_.RemoveFakeInputDevice(kDeviceId);
+  ASSERT_TRUE(on_bind_stream_factory_future_.WaitAndClear());
+  EXPECT_EQ(on_input_stream_id_future_.Take(), kDeviceId2);
+  EXPECT_THAT(GetComboboxModel(), HasItems(std::vector{kDeviceName2}));
+
+  // Re-add first mic and connect to it.
+  fake_audio_service_.AddFakeInputDevice({kDeviceName, kDeviceId, kGroupId});
+  ASSERT_TRUE(on_bind_stream_factory_future_.WaitAndClear());
+  EXPECT_EQ(on_input_stream_id_future_.Take(), kDeviceId);
+  EXPECT_THAT(GetComboboxModel(),
+              HasItems(std::vector{kDeviceName, kDeviceName2}));
+
+  // Remove second mic, and connection to the first is not affected.
+  fake_audio_service_.SetOnRepliedWithInputDeviceDescriptionsCallback(
+      replied_with_device_descriptions_future_.GetCallback());
+  fake_audio_service_.RemoveFakeInputDevice(kDeviceId2);
+  ASSERT_TRUE(replied_with_device_descriptions_future_.WaitAndClear());
+  EXPECT_FALSE(on_input_stream_id_future_.IsReady());
+  EXPECT_THAT(GetComboboxModel(), HasItems(std::vector{kDeviceName}));
+
+  // Remove first mic.
+  fake_audio_service_.SetOnRepliedWithInputDeviceDescriptionsCallback(
+      replied_with_device_descriptions_future_.GetCallback());
+  fake_audio_service_.RemoveFakeInputDevice(kDeviceId);
+  ASSERT_TRUE(replied_with_device_descriptions_future_.WaitAndClear());
+  VerifyEmptyCombobox();
+}
+
+TEST_F(MicCoordinatorTest, ConnectToDifferentDevice) {
+  VerifyEmptyCombobox();
+
+  // Add first mic, and connect to it.
+  fake_audio_service_.AddFakeInputDevice({kDeviceName, kDeviceId, kGroupId});
+  ASSERT_TRUE(on_bind_stream_factory_future_.WaitAndClear());
+  EXPECT_EQ(on_input_stream_id_future_.Take(), kDeviceId);
+
+  // Add second mic and connection to the first is not affected.
+  fake_audio_service_.SetOnRepliedWithInputDeviceDescriptionsCallback(
+      replied_with_device_descriptions_future_.GetCallback());
+  fake_audio_service_.AddFakeInputDevice({kDeviceName2, kDeviceId2, kGroupId2});
+  ASSERT_TRUE(replied_with_device_descriptions_future_.WaitAndClear());
+  EXPECT_FALSE(on_input_stream_id_future_.IsReady());
+
+  //  Connect to the second mic.
+  coordinator_->OnAudioSourceChanged(/*selected_index=*/1);
+  ASSERT_TRUE(on_bind_stream_factory_future_.WaitAndClear());
+  EXPECT_EQ(on_input_stream_id_future_.Take(), kDeviceId2);
+}
+
+TEST_F(MicCoordinatorTest, TryConnectToSameDevice) {
+  VerifyEmptyCombobox();
+
+  // Add mic, and connect to it.
+  fake_audio_service_.AddFakeInputDevice({kDeviceName, kDeviceId, kGroupId});
+  ASSERT_TRUE(on_bind_stream_factory_future_.WaitAndClear());
+  EXPECT_EQ(on_input_stream_id_future_.Take(), kDeviceId);
+
+  //  Try connect to the mic.
+  // Nothing is expected because we are already connected.
+  coordinator_->OnAudioSourceChanged(/*selected_index=*/0);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_FALSE(on_input_stream_id_future_.IsReady());
+
+  // Remove mic.
+  fake_audio_service_.SetOnRepliedWithInputDeviceDescriptionsCallback(
+      replied_with_device_descriptions_future_.GetCallback());
+  fake_audio_service_.RemoveFakeInputDevice(kDeviceId);
+  ASSERT_TRUE(replied_with_device_descriptions_future_.WaitAndClear());
+  VerifyEmptyCombobox();
+
+  // Add mic, and connect to it again.
+  fake_audio_service_.AddFakeInputDevice({kDeviceName, kDeviceId, kGroupId});
+  ASSERT_TRUE(on_bind_stream_factory_future_.WaitAndClear());
+  EXPECT_EQ(on_input_stream_id_future_.Take(), kDeviceId);
+}
+
+TEST_F(MicCoordinatorTest, DefaultMicHandling) {
+  VerifyEmptyCombobox();
+
+  // Add mic, and connect to it.
+  fake_audio_service_.AddFakeInputDevice({kDeviceName, kDeviceId, kGroupId});
+  ASSERT_TRUE(on_bind_stream_factory_future_.WaitAndClear());
+  EXPECT_EQ(on_input_stream_id_future_.Take(), kDeviceId);
+  EXPECT_THAT(GetComboboxModel(), HasItems(std::vector{kDeviceName}));
+  EXPECT_EQ(GetComboboxModel().GetDropDownSecondaryTextAt(/*index=*/0),
+            std::u16string());
+
+  // Add the same mic again with the default id.
+  // One mic is expected to exist in the model with secondary text as default.
+  fake_audio_service_.SetOnRepliedWithInputDeviceDescriptionsCallback(
+      replied_with_device_descriptions_future_.GetCallback());
+  fake_audio_service_.AddFakeInputDevice(
+      {kDeviceName, media::AudioDeviceDescription::kDefaultDeviceId, kGroupId});
+  ASSERT_TRUE(replied_with_device_descriptions_future_.WaitAndClear());
+  EXPECT_FALSE(on_input_stream_id_future_.IsReady());
+  EXPECT_THAT(GetComboboxModel(), HasItems(std::vector{kDeviceName}));
+  EXPECT_EQ(GetComboboxModel().GetDropDownSecondaryTextAt(/*index=*/0),
+            l10n_util::GetStringUTF16(IDS_MEDIA_PREVIEW_SYSTEM_DEFAULT_MIC));
+}
diff --git a/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.cc b/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.cc
index 964633c..7ebde407 100644
--- a/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.cc
+++ b/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.cc
@@ -13,6 +13,7 @@
 #include "base/json/json_reader.h"
 #include "base/logging.h"
 #include "base/system/sys_info.h"
+#include "base/uuid.h"
 #include "base/values.h"
 #include "build/build_config.h"
 #include "chrome/browser/ash/login/help_app_launcher.h"
@@ -623,6 +624,8 @@
               &EnrollmentScreenHandler::HandleDeviceAttributesProvided);
   AddCallback("oauthEnrollOnLearnMore",
               &EnrollmentScreenHandler::HandleOnLearnMore);
+  AddCallback("getDeviceIdForEnrollment",
+              &EnrollmentScreenHandler::HandleGetDeviceId);
 }
 
 void EnrollmentScreenHandler::GetAdditionalParameters(
@@ -800,6 +803,21 @@
   help_app_->ShowHelpTopic(HelpAppLauncher::HELP_DEVICE_ATTRIBUTES);
 }
 
+void EnrollmentScreenHandler::HandleGetDeviceId(
+    const std::string& callback_id) {
+  if (!IsJavascriptAllowed()) {
+    return;
+  }
+
+  // We need to respond to "getDeviceId" message from Gaia. This is normally
+  // used for regular signin scenarios but since we need to respond with
+  // something here - we will respond with a GUID. The account used for
+  // enrollment is not actually logging into the device - and "getDeviceId" is
+  // meant for those kinds of users.
+  ResolveJavascriptCallback(base::Value(callback_id),
+                            base::Uuid::GenerateRandomV4().AsLowercaseString());
+}
+
 void EnrollmentScreenHandler::ShowStep(const std::string& step) {
   CallExternalAPI("showStep", step);
 }
diff --git a/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.h b/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.h
index 56ded1f..aeb3fa1 100644
--- a/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.h
+++ b/chrome/browser/ui/webui/ash/login/enrollment_screen_handler.h
@@ -102,6 +102,7 @@
   void HandleDeviceAttributesProvided(const std::string& asset_id,
                                       const std::string& location);
   void HandleOnLearnMore();
+  void HandleGetDeviceId(const std::string& callback_id);
 
   // Shows a given enrollment step.
   void ShowStep(const std::string& step);
diff --git a/chrome/browser/ui/webui/password_manager/password_manager_ui.cc b/chrome/browser/ui/webui/password_manager/password_manager_ui.cc
index a3da4f0..83c72c8 100644
--- a/chrome/browser/ui/webui/password_manager/password_manager_ui.cc
+++ b/chrome/browser/ui/webui/password_manager/password_manager_ui.cc
@@ -37,6 +37,7 @@
 #include "components/favicon_base/favicon_url_parser.h"
 #include "components/grit/components_scaled_resources.h"
 #include "components/password_manager/content/common/web_ui_constants.h"
+#include "components/password_manager/core/browser/features/password_features.h"
 #include "components/password_manager/core/browser/leak_detection_dialog_utils.h"
 #include "components/password_manager/core/common/password_manager_constants.h"
 #include "components/password_manager/core/common/password_manager_features.h"
@@ -89,301 +90,310 @@
 #endif
 
   static const webui::LocalizedString kStrings[] = {
-    {"accountStorageToggleLabel",
-     base::FeatureList::IsEnabled(syncer::kSyncWebauthnCredentials)
-         ? IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_WITH_PASSKEYS_TOGGLE_LABEL
-         : IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_LABEL},
-    {"addPassword", IDS_PASSWORD_MANAGER_UI_ADD_PASSWORD_BUTTON},
-    {"addPasswordFooter", IDS_PASSWORD_MANAGER_UI_ADD_PASSWORD_FOOTNOTE},
-    {"addPasswordStoreOptionAccount",
-     IDS_PASSWORD_MANAGER_DESTINATION_DROPDOWN_SAVE_TO_ACCOUNT},
-    {"addPasswordStoreOptionDevice",
-     IDS_PASSWORD_MANAGER_DESTINATION_DROPDOWN_SAVE_TO_DEVICE},
-    {"addPasswordStorePickerA11yDescription",
-     IDS_PASSWORD_MANAGER_DESTINATION_DROPDOWN_ACCESSIBLE_NAME},
-    {"addPasswordTitle", IDS_PASSWORD_MANAGER_UI_ADD_PASSWORD},
-    {"addShortcut", IDS_PASSWORD_MANAGER_UI_ADD_SHORTCUT_TITLE},
-    {"alreadyChangedPasswordLink",
-     IDS_PASSWORD_MANAGER_UI_ALREADY_CHANGED_PASSWORD},
-    {"appsLabel", IDS_PASSWORD_MANAGER_UI_APPS_LABEL},
-    {"authTimedOut", IDS_PASSWORD_MANAGER_UI_AUTH_TIMED_OUT},
-    {"autosigninLabel", IDS_PASSWORD_MANAGER_UI_AUTOSIGNIN_TOGGLE_LABEL},
-    {"backToCheckup", IDS_PASSWORD_MANAGER_UI_BACK_TO_CHECKUP_ARIA_DESCRIPTION},
-    {"backToPasswords",
-     IDS_PASSWORD_MANAGER_UI_BACK_TO_PASSWORDS_ARIA_DESCRIPTION},
-    {"blockedSitesDescription",
-     IDS_PASSWORD_MANAGER_UI_BLOCKED_SITES_DESCRIPTION},
-    {"blockedSitesTitle", IDS_PASSWORD_MANAGER_UI_BLOCKED_SITES_TITLE},
-    {"cancel", IDS_CANCEL},
-    {"changePassword", IDS_PASSWORD_MANAGER_UI_CHANGE_PASSWORD_BUTTON},
-    {"changePasswordAriaDescription",
-     IDS_PASSWORD_MANAGER_UI_CHANGE_PASSWORD_BUTTON_ARIA_DESCRIPTION},
-    {"changePasswordInApp", IDS_PASSWORD_MANAGER_UI_CHANGE_PASSWORD_IN_APP},
-    {"checkup", IDS_PASSWORD_MANAGER_UI_CHECKUP},
-    {"checkupCanceled", IDS_PASSWORD_MANAGER_UI_CHECKUP_CANCELED},
-    {"checkupErrorGeneric", IDS_PASSWORD_MANAGER_UI_CHECKUP_OTHER_ERROR},
-    {"checkupErrorNoPasswords", IDS_PASSWORD_MANAGER_UI_CHECKUP_NO_PASSWORDS},
-    {"checkupErrorOffline", IDS_PASSWORD_MANAGER_UI_CHECKUP_OFFLINE},
-    {"checkupErrorQuota", IDS_PASSWORD_MANAGER_UI_CHECKUP_QUOTA_LIMIT},
-    {"checkupErrorSignedOut", IDS_PASSWORD_MANAGER_UI_CHECKUP_SIGNED_OUT},
-    {"checkupResultGreen", IDS_PASSWORD_MANAGER_UI_CHECKUP_GREEN_STATE_A11Y},
-    {"checkupResultRed", IDS_PASSWORD_MANAGER_UI_CHECKUP_RED_STATE_A11Y},
-    {"checkupResultYellow", IDS_PASSWORD_MANAGER_UI_CHECKUP_YELLOW_STATE_A11Y},
-    {"compromisedRowWithError",
-     IDS_PASSWORD_MANAGER_UI_CHECKUP_COMPROMISED_SECTION},
-    {"checkupProgress", IDS_PASSWORD_MANAGER_UI_CHECKUP_PROGRESS},
-    {"checkupTitle", IDS_PASSWORD_MANAGER_UI_CHECKUP_TITLE},
-    {"clearSearch", IDS_CLEAR_SEARCH},
-    {"close", IDS_CLOSE},
-    {"compromisedPasswordsDescription",
-     IDS_PASSWORD_MANAGER_UI_COMPROMISED_PASSWORDS_DESCRIPTION},
-    {"compromisedPasswordsEmpty",
-     IDS_PASSWORD_MANAGER_UI_NO_COMPROMISED_PASSWORDS},
-    {"compromisedPasswordsTitle",
-     IDS_PASSWORD_MANAGER_UI_HAS_COMPROMISED_PASSWORDS},
-    {"controlledByExtension", IDS_SETTINGS_CONTROLLED_BY_EXTENSION},
-    {"copyDisplayName", IDS_PASSWORD_MANAGER_UI_COPY_DISPLAY_NAME_LABEL},
-    {"copyPassword", IDS_PASSWORD_MANAGER_UI_COPY_PASSWORD},
-    {"copyUsername", IDS_PASSWORD_MANAGER_UI_COPY_USERNAME},
-    {"delete", IDS_DELETE},
-    {"deletePassword", IDS_DELETE},
-    {"deletePasskeyConfirmationDescription",
-     IDS_PASSWORD_MANAGER_UI_DELETE_PASSKEY_CONFIRMATION_DESCRIPTION},
-    {"deletePasskeyConfirmationTitle",
-     IDS_PASSWORD_MANAGER_UI_DELETE_PASSKEY_CONFIRMATION_TITLE},
-    {"deletePasswordConfirmationDescription",
-     IDS_PASSWORD_MANAGER_UI_DELETE_PASSWORD_CONFIRMATION_DESCRIPTION},
-    {"deletePasswordConfirmationTitle",
-     IDS_PASSWORD_MANAGER_UI_DELETE_PASSWORD_CONFIRMATION_TITLE},
-    {"deletePasswordDialogDevice",
-     IDS_PASSWORD_MANAGER_UI_DELETE_DIALOG_FROM_DEVICE_CHECKBOX_LABEL},
-    {"deletePasswordDialogBody", IDS_PASSWORD_MANAGER_UI_DELETE_DIALOG_BODY},
-    {"deletePasswordDialogAccount",
-     IDS_PASSWORD_MANAGER_UI_DELETE_DIALOG_FROM_ACCOUNT_CHECKBOX_LABEL},
-    {"deletePasswordDialogTitle", IDS_PASSWORD_MANAGER_UI_DELETE_DIALOG_TITLE},
-    {"done", IDS_DONE},
-    {"disable", IDS_DISABLE},
-    {"displayNameCopiedToClipboard",
-     IDS_PASSWORD_MANAGER_UI_DISPLAY_NAME_COPIED_TO_CLIPBOARD},
-    {"displayNameLabel", IDS_PASSWORD_MANAGER_UI_DISPLAY_NAME_LABEL},
-    {"displayNamePlaceholder",
-     IDS_PASSWORD_MANAGER_UI_DISPLAY_NAME_PLACEHOLDER},
-    {"downloadFile", IDS_PASSWORD_MANAGER_UI_DOWNLOAD_FILE},
-    {"downloadLinkShow", IDS_DOWNLOAD_LINK_SHOW},
-    {"edit", IDS_EDIT2},
-    {"editDisclaimerDescription",
-     IDS_PASSWORD_MANAGER_UI_EDIT_DISCLAIMER_DESCRIPTION},
-    {"editDisclaimerTitle", IDS_PASSWORD_MANAGER_UI_EDIT_DISCLAIMER_TITLE},
-    {"editPasskeyTitle", IDS_PASSWORD_MANAGER_UI_EDIT_PASSKEY},
-    {"editPassword", IDS_EDIT2},
-    {"editPasswordFootnote", IDS_PASSWORD_MANAGER_UI_PASSWORD_EDIT_FOOTNOTE},
-    {"editPasswordTitle", IDS_PASSWORD_MANAGER_UI_EDIT_PASSWORD},
-    {"emptyNote", IDS_PASSWORD_MANAGER_UI_NO_NOTE_ADDED},
-    {"emptyStateImportSyncing",
-     IDS_PASSWORD_MANAGER_UI_EMPTY_STATE_SYNCING_USERS},
-    {"exportPasswords", IDS_PASSWORD_MANAGER_UI_EXPORT_TITLE},
-    {"exportPasswordsDescription",
-     IDS_PASSWORD_MANAGER_UI_EXPORT_BANNER_DESCRIPTION},
-    {"exportPasswordsFailTips", IDS_PASSWORD_MANAGER_UI_EXPORTING_FAILURE_TIPS},
-    {"exportPasswordsFailTipsAnotherFolder",
-     IDS_PASSWORD_MANAGER_UI_EXPORTING_FAILURE_TIP_ANOTHER_FOLDER},
-    {"exportPasswordsFailTipsEnoughSpace",
-     IDS_PASSWORD_MANAGER_UI_EXPORTING_FAILURE_TIP_ENOUGH_SPACE},
-    {"exportPasswordsFailTitle",
-     IDS_PASSWORD_MANAGER_UI_EXPORTING_FAILURE_TITLE},
-    {"exportPasswordsTryAgain", IDS_PASSWORD_MANAGER_UI_EXPORT_TRY_AGAIN},
-    {"exportSuccessful", IDS_PASSWORD_MANAGER_UI_EXPORT_SUCCESSFUL},
-    {"federationLabel", IDS_PASSWORD_MANAGER_UI_FEDERATION_LABEL},
-    {"gotIt", IDS_SETTINGS_GOT_IT},
-    {"help", IDS_PASSWORD_MANAGER_UI_HELP},
-    {"hidePassword", IDS_PASSWORD_MANAGER_UI_HIDE_PASSWORD},
-    {"hidePasswordA11yLabel", IDS_PASSWORD_MANAGER_UI_HIDE_PASSWORD_A11Y},
-    {"importPasswords", IDS_PASSWORD_MANAGER_UI_IMPORT_BANNER_TITLE},
-    {"importPasswordsCancel", IDS_PASSWORD_MANAGER_UI_IMPORT_CANCEL},
-    {"importPasswordsSkip", IDS_PASSWORD_MANAGER_UI_IMPORT_SKIP},
-    {"importPasswordsReplace", IDS_PASSWORD_MANAGER_UI_IMPORT_REPLACE},
-    {"importPasswordsAlreadyActive",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_ALREADY_ACTIVE},
-    {"importPasswordsFileSizeExceeded",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_FILE_SIZE_EXCEEDED},
-    {"importPasswordsUnknownError",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_ERROR_UNKNOWN},
-    {"importPasswordsBadFormatError",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_ERROR_BAD_FORMAT},
-    {"importPasswordsErrorTitle", IDS_PASSWORD_MANAGER_UI_IMPORT_ERROR_TITLE},
-    {"importPasswordsMissingPassword",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_MISSING_PASSWORD},
-    {"importPasswordsMissingURL", IDS_PASSWORD_MANAGER_UI_IMPORT_MISSING_URL},
-    {"importPasswordsInvalidURL", IDS_PASSWORD_MANAGER_UI_IMPORT_INVALID_URL},
-    {"importPasswordsLongURL", IDS_PASSWORD_MANAGER_UI_IMPORT_LONG_URL},
-    {"importPasswordsLongPassword",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_LONG_PASSWORD},
-    {"importPasswordsLongUsername",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_LONG_USERNAME},
-    {"importPasswordsLongNote", IDS_PASSWORD_MANAGER_UI_IMPORT_LONG_NOTE},
-    {"importPasswordsConflictDevice",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_CONFLICT_DEVICE},
-    {"importPasswordsConflictAccount",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_CONFLICT_ACCOUNT},
-    {"importPasswordsCompleteTitle",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_COMPLETE_TITLE},
-    {"importPasswordsSuccessTitle",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_SUCCESS_TITLE},
-    {"importPasswordsSuccessTip", IDS_PASSWORD_MANAGER_UI_IMPORT_SUCCESS_TIP},
-    {"importPasswordsDeleteFileOption",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_DELETE_FILE_OPTION},
-    {"importPasswordsDescriptionAccount",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_DESCRIPTION_SYNCING_USERS},
-    {"importPasswordsSelectFile",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_SELECT_FILE_DESCRIPTION},
-    {"importPasswordsStorePickerA11yDescription",
-     IDS_PASSWORD_MANAGER_UI_IMPORT_STORE_PICKER_ACCESSIBLE_NAME},
-    {"passwordsStoreOptionAccount",
-     IDS_PASSWORD_MANAGER_UI_STORE_PICKER_OPTION_ACCOUNT},
-    {"justNow", IDS_PASSWORD_MANAGER_UI_JUST_NOW},
-    {"leakedPassword", IDS_PASSWORD_MANAGER_UI_PASSWORD_LEAKED},
-    {"localPasswordManager",
-     IDS_PASSWORD_BUBBLES_PASSWORD_MANAGER_LINK_TEXT_SAVING_ON_DEVICE},
-    {"manage", IDS_SETTINGS_MANAGE},
+      {"accountStorageToggleLabel",
+       base::FeatureList::IsEnabled(syncer::kSyncWebauthnCredentials)
+           ? IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_WITH_PASSKEYS_TOGGLE_LABEL
+           : IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_LABEL},
+      {"accountStorageToggleSubLabel",
+       IDS_PASSWORD_MANAGER_UI_ACCOUNT_STORAGE_TOGGLE_SUB_LABEL},
+      {"addPassword", IDS_PASSWORD_MANAGER_UI_ADD_PASSWORD_BUTTON},
+      {"addPasswordFooter", IDS_PASSWORD_MANAGER_UI_ADD_PASSWORD_FOOTNOTE},
+      {"addPasswordStoreOptionAccount",
+       IDS_PASSWORD_MANAGER_DESTINATION_DROPDOWN_SAVE_TO_ACCOUNT},
+      {"addPasswordStoreOptionDevice",
+       IDS_PASSWORD_MANAGER_DESTINATION_DROPDOWN_SAVE_TO_DEVICE},
+      {"addPasswordStorePickerA11yDescription",
+       IDS_PASSWORD_MANAGER_DESTINATION_DROPDOWN_ACCESSIBLE_NAME},
+      {"addPasswordTitle", IDS_PASSWORD_MANAGER_UI_ADD_PASSWORD},
+      {"addShortcut", IDS_PASSWORD_MANAGER_UI_ADD_SHORTCUT_TITLE},
+      {"alreadyChangedPasswordLink",
+       IDS_PASSWORD_MANAGER_UI_ALREADY_CHANGED_PASSWORD},
+      {"appsLabel", IDS_PASSWORD_MANAGER_UI_APPS_LABEL},
+      {"authTimedOut", IDS_PASSWORD_MANAGER_UI_AUTH_TIMED_OUT},
+      {"autosigninLabel", IDS_PASSWORD_MANAGER_UI_AUTOSIGNIN_TOGGLE_LABEL},
+      {"backToCheckup",
+       IDS_PASSWORD_MANAGER_UI_BACK_TO_CHECKUP_ARIA_DESCRIPTION},
+      {"backToPasswords",
+       IDS_PASSWORD_MANAGER_UI_BACK_TO_PASSWORDS_ARIA_DESCRIPTION},
+      {"blockedSitesDescription",
+       IDS_PASSWORD_MANAGER_UI_BLOCKED_SITES_DESCRIPTION},
+      {"blockedSitesTitle", IDS_PASSWORD_MANAGER_UI_BLOCKED_SITES_TITLE},
+      {"cancel", IDS_CANCEL},
+      {"changePassword", IDS_PASSWORD_MANAGER_UI_CHANGE_PASSWORD_BUTTON},
+      {"changePasswordAriaDescription",
+       IDS_PASSWORD_MANAGER_UI_CHANGE_PASSWORD_BUTTON_ARIA_DESCRIPTION},
+      {"changePasswordInApp", IDS_PASSWORD_MANAGER_UI_CHANGE_PASSWORD_IN_APP},
+      {"checkup", IDS_PASSWORD_MANAGER_UI_CHECKUP},
+      {"checkupCanceled", IDS_PASSWORD_MANAGER_UI_CHECKUP_CANCELED},
+      {"checkupErrorGeneric", IDS_PASSWORD_MANAGER_UI_CHECKUP_OTHER_ERROR},
+      {"checkupErrorNoPasswords", IDS_PASSWORD_MANAGER_UI_CHECKUP_NO_PASSWORDS},
+      {"checkupErrorOffline", IDS_PASSWORD_MANAGER_UI_CHECKUP_OFFLINE},
+      {"checkupErrorQuota", IDS_PASSWORD_MANAGER_UI_CHECKUP_QUOTA_LIMIT},
+      {"checkupErrorSignedOut", IDS_PASSWORD_MANAGER_UI_CHECKUP_SIGNED_OUT},
+      {"checkupResultGreen", IDS_PASSWORD_MANAGER_UI_CHECKUP_GREEN_STATE_A11Y},
+      {"checkupResultRed", IDS_PASSWORD_MANAGER_UI_CHECKUP_RED_STATE_A11Y},
+      {"checkupResultYellow",
+       IDS_PASSWORD_MANAGER_UI_CHECKUP_YELLOW_STATE_A11Y},
+      {"compromisedRowWithError",
+       IDS_PASSWORD_MANAGER_UI_CHECKUP_COMPROMISED_SECTION},
+      {"checkupProgress", IDS_PASSWORD_MANAGER_UI_CHECKUP_PROGRESS},
+      {"checkupTitle", IDS_PASSWORD_MANAGER_UI_CHECKUP_TITLE},
+      {"clearSearch", IDS_CLEAR_SEARCH},
+      {"close", IDS_CLOSE},
+      {"compromisedPasswordsDescription",
+       IDS_PASSWORD_MANAGER_UI_COMPROMISED_PASSWORDS_DESCRIPTION},
+      {"compromisedPasswordsEmpty",
+       IDS_PASSWORD_MANAGER_UI_NO_COMPROMISED_PASSWORDS},
+      {"compromisedPasswordsTitle",
+       IDS_PASSWORD_MANAGER_UI_HAS_COMPROMISED_PASSWORDS},
+      {"controlledByExtension", IDS_SETTINGS_CONTROLLED_BY_EXTENSION},
+      {"copyDisplayName", IDS_PASSWORD_MANAGER_UI_COPY_DISPLAY_NAME_LABEL},
+      {"copyPassword", IDS_PASSWORD_MANAGER_UI_COPY_PASSWORD},
+      {"copyUsername", IDS_PASSWORD_MANAGER_UI_COPY_USERNAME},
+      {"delete", IDS_DELETE},
+      {"deletePassword", IDS_DELETE},
+      {"deletePasskeyConfirmationDescription",
+       IDS_PASSWORD_MANAGER_UI_DELETE_PASSKEY_CONFIRMATION_DESCRIPTION},
+      {"deletePasskeyConfirmationTitle",
+       IDS_PASSWORD_MANAGER_UI_DELETE_PASSKEY_CONFIRMATION_TITLE},
+      {"deletePasswordConfirmationDescription",
+       IDS_PASSWORD_MANAGER_UI_DELETE_PASSWORD_CONFIRMATION_DESCRIPTION},
+      {"deletePasswordConfirmationTitle",
+       IDS_PASSWORD_MANAGER_UI_DELETE_PASSWORD_CONFIRMATION_TITLE},
+      {"deletePasswordDialogDevice",
+       IDS_PASSWORD_MANAGER_UI_DELETE_DIALOG_FROM_DEVICE_CHECKBOX_LABEL},
+      {"deletePasswordDialogBody", IDS_PASSWORD_MANAGER_UI_DELETE_DIALOG_BODY},
+      {"deletePasswordDialogAccount",
+       IDS_PASSWORD_MANAGER_UI_DELETE_DIALOG_FROM_ACCOUNT_CHECKBOX_LABEL},
+      {"deletePasswordDialogTitle",
+       IDS_PASSWORD_MANAGER_UI_DELETE_DIALOG_TITLE},
+      {"done", IDS_DONE},
+      {"disable", IDS_DISABLE},
+      {"displayNameCopiedToClipboard",
+       IDS_PASSWORD_MANAGER_UI_DISPLAY_NAME_COPIED_TO_CLIPBOARD},
+      {"displayNameLabel", IDS_PASSWORD_MANAGER_UI_DISPLAY_NAME_LABEL},
+      {"displayNamePlaceholder",
+       IDS_PASSWORD_MANAGER_UI_DISPLAY_NAME_PLACEHOLDER},
+      {"downloadFile", IDS_PASSWORD_MANAGER_UI_DOWNLOAD_FILE},
+      {"downloadLinkShow", IDS_DOWNLOAD_LINK_SHOW},
+      {"edit", IDS_EDIT2},
+      {"editDisclaimerDescription",
+       IDS_PASSWORD_MANAGER_UI_EDIT_DISCLAIMER_DESCRIPTION},
+      {"editDisclaimerTitle", IDS_PASSWORD_MANAGER_UI_EDIT_DISCLAIMER_TITLE},
+      {"editPasskeyTitle", IDS_PASSWORD_MANAGER_UI_EDIT_PASSKEY},
+      {"editPassword", IDS_EDIT2},
+      {"editPasswordFootnote", IDS_PASSWORD_MANAGER_UI_PASSWORD_EDIT_FOOTNOTE},
+      {"editPasswordTitle", IDS_PASSWORD_MANAGER_UI_EDIT_PASSWORD},
+      {"emptyNote", IDS_PASSWORD_MANAGER_UI_NO_NOTE_ADDED},
+      {"emptyStateImportSyncing",
+       IDS_PASSWORD_MANAGER_UI_EMPTY_STATE_SYNCING_USERS},
+      {"exportPasswords", IDS_PASSWORD_MANAGER_UI_EXPORT_TITLE},
+      {"exportPasswordsDescription",
+       IDS_PASSWORD_MANAGER_UI_EXPORT_BANNER_DESCRIPTION},
+      {"exportPasswordsFailTips",
+       IDS_PASSWORD_MANAGER_UI_EXPORTING_FAILURE_TIPS},
+      {"exportPasswordsFailTipsAnotherFolder",
+       IDS_PASSWORD_MANAGER_UI_EXPORTING_FAILURE_TIP_ANOTHER_FOLDER},
+      {"exportPasswordsFailTipsEnoughSpace",
+       IDS_PASSWORD_MANAGER_UI_EXPORTING_FAILURE_TIP_ENOUGH_SPACE},
+      {"exportPasswordsFailTitle",
+       IDS_PASSWORD_MANAGER_UI_EXPORTING_FAILURE_TITLE},
+      {"exportPasswordsTryAgain", IDS_PASSWORD_MANAGER_UI_EXPORT_TRY_AGAIN},
+      {"exportSuccessful", IDS_PASSWORD_MANAGER_UI_EXPORT_SUCCESSFUL},
+      {"federationLabel", IDS_PASSWORD_MANAGER_UI_FEDERATION_LABEL},
+      {"gotIt", IDS_SETTINGS_GOT_IT},
+      {"help", IDS_PASSWORD_MANAGER_UI_HELP},
+      {"hidePassword", IDS_PASSWORD_MANAGER_UI_HIDE_PASSWORD},
+      {"hidePasswordA11yLabel", IDS_PASSWORD_MANAGER_UI_HIDE_PASSWORD_A11Y},
+      {"importPasswords", IDS_PASSWORD_MANAGER_UI_IMPORT_BANNER_TITLE},
+      {"importPasswordsCancel", IDS_PASSWORD_MANAGER_UI_IMPORT_CANCEL},
+      {"importPasswordsSkip", IDS_PASSWORD_MANAGER_UI_IMPORT_SKIP},
+      {"importPasswordsReplace", IDS_PASSWORD_MANAGER_UI_IMPORT_REPLACE},
+      {"importPasswordsAlreadyActive",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_ALREADY_ACTIVE},
+      {"importPasswordsFileSizeExceeded",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_FILE_SIZE_EXCEEDED},
+      {"importPasswordsUnknownError",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_ERROR_UNKNOWN},
+      {"importPasswordsBadFormatError",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_ERROR_BAD_FORMAT},
+      {"importPasswordsErrorTitle", IDS_PASSWORD_MANAGER_UI_IMPORT_ERROR_TITLE},
+      {"importPasswordsMissingPassword",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_MISSING_PASSWORD},
+      {"importPasswordsMissingURL", IDS_PASSWORD_MANAGER_UI_IMPORT_MISSING_URL},
+      {"importPasswordsInvalidURL", IDS_PASSWORD_MANAGER_UI_IMPORT_INVALID_URL},
+      {"importPasswordsLongURL", IDS_PASSWORD_MANAGER_UI_IMPORT_LONG_URL},
+      {"importPasswordsLongPassword",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_LONG_PASSWORD},
+      {"importPasswordsLongUsername",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_LONG_USERNAME},
+      {"importPasswordsLongNote", IDS_PASSWORD_MANAGER_UI_IMPORT_LONG_NOTE},
+      {"importPasswordsConflictDevice",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_CONFLICT_DEVICE},
+      {"importPasswordsConflictAccount",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_CONFLICT_ACCOUNT},
+      {"importPasswordsCompleteTitle",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_COMPLETE_TITLE},
+      {"importPasswordsSuccessTitle",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_SUCCESS_TITLE},
+      {"importPasswordsSuccessTip", IDS_PASSWORD_MANAGER_UI_IMPORT_SUCCESS_TIP},
+      {"importPasswordsDeleteFileOption",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_DELETE_FILE_OPTION},
+      {"importPasswordsDescriptionAccount",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_DESCRIPTION_SYNCING_USERS},
+      {"importPasswordsSelectFile",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_SELECT_FILE_DESCRIPTION},
+      {"importPasswordsStorePickerA11yDescription",
+       IDS_PASSWORD_MANAGER_UI_IMPORT_STORE_PICKER_ACCESSIBLE_NAME},
+      {"passwordsStoreOptionAccount",
+       IDS_PASSWORD_MANAGER_UI_STORE_PICKER_OPTION_ACCOUNT},
+      {"justNow", IDS_PASSWORD_MANAGER_UI_JUST_NOW},
+      {"leakedPassword", IDS_PASSWORD_MANAGER_UI_PASSWORD_LEAKED},
+      {"localPasswordManager",
+       IDS_PASSWORD_BUBBLES_PASSWORD_MANAGER_LINK_TEXT_SAVING_ON_DEVICE},
+      {"manage", IDS_SETTINGS_MANAGE},
 #if BUILDFLAG(IS_WIN)
-    {"managePasskeysLabel", IDS_PASSWORD_MANAGER_UI_MANAGE_PASSKEYS_LABEL},
+      {"managePasskeysLabel", IDS_PASSWORD_MANAGER_UI_MANAGE_PASSKEYS_LABEL},
 #elif BUILDFLAG(IS_MAC)
-    {"createPasskeysInICloudKeychainLabel",
-     IDS_PASSWORD_MANAGER_UI_CREATE_PASSKEYS_IN_ICLOUD_KEYCHAIN_LABEL},
-    {"createPasskeysInICloudKeychainSubLabel",
-     IDS_PASSWORD_MANAGER_UI_CREATE_PASSKEYS_IN_ICLOUD_KEYCHAIN_SUBLABEL},
-    {"managePasskeysLabel",
-     IDS_PASSWORD_MANAGER_UI_MANAGE_PASSKEYS_FROM_PROFILE_LABEL},
+      {"createPasskeysInICloudKeychainLabel",
+       IDS_PASSWORD_MANAGER_UI_CREATE_PASSKEYS_IN_ICLOUD_KEYCHAIN_LABEL},
+      {"createPasskeysInICloudKeychainSubLabel",
+       IDS_PASSWORD_MANAGER_UI_CREATE_PASSKEYS_IN_ICLOUD_KEYCHAIN_SUBLABEL},
+      {"managePasskeysLabel",
+       IDS_PASSWORD_MANAGER_UI_MANAGE_PASSKEYS_FROM_PROFILE_LABEL},
 #endif
-    {"menu", IDS_MENU},
-    {"menuButtonLabel", IDS_SETTINGS_MENU_BUTTON_LABEL},
-    {"missingTLD", IDS_PASSWORD_MANAGER_UI_MISSING_TLD},
-    {"moreActions", IDS_PASSWORD_MANAGER_UI_MORE_ACTIONS},
-    {"moreActionsAriaDescription",
-     IDS_PASSWORD_MANAGER_UI_MORE_ACTIONS_ARIA_DESCRIPTION},
-    {"movePasswordsButton", IDS_PASSWORD_MANAGER_UI_MOVE_PASSWORDS_BUTTON},
-    {"movePasswordsDescription",
-     IDS_PASSWORD_MANAGER_UI_MOVE_PASSWORDS_DESCRIPTION},
-    {"movePasswordsTitle", IDS_PASSWORD_MANAGER_UI_MOVE_PASSWORDS_TITLE},
-    {"muteCompromisedPassword", IDS_PASSWORD_MANAGER_UI_MUTE_ISSUE},
-    {"mutedCompromisedCredentials",
-     IDS_PASSWORD_MANAGER_UI_MUTED_COMPROMISED_PASSWORDS},
-    {"notValidWebsite", IDS_PASSWORD_MANAGER_UI_NOT_VALID_WEB_ADDRESS},
-    {"noteLabel", IDS_PASSWORD_MANAGER_UI_NOTE_LABEL},
-    {"noPasswordsFound", IDS_PASSWORD_MANAGER_UI_NO_PASSWORDS_FOUND},
-    {"opensInNewTab", IDS_PASSWORD_MANAGER_UI_OPENS_IN_NEW_TAB},
-    {"passkeyDeleted", IDS_PASSWORD_MANAGER_UI_PASSKEY_DELETED},
-    {"passkeyManagementInfoLabel",
-     IDS_PASSWORD_MANAGER_UI_PASSKEY_MANAGEMENT_INFO_LABEL},
-    {"passwordCopiedToClipboard",
-     IDS_PASSWORD_MANAGER_UI_PASSWORD_COPIED_TO_CLIPBOARD},
-    {"passwordDeleted", IDS_PASSWORD_MANAGER_UI_PASSWORD_DELETED},
-    {"passwordLabel", IDS_PASSWORD_MANAGER_UI_PASSWORD_LABEL},
-    {"passwordManager",
-     IDS_PASSWORD_BUBBLES_PASSWORD_MANAGER_LINK_TEXT_SYNCED_TO_ACCOUNT},
-    // Header for the page, always "Password Manager".
-    {"passwordManagerString", IDS_PASSWORD_MANAGER_UI_TITLE},
-    // Page title, branded. "Google Password Manager" or "Password Manager"
-    // depending on the build.
-    {"passwordManagerTitle",
-     IDS_PASSWORD_BUBBLES_PASSWORD_MANAGER_LINK_TEXT_SAVING_ON_DEVICE},
-    {"passwordNoteCharacterCount",
-     IDS_PASSWORD_MANAGER_UI_NOTE_CHARACTER_COUNT},
-    {"passwordNoteCharacterCountWarning",
-     IDS_PASSWORD_MANAGER_UI_NOTE_CHARACTER_COUNT_WARNING},
-    {"passwordListAriaLabel", IDS_PASSWORD_MANAGER_UI_PASSWORD_LIST_ARIA_LABEL},
-    {"passwords", IDS_PASSWORD_MANAGER_UI_PASSWORDS},
-    {"phishedAndLeakedPassword",
-     IDS_PASSWORD_MANAGER_UI_PASSWORD_PHISHED_AND_LEAKED},
-    {"phishedPassword", IDS_PASSWORD_MANAGER_UI_PASSWORD_PHISHED},
-    {"removeBlockedAriaDescription",
-     IDS_PASSWORD_MANAGER_UI_REMOVE_BLOCKED_SITE_ARIA_DESCRIPTION},
-    {"reload", IDS_RELOAD},
-    {"reusedPasswordsDescription",
-     IDS_PASSWORD_MANAGER_UI_REUSED_PASSWORDS_DESCRIPTION},
-    {"reusedPasswordsEmpty", IDS_PASSWORD_MANAGER_UI_NO_REUSED_PASSWORDS},
-    {"reusedPasswordsTitle", IDS_PASSWORD_MANAGER_UI_HAS_REUSED_PASSWORDS},
-    {"runCheckupAriaDescription",
-     IDS_PASSWORD_MANAGER_UI_RUN_CHECKUP_ARIA_DESCRIPTION},
-    {"save", IDS_SAVE},
-    {"savePasswordsLabel", IDS_PASSWORD_MANAGER_UI_SAVE_PASSWORDS_TOGGLE_LABEL},
-    {"share", IDS_PASSWORD_MANAGER_UI_SHARE},
-    {"shareDialogTitle", IDS_PASSWORD_MANAGER_UI_SHARE_DIALOG_TITLE},
-    {"shareDialogLoadingTitle",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_LOADING_TITLE},
-    {"shareDialogSuccessTitle",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_SUCCESS_TITLE},
-    {"shareDialogCanceledTitle",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_CANCELED_TITLE},
-    {"sharePasswordFamilyPickerDescription",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_FAMILY_PICKER_DESCRIPTION},
-    {"sharePasswordConfirmationDescriptionSingleRecipient",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_CONFIRMATION_DESCRIPTION_SINGLE},
-    {"sharePasswordConfirmationDescriptionMultipleRecipients",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_CONFIRMATION_DESCRIPTION_MULTIPLE},
-    {"sharePasswordConfirmationFooterWebsite",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_CONFIRMATION_FOOTER_WEBSITE},
-    {"sharePasswordConfirmationFooterAndroidApp",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_CONFIRMATION_FOOTER_ANDROID_APP},
-    {"sharePasswordViewFamily",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_VIEW_FAMILY},
-    {"sharePasswordMemeberUnavailable",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_MEMBER_UNAVAILABLE},
-    {"sharePasswordManagedByAdmin",
-     IDS_PASSWORD_MANAGER_UI_SHARING_IS_MANAGED_BY_ADMIN},
-    {"sharePasswordNotAvailable",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_NOT_AVAILABLE},
-    {"sharePasswordErrorDescription",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_ERROR_DESCRIPTION},
-    {"sharePasswordErrorTitle",
-     IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_ERROR_TITLE},
-    {"sharePasswordGotIt", IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_GOT_IT},
-    {"sharePasswordTryAgain", IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_TRY_AGAIN},
-    {"searchPrompt", IDS_PASSWORD_MANAGER_UI_SEARCH_PROMPT},
-    {"selectFile", IDS_PASSWORD_MANAGER_UI_SELECT_FILE},
-    {"settings", IDS_PASSWORD_MANAGER_UI_SETTINGS},
-    {"showMore", IDS_PASSWORD_MANAGER_UI_SHOW_MORE},
-    {"showPassword", IDS_PASSWORD_MANAGER_UI_SHOW_PASSWORD},
-    {"showPasswordA11yLabel", IDS_PASSWORD_MANAGER_UI_SHOW_PASSWORD_A11Y},
-    {"sitesAndAppsLabel", IDS_PASSWORD_MANAGER_UI_SITES_AND_APPS_LABEL},
-    {"sitesLabel", IDS_PASSWORD_MANAGER_UI_SITES_LABEL},
-    {"trustedVaultBannerLabelOfferOptIn",
-     IDS_PASSWORD_MANAGER_UI_TRUSTED_VAULT_OPT_IN_TITLE},
-    {"trustedVaultBannerSubLabelOfferOptIn",
-     IDS_PASSWORD_MANAGER_UI_TRUSTED_VAULT_OPT_IN_DESCRIPTION},
-    {"trustedVaultBannerLabelOptedIn",
-     IDS_PASSWORD_MANAGER_UI_TRUSTED_VAULT_OPTED_IN_TITLE},
-    {"trustedVaultBannerSubLabelOptedIn",
-     IDS_PASSWORD_MANAGER_UI_TRUSTED_VAULT_OPTED_IN_DESCRIPTION},
-    {"tryAgain", IDS_PASSWORD_MANAGER_UI_CHECK_PASSWORDS_AFTER_ERROR},
-    {"undoRemovePassword", IDS_PASSWORD_MANAGER_UI_UNDO},
-    {"unmuteCompromisedPassword", IDS_PASSWORD_MANAGER_UI_UNMUTE_ISSUE},
-    {"usernameAlreadyUsed", IDS_PASSWORD_MANAGER_UI_USERNAME_ALREADY_USED},
-    {"usernameCopiedToClipboard",
-     IDS_PASSWORD_MANAGER_UI_USERNAME_COPIED_TO_CLIPBOARD},
-    {"usernameLabel", IDS_PASSWORD_MANAGER_UI_USERNAME_LABEL},
-    {"usernamePlaceholder", IDS_PASSWORD_MANAGER_UI_USERNAME_PLACEHOLDER},
-    {"viewExistingPassword", IDS_PASSWORD_MANAGER_UI_VIEW_EXISTING_PASSWORD},
-    {"viewExistingPasswordAriaDescription",
-     IDS_PASSWORD_MANAGER_UI_VIEW_EXISTING_PASSWORD_ARIA_DESCRIPTION},
-    {"viewPasswordAriaDescription",
-     IDS_PASSWORD_MANAGER_UI_VIEW_PASSWORD_ARIA_DESCRIPTION},
-    {"viewPasswordsButton", IDS_PASSWORD_MANAGER_UI_IMPORT_VIEW_PASSWORDS},
-    {"weakPasswordsDescription",
-     IDS_PASSWORD_MANAGER_UI_WEAK_PASSWORDS_DESCRIPTION},
-    {"weakPasswordsEmpty", IDS_PASSWORD_MANAGER_UI_NO_WEAK_PASSWORDS},
-    {"weakPasswordsTitle", IDS_PASSWORD_MANAGER_UI_HAS_WEAK_PASSWORDS},
-    {"websiteLabel", IDS_PASSWORD_MANAGER_UI_WEBSITE_LABEL},
+      {"menu", IDS_MENU},
+      {"menuButtonLabel", IDS_SETTINGS_MENU_BUTTON_LABEL},
+      {"missingTLD", IDS_PASSWORD_MANAGER_UI_MISSING_TLD},
+      {"moreActions", IDS_PASSWORD_MANAGER_UI_MORE_ACTIONS},
+      {"moreActionsAriaDescription",
+       IDS_PASSWORD_MANAGER_UI_MORE_ACTIONS_ARIA_DESCRIPTION},
+      {"movePasswordsButton", IDS_PASSWORD_MANAGER_UI_MOVE_PASSWORDS_BUTTON},
+      {"movePasswordsDescription",
+       IDS_PASSWORD_MANAGER_UI_MOVE_PASSWORDS_DESCRIPTION},
+      {"movePasswordsTitle", IDS_PASSWORD_MANAGER_UI_MOVE_PASSWORDS_TITLE},
+      {"muteCompromisedPassword", IDS_PASSWORD_MANAGER_UI_MUTE_ISSUE},
+      {"mutedCompromisedCredentials",
+       IDS_PASSWORD_MANAGER_UI_MUTED_COMPROMISED_PASSWORDS},
+      {"notValidWebsite", IDS_PASSWORD_MANAGER_UI_NOT_VALID_WEB_ADDRESS},
+      {"noteLabel", IDS_PASSWORD_MANAGER_UI_NOTE_LABEL},
+      {"noPasswordsFound", IDS_PASSWORD_MANAGER_UI_NO_PASSWORDS_FOUND},
+      {"opensInNewTab", IDS_PASSWORD_MANAGER_UI_OPENS_IN_NEW_TAB},
+      {"passkeyDeleted", IDS_PASSWORD_MANAGER_UI_PASSKEY_DELETED},
+      {"passkeyManagementInfoLabel",
+       IDS_PASSWORD_MANAGER_UI_PASSKEY_MANAGEMENT_INFO_LABEL},
+      {"passwordCopiedToClipboard",
+       IDS_PASSWORD_MANAGER_UI_PASSWORD_COPIED_TO_CLIPBOARD},
+      {"passwordDeleted", IDS_PASSWORD_MANAGER_UI_PASSWORD_DELETED},
+      {"passwordLabel", IDS_PASSWORD_MANAGER_UI_PASSWORD_LABEL},
+      {"passwordManager",
+       IDS_PASSWORD_BUBBLES_PASSWORD_MANAGER_LINK_TEXT_SYNCED_TO_ACCOUNT},
+      // Header for the page, always "Password Manager".
+      {"passwordManagerString", IDS_PASSWORD_MANAGER_UI_TITLE},
+      // Page title, branded. "Google Password Manager" or "Password Manager"
+      // depending on the build.
+      {"passwordManagerTitle",
+       IDS_PASSWORD_BUBBLES_PASSWORD_MANAGER_LINK_TEXT_SAVING_ON_DEVICE},
+      {"passwordNoteCharacterCount",
+       IDS_PASSWORD_MANAGER_UI_NOTE_CHARACTER_COUNT},
+      {"passwordNoteCharacterCountWarning",
+       IDS_PASSWORD_MANAGER_UI_NOTE_CHARACTER_COUNT_WARNING},
+      {"passwordListAriaLabel",
+       IDS_PASSWORD_MANAGER_UI_PASSWORD_LIST_ARIA_LABEL},
+      {"passwords", IDS_PASSWORD_MANAGER_UI_PASSWORDS},
+      {"phishedAndLeakedPassword",
+       IDS_PASSWORD_MANAGER_UI_PASSWORD_PHISHED_AND_LEAKED},
+      {"phishedPassword", IDS_PASSWORD_MANAGER_UI_PASSWORD_PHISHED},
+      {"removeBlockedAriaDescription",
+       IDS_PASSWORD_MANAGER_UI_REMOVE_BLOCKED_SITE_ARIA_DESCRIPTION},
+      {"reload", IDS_RELOAD},
+      {"reusedPasswordsDescription",
+       IDS_PASSWORD_MANAGER_UI_REUSED_PASSWORDS_DESCRIPTION},
+      {"reusedPasswordsEmpty", IDS_PASSWORD_MANAGER_UI_NO_REUSED_PASSWORDS},
+      {"reusedPasswordsTitle", IDS_PASSWORD_MANAGER_UI_HAS_REUSED_PASSWORDS},
+      {"runCheckupAriaDescription",
+       IDS_PASSWORD_MANAGER_UI_RUN_CHECKUP_ARIA_DESCRIPTION},
+      {"save", IDS_SAVE},
+      {"savePasswordsLabel",
+       IDS_PASSWORD_MANAGER_UI_SAVE_PASSWORDS_TOGGLE_LABEL},
+      {"share", IDS_PASSWORD_MANAGER_UI_SHARE},
+      {"shareDialogTitle", IDS_PASSWORD_MANAGER_UI_SHARE_DIALOG_TITLE},
+      {"shareDialogLoadingTitle",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_LOADING_TITLE},
+      {"shareDialogSuccessTitle",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_SUCCESS_TITLE},
+      {"shareDialogCanceledTitle",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_CANCELED_TITLE},
+      {"sharePasswordFamilyPickerDescription",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_FAMILY_PICKER_DESCRIPTION},
+      {"sharePasswordConfirmationDescriptionSingleRecipient",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_CONFIRMATION_DESCRIPTION_SINGLE},
+      {"sharePasswordConfirmationDescriptionMultipleRecipients",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_CONFIRMATION_DESCRIPTION_MULTIPLE},
+      {"sharePasswordConfirmationFooterWebsite",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_CONFIRMATION_FOOTER_WEBSITE},
+      {"sharePasswordConfirmationFooterAndroidApp",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_CONFIRMATION_FOOTER_ANDROID_APP},
+      {"sharePasswordViewFamily",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_VIEW_FAMILY},
+      {"sharePasswordMemeberUnavailable",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_MEMBER_UNAVAILABLE},
+      {"sharePasswordManagedByAdmin",
+       IDS_PASSWORD_MANAGER_UI_SHARING_IS_MANAGED_BY_ADMIN},
+      {"sharePasswordNotAvailable",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_NOT_AVAILABLE},
+      {"sharePasswordErrorDescription",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_ERROR_DESCRIPTION},
+      {"sharePasswordErrorTitle",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_ERROR_TITLE},
+      {"sharePasswordGotIt", IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_GOT_IT},
+      {"sharePasswordTryAgain",
+       IDS_PASSWORD_MANAGER_UI_SHARE_PASSWORD_TRY_AGAIN},
+      {"searchPrompt", IDS_PASSWORD_MANAGER_UI_SEARCH_PROMPT},
+      {"selectFile", IDS_PASSWORD_MANAGER_UI_SELECT_FILE},
+      {"settings", IDS_PASSWORD_MANAGER_UI_SETTINGS},
+      {"showMore", IDS_PASSWORD_MANAGER_UI_SHOW_MORE},
+      {"showPassword", IDS_PASSWORD_MANAGER_UI_SHOW_PASSWORD},
+      {"showPasswordA11yLabel", IDS_PASSWORD_MANAGER_UI_SHOW_PASSWORD_A11Y},
+      {"sitesAndAppsLabel", IDS_PASSWORD_MANAGER_UI_SITES_AND_APPS_LABEL},
+      {"sitesLabel", IDS_PASSWORD_MANAGER_UI_SITES_LABEL},
+      {"trustedVaultBannerLabelOfferOptIn",
+       IDS_PASSWORD_MANAGER_UI_TRUSTED_VAULT_OPT_IN_TITLE},
+      {"trustedVaultBannerSubLabelOfferOptIn",
+       IDS_PASSWORD_MANAGER_UI_TRUSTED_VAULT_OPT_IN_DESCRIPTION},
+      {"trustedVaultBannerLabelOptedIn",
+       IDS_PASSWORD_MANAGER_UI_TRUSTED_VAULT_OPTED_IN_TITLE},
+      {"trustedVaultBannerSubLabelOptedIn",
+       IDS_PASSWORD_MANAGER_UI_TRUSTED_VAULT_OPTED_IN_DESCRIPTION},
+      {"tryAgain", IDS_PASSWORD_MANAGER_UI_CHECK_PASSWORDS_AFTER_ERROR},
+      {"undoRemovePassword", IDS_PASSWORD_MANAGER_UI_UNDO},
+      {"unmuteCompromisedPassword", IDS_PASSWORD_MANAGER_UI_UNMUTE_ISSUE},
+      {"usernameAlreadyUsed", IDS_PASSWORD_MANAGER_UI_USERNAME_ALREADY_USED},
+      {"usernameCopiedToClipboard",
+       IDS_PASSWORD_MANAGER_UI_USERNAME_COPIED_TO_CLIPBOARD},
+      {"usernameLabel", IDS_PASSWORD_MANAGER_UI_USERNAME_LABEL},
+      {"usernamePlaceholder", IDS_PASSWORD_MANAGER_UI_USERNAME_PLACEHOLDER},
+      {"viewExistingPassword", IDS_PASSWORD_MANAGER_UI_VIEW_EXISTING_PASSWORD},
+      {"viewExistingPasswordAriaDescription",
+       IDS_PASSWORD_MANAGER_UI_VIEW_EXISTING_PASSWORD_ARIA_DESCRIPTION},
+      {"viewPasswordAriaDescription",
+       IDS_PASSWORD_MANAGER_UI_VIEW_PASSWORD_ARIA_DESCRIPTION},
+      {"viewPasswordsButton", IDS_PASSWORD_MANAGER_UI_IMPORT_VIEW_PASSWORDS},
+      {"weakPasswordsDescription",
+       IDS_PASSWORD_MANAGER_UI_WEAK_PASSWORDS_DESCRIPTION},
+      {"weakPasswordsEmpty", IDS_PASSWORD_MANAGER_UI_NO_WEAK_PASSWORDS},
+      {"weakPasswordsTitle", IDS_PASSWORD_MANAGER_UI_HAS_WEAK_PASSWORDS},
+      {"websiteLabel", IDS_PASSWORD_MANAGER_UI_WEBSITE_LABEL},
 #if BUILDFLAG(IS_MAC)
-    {"biometricAuthenticaionForFillingLabel",
-     IDS_PASSWORD_MANAGER_UI_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_LABEL_MAC},
-    {"biometricAuthenticaionForFillingSublabel",
-     IDS_PASSWORD_MANAGER_UI_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_SUBLABEL_MAC},
+      {"biometricAuthenticaionForFillingLabel",
+       IDS_PASSWORD_MANAGER_UI_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_LABEL_MAC},
+      {"biometricAuthenticaionForFillingSublabel",
+       IDS_PASSWORD_MANAGER_UI_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_SUBLABEL_MAC},
 #elif BUILDFLAG(IS_WIN)
-    {"biometricAuthenticaionForFillingLabel",
-     IDS_PASSWORD_MANAGER_UI_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_LABEL_WIN},
-    {"biometricAuthenticaionForFillingSublabel",
-     IDS_PASSWORD_MANAGER_UI_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_SUBLABEL_WIN},
+      {"biometricAuthenticaionForFillingLabel",
+       IDS_PASSWORD_MANAGER_UI_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_LABEL_WIN},
+      {"biometricAuthenticaionForFillingSublabel",
+       IDS_PASSWORD_MANAGER_UI_BIOMETRIC_AUTHENTICATION_FOR_FILLING_TOGGLE_SUBLABEL_WIN},
 #endif
   };
   for (const auto& str : kStrings) {
@@ -432,6 +442,10 @@
       "enableSendPasswords",
       base::FeatureList::IsEnabled(password_manager::features::kSendPasswords));
 
+  source->AddBoolean("enableButterOnDesktopFollowup",
+                     base::FeatureList::IsEnabled(
+                         password_manager::features::kButterOnDesktopFollowup));
+
   source->AddString("passwordSharingLearnMoreURL",
                     chrome::kPasswordSharingLearnMoreURL);
 
@@ -534,6 +548,9 @@
       "compromisedPasswords",
       IDS_PASSWORD_MANAGER_UI_COMPROMISED_PASSWORDS_COUNT);
   plural_string_handler->AddLocalizedString(
+      "deviceOnlyPasswordsIconTooltip",
+      IDS_PASSWORD_MANAGER_UI_DEVICE_ONLY_PASSWORDS_ICON_TOOLTIP);
+  plural_string_handler->AddLocalizedString(
       "importPasswordsFailuresSummary",
       IDS_PASSWORD_MANAGER_UI_IMPORT_FAILURES_SUMMARY);
   plural_string_handler->AddLocalizedString(
diff --git a/chrome/browser/ui/webui/settings/performance_handler.cc b/chrome/browser/ui/webui/settings/performance_handler.cc
index 41c4e68..f4e1b6c 100644
--- a/chrome/browser/ui/webui/settings/performance_handler.cc
+++ b/chrome/browser/ui/webui/settings/performance_handler.cc
@@ -35,9 +35,9 @@
           &PerformanceHandler::HandleOpenBatterySaverFeedbackDialog,
           base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
-      "openHighEfficiencyFeedbackDialog",
+      "openMemorySaverFeedbackDialog",
       base::BindRepeating(
-          &PerformanceHandler::HandleOpenHighEfficiencyFeedbackDialog,
+          &PerformanceHandler::HandleOpenMemorySaverFeedbackDialog,
           base::Unretained(this)));
   web_ui()->RegisterMessageCallback(
       "openSpeedFeedbackDialog",
@@ -127,7 +127,7 @@
   HandleOpenFeedbackDialog("performance_battery");
 }
 
-void PerformanceHandler::HandleOpenHighEfficiencyFeedbackDialog(
+void PerformanceHandler::HandleOpenMemorySaverFeedbackDialog(
     const base::Value::List& args) {
   HandleOpenFeedbackDialog("performance_tabs");
 }
diff --git a/chrome/browser/ui/webui/settings/performance_handler.h b/chrome/browser/ui/webui/settings/performance_handler.h
index 1446a571..d64af3e 100644
--- a/chrome/browser/ui/webui/settings/performance_handler.h
+++ b/chrome/browser/ui/webui/settings/performance_handler.h
@@ -51,7 +51,7 @@
    */
   void HandleGetDeviceHasBattery(const base::Value::List& args);
   void HandleOpenBatterySaverFeedbackDialog(const base::Value::List& args);
-  void HandleOpenHighEfficiencyFeedbackDialog(const base::Value::List& args);
+  void HandleOpenMemorySaverFeedbackDialog(const base::Value::List& args);
   void HandleOpenSpeedFeedbackDialog(const base::Value::List& args);
   void HandleOpenFeedbackDialog(const std::string category_tag);
   void HandleValidateTabDiscardExceptionRule(const base::Value::List& args);
diff --git a/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc b/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc
index cf5d8da..f612b02 100644
--- a/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc
+++ b/chrome/browser/ui/webui/settings/performance_settings_interactive_uitest.cc
@@ -40,7 +40,7 @@
 constexpr char kCheckJsElementIsNotChecked[] =
     "(el) => { return !el.checked; }";
 
-const WebContentsInteractionTestUtil::DeepQuery kHighEfficiencyToggleQuery = {
+const WebContentsInteractionTestUtil::DeepQuery kMemorySaverToggleQuery = {
     "settings-ui",
     "settings-main",
     "settings-basic-page",
@@ -91,7 +91,7 @@
     return CheckResult(get_tab_count, expected_tab_count);
   }
 
-  auto CheckHighEfficiencyModePrefState(HighEfficiencyModeState state) {
+  auto CheckMemorySaverModePrefState(HighEfficiencyModeState state) {
     return CheckResult(base::BindLambdaForTesting([]() {
                          return performance_manager::user_tuning::prefs::
                              GetCurrentHighEfficiencyModeState(
@@ -100,7 +100,7 @@
                        state);
   }
 
-  auto CheckHighEfficiencyModeLogged(
+  auto CheckMemorySaverModeLogged(
       HighEfficiencyModeState state,
       int expected_count,
       const base::HistogramTester& histogram_tester) {
@@ -154,32 +154,30 @@
 };
 
 IN_PROC_BROWSER_TEST_F(PerformanceSettingsInteractiveTest,
-                       HighEfficiencyPrefChanged) {
+                       MemorySaverPrefChanged) {
   RunTestSequence(
       InstrumentTab(kPerformanceSettingsPage),
       NavigateWebContents(kPerformanceSettingsPage,
                           GURL(chrome::kChromeUIPerformanceSettingsURL)),
-      WaitForElementToRender(kPerformanceSettingsPage,
-                             kHighEfficiencyToggleQuery),
-      CheckJsResultAt(kPerformanceSettingsPage, kHighEfficiencyToggleQuery,
+      WaitForElementToRender(kPerformanceSettingsPage, kMemorySaverToggleQuery),
+      CheckJsResultAt(kPerformanceSettingsPage, kMemorySaverToggleQuery,
                       kCheckJsElementIsChecked),
 
       // Turn Off High Efficiency Mode
-      ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery),
+      ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage,
-                               kHighEfficiencyToggleQuery, false),
-      CheckHighEfficiencyModePrefState(HighEfficiencyModeState::kDisabled),
+                               kMemorySaverToggleQuery, false),
+      CheckMemorySaverModePrefState(HighEfficiencyModeState::kDisabled),
 
       // Turn High Efficiency Mode back on
-      ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery),
+      ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage,
-                               kHighEfficiencyToggleQuery, true),
-      CheckHighEfficiencyModePrefState(
-          HighEfficiencyModeState::kEnabledOnTimer));
+                               kMemorySaverToggleQuery, true),
+      CheckMemorySaverModePrefState(HighEfficiencyModeState::kEnabledOnTimer));
 }
 
 IN_PROC_BROWSER_TEST_F(PerformanceSettingsInteractiveTest,
-                       HighEfficiencyLearnMoreLinkNavigates) {
+                       MemorySaverLearnMoreLinkNavigates) {
   DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kLearnMorePage);
   const DeepQuery high_efficiency_learn_more = {"settings-ui",
                                                 "settings-main",
@@ -200,37 +198,36 @@
 }
 
 IN_PROC_BROWSER_TEST_F(PerformanceSettingsInteractiveTest,
-                       HighEfficiencyMetricsShouldLogOnToggle) {
+                       MemorySaverMetricsShouldLogOnToggle) {
   base::HistogramTester histogram_tester;
 
   RunTestSequence(
       InstrumentTab(kPerformanceSettingsPage),
       NavigateWebContents(kPerformanceSettingsPage,
                           GURL(chrome::kChromeUIPerformanceSettingsURL)),
-      WaitForElementToRender(kPerformanceSettingsPage,
-                             kHighEfficiencyToggleQuery),
-      CheckJsResultAt(kPerformanceSettingsPage, kHighEfficiencyToggleQuery,
+      WaitForElementToRender(kPerformanceSettingsPage, kMemorySaverToggleQuery),
+      CheckJsResultAt(kPerformanceSettingsPage, kMemorySaverToggleQuery,
                       kCheckJsElementIsChecked),
 
       // Turn Off High Efficiency Mode
-      ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery),
+      ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage,
-                               kHighEfficiencyToggleQuery, false),
-      CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kDisabled, 1,
-                                    histogram_tester),
+                               kMemorySaverToggleQuery, false),
+      CheckMemorySaverModeLogged(HighEfficiencyModeState::kDisabled, 1,
+                                 histogram_tester),
 
       // Turn High Efficiency Mode back on
-      ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery),
+      ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage,
-                               kHighEfficiencyToggleQuery, true),
-      CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kEnabledOnTimer, 1,
-                                    histogram_tester));
+                               kMemorySaverToggleQuery, true),
+      CheckMemorySaverModeLogged(HighEfficiencyModeState::kEnabledOnTimer, 1,
+                                 histogram_tester));
 }
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
 // TODO(http://b/281528238): reenable the test.
 IN_PROC_BROWSER_TEST_F(PerformanceSettingsInteractiveTest,
-                       DISABLED_HighEfficiencySendFeedbackDialogOpens) {
+                       DISABLED_MemorySaverSendFeedbackDialogOpens) {
   const DeepQuery high_efficiency_feedback = {
       "settings-ui", "settings-main", "settings-basic-page",
       "settings-section#performanceSettingsSection", "cr-icon-button#feedback"};
@@ -273,38 +270,36 @@
 };
 
 IN_PROC_BROWSER_TEST_F(PerformanceSettingsMultiStateModeInteractiveTest,
-                       HighEfficiencyPrefChanged) {
+                       MemorySaverPrefChanged) {
   RunTestSequence(
       InstrumentTab(kPerformanceSettingsPage),
       NavigateWebContents(kPerformanceSettingsPage,
                           GURL(chrome::kChromeUIPerformanceSettingsURL)),
-      WaitForElementToRender(kPerformanceSettingsPage,
-                             kHighEfficiencyToggleQuery),
-      CheckJsResultAt(kPerformanceSettingsPage, kHighEfficiencyToggleQuery,
+      WaitForElementToRender(kPerformanceSettingsPage, kMemorySaverToggleQuery),
+      CheckJsResultAt(kPerformanceSettingsPage, kMemorySaverToggleQuery,
                       kCheckJsElementIsChecked),
 
       // Enable high efficiency mode to discard tabs based on a timer
       ClickElement(kPerformanceSettingsPage, kDiscardOnTimerQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage, kDiscardOnTimerQuery,
                                true),
-      CheckHighEfficiencyModePrefState(
-          HighEfficiencyModeState::kEnabledOnTimer),
+      CheckMemorySaverModePrefState(HighEfficiencyModeState::kEnabledOnTimer),
 
       // Turn off high efficiency mode
-      ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery),
+      ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage,
-                               kHighEfficiencyToggleQuery, false),
-      CheckHighEfficiencyModePrefState(HighEfficiencyModeState::kDisabled),
+                               kMemorySaverToggleQuery, false),
+      CheckMemorySaverModePrefState(HighEfficiencyModeState::kDisabled),
 
       // Turn high efficiency mode back on
-      ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery),
+      ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage,
-                               kHighEfficiencyToggleQuery, true),
-      CheckHighEfficiencyModePrefState(HighEfficiencyModeState::kEnabled));
+                               kMemorySaverToggleQuery, true),
+      CheckMemorySaverModePrefState(HighEfficiencyModeState::kEnabled));
 }
 
 IN_PROC_BROWSER_TEST_F(PerformanceSettingsMultiStateModeInteractiveTest,
-                       HighEfficiencyMetricsShouldLogOnToggle) {
+                       MemorySaverMetricsShouldLogOnToggle) {
   base::HistogramTester histogram_tester;
 
   const DeepQuery iron_collapse = {
@@ -315,24 +310,23 @@
       InstrumentTab(kPerformanceSettingsPage),
       NavigateWebContents(kPerformanceSettingsPage,
                           GURL(chrome::kChromeUIPerformanceSettingsURL)),
-      WaitForElementToRender(kPerformanceSettingsPage,
-                             kHighEfficiencyToggleQuery),
-      CheckJsResultAt(kPerformanceSettingsPage, kHighEfficiencyToggleQuery,
+      WaitForElementToRender(kPerformanceSettingsPage, kMemorySaverToggleQuery),
+      CheckJsResultAt(kPerformanceSettingsPage, kMemorySaverToggleQuery,
                       kCheckJsElementIsChecked),
 
       // Turn Off High Efficiency Mode
-      ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery),
+      ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage,
-                               kHighEfficiencyToggleQuery, false),
-      CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kDisabled, 1,
-                                    histogram_tester),
+                               kMemorySaverToggleQuery, false),
+      CheckMemorySaverModeLogged(HighEfficiencyModeState::kDisabled, 1,
+                                 histogram_tester),
 
       // Turn High Efficiency Mode back on
-      ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery),
+      ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage,
-                               kHighEfficiencyToggleQuery, true),
-      CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kEnabled, 1,
-                                    histogram_tester),
+                               kMemorySaverToggleQuery, true),
+      CheckMemorySaverModeLogged(HighEfficiencyModeState::kEnabled, 1,
+                                 histogram_tester),
 
       // Wait for the iron-collapse animation to finish so that the performance
       // radio buttons will show on screen
@@ -343,15 +337,15 @@
       ClickElement(kPerformanceSettingsPage, kDiscardOnTimerQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage, kDiscardOnTimerQuery,
                                true),
-      CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kEnabledOnTimer, 1,
-                                    histogram_tester),
+      CheckMemorySaverModeLogged(HighEfficiencyModeState::kEnabledOnTimer, 1,
+                                 histogram_tester),
 
       // Change high efficiency setting to discard tabs based on usage
       ClickElement(kPerformanceSettingsPage, kDiscardOnUsageQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage, kDiscardOnUsageQuery,
                                true),
-      CheckHighEfficiencyModeLogged(HighEfficiencyModeState::kEnabled, 2,
-                                    histogram_tester));
+      CheckMemorySaverModeLogged(HighEfficiencyModeState::kEnabled, 2,
+                                 histogram_tester));
 }
 
 // Checks that the selected discard timer value is preserved as the high
@@ -381,9 +375,8 @@
       InstrumentTab(kPerformanceSettingsPage),
       NavigateWebContents(kPerformanceSettingsPage,
                           GURL(chrome::kChromeUIPerformanceSettingsURL)),
-      WaitForElementToRender(kPerformanceSettingsPage,
-                             kHighEfficiencyToggleQuery),
-      CheckJsResultAt(kPerformanceSettingsPage, kHighEfficiencyToggleQuery,
+      WaitForElementToRender(kPerformanceSettingsPage, kMemorySaverToggleQuery),
+      CheckJsResultAt(kPerformanceSettingsPage, kMemorySaverToggleQuery,
                       kCheckJsElementIsChecked),
 
       // Select discard on timer option
@@ -400,11 +393,11 @@
                                           {discard_timer_value}, nullptr)),
 
       // Turn off high efficiency mode
-      ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery),
+      ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery),
       WaitForButtonStateChange(kPerformanceSettingsPage,
-                               kHighEfficiencyToggleQuery, false),
+                               kMemorySaverToggleQuery, false),
       // Turn high efficiency mode back on
-      ClickElement(kPerformanceSettingsPage, kHighEfficiencyToggleQuery),
+      ClickElement(kPerformanceSettingsPage, kMemorySaverToggleQuery),
       WaitForIronListCollapseStateChange(kPerformanceSettingsPage,
                                          iron_collapse),
       CheckJsResultAt(kPerformanceSettingsPage, discard_time_drop_down,
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
index d4a0eabc..44e8dec 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -712,19 +712,19 @@
       {"performancePageTitle", IDS_SETTINGS_PERFORMANCE_PAGE_TITLE},
       {"memoryPageTitle", IDS_SETTINGS_MEMORY_PAGE_TITLE},
       {"speedPageTitle", IDS_SETTINGS_SPEED_PAGE_TITLE},
-      {"highEfficiencyModeLabel",
+      {"memorySaverModeLabel",
        IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_SETTING},
-      {"highEfficiencyModeDescription",
+      {"memorySaverModeDescription",
        IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_SETTING_DESCRIPTION},
-      {"highEfficiencyModeHeuristicsLabel",
+      {"memorySaverModeHeuristicsLabel",
        IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_HEURISTICS_LABEL},
-      {"highEfficiencyModeRecommendedBadge",
+      {"memorySaverModeRecommendedBadge",
        IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_RECOMMENDED_BADGE},
-      {"highEfficiencyModeOnTimerLabel",
+      {"memorySaverModeOnTimerLabel",
        IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_ON_TIMER_LABEL},
-      {"highEfficiencyModeRadioGroupAriaLabel",
+      {"memorySaverModeRadioGroupAriaLabel",
        IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_RADIO_GROUP_ARIA_LABEL},
-      {"highEfficiencyChooseDiscardTimeAriaLabel",
+      {"memorySaverChooseDiscardTimeAriaLabel",
        IDS_SETTINGS_PERFORMANCE_HIGH_EFFICIENCY_MODE_CHOOSE_DISCARD_TIME_ARIA_LABEL},
       {"batteryPageTitle", IDS_SETTINGS_BATTERY_PAGE_TITLE},
       {"batterySaverModeLabel",
@@ -761,7 +761,7 @@
   html_source->AddLocalizedStrings(kLocalizedStrings);
 
   html_source->AddBoolean(
-      "highEfficiencyShowRecommendedBadge",
+      "memorySaverShowRecommendedBadge",
       performance_manager::features::kMemorySaverShowRecommendedBadge.Get());
 
   html_source->AddString(
@@ -814,7 +814,7 @@
           IDS_SETTINGS_PERFORMANCE_TAB_DISCARDING_EXCEPTIONS_ADD_DIALOG_HELP,
           chrome::kHighEfficiencyModeTabDiscardingHelpUrl));
 
-  html_source->AddString("highEfficiencyLearnMoreUrl",
+  html_source->AddString("memorySaverLearnMoreUrl",
                          chrome::kHighEfficiencyModeLearnMoreUrl);
   html_source->AddString("batterySaverLearnMoreUrl",
                          chrome::kBatterySaverModeLearnMoreUrl);
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc
index 2ae9737..e2d58fc 100644
--- a/chrome/browser/ui/webui/settings/settings_ui.cc
+++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -529,7 +529,7 @@
   // Performance
   AddSettingsPageUIHandler(std::make_unique<PerformanceHandler>());
   html_source->AddBoolean(
-      "isHighEfficiencyMultistateModeEnabled",
+      "isMemorySaverMultistateModeEnabled",
       base::FeatureList::IsEnabled(
           performance_manager::features::kMemorySaverMultistateMode));
   html_source->AddBoolean(
diff --git a/chrome/browser/vr/win/graphics_delegate_win.cc b/chrome/browser/vr/win/graphics_delegate_win.cc
index a9371ed..da33b85 100644
--- a/chrome/browser/vr/win/graphics_delegate_win.cc
+++ b/chrome/browser/vr/win/graphics_delegate_win.cc
@@ -143,7 +143,7 @@
   client_shared_image_ = sii_->CreateSharedImage(
       format, buffer_size, gfx::ColorSpace(), kTopLeft_GrSurfaceOrigin,
       kPremul_SkAlphaType,
-      gpu::SHARED_IMAGE_USAGE_GLES2 |
+      gpu::SHARED_IMAGE_USAGE_GLES2_READ | gpu::SHARED_IMAGE_USAGE_GLES2_WRITE |
           gpu::SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT,
       "VRGraphicsDelegate", gpu::kNullSurfaceHandle, gfx::BufferUsage::SCANOUT);
   if (!client_shared_image_) {
diff --git a/chrome/browser/web_applications/BUILD.gn b/chrome/browser/web_applications/BUILD.gn
index ae9a9cb7..2d4cce63 100644
--- a/chrome/browser/web_applications/BUILD.gn
+++ b/chrome/browser/web_applications/BUILD.gn
@@ -334,6 +334,8 @@
       "isolated_web_apps/policy/isolated_web_app_policy_constants.h",
       "isolated_web_apps/policy/isolated_web_app_policy_manager.cc",
       "isolated_web_apps/policy/isolated_web_app_policy_manager.h",
+      "migrations/adobe_express_oem_to_default_migration.cc",
+      "migrations/adobe_express_oem_to_default_migration.h",
       "os_integration/web_app_run_on_os_login_chromeos.cc",
       "os_integration/web_app_shortcut_chromeos.cc",
       "preinstalled_web_app_window_experiment.cc",
@@ -943,6 +945,7 @@
   if (is_chromeos) {
     sources += [
       "commands/install_preloaded_verified_app_command_browsertest.cc",
+      "migrations/adobe_express_oem_to_default_migration_browsertest.cc",
       "web_app_run_on_os_login_manager_browsertest.cc",
 
       # TODO(crbug.com/1458725): Support automatic IWA updates on other
diff --git a/chrome/browser/web_applications/migrations/adobe_express_oem_to_default_migration.cc b/chrome/browser/web_applications/migrations/adobe_express_oem_to_default_migration.cc
new file mode 100644
index 0000000..922b072
--- /dev/null
+++ b/chrome/browser/web_applications/migrations/adobe_express_oem_to_default_migration.cc
@@ -0,0 +1,35 @@
+// 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/web_applications/migrations/adobe_express_oem_to_default_migration.h"
+
+#include "chrome/browser/web_applications/web_app_constants.h"
+#include "chrome/browser/web_applications/web_app_id_constants.h"
+#include "chrome/browser/web_applications/web_app_registrar.h"
+#include "chrome/browser/web_applications/web_app_registry_update.h"
+#include "chrome/browser/web_applications/web_app_sync_bridge.h"
+
+namespace web_app::migrations {
+
+void MigrateAdobeExpressFromOemInstallToDefault(WebAppSyncBridge* sync_bridge) {
+  if (!sync_bridge->registrar().IsInstalled(kAdobeExpressAppId)) {
+    return;
+  }
+
+  if (!sync_bridge->registrar()
+           .GetAppById(kAdobeExpressAppId)
+           ->GetSources()
+           .Has(WebAppManagement::Type::kOem)) {
+    return;
+  }
+
+  web_app::ScopedRegistryUpdate update = sync_bridge->BeginUpdate();
+  web_app::WebApp* app = update->UpdateApp(kAdobeExpressAppId);
+  CHECK(app);
+
+  app->AddSource(WebAppManagement::Type::kApsDefault);
+  app->RemoveSource(WebAppManagement::Type::kOem);
+}
+
+}  // namespace web_app::migrations
diff --git a/chrome/browser/web_applications/migrations/adobe_express_oem_to_default_migration.h b/chrome/browser/web_applications/migrations/adobe_express_oem_to_default_migration.h
new file mode 100644
index 0000000..8951821
--- /dev/null
+++ b/chrome/browser/web_applications/migrations/adobe_express_oem_to_default_migration.h
@@ -0,0 +1,25 @@
+// 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_WEB_APPLICATIONS_MIGRATIONS_ADOBE_EXPRESS_OEM_TO_DEFAULT_MIGRATION_H_
+#define CHROME_BROWSER_WEB_APPLICATIONS_MIGRATIONS_ADOBE_EXPRESS_OEM_TO_DEFAULT_MIGRATION_H_
+
+namespace web_app {
+
+class WebAppSyncBridge;
+
+namespace migrations {
+
+// If the Adobe Express app is installed as an OEM install, migrate it instead
+// to WebAppManagement::Type::kApsDefault. This is a migration away from a
+// workaround added to install the app as WebAppManagement::Type::kOem before
+// kApsDefault was supported. See b/300529104 for context.
+// TODO(b/314865744): Remove this migration in ~M134.
+void MigrateAdobeExpressFromOemInstallToDefault(WebAppSyncBridge* sync_bridge);
+
+}  // namespace migrations
+
+}  // namespace web_app
+
+#endif  // CHROME_BROWSER_WEB_APPLICATIONS_MIGRATIONS_ADOBE_EXPRESS_OEM_TO_DEFAULT_MIGRATION_H_
diff --git a/chrome/browser/web_applications/migrations/adobe_express_oem_to_default_migration_browsertest.cc b/chrome/browser/web_applications/migrations/adobe_express_oem_to_default_migration_browsertest.cc
new file mode 100644
index 0000000..c288f99
--- /dev/null
+++ b/chrome/browser/web_applications/migrations/adobe_express_oem_to_default_migration_browsertest.cc
@@ -0,0 +1,80 @@
+// 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/browser.h"
+#include "chrome/browser/web_applications/migrations/adobe_express_oem_to_default_migration.h"
+#include "chrome/browser/web_applications/test/web_app_install_test_utils.h"
+#include "chrome/browser/web_applications/test/web_app_test_utils.h"
+#include "chrome/browser/web_applications/web_app_id_constants.h"
+#include "chrome/browser/web_applications/web_app_provider.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/testing_profile.h"
+#include "components/webapps/browser/installable/installable_metrics.h"
+#include "content/public/test/browser_task_environment.h"
+#include "content/public/test/browser_test.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace web_app::migrations {
+namespace {
+
+class AdobeExpressOemToDefaultMigrationTest : public InProcessBrowserTest {
+ public:
+  Profile* profile() { return browser()->profile(); }
+};
+
+// Installs Adobe Express as an OEM installed app.
+IN_PROC_BROWSER_TEST_F(AdobeExpressOemToDefaultMigrationTest,
+                       PRE_MigrateOemInstall) {
+  auto web_app_info = std::make_unique<web_app::WebAppInstallInfo>();
+  web_app_info->start_url = GURL("https://new.express.adobe.com/");
+
+  webapps::AppId app_id =
+      test::InstallWebApp(profile(), std::move(web_app_info),
+                          /*overwrite_existing_manifest_fields=*/false,
+                          webapps::WebappInstallSource::PRELOADED_OEM);
+  ASSERT_EQ(app_id, kAdobeExpressAppId);
+
+  auto* provider = WebAppProvider::GetForWebApps(profile());
+  ASSERT_TRUE(provider->registrar_unsafe().GetAppById(app_id)->HasOnlySource(
+      WebAppManagement::Type::kOem));
+}
+
+// Verifies that on next startup of the WebAppProvider, the OEM installed app is
+// migrated to be Default installed.
+IN_PROC_BROWSER_TEST_F(AdobeExpressOemToDefaultMigrationTest,
+                       MigrateOemInstall) {
+  auto* provider = WebAppProvider::GetForWebApps(profile());
+  ASSERT_TRUE(provider->registrar_unsafe()
+                  .GetAppById(kAdobeExpressAppId)
+                  ->HasOnlySource(WebAppManagement::Type::kApsDefault));
+}
+
+// Installs Adobe Express as a user installed app.
+IN_PROC_BROWSER_TEST_F(AdobeExpressOemToDefaultMigrationTest,
+                       PRE_DoNotMigrateUserInstall) {
+  auto web_app_info = std::make_unique<web_app::WebAppInstallInfo>();
+  web_app_info->start_url = GURL("https://new.express.adobe.com/");
+
+  webapps::AppId app_id =
+      test::InstallWebApp(profile(), std::move(web_app_info),
+                          /*overwrite_existing_manifest_fields=*/false,
+                          webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON);
+  ASSERT_EQ(app_id, kAdobeExpressAppId);
+
+  auto* provider = WebAppProvider::GetForWebApps(profile());
+  ASSERT_TRUE(provider->registrar_unsafe().GetAppById(app_id)->HasOnlySource(
+      WebAppManagement::Type::kSync));
+}
+
+// Verifies that the user-installed app is not changed on next startup.
+IN_PROC_BROWSER_TEST_F(AdobeExpressOemToDefaultMigrationTest,
+                       DoNotMigrateUserInstall) {
+  auto* provider = WebAppProvider::GetForWebApps(profile());
+  ASSERT_TRUE(provider->registrar_unsafe()
+                  .GetAppById(kAdobeExpressAppId)
+                  ->HasOnlySource(WebAppManagement::Type::kSync));
+}
+
+}  // namespace
+}  // namespace web_app::migrations
diff --git a/chrome/browser/web_applications/web_app_provider.cc b/chrome/browser/web_applications/web_app_provider.cc
index a37d05e8..d1c9c0a7 100644
--- a/chrome/browser/web_applications/web_app_provider.cc
+++ b/chrome/browser/web_applications/web_app_provider.cc
@@ -58,6 +58,7 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 #if BUILDFLAG(IS_CHROMEOS)
+#include "chrome/browser/web_applications/migrations/adobe_express_oem_to_default_migration.h"
 #include "chrome/browser/web_applications/web_app_run_on_os_login_manager.h"
 #endif
 
@@ -420,6 +421,14 @@
 void WebAppProvider::OnSyncBridgeReady() {
   DCHECK(!on_registry_ready_.is_signaled());
 
+  // Perform database migrations once the sync bridge is ready, but before
+  // starting the rest of the subsystems and notifying that the registry is
+  // ready.
+#if BUILDFLAG(IS_CHROMEOS)
+  web_app::migrations::MigrateAdobeExpressFromOemInstallToDefault(
+      sync_bridge_.get());
+#endif  // BUILDFLAG(IS_CHROMEOS)
+
   // Note: This does not wait for the call from the ChromeOS
   // SystemWebAppManager, which is a separate keyed service.
   int num_barrier_calls = 2;
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index 6ecc32b7..ecf7627 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1702360342-58a434caafcb4b1f20e8ae9ace4143db8b9d32d7.profdata
+chrome-android32-main-1702382390-aedc3b176118e492520a9cfe7aad8b29e4f1be22.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 97ed507..ee5fedac 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1702360342-a34fb64f7e574aa2cbb7a66dc37ed1b28a15a42d.profdata
+chrome-android64-main-1702382390-8adedea8df7860f03fb7285696c7f874428ba41d.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index d963149a..b3ae4775 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1702351275-de0127e8b75d161ba4e5799236a697d89d19410c.profdata
+chrome-mac-arm-main-1702382390-f4f82074d1c857944ee4517a2229f917ee89d864.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 011aac5..93c034e3 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1702339053-e3465748493dcbe546a74aa37582c5f51cf6dc70.profdata
+chrome-mac-main-1702360342-0f54327365b9827ddf7a8de770463c986d4e8708.profdata
diff --git a/chrome/renderer/autofill/form_autocomplete_browsertest.cc b/chrome/renderer/autofill/form_autocomplete_browsertest.cc
index dccb370..e7c5dec 100644
--- a/chrome/renderer/autofill/form_autocomplete_browsertest.cc
+++ b/chrome/renderer/autofill/form_autocomplete_browsertest.cc
@@ -13,8 +13,10 @@
 #include "build/build_config.h"
 #include "chrome/test/base/chrome_render_view_test.h"
 #include "components/autofill/content/renderer/autofill_agent.h"
+#include "components/autofill/content/renderer/autofill_agent_test_api.h"
 #include "components/autofill/content/renderer/focus_test_utils.h"
 #include "components/autofill/content/renderer/form_autofill_util.h"
+#include "components/autofill/content/renderer/form_tracker_test_api.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h"
@@ -308,8 +310,6 @@
                                   form.unique_renderer_id, form.fields);
 }
 
-}  // end namespace
-
 class FormAutocompleteTest : public ChromeRenderViewTest {
  public:
   FormAutocompleteTest() = default;
@@ -820,7 +820,8 @@
       "<form><input type='text' name='excluded'/></form>"
       "</html>");
 
-  std::optional<FormData> result = autofill_agent_->CollectFormlessElements();
+  std::optional<FormData> result =
+      test_api(*autofill_agent_).CollectFormlessElements();
   ASSERT_TRUE(result);
 
   // Asserting size 4 also ensures that 'excluded' field inside <form> is not
@@ -1117,8 +1118,8 @@
   ExecuteJavaScriptForTests(hide_elements.c_str());
 
   // Simulate same document navigation.
-  autofill_agent_->form_tracker_for_testing()
-      ->DidFinishSameDocumentNavigation();
+  test_api(test_api(*autofill_agent_).form_tracker())
+      .DidFinishSameDocumentNavigation();
   base::RunLoop().RunUntilIdle();
 
   VerifyReceivedAddressRendererMessages(
@@ -1146,8 +1147,8 @@
   ExecuteJavaScriptForTests(hide_elements.c_str());
 
   // Simulate navigation.
-  autofill_agent_->form_tracker_for_testing()
-      ->FireProbablyFormSubmittedForTesting();
+  test_api(test_api(*autofill_agent_).form_tracker())
+      .FireProbablyFormSubmitted();
 
   base::RunLoop().RunUntilIdle();
 
@@ -1183,4 +1184,6 @@
   EXPECT_EQ(u"blue", field->value);
 }
 
+}  // namespace
+
 }  // namespace autofill
diff --git a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
index fe5cf79ae..af74625 100644
--- a/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
+++ b/chrome/renderer/autofill/password_autofill_agent_browsertest.cc
@@ -22,6 +22,7 @@
 #include "chrome/renderer/autofill/password_generation_test_utils.h"
 #include "chrome/test/base/chrome_render_view_test.h"
 #include "components/autofill/content/renderer/autofill_agent.h"
+#include "components/autofill/content/renderer/autofill_agent_test_api.h"
 #include "components/autofill/content/renderer/form_autofill_util.h"
 #include "components/autofill/content/renderer/form_tracker.h"
 #include "components/autofill/content/renderer/password_generation_agent.h"
@@ -59,6 +60,10 @@
 #include "third_party/blink/public/web/win/web_font_rendering.h"
 #endif
 
+namespace autofill {
+
+namespace {
+
 using autofill::FormRendererId;
 using autofill::FormTracker;
 using autofill::mojom::FocusedFieldType;
@@ -78,8 +83,6 @@
 using testing::Eq;
 using testing::Truly;
 
-namespace {
-
 // The name of the username/password element in the form.
 const char kUsernameName[] = "username";
 const char kPasswordName[] = "password";
@@ -341,10 +344,6 @@
 
 enum class FieldChangeSource { USER, AUTOFILL, USER_AUTOFILL };
 
-}  // namespace
-
-namespace autofill {
-
 class PasswordAutofillAgentTest : public ChromeRenderViewTest {
  public:
   PasswordAutofillAgentTest() = default;
@@ -828,10 +827,10 @@
   void SaveAndSubmitForm() { SaveAndSubmitForm(username_element_.Form()); }
 
   void SaveAndSubmitForm(const WebFormElement& form_element) {
-    FormTracker* tracker = autofill_agent_->form_tracker_for_testing();
-    static_cast<blink::WebLocalFrameObserver*>(tracker)->WillSendSubmitEvent(
+    FormTracker& tracker = test_api(*autofill_agent_).form_tracker();
+    static_cast<blink::WebLocalFrameObserver&>(tracker).WillSendSubmitEvent(
         form_element);
-    static_cast<content::RenderFrameObserver*>(tracker)->WillSubmitForm(
+    static_cast<content::RenderFrameObserver&>(tracker).WillSubmitForm(
         form_element);
   }
 
@@ -841,20 +840,20 @@
   }
 
   void SubmitForm() {
-    FormTracker* tracker = autofill_agent_->form_tracker_for_testing();
-    static_cast<content::RenderFrameObserver*>(tracker)->WillSubmitForm(
+    FormTracker& tracker = test_api(*autofill_agent_).form_tracker();
+    static_cast<content::RenderFrameObserver&>(tracker).WillSubmitForm(
         username_element_.Form());
   }
 
   void FireAjaxSucceeded() {
-    FormTracker* tracker = autofill_agent_->form_tracker_for_testing();
-    tracker->AjaxSucceeded();
+    FormTracker& tracker = test_api(*autofill_agent_).form_tracker();
+    tracker.AjaxSucceeded();
   }
 
   void FireDidFinishSameDocumentNavigation() {
-    FormTracker* tracker = autofill_agent_->form_tracker_for_testing();
-    static_cast<content::RenderFrameObserver*>(tracker)
-        ->DidFinishSameDocumentNavigation();
+    FormTracker& tracker = test_api(*autofill_agent_).form_tracker();
+    static_cast<content::RenderFrameObserver&>(tracker)
+        .DidFinishSameDocumentNavigation();
   }
 
   FakeMojoPasswordManagerDriver fake_driver_;
@@ -2403,8 +2402,8 @@
   confirmation_password_element.SetValue(WebString());
 
   // Submit form.
-  FormTracker* tracker = autofill_agent_->form_tracker_for_testing();
-  static_cast<content::RenderFrameObserver*>(tracker)->WillSubmitForm(
+  FormTracker& tracker = test_api(*autofill_agent_).form_tracker();
+  static_cast<content::RenderFrameObserver&>(tracker).WillSubmitForm(
       username_element.Form());
 
   // Observe that the PasswordAutofillAgent still remembered the last non-empty
@@ -4502,4 +4501,6 @@
 
 #endif  // BUILDFLAG(IS_ANDROID)
 
+}  // namespace
+
 }  // namespace autofill
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 4910087..1f259bb 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -5582,6 +5582,7 @@
       "../browser/lacros/browser_launcher_browsertest.cc",
       "../browser/lacros/browser_service_lacros_browsertest.cc",
       "../browser/lacros/cert/cert_db_initializer_browsertest.cc",
+      "../browser/lacros/chaps_service_lacros_browsertest.cc",
       "../browser/lacros/clipboard_history_lacros_browsertest.cc",
       "../browser/lacros/clipboard_lacros_browsertest.cc",
       "../browser/lacros/component_policy_lacros_browsertest.cc",
@@ -9869,6 +9870,7 @@
         "../browser/ui/views/media_preview/camera_preview/camera_coordinator_unittest.cc",
         "../browser/ui/views/media_preview/camera_preview/video_stream_coordinator_unittest.cc",
         "../browser/ui/views/media_preview/media_view_controller_base_unittest.cc",
+        "../browser/ui/views/media_preview/mic_preview/mic_coordinator_unittest.cc",
         "../browser/ui/views/policy/enterprise_startup_dialog_unittest.cc",
       ]
 
diff --git a/chrome/test/data/webui/password_manager/passwords_section_test.ts b/chrome/test/data/webui/password_manager/passwords_section_test.ts
index 839c217..8de9916 100644
--- a/chrome/test/data/webui/password_manager/passwords_section_test.ts
+++ b/chrome/test/data/webui/password_manager/passwords_section_test.ts
@@ -5,6 +5,7 @@
 import 'chrome://password-manager/password_manager.js';
 
 import {AddPasswordDialogElement, AuthTimedOutDialogElement, Page, PasswordListItemElement, PasswordManagerImpl, PasswordsSectionElement, PasswordViewPageInteractions, PluralStringProxyImpl, Router, SyncBrowserProxyImpl, UrlParam} from 'chrome://password-manager/password_manager.js';
+import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {assertArrayEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
 import {TestPluralStringProxy} from 'chrome://webui-test/test_plural_string_proxy.js';
@@ -630,4 +631,69 @@
             Page.PASSWORD_DETAILS, Router.getInstance().currentRoute.page);
         assertEquals(query, Router.getInstance().currentRoute.queryParameters);
       });
+
+  test('Should not show local credentials icon', async function() {
+    loadTimeData.overrideValues({enableButterOnDesktopFollowup: true});
+    passwordManager.data.isOptedInAccountStorage = true;
+
+    passwordManager.data.groups = [createCredentialGroup({
+      name: 'test.com',
+      credentials: [
+        createPasswordEntry({id: 0, inAccountStore: true}),
+        createPasswordEntry(
+            {id: 1, inAccountStore: true, inProfileStore: true}),
+      ],
+    })];
+
+    const section = await createPasswordsSection();
+    const listEntry =
+        section.shadowRoot!.querySelector<HTMLElement>('password-list-item');
+    assertTrue(!!listEntry);
+    assertFalse(isVisible(
+        section.shadowRoot!.querySelector<HTMLElement>('#localPasswordsIcon')));
+  });
+
+  test('Should show local credentials icon', async function() {
+    loadTimeData.overrideValues({enableButterOnDesktopFollowup: true});
+    passwordManager.data.isOptedInAccountStorage = true;
+    syncProxy.syncInfo = {
+      isEligibleForAccountStorage: true,
+      isSyncingPasswords: false,
+    };
+
+    passwordManager.data.groups = [createCredentialGroup({
+      name: 'test.com',
+      credentials: [
+        createPasswordEntry({id: 0, inProfileStore: true}),
+      ],
+    })];
+
+    const section = await createPasswordsSection();
+    const listEntry =
+        section.shadowRoot!.querySelector<HTMLElement>('password-list-item');
+    assertTrue(!!listEntry);
+    assertTrue(isVisible(listEntry.shadowRoot!.querySelector<HTMLElement>(
+        '#localPasswordsIcon')));
+  });
+
+  test('Number of local passwords tooltip text', async function() {
+    passwordManager.data.groups = [
+      createCredentialGroup({
+        name: 'bar.com',
+        credentials: [
+          createPasswordEntry({id: 0, inProfileStore: true}),
+        ],
+      }),
+    ];
+    pluralString.text = '1 password';
+
+    const section = await createPasswordsSection();
+    const listEntry =
+        section.shadowRoot!.querySelector<HTMLElement>('password-list-item');
+    assertTrue(!!listEntry);
+    assertEquals(
+        listEntry.shadowRoot!.querySelector<HTMLElement>(
+                                 'paper-tooltip')!.innerHTML,
+        '1 password');
+  });
 });
diff --git a/chrome/test/data/webui/settings/performance_page_test.ts b/chrome/test/data/webui/settings/performance_page_test.ts
index 1da2fe8..91ca7dd8 100644
--- a/chrome/test/data/webui/settings/performance_page_test.ts
+++ b/chrome/test/data/webui/settings/performance_page_test.ts
@@ -8,7 +8,7 @@
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {CrIconButtonElement, IronCollapseElement, SettingsRadioGroupElement} from 'chrome://settings/lazy_load.js';
-import {ExceptionAddDialogElement, ExceptionEditDialogElement, ExceptionEntryElement, ExceptionListElement, ExceptionTabbedAddDialogElement, HIGH_EFFICIENCY_MODE_PREF, HighEfficiencyModeExceptionListAction, HighEfficiencyModeState, PerformanceBrowserProxyImpl, PerformanceMetricsProxyImpl, SettingsCheckboxListEntryElement, SettingsDropdownMenuElement, SettingsPerformancePageElement, TAB_DISCARD_EXCEPTIONS_MANAGED_PREF, TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE, TAB_DISCARD_EXCEPTIONS_PREF} from 'chrome://settings/settings.js';
+import {ExceptionAddDialogElement, ExceptionEditDialogElement, ExceptionEntryElement, ExceptionListElement, ExceptionTabbedAddDialogElement, MEMORY_SAVER_MODE_PREF, MemorySaverModeExceptionListAction, MemorySaverModeState, PerformanceBrowserProxyImpl, PerformanceMetricsProxyImpl, SettingsCheckboxListEntryElement, SettingsDropdownMenuElement, SettingsPerformancePageElement, TAB_DISCARD_EXCEPTIONS_MANAGED_PREF, TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE, TAB_DISCARD_EXCEPTIONS_PREF} from 'chrome://settings/settings.js';
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
 import {eventToPromise} from 'chrome://webui-test/test_util.js';
@@ -20,7 +20,7 @@
   high_efficiency_mode: {
     state: {
       type: chrome.settingsPrivate.PrefType.NUMBER,
-      value: HighEfficiencyModeState.DISABLED,
+      value: MemorySaverModeState.DISABLED,
     },
     time_before_discard_in_minutes: {
       type: chrome.settingsPrivate.PrefType.NUMBER,
@@ -71,38 +71,38 @@
     flush();
   });
 
-  test('testHighEfficiencyModeEnabled', function() {
+  test('testMemorySaverModeEnabled', function() {
     performancePage.setPrefValue(
-        HIGH_EFFICIENCY_MODE_PREF, HighEfficiencyModeState.ENABLED_ON_TIMER);
+        MEMORY_SAVER_MODE_PREF, MemorySaverModeState.ENABLED_ON_TIMER);
     assertTrue(performancePage.$.toggleButton.checked);
   });
 
-  test('testHighEfficiencyModeDisabled', function() {
+  test('testMemorySaverModeDisabled', function() {
     performancePage.setPrefValue(
-        HIGH_EFFICIENCY_MODE_PREF, HighEfficiencyModeState.DISABLED);
+        MEMORY_SAVER_MODE_PREF, MemorySaverModeState.DISABLED);
     assertFalse(performancePage.$.toggleButton.checked);
   });
 
-  test('testHighEfficiencyModeChangeState', async function() {
+  test('testMemorySaverModeChangeState', async function() {
     performancePage.setPrefValue(
-        HIGH_EFFICIENCY_MODE_PREF, HighEfficiencyModeState.DISABLED);
+        MEMORY_SAVER_MODE_PREF, MemorySaverModeState.DISABLED);
 
     performancePage.$.toggleButton.click();
     let state = await performanceMetricsProxy.whenCalled(
-        'recordHighEfficiencyModeChanged');
-    assertEquals(state, HighEfficiencyModeState.ENABLED_ON_TIMER);
+        'recordMemorySaverModeChanged');
+    assertEquals(state, MemorySaverModeState.ENABLED_ON_TIMER);
     assertEquals(
-        performancePage.getPref(HIGH_EFFICIENCY_MODE_PREF).value,
-        HighEfficiencyModeState.ENABLED_ON_TIMER);
+        performancePage.getPref(MEMORY_SAVER_MODE_PREF).value,
+        MemorySaverModeState.ENABLED_ON_TIMER);
 
     performanceMetricsProxy.reset();
     performancePage.$.toggleButton.click();
     state = await performanceMetricsProxy.whenCalled(
-        'recordHighEfficiencyModeChanged');
-    assertEquals(state, HighEfficiencyModeState.DISABLED);
+        'recordMemorySaverModeChanged');
+    assertEquals(state, MemorySaverModeState.DISABLED);
     assertEquals(
-        performancePage.getPref(HIGH_EFFICIENCY_MODE_PREF).value,
-        HighEfficiencyModeState.DISABLED);
+        performancePage.getPref(MEMORY_SAVER_MODE_PREF).value,
+        MemorySaverModeState.DISABLED);
   });
 });
 
@@ -120,7 +120,7 @@
   /**
    * Used to get elements form the performance page that may or may not exist,
    * such as those inside a dom-if.
-   * TODO(charlesmeng): remove once kHighEfficiencyMultistateMode flag is
+   * TODO(charlesmeng): remove once kMemorySaverMultistateMode flag is
    * cleaned up, since elements can then be selected with $ interface
    */
   function getPerformancePageElement<T extends HTMLElement = HTMLElement>(
@@ -152,36 +152,36 @@
     discardTimeDropdown = getPerformancePageElement('discardTimeDropdown');
   });
 
-  test('testHighEfficiencyModeDisabled', function() {
+  test('testMemorySaverModeDisabled', function() {
     performancePage.setPrefValue(
-        HIGH_EFFICIENCY_MODE_PREF, HighEfficiencyModeState.DISABLED);
+        MEMORY_SAVER_MODE_PREF, MemorySaverModeState.DISABLED);
     assertFalse(performancePage.$.toggleButton.checked);
     assertFalse(radioGroupCollapse.opened);
     assertTrue(discardTimeDropdown.disabled);
   });
 
-  test('testHighEfficiencyModeEnabled', function() {
+  test('testMemorySaverModeEnabled', function() {
     performancePage.setPrefValue(
-        HIGH_EFFICIENCY_MODE_PREF, HighEfficiencyModeState.ENABLED);
+        MEMORY_SAVER_MODE_PREF, MemorySaverModeState.ENABLED);
     assertTrue(performancePage.$.toggleButton.checked);
     assertTrue(radioGroupCollapse.opened);
-    assertEquals(String(HighEfficiencyModeState.ENABLED), radioGroup.selected);
+    assertEquals(String(MemorySaverModeState.ENABLED), radioGroup.selected);
     assertTrue(discardTimeDropdown.disabled);
   });
 
-  test('testHighEfficiencyModeEnabledOnTimer', function() {
+  test('testMemorySaverModeEnabledOnTimer', function() {
     performancePage.setPrefValue(
-        HIGH_EFFICIENCY_MODE_PREF, HighEfficiencyModeState.ENABLED_ON_TIMER);
+        MEMORY_SAVER_MODE_PREF, MemorySaverModeState.ENABLED_ON_TIMER);
     assertTrue(performancePage.$.toggleButton.checked);
     assertTrue(radioGroupCollapse.opened);
     assertEquals(
-        String(HighEfficiencyModeState.ENABLED_ON_TIMER), radioGroup.selected);
+        String(MemorySaverModeState.ENABLED_ON_TIMER), radioGroup.selected);
     assertFalse(discardTimeDropdown.disabled);
   });
 
-  test('testHighEfficiencyModeDiscardTime', async function() {
+  test('testMemorySaverModeDiscardTime', async function() {
     performancePage.setPrefValue(
-        HIGH_EFFICIENCY_MODE_PREF, HighEfficiencyModeState.ENABLED_ON_TIMER);
+        MEMORY_SAVER_MODE_PREF, MemorySaverModeState.ENABLED_ON_TIMER);
     performancePage.setPrefValue(DISCARD_TIME_PREF, 120);
     // Need to wait for dropdown menu to update its selection using a microtask
     await flushTasks();
@@ -200,35 +200,35 @@
         performancePage.getPref(DISCARD_TIME_PREF).value);
   });
 
-  test('testHighEfficiencyModeChangeState', async function() {
+  test('testMemorySaverModeChangeState', async function() {
     performancePage.setPrefValue(
-        HIGH_EFFICIENCY_MODE_PREF, HighEfficiencyModeState.DISABLED);
+        MEMORY_SAVER_MODE_PREF, MemorySaverModeState.DISABLED);
 
     performancePage.$.toggleButton.click();
     let state = await performanceMetricsProxy.whenCalled(
-        'recordHighEfficiencyModeChanged');
-    assertEquals(state, HighEfficiencyModeState.ENABLED);
+        'recordMemorySaverModeChanged');
+    assertEquals(state, MemorySaverModeState.ENABLED);
     assertEquals(
-        performancePage.getPref(HIGH_EFFICIENCY_MODE_PREF).value,
-        HighEfficiencyModeState.ENABLED);
+        performancePage.getPref(MEMORY_SAVER_MODE_PREF).value,
+        MemorySaverModeState.ENABLED);
 
     performanceMetricsProxy.reset();
     enabledOnTimerButton.click();
     state = await performanceMetricsProxy.whenCalled(
-        'recordHighEfficiencyModeChanged');
-    assertEquals(state, HighEfficiencyModeState.ENABLED_ON_TIMER);
+        'recordMemorySaverModeChanged');
+    assertEquals(state, MemorySaverModeState.ENABLED_ON_TIMER);
     assertEquals(
-        performancePage.getPref(HIGH_EFFICIENCY_MODE_PREF).value,
-        HighEfficiencyModeState.ENABLED_ON_TIMER);
+        performancePage.getPref(MEMORY_SAVER_MODE_PREF).value,
+        MemorySaverModeState.ENABLED_ON_TIMER);
 
     performanceMetricsProxy.reset();
     performancePage.$.toggleButton.click();
     state = await performanceMetricsProxy.whenCalled(
-        'recordHighEfficiencyModeChanged');
-    assertEquals(state, HighEfficiencyModeState.DISABLED);
+        'recordMemorySaverModeChanged');
+    assertEquals(state, MemorySaverModeState.DISABLED);
     assertEquals(
-        performancePage.getPref(HIGH_EFFICIENCY_MODE_PREF).value,
-        HighEfficiencyModeState.DISABLED);
+        performancePage.getPref(MEMORY_SAVER_MODE_PREF).value,
+        MemorySaverModeState.DISABLED);
   });
 });
 
@@ -363,7 +363,7 @@
     flush();
     assertExceptionListEquals(['bar']);
     assertEquals(
-        HighEfficiencyModeExceptionListAction.REMOVE,
+        MemorySaverModeExceptionListAction.REMOVE,
         await performanceMetricsProxy.whenCalled('recordExceptionListAction'));
 
     clickMoreActionsButton(getExceptionListEntry(0));
@@ -445,7 +445,7 @@
     assertEquals('', addDialog.$.input.$.input.value);
     await inputDialog(addDialog, 'bar');
     assertEquals(
-        HighEfficiencyModeExceptionListAction.ADD_MANUAL,
+        MemorySaverModeExceptionListAction.ADD_MANUAL,
         await performanceMetricsProxy.whenCalled('recordExceptionListAction'));
     assertExceptionListEquals(['foo', 'bar']);
   });
@@ -464,7 +464,7 @@
     assertEquals(entry.entry.site, editDialog.$.input.$.input.value);
     await inputDialog(editDialog, 'baz');
     assertEquals(
-        HighEfficiencyModeExceptionListAction.EDIT,
+        MemorySaverModeExceptionListAction.EDIT,
         await performanceMetricsProxy.whenCalled('recordExceptionListAction'));
     assertExceptionListEquals(['foo', 'baz']);
   });
diff --git a/chrome/test/data/webui/settings/tab_discard_exception_dialog_test.ts b/chrome/test/data/webui/settings/tab_discard_exception_dialog_test.ts
index b9fde49..ff93a82 100644
--- a/chrome/test/data/webui/settings/tab_discard_exception_dialog_test.ts
+++ b/chrome/test/data/webui/settings/tab_discard_exception_dialog_test.ts
@@ -5,7 +5,7 @@
 import 'chrome://settings/settings.js';
 
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {ExceptionAddDialogElement, ExceptionAddDialogTabs, ExceptionEditDialogElement, ExceptionTabbedAddDialogElement, HighEfficiencyModeExceptionListAction, MAX_TAB_DISCARD_EXCEPTION_RULE_LENGTH, PerformanceBrowserProxyImpl, PerformanceMetricsProxyImpl, SettingsCheckboxListEntryElement, TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE, TAB_DISCARD_EXCEPTIONS_PREF} from 'chrome://settings/settings.js';
+import {ExceptionAddDialogElement, ExceptionAddDialogTabs, ExceptionEditDialogElement, ExceptionTabbedAddDialogElement, MAX_TAB_DISCARD_EXCEPTION_RULE_LENGTH, MemorySaverModeExceptionListAction, PerformanceBrowserProxyImpl, PerformanceMetricsProxyImpl, SettingsCheckboxListEntryElement, TAB_DISCARD_EXCEPTIONS_OVERFLOW_SIZE, TAB_DISCARD_EXCEPTIONS_PREF} from 'chrome://settings/settings.js';
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {eventToPromise} from 'chrome://webui-test/test_util.js';
 
@@ -180,7 +180,7 @@
     assertSubmit([EXISTING_RULE, VALID_RULE]);
     const action =
         await performanceMetricsProxy.whenCalled('recordExceptionListAction');
-    assertEquals(HighEfficiencyModeExceptionListAction.ADD_MANUAL, action);
+    assertEquals(MemorySaverModeExceptionListAction.ADD_MANUAL, action);
   });
 
   test('testExceptionAddDialogSubmitExisting', async function() {
@@ -195,7 +195,7 @@
     assertSubmit([EXISTING_RULE, VALID_RULE]);
     const action =
         await performanceMetricsProxy.whenCalled('recordExceptionListAction');
-    assertEquals(HighEfficiencyModeExceptionListAction.ADD_MANUAL, action);
+    assertEquals(MemorySaverModeExceptionListAction.ADD_MANUAL, action);
   });
 
   test('testExceptionTabbedAddDialogSubmitExisting', async function() {
@@ -210,7 +210,7 @@
     assertSubmit([VALID_RULE]);
     const action =
         await performanceMetricsProxy.whenCalled('recordExceptionListAction');
-    assertEquals(HighEfficiencyModeExceptionListAction.EDIT, action);
+    assertEquals(MemorySaverModeExceptionListAction.EDIT, action);
   });
 
   test('testExceptionEditDialogSubmitExisting', async function() {
diff --git a/chrome/test/data/webui/settings/test_performance_browser_proxy.ts b/chrome/test/data/webui/settings/test_performance_browser_proxy.ts
index 9effa1ec..0def5e2 100644
--- a/chrome/test/data/webui/settings/test_performance_browser_proxy.ts
+++ b/chrome/test/data/webui/settings/test_performance_browser_proxy.ts
@@ -15,7 +15,7 @@
       'getCurrentOpenSites',
       'getDeviceHasBattery',
       'openBatterySaverFeedbackDialog',
-      'openHighEfficiencyFeedbackDialog',
+      'openMemorySaverFeedbackDialog',
       'openSpeedFeedbackDialog',
       'validateTabDiscardExceptionRule',
     ]);
@@ -39,8 +39,8 @@
     this.methodCalled('openBatterySaverFeedbackDialog');
   }
 
-  openHighEfficiencyFeedbackDialog() {
-    this.methodCalled('openHighEfficiencyFeedbackDialog');
+  openMemorySaverFeedbackDialog() {
+    this.methodCalled('openMemorySaverFeedbackDialog');
   }
 
   openSpeedFeedbackDialog() {
diff --git a/chrome/test/data/webui/settings/test_performance_metrics_proxy.ts b/chrome/test/data/webui/settings/test_performance_metrics_proxy.ts
index 976a916927..a23f87ee 100644
--- a/chrome/test/data/webui/settings/test_performance_metrics_proxy.ts
+++ b/chrome/test/data/webui/settings/test_performance_metrics_proxy.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 {BatterySaverModeState, HighEfficiencyModeExceptionListAction, HighEfficiencyModeState, PerformanceMetricsProxy} from 'chrome://settings/settings.js';
+import {BatterySaverModeState, MemorySaverModeExceptionListAction, MemorySaverModeState, PerformanceMetricsProxy} from 'chrome://settings/settings.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
 export class TestPerformanceMetricsProxy extends TestBrowserProxy implements
@@ -10,7 +10,7 @@
   constructor() {
     super([
       'recordBatterySaverModeChanged',
-      'recordHighEfficiencyModeChanged',
+      'recordMemorySaverModeChanged',
       'recordExceptionListAction',
     ]);
   }
@@ -19,11 +19,11 @@
     this.methodCalled('recordBatterySaverModeChanged', state);
   }
 
-  recordHighEfficiencyModeChanged(state: HighEfficiencyModeState) {
-    this.methodCalled('recordHighEfficiencyModeChanged', state);
+  recordMemorySaverModeChanged(state: MemorySaverModeState) {
+    this.methodCalled('recordMemorySaverModeChanged', state);
   }
 
-  recordExceptionListAction(action: HighEfficiencyModeExceptionListAction) {
+  recordExceptionListAction(action: MemorySaverModeExceptionListAction) {
     this.methodCalled('recordExceptionListAction', action);
   }
 }
\ No newline at end of file
diff --git a/chromeos/crosapi/mojom/BUILD.gn b/chromeos/crosapi/mojom/BUILD.gn
index 90a3f28b..1624acfe 100644
--- a/chromeos/crosapi/mojom/BUILD.gn
+++ b/chromeos/crosapi/mojom/BUILD.gn
@@ -20,6 +20,7 @@
     "browser_version.mojom",
     "cert_database.mojom",
     "cert_provisioning.mojom",
+    "chaps_service.mojom",
     "chrome_app_kiosk_service.mojom",
     "clipboard.mojom",
     "clipboard_history.mojom",
diff --git a/chromeos/crosapi/mojom/chaps_service.mojom b/chromeos/crosapi/mojom/chaps_service.mojom
new file mode 100644
index 0000000..117eafc6
--- /dev/null
+++ b/chromeos/crosapi/mojom/chaps_service.mojom
@@ -0,0 +1,135 @@
+// 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.
+
+module crosapi.mojom;
+
+// This interface is implemented by Ash-Chrome. It allows Ash-Chrome and
+// Lacros-Chrome to communicate with the Chaps system daemon (instead of using
+// D-Bus directly, which doesn't have backwards-compatibility safeguards).
+[Stable, Uuid="d1956d76-2141-4638-aee8-fb0e313418e4"]
+interface ChapsService {
+    // PKCS #11 v2.20 section 11.5 page 106.
+    GetSlotList@0(bool token_present) =>
+        (array<uint64> slot_list, uint32 result);
+
+    // PKCS #11 v2.20 section 11.5 page 111.
+    GetMechanismList@1(uint64 slot_id) =>
+        (array<uint64> mechanism_list, uint32 result);
+
+    // PKCS #11 v2.20 section 11.6 page 117.
+    OpenSession@2(uint64 slot_id, uint64 flags) =>
+        (uint64 session_id, uint32 result);
+
+    // PKCS #11 v2.20 section 11.6 page 118.
+    CloseSession@3(uint64 session_id) =>
+        (uint32 result);
+
+    // PKCS #11 v2.20 section 11.7 page 128.
+    // `attributes` is a serialized chaps::AttributeList
+    // (see system_api/dbus/chaps/attributes.proto).
+    CreateObject@4(uint64 session_id, array<uint8> attributes) =>
+        (uint64 new_object_handle, uint32 result);
+
+    // PKCS #11 v2.20 section 11.7 page 131.
+    DestroyObject@5(uint64 session_id, uint64 object_handle) =>
+        (uint32 result);
+
+    // PKCS #11 v2.20 section 11.7 page 133.
+    // `attributes` and `attributes_out` are serialized chaps::AttributeList-s
+    // (see system_api/dbus/chaps/attributes.proto).
+    GetAttributeValue@6(uint64 session_id, uint64 object_handle,
+        array<uint8> attributes) =>
+        (array<uint8> attributes_out, uint32 result);
+
+    // PKCS #11 v2.20 section 11.7 page 135.
+    // `attributes` is a serialized chaps::AttributeList
+    // (see system_api/dbus/chaps/attributes.proto).
+    SetAttributeValue@7(uint64 session_id, uint64 object_handle,
+        array<uint8> attributes) =>
+        (uint32 result);
+
+    // PKCS #11 v2.20 section 11.7 page 136.
+    // `attributes` is a serialized chaps::AttributeList
+    // (see system_api/dbus/chaps/attributes.proto).
+    FindObjectsInit@8(uint64 session_id, array<uint8> attributes) =>
+        (uint32 result);
+
+    // PKCS #11 v2.20 section 11.7 page 137.
+    FindObjects@9(uint64 session_id, uint64 max_object_count) =>
+        (array<uint64> object_list, uint32 result);
+
+    // PKCS #11 v2.20 section 11.7 page 138.
+    FindObjectsFinal@10(uint64 session_id) => (uint32 result);
+
+    // PKCS #11 v2.20 section 11.8 page 139.
+    // `mechanism_parameter` is a buffer containing a C-struct. The type of the
+    // struct depends on the provided `mechanism_type`.
+    EncryptInit@11(uint64 session_id, uint64 mechanism_type,
+        array<uint8> mechanism_parameter, uint64 key_handle) =>
+        (uint32 result);
+
+    // PKCS #11 v2.20 section 11.8 page 140.
+    Encrypt@12(uint64 session_id, array<uint8> data, uint64 max_out_length) =>
+        (uint64 actual_out_length, array<uint8> data, uint32 result);
+
+    // PKCS #11 v2.20 section 11.9 page 144.
+    // `mechanism_parameter` is a buffer containing a C-struct. The type of the
+    // struct depends on the provided `mechanism_type`.
+    DecryptInit@13(uint64 session_id, uint64 mechanism_type,
+        array<uint8> mechanism_parameter, uint64 key_handle) =>
+        (uint32 result);
+
+    // PKCS #11 v2.20 section 11.9 page 145.
+    Decrypt@14(uint64 session_id, array<uint8> data, uint64 max_out_length) =>
+        (uint64 actual_out_length, array<uint8> data, uint32 result);
+
+    // PKCS #11 v2.20 section 11.11 page 152.
+    // `mechanism_parameter` is a buffer containing a C-struct. The type of the
+    // struct depends on the provided `mechanism_type`.
+    SignInit@15(uint64 session_id, uint64 mechanism_type,
+        array<uint8> mechanism_parameter, uint64 key_handle) =>
+        (uint32 result);
+
+    // PKCS #11 v2.20 section 11.11 page 153.
+    Sign@16(uint64 session_id, array<uint8> data, uint64 max_out_length) =>
+        (uint64 actual_out_length, array<uint8> signature, uint32 result);
+
+    // PKCS #11 v2.20 section 11.14 page 175.
+    // `mechanism_parameter` is a buffer containing a C-struct. The type of the
+    // struct depends on the provided `mechanism_type`.
+    // `public_attributes` and `private_attributes` are serialized
+    // chaps::AttributeList-s (see system_api/dbus/chaps/attributes.proto).
+    GenerateKeyPair@17(uint64 session_id, uint64 mechanism_type,
+        array<uint8> mechanism_parameter, array<uint8> public_attributes,
+        array<uint8> private_attributes) =>
+        (uint64 public_key_handle, uint64 private_key_handle, uint32 result);
+
+    // PKCS #11 v2.20 section 11.14 page 178.
+    // `mechanism_parameter` is a buffer containing a C-struct. The type of the
+    // struct depends on the provided `mechanism_type`.
+    WrapKey@18(uint64 session_id, uint64 mechanism_type,
+        array<uint8> mechanism_parameter, uint64 wrapping_key_handle,
+        uint64 key_handle, uint64 max_out_length) =>
+        (uint64 actual_out_length, array<uint8> wrapped_key, uint32 result);
+
+    // PKCS #11 v2.20 section 11.14 page 180.
+    // `mechanism_parameter` is a buffer containing a C-struct. The type of the
+    // struct depends on the provided `mechanism_type`.
+    // `attributes` is a serialized chaps::AttributeList
+    // (see system_api/dbus/chaps/attributes.proto).
+    UnwrapKey@19(uint64 session_id, uint64 mechanism_type,
+        array<uint8> mechanism_parameter, uint64 wrapping_key_handle,
+        array<uint8> wrapped_key, array<uint8> attributes) =>
+        (uint64 key_handle, uint32 result);
+
+    // PKCS #11 v2.20 section 11.14 page 182.
+    // `mechanism_parameter` is a buffer containing a C-struct. The type of the
+    // struct depends on the provided `mechanism_type`.
+    // `attributes` is a serialized chaps::AttributeList
+    // (see system_api/dbus/chaps/attributes.proto).
+    DeriveKey@20(uint64 session_id, uint64 mechanism_type,
+        array<uint8> mechanism_parameter, uint64 base_key_handle,
+        array<uint8> attributes) =>
+        (uint64 key_handle, uint32 result);
+};
diff --git a/chromeos/crosapi/mojom/crosapi.mojom b/chromeos/crosapi/mojom/crosapi.mojom
index 6e3479a..f68b9c5 100644
--- a/chromeos/crosapi/mojom/crosapi.mojom
+++ b/chromeos/crosapi/mojom/crosapi.mojom
@@ -20,6 +20,7 @@
 import "chromeos/crosapi/mojom/guest_os_sk_forwarder.mojom";
 import "chromeos/crosapi/mojom/cert_database.mojom";
 import "chromeos/crosapi/mojom/cert_provisioning.mojom";
+import "chromeos/crosapi/mojom/chaps_service.mojom";
 import "chromeos/crosapi/mojom/chrome_app_kiosk_service.mojom";
 import "chromeos/crosapi/mojom/clipboard.mojom";
 import "chromeos/crosapi/mojom/clipboard_history.mojom";
@@ -151,8 +152,8 @@
 // please note the milestone when you added it, to help us reason about
 // compatibility between the client applications and older ash-chrome binaries.
 //
-// Next version: 125
-// Next method id: 127
+// Next version: 126
+// Next method id: 128
 [Stable, Uuid="8b79c34f-2bf8-4499-979a-b17cac522c1e",
  RenamedFrom="crosapi.mojom.AshChromeService"]
 interface Crosapi {
@@ -238,6 +239,11 @@
   [MinVersion=83]
   BindCertProvisioning@86(pending_receiver<CertProvisioning> receiver);
 
+  // Binds the ChapsService interface for communicating with the Chaps daemon.
+  // Added in M121.
+  [MinVersion=125] BindChapsService@127(
+      pending_receiver<ChapsService> receiver);
+
   // Binds the chrome app publisher service, which allows Lacros to connect its
   // Chrome apps to the app service.
   // Added in M93.
diff --git a/chromeos/lacros/lacros_service.cc b/chromeos/lacros/lacros_service.cc
index 0b7b0a4..aaaa1d2 100644
--- a/chromeos/lacros/lacros_service.cc
+++ b/chromeos/lacros/lacros_service.cc
@@ -31,6 +31,7 @@
 #include "chromeos/crosapi/mojom/browser_version.mojom.h"
 #include "chromeos/crosapi/mojom/cert_database.mojom.h"
 #include "chromeos/crosapi/mojom/cert_provisioning.mojom.h"
+#include "chromeos/crosapi/mojom/chaps_service.mojom.h"
 #include "chromeos/crosapi/mojom/chrome_app_kiosk_service.mojom.h"
 #include "chromeos/crosapi/mojom/clipboard.mojom.h"
 #include "chromeos/crosapi/mojom/clipboard_history.mojom.h"
@@ -298,6 +299,8 @@
   ConstructRemote<
       crosapi::mojom::CertProvisioning, &Crosapi::BindCertProvisioning,
       Crosapi::MethodMinVersions::kBindCertProvisioningMinVersion>();
+  ConstructRemote<crosapi::mojom::ChapsService, &Crosapi::BindChapsService,
+                  Crosapi::MethodMinVersions::kBindChapsServiceMinVersion>();
   ConstructRemote<crosapi::mojom::Clipboard, &Crosapi::BindClipboard,
                   Crosapi::MethodMinVersions::kBindClipboardMinVersion>();
   ConstructRemote<
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni
index 095c34b..4000abe 100644
--- a/chromeos/tast_control.gni
+++ b/chromeos/tast_control.gni
@@ -130,6 +130,9 @@
   "wmp.DeskTemplatesDelete",
   "wmp.SavedDeskDelete",
 
+  # b/314779670, waiting for LKGM including the revert
+  "platform.Resourced.baseline",
+
   # READ COMMENT AT TOP BEFORE ADDING NEW TESTS HERE.
 ]
 
diff --git a/clank b/clank
index 11181f4..3d55fc4 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 11181f4251073bcd9247a6e263ddaf9e44cc78a3
+Subproject commit 3d55fc4f1877714a5aefaf5ca58e533d53b61244
diff --git a/components/autofill/content/renderer/BUILD.gn b/components/autofill/content/renderer/BUILD.gn
index 105582d..b0cad347 100644
--- a/components/autofill/content/renderer/BUILD.gn
+++ b/components/autofill/content/renderer/BUILD.gn
@@ -69,6 +69,7 @@
     "focus_test_utils.cc",
     "focus_test_utils.h",
     "form_cache_test_api.h",
+    "form_tracker_test_api.h",
     "test_password_autofill_agent.cc",
     "test_password_autofill_agent.h",
     "test_utils.cc",
diff --git a/components/autofill/content/renderer/autofill_agent.h b/components/autofill/content/renderer/autofill_agent.h
index 6e991d2..38da23e 100644
--- a/components/autofill/content/renderer/autofill_agent.h
+++ b/components/autofill/content/renderer/autofill_agent.h
@@ -177,12 +177,6 @@
   void UpdateStateForTextChange(const blink::WebFormControlElement& element,
                                 FieldPropertiesFlags flag);
 
-  FormTracker* form_tracker_for_testing() { return form_tracker_.get(); }
-  void set_form_tracker_for_testing(
-      std::unique_ptr<FormTracker>&& form_tracker) {
-    form_tracker_ = std::move(form_tracker);
-  }
-
   bool is_heavy_form_data_scraping_enabled() {
     return is_heavy_form_data_scraping_enabled_;
   }
@@ -313,7 +307,6 @@
       DenseSet<form_util::ExtractOption> extract_options = {
           form_util::ExtractOption::kValue,
           form_util::ExtractOption::kOptions}) const;
-  FRIEND_TEST_ALL_PREFIXES(FormAutocompleteTest, CollectFormlessElements);
 
   void OnTextFieldDidChange(const blink::WebFormControlElement& element);
   void DidChangeScrollOffsetImpl(const blink::WebFormControlElement& element);
diff --git a/components/autofill/content/renderer/autofill_agent_browsertest.cc b/components/autofill/content/renderer/autofill_agent_browsertest.cc
index b561243a..afcbf45 100644
--- a/components/autofill/content/renderer/autofill_agent_browsertest.cc
+++ b/components/autofill/content/renderer/autofill_agent_browsertest.cc
@@ -194,8 +194,9 @@
     autofill_agent_ = std::make_unique<AutofillAgent>(
         GetMainRenderFrame(), std::move(password_autofill_agent),
         std::move(password_generation), &associated_interfaces_);
-    autofill_agent_->set_form_tracker_for_testing(
-        std::make_unique<MockFormTracker>(GetMainRenderFrame()));
+    test_api(*autofill_agent_)
+        .set_form_tracker(
+            std::make_unique<MockFormTracker>(GetMainRenderFrame()));
   }
 
   void TearDown() override {
@@ -204,8 +205,8 @@
   }
 
   MockFormTracker& form_tracker() {
-    return *static_cast<MockFormTracker*>(
-        autofill_agent_->form_tracker_for_testing());
+    return static_cast<MockFormTracker&>(
+        test_api(*autofill_agent_).form_tracker());
   }
 
   // AutofillDriver::FormsSeen() is throttled indirectly because some callsites
diff --git a/components/autofill/content/renderer/autofill_agent_test_api.h b/components/autofill/content/renderer/autofill_agent_test_api.h
index 96d574a..1dab1a2 100644
--- a/components/autofill/content/renderer/autofill_agent_test_api.h
+++ b/components/autofill/content/renderer/autofill_agent_test_api.h
@@ -14,6 +14,15 @@
  public:
   explicit AutofillAgentTestApi(AutofillAgent* agent) : agent_(*agent) {}
 
+  std::optional<FormData> CollectFormlessElements() {
+    return agent_->CollectFormlessElements();
+  }
+
+  FormTracker& form_tracker() { return *agent_->form_tracker_; }
+  void set_form_tracker(std::unique_ptr<FormTracker> form_tracker) {
+    agent_->form_tracker_ = std::move(form_tracker);
+  }
+
  private:
   const raw_ref<AutofillAgent> agent_;
 };
diff --git a/components/autofill/content/renderer/form_tracker.cc b/components/autofill/content/renderer/form_tracker.cc
index ab10565..7642b42 100644
--- a/components/autofill/content/renderer/form_tracker.cc
+++ b/components/autofill/content/renderer/form_tracker.cc
@@ -222,10 +222,6 @@
   TrackElement();
 }
 
-void FormTracker::FireProbablyFormSubmittedForTesting() {
-  FireProbablyFormSubmitted();
-}
-
 void FormTracker::FormControlDidChangeImpl(
     const WebFormControlElement& element,
     Observer::ElementChangeSource change_source) {
diff --git a/components/autofill/content/renderer/form_tracker.h b/components/autofill/content/renderer/form_tracker.h
index 3d482fd..796d7ab5a 100644
--- a/components/autofill/content/renderer/form_tracker.h
+++ b/components/autofill/content/renderer/form_tracker.h
@@ -132,11 +132,8 @@
     user_gesture_required_ = required;
   }
 
-  void FireProbablyFormSubmittedForTesting();
-
  private:
-  FRIEND_TEST_ALL_PREFIXES(FormAutocompleteTest,
-                           FormSubmittedBySameDocumentNavigation);
+  friend class FormTrackerTestApi;
 
   // content::RenderFrameObserver:
   void DidCommitProvisionalLoad(ui::PageTransition transition) override;
diff --git a/components/autofill/content/renderer/form_tracker_test_api.h b/components/autofill/content/renderer/form_tracker_test_api.h
new file mode 100644
index 0000000..f9fc516f
--- /dev/null
+++ b/components/autofill/content/renderer/form_tracker_test_api.h
@@ -0,0 +1,35 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CONTENT_RENDERER_FORM_TRACKER_TEST_API_H_
+#define COMPONENTS_AUTOFILL_CONTENT_RENDERER_FORM_TRACKER_TEST_API_H_
+
+#include "base/memory/raw_ref.h"
+#include "components/autofill/content/renderer/form_tracker.h"
+
+namespace autofill {
+
+class FormTrackerTestApi {
+ public:
+  explicit FormTrackerTestApi(FormTracker* agent) : form_tracker_(*agent) {}
+
+  void DidFinishSameDocumentNavigation() {
+    return form_tracker_->DidFinishSameDocumentNavigation();
+  }
+
+  void FireProbablyFormSubmitted() {
+    form_tracker_->FireProbablyFormSubmitted();
+  }
+
+ private:
+  const raw_ref<FormTracker> form_tracker_;
+};
+
+inline FormTrackerTestApi test_api(FormTracker& agent) {
+  return FormTrackerTestApi(&agent);
+}
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CONTENT_RENDERER_FORM_TRACKER_TEST_API_H_
diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc
index 82311a92..ba371bd 100644
--- a/components/autofill/core/browser/autofill_external_delegate.cc
+++ b/components/autofill/core/browser/autofill_external_delegate.cc
@@ -218,7 +218,6 @@
     case PopupItemId::kSeePromoCodeDetails:
     case PopupItemId::kSeparator:
     case PopupItemId::kShowAccountCards:
-    case PopupItemId::kTitle:
     case PopupItemId::kUsernameEntry:
     case PopupItemId::kWebauthnCredential:
     case PopupItemId::kWebauthnSignInWithAnotherDevice:
@@ -469,7 +468,6 @@
     case PopupItemId::kAddressEntryNotSelectable:
     case PopupItemId::kPaymentsEntryNotSelectable:
       return;
-    case PopupItemId::kTitle:
     case PopupItemId::kEditAddressProfile:
     case PopupItemId::kDeleteAddressProfile:
     case PopupItemId::kAutofillOptions:
@@ -716,7 +714,6 @@
       break;
     case PopupItemId::kDevtoolsTestAddresses:
     case PopupItemId::kDevtoolsTestAddressEntry:
-    case PopupItemId::kTitle:
       FillAutofillFormData(
           suggestion.popup_item_id,
           suggestion.GetPayload<Suggestion::BackendId>(), /*is_preview=*/false,
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc
index b8e28495..cd5df36 100644
--- a/components/autofill/core/browser/browser_autofill_manager.cc
+++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -295,7 +295,6 @@
     case PopupItemId::kSeePromoCodeDetails:
     case PopupItemId::kSeparator:
     case PopupItemId::kShowAccountCards:
-    case PopupItemId::kTitle:
     case PopupItemId::kUsernameEntry:
     case PopupItemId::kVirtualCreditCardEntry:
     case PopupItemId::kWebauthnCredential:
diff --git a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc
index a455c7c..88f4ccb 100644
--- a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc
+++ b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.cc
@@ -19,6 +19,7 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
+#include "base/no_destructor.h"
 #include "base/numerics/safe_conversions.h"
 #include "base/rand_util.h"
 #include "base/strings/strcat.h"
@@ -47,6 +48,7 @@
 #include "components/prefs/pref_service.h"
 #include "components/prefs/scoped_user_pref_update.h"
 #include "components/variations/net/variations_http_headers.h"
+#include "components/variations/variations_ids_provider.h"
 #include "google_apis/google_api_keys.h"
 #include "net/base/load_flags.h"
 #include "net/http/http_request_headers.h"
@@ -535,6 +537,39 @@
   return google_apis::GetNonStableAPIKey();
 }
 
+std::optional<std::vector<variations::VariationID>>& GetActiveExperiments() {
+  static base::NoDestructor<std::optional<std::vector<variations::VariationID>>>
+      active_experiments;
+  return *active_experiments;
+}
+
+// Populates `GetActiveExperiments()` with the set of active autofill server
+// experiments.
+void InitActiveExperiments() {
+  auto* variations_ids_provider =
+      variations::VariationsIdsProvider::GetInstance();
+  DCHECK(variations_ids_provider != nullptr);
+
+  // TODO(crbug.com/1331322): Retire the hardcoded GWS ID ranges and only read
+  // the finch parameter.
+  std::vector<variations::VariationID> active_experiments =
+      variations_ids_provider->GetVariationsVector(
+          {variations::GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT,
+           variations::GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY});
+  std::erase_if(active_experiments, std::not_fn(&IsAutofillExperimentId));
+  if (base::FeatureList::IsEnabled(
+          autofill::features::kAutofillServerBehaviors)) {
+    active_experiments.push_back(
+        autofill::features::kAutofillServerBehaviorsParam.Get());
+  }
+  std::sort(active_experiments.begin(), active_experiments.end());
+  active_experiments.erase(
+      std::unique(active_experiments.begin(), active_experiments.end()),
+      active_experiments.end());
+
+  GetActiveExperiments() = std::move(active_experiments);
+}
+
 }  // namespace
 
 struct AutofillCrowdsourcingManager::FormRequestData {
@@ -547,16 +582,13 @@
 };
 
 ScopedActiveAutofillExperiments::ScopedActiveAutofillExperiments() {
-  AutofillCrowdsourcingManager::ResetActiveExperiments();
+  GetActiveExperiments().reset();
 }
 
 ScopedActiveAutofillExperiments::~ScopedActiveAutofillExperiments() {
-  AutofillCrowdsourcingManager::ResetActiveExperiments();
+  GetActiveExperiments().reset();
 }
 
-std::vector<variations::VariationID>*
-    AutofillCrowdsourcingManager::active_experiments_ = nullptr;
-
 AutofillCrowdsourcingManager::AutofillCrowdsourcingManager(AutofillClient* client,
                                                  version_info::Channel channel,
                                                  LogManager* log_manager)
@@ -606,13 +638,15 @@
   // The set of active autofill experiments is constant for the life of the
   // process. We initialize and statically cache it on first use. Leaked on
   // process termination.
-  if (active_experiments_ == nullptr)
+  if (!GetActiveExperiments()) {
     InitActiveExperiments();
+  }
 
   // Attach any active autofill experiments.
-  query.mutable_experiments()->Reserve(active_experiments_->size());
-  for (int id : *active_experiments_)
+  query.mutable_experiments()->Reserve(GetActiveExperiments()->size());
+  for (variations::VariationID id : *GetActiveExperiments()) {
     query.mutable_experiments()->Add(id);
+  }
 
   std::optional<std::string> payload = GetAPIQueryPayload(query);
   if (!payload) {
@@ -998,37 +1032,4 @@
   NOTREACHED_NORETURN();
 }
 
-void AutofillCrowdsourcingManager::InitActiveExperiments() {
-  auto* variations_ids_provider =
-      variations::VariationsIdsProvider::GetInstance();
-  DCHECK(variations_ids_provider != nullptr);
-
-  // TODO(crbug.com/1331322): Retire the hardcoded GWS ID ranges and only read
-  // the finch parameter.
-  std::vector<int> active_experiments =
-      variations_ids_provider->GetVariationsVector(
-          {variations::GOOGLE_WEB_PROPERTIES_TRIGGER_ANY_CONTEXT,
-           variations::GOOGLE_WEB_PROPERTIES_TRIGGER_FIRST_PARTY});
-  std::erase_if(active_experiments, std::not_fn(&IsAutofillExperimentId));
-  if (base::FeatureList::IsEnabled(
-          autofill::features::kAutofillServerBehaviors)) {
-    active_experiments.push_back(
-        autofill::features::kAutofillServerBehaviorsParam.Get());
-  }
-  std::sort(active_experiments.begin(), active_experiments.end());
-  active_experiments.erase(
-      std::unique(active_experiments.begin(), active_experiments.end()),
-      active_experiments.end());
-
-  delete active_experiments_;
-  active_experiments_ = new std::vector<int>();
-  *active_experiments_ = std::move(active_experiments);
-}
-
-// static
-void AutofillCrowdsourcingManager::ResetActiveExperiments() {
-  delete active_experiments_;
-  active_experiments_ = nullptr;
-}
-
 }  // namespace autofill
diff --git a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h
index 0f4f90d..3f033501 100644
--- a/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h
+++ b/components/autofill/core/browser/crowdsourcing/autofill_crowdsourcing_manager.h
@@ -19,7 +19,6 @@
 #include "components/autofill/core/browser/autofill_type.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/common/signatures.h"
-#include "components/variations/variations_ids_provider.h"
 #include "components/version_info/channel.h"
 #include "net/base/backoff_entry.h"
 #include "net/base/isolation_info.h"
@@ -196,9 +195,6 @@
       base::TimeTicks request_start,
       std::unique_ptr<std::string> response_body);
 
-  static void InitActiveExperiments();
-  static void ResetActiveExperiments();
-
   // The AutofillClient that this instance will use. Must not be null, and must
   // outlive this instance.
   const raw_ptr<AutofillClient> client_;
@@ -216,9 +212,6 @@
   // The period after which the tracked set of uploads to throttle is reset.
   const base::TimeDelta throttle_reset_period_;
 
-  // The set of active autofill server experiments.
-  static std::vector<variations::VariationID>* active_experiments_;
-
   // Loaders used for the processing the requests. Invalidated after completion.
   std::list<std::unique_ptr<network::SimpleURLLoader>> url_loaders_;
 
diff --git a/components/autofill/core/browser/filling_product.cc b/components/autofill/core/browser/filling_product.cc
index 1c4460e..78fd47c 100644
--- a/components/autofill/core/browser/filling_product.cc
+++ b/components/autofill/core/browser/filling_product.cc
@@ -56,7 +56,6 @@
     case PopupItemId::kCreateNewPlusAddress:
     case PopupItemId::kFillExistingPlusAddress:
       return FillingProduct::kPlusAddresses;
-    case PopupItemId::kTitle:
     case PopupItemId::kAutofillOptions:
     case PopupItemId::kSeparator:
     case PopupItemId::kClearForm:
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc
index 2c5610a..eaa6803 100644
--- a/components/autofill/core/browser/form_data_importer.cc
+++ b/components/autofill/core/browser/form_data_importer.cc
@@ -15,6 +15,7 @@
 #include <string>
 #include <utility>
 
+#include "base/containers/flat_map.h"
 #include "base/functional/bind.h"
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
@@ -442,7 +443,7 @@
   // profile's country has been set to make sure the correct address
   // representation is used.
   for (const auto& [type, value] : observed_values) {
-    // The profile country has already been stablished by this point. It's
+    // The profile country has already been established by this point. It's
     // ignored here to avoid re-setting up a potentially invalid country that
     // was present in the form.
     if (type == ADDRESS_HOME_COUNTRY) {
@@ -469,37 +470,22 @@
   return candidate_profile;
 }
 
-bool FormDataImporter::ExtractAddressProfileFromSection(
+base::flat_map<ServerFieldType, std::u16string>
+FormDataImporter::GetAddressObservedFieldValues(
     base::span<const AutofillField* const> section_fields,
-    const GURL& source_url,
-    std::vector<FormDataImporter::AddressProfileImportCandidate>*
-        address_profile_import_candidates,
-    LogBuffer* import_log_buffer) {
-  // Tracks if the form section contains multiple distinct email addresses.
-  bool has_multiple_distinct_email_addresses = false;
-
-  // Tracks if the form section contains an invalid types.
-  bool has_invalid_field_types = false;
+    ProfileImportMetadata& import_metadata,
+    LogBuffer* import_log_buffer,
+    bool& has_invalid_field_types,
+    bool& has_multiple_distinct_email_addresses,
+    bool& has_address_related_fields) const {
+  plus_addresses::PlusAddressService* plus_address_service =
+      client_->GetPlusAddressService();
+  base::flat_map<ServerFieldType, std::u16string> observed_field_values;
 
   // Tracks if subsequent phone number fields should be ignored,
   // since they do not belong to the first phone number in the form.
   bool ignore_phone_number_fields = false;
 
-  // Metadata about the way we construct candidate_profile.
-  ProfileImportMetadata import_metadata{.origin =
-                                            url::Origin::Create(source_url)};
-
-  // Tracks if any of the fields belongs to FormType::kAddressForm.
-  bool has_address_related_fields = false;
-
-  plus_addresses::PlusAddressService* plus_address_service =
-      client_->GetPlusAddressService();
-
-  // Stores the values collected for each related `ServerFieldType`. Used as
-  // well to detect and discard address forms with multiple fields of the same
-  // type.
-  base::flat_map<ServerFieldType, std::u16string> observed_field_values;
-
   // Go through each |form| field and attempt to constitute a valid profile.
   for (const AutofillField* const field : section_fields) {
     std::u16string value;
@@ -507,8 +493,16 @@
 
     // If we don't know the type of the field, or the user hasn't entered any
     // information into the field, then skip it.
-    if (!field->IsFieldFillable() || value.empty())
+    if (!field->IsFieldFillable() || value.empty()) {
       continue;
+    }
+
+    // If the field was filled with a fallback type, skip it in order to not
+    // introduce noise to the map's data, as this would add an entry for
+    // field type X with a value retrieved from another field type Y.
+    if (field->WasAutofilledWithFallback()) {
+      continue;
+    }
 
     // When the experimental plus addresses feature is enabled, and the value is
     // a plus address, exclude it from the resulting address profile.
@@ -529,8 +523,9 @@
     AutofillType field_type = field->Type();
 
     // Credit card fields are handled by ExtractCreditCard().
-    if (field_type.group() == FieldTypeGroup::kCreditCard)
+    if (field_type.group() == FieldTypeGroup::kCreditCard) {
       continue;
+    }
 
     // There can be multiple email fields (e.g. in the case of 'confirm email'
     // fields) but they must all contain the same value, else the profile is
@@ -559,8 +554,9 @@
     if (field_type.group() == FieldTypeGroup::kPhone &&
         base::FeatureList::IsEnabled(
             features::kAutofillEnableImportWhenMultiplePhoneNumbers)) {
-      if (ignore_phone_number_fields)
+      if (ignore_phone_number_fields) {
         continue;
+      }
       // Each phone number related type only occurs once per number. Seeing a
       // type a second time implies that it belongs to a new number. Since
       // Autofill currently supports storing only one phone number per profile,
@@ -583,6 +579,36 @@
       }
     }
   }
+  return observed_field_values;
+}
+
+bool FormDataImporter::ExtractAddressProfileFromSection(
+    base::span<const AutofillField* const> section_fields,
+    const GURL& source_url,
+    std::vector<FormDataImporter::AddressProfileImportCandidate>*
+        address_profile_import_candidates,
+    LogBuffer* import_log_buffer) {
+  // Tracks if the form section contains multiple distinct email addresses.
+  bool has_multiple_distinct_email_addresses = false;
+
+  // Tracks if the form section contains an invalid types.
+  bool has_invalid_field_types = false;
+
+  // Metadata about the way we construct candidate_profile.
+  ProfileImportMetadata import_metadata{.origin =
+                                            url::Origin::Create(source_url)};
+
+  // Tracks if any of the fields belongs to FormType::kAddressForm.
+  bool has_address_related_fields = false;
+
+  // Stores the values collected for each related `ServerFieldType`. Used as
+  // well to detect and discard address forms with multiple fields of the same
+  // type.
+  base::flat_map<ServerFieldType, std::u16string> observed_field_values =
+      GetAddressObservedFieldValues(section_fields, import_metadata,
+                                    import_log_buffer, has_invalid_field_types,
+                                    has_multiple_distinct_email_addresses,
+                                    has_address_related_fields);
 
   // The candidate for profile import.
   AutofillProfile candidate_profile = ConstructProfileFromObservedValues(
diff --git a/components/autofill/core/browser/form_data_importer.h b/components/autofill/core/browser/form_data_importer.h
index b7e5cd8..40f7ba3 100644
--- a/components/autofill/core/browser/form_data_importer.h
+++ b/components/autofill/core/browser/form_data_importer.h
@@ -199,6 +199,16 @@
                                 std::vector<AddressProfileImportCandidate>*
                                     address_profile_import_candidates);
 
+  // Iterates over `section_fields` and builds a map from field type to observed
+  // value for that field type.
+  base::flat_map<ServerFieldType, std::u16string> GetAddressObservedFieldValues(
+      base::span<const AutofillField* const> section_fields,
+      ProfileImportMetadata& import_metadata,
+      LogBuffer* import_log_buffer,
+      bool& has_invalid_field_types,
+      bool& has_multiple_distinct_email_addresses,
+      bool& has_address_related_fields) const;
+
   // Helper method to construct an AutofillProfile out of observed values in the
   // form. Used during `ExtractAddressProfileFromSection()`.
   AutofillProfile ConstructProfileFromObservedValues(
diff --git a/components/autofill/core/browser/form_data_importer_test_api.h b/components/autofill/core/browser/form_data_importer_test_api.h
index 22e08b8..8e2e3e3 100644
--- a/components/autofill/core/browser/form_data_importer_test_api.h
+++ b/components/autofill/core/browser/form_data_importer_test_api.h
@@ -5,6 +5,10 @@
 #ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_DATA_IMPORTER_TEST_API_H_
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_DATA_IMPORTER_TEST_API_H_
 
+#include <string>
+
+#include "base/containers/flat_map.h"
+#include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/form_data_importer.h"
 #include "components/autofill/core/browser/payments/credit_card_save_manager.h"
 
@@ -65,6 +69,17 @@
                                         address_profile_import_candidates);
   }
 
+  base::flat_map<ServerFieldType, std::u16string> GetObservedFieldValues(
+      base::span<const AutofillField* const> section_fields) {
+    ProfileImportMetadata import_metadata;
+    bool has_invalid_field_types = false;
+    bool has_multiple_distinct_email_addresses = false;
+    bool has_address_related_fields = false;
+    return fdi_->GetAddressObservedFieldValues(
+        section_fields, import_metadata, nullptr, has_invalid_field_types,
+        has_multiple_distinct_email_addresses, has_address_related_fields);
+  }
+
   bool ProcessAddressProfileImportCandidates(
       const std::vector<AddressProfileImportCandidate>&
           address_profile_import_candidates,
diff --git a/components/autofill/core/browser/form_data_importer_unittest.cc b/components/autofill/core/browser/form_data_importer_unittest.cc
index b1c10c0..2d322287 100644
--- a/components/autofill/core/browser/form_data_importer_unittest.cc
+++ b/components/autofill/core/browser/form_data_importer_unittest.cc
@@ -17,6 +17,8 @@
 #include <utility>
 #include <vector>
 
+#include "base/containers/flat_map.h"
+#include "base/containers/span.h"
 #include "base/feature_list.h"
 #include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ptr.h"
@@ -29,7 +31,10 @@
 #include "base/uuid.h"
 #include "build/build_config.h"
 #include "components/autofill/core/browser/autofill_experiments.h"
+#include "components/autofill/core/browser/autofill_field.h"
+#include "components/autofill/core/browser/autofill_form_test_utils.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_structured_address_utils.h"
 #include "components/autofill/core/browser/data_model/credit_card.h"
@@ -55,6 +60,7 @@
 #include "components/autofill/core/common/autofill_util.h"
 #include "components/autofill/core/common/form_data.h"
 #include "components/autofill/core/common/form_field_data.h"
+#include "components/autofill/core/common/mojom/autofill_types.mojom-shared.h"
 #include "components/plus_addresses/plus_address_service.h"
 #include "components/prefs/pref_service.h"
 #include "components/signin/public/identity_manager/identity_test_environment.h"
@@ -1544,7 +1550,7 @@
 }
 
 // Test that even from unfocusable fields we extract.
-TEST_F(FormDataImporterTest, ImportAddressProfiles_UnFocussableFields) {
+TEST_F(FormDataImporterTest, ImportAddressProfiles_UnfocusableFields) {
   std::unique_ptr<FormStructure> form_structure =
       ConstructDefaultProfileFormStructure();
   // Set the Address line field as unfocusable.
@@ -2879,7 +2885,7 @@
 // This test includes two cases:
 // 1. The extracted credit card has the same expiration with the second masked
 //    server card.
-// 2. The extracted credit card's expiraion date is not the same as any of the
+// 2. The extracted credit card's expiration date is not the same as any of the
 //    the masked server cards.
 TEST_F(
     FormDataImporterTest,
@@ -4200,4 +4206,29 @@
                                   /*payment_methods_autofill_enabled=*/true,
                                   /*is_credit_card_upstream_enabled=*/false);
 }
+
+// Test that Autofill will not try to import from a field that was filled with
+// fallback.
+TEST_F(FormDataImporterTest,
+       GetObservedFieldValues_SkipFieldsFilledWithFallback) {
+  AutofillField field;
+  field.SetTypeTo(AutofillType(NAME_FIRST));
+  field.value = u"First";
+  const AutofillField* field_ptr = &field;
+
+  base::flat_map<ServerFieldType, std::u16string> observed_field_types =
+      test_api(form_data_importer())
+          .GetObservedFieldValues(base::make_span(&field_ptr, 1u));
+  EXPECT_EQ(observed_field_types.size(), 1u);
+
+  // Set the autofilled type of the field as something different from its
+  // classified type, representing that the field was filled using this type as
+  // fallback.
+  field.set_autofilled_type(NAME_FULL);
+  observed_field_types =
+      test_api(form_data_importer())
+          .GetObservedFieldValues(base::make_span(&field_ptr, 1u));
+  EXPECT_TRUE(observed_field_types.empty());
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/ui/popup_item_ids.h b/components/autofill/core/browser/ui/popup_item_ids.h
index 72ffb9e..0e426a46 100644
--- a/components/autofill/core/browser/ui/popup_item_ids.h
+++ b/components/autofill/core/browser/ui/popup_item_ids.h
@@ -38,7 +38,6 @@
   // will fill every email field.
   kFillFullEmail,
   kAddressFieldByFieldFilling,
-  kTitle,
   kEditAddressProfile,
   kDeleteAddressProfile,
   kAddressEntryNotSelectable,
diff --git a/components/browser_sync/BUILD.gn b/components/browser_sync/BUILD.gn
index 8c89f3d..93822b6c 100644
--- a/components/browser_sync/BUILD.gn
+++ b/components/browser_sync/BUILD.gn
@@ -50,6 +50,7 @@
     "//components/url_formatter",
     "//components/version_info",
     "//components/version_info:generate_version_info",
+    "//components/webauthn/core/browser",
     "//ui/base",
   ]
 
diff --git a/components/browser_sync/DEPS b/components/browser_sync/DEPS
index 4bf201c..d3c3870 100644
--- a/components/browser_sync/DEPS
+++ b/components/browser_sync/DEPS
@@ -26,6 +26,7 @@
   "+components/undo",
   "+components/url_formatter",
   "+components/version_info",
+  "+components/webauthn/core/browser/passkey_model_type_controller.h",
   "+components/webdata/common",
   "+components/webdata_services",
   "+services/network/test",
diff --git a/components/browser_sync/sync_api_component_factory_impl.cc b/components/browser_sync/sync_api_component_factory_impl.cc
index 8275ca28..daf9abe 100644
--- a/components/browser_sync/sync_api_component_factory_impl.cc
+++ b/components/browser_sync/sync_api_component_factory_impl.cc
@@ -34,7 +34,7 @@
 #include "components/password_manager/core/browser/sharing/outgoing_password_sharing_invitation_model_type_controller.h"
 #include "components/password_manager/core/browser/sharing/password_receiver_service.h"
 #include "components/password_manager/core/browser/sharing/password_sender_service.h"
-#include "components/password_manager/core/browser/sync/credential_model_type_controller.h"
+#include "components/password_manager/core/browser/sync/password_model_type_controller.h"
 #include "components/power_bookmarks/core/power_bookmark_features.h"
 #include "components/power_bookmarks/core/power_bookmark_service.h"
 #include "components/prefs/pref_service.h"
@@ -62,6 +62,7 @@
 #include "components/sync_sessions/session_model_type_controller.h"
 #include "components/sync_sessions/session_sync_service.h"
 #include "components/sync_user_events/user_event_model_type_controller.h"
+#include "components/webauthn/core/browser/passkey_model_type_controller.h"
 
 #if BUILDFLAG(ENABLE_SUPERVISED_USERS)
 #include "components/supervised_user/core/browser/supervised_user_settings_model_type_controller.h"
@@ -386,8 +387,7 @@
     if (profile_password_store_) {
       // |profile_password_store_| can be null in tests.
       controllers.push_back(
-          std::make_unique<password_manager::CredentialModelTypeController>(
-              syncer::PASSWORDS,
+          std::make_unique<password_manager::PasswordModelTypeController>(
               profile_password_store_->CreateSyncControllerDelegate(),
               account_password_store_
                   ? account_password_store_->CreateSyncControllerDelegate()
@@ -522,14 +522,12 @@
   if (base::FeatureList::IsEnabled(syncer::kSyncWebauthnCredentials) &&
       !disabled_types.Has(syncer::WEBAUTHN_CREDENTIAL)) {
     controllers.push_back(
-        std::make_unique<password_manager::CredentialModelTypeController>(
-            syncer::WEBAUTHN_CREDENTIAL,
+        std::make_unique<webauthn::PasskeyModelTypeController>(
+            sync_service,
             /*delegate_for_full_sync_mode=*/
             CreateForwardingControllerDelegate(syncer::WEBAUTHN_CREDENTIAL),
             /*delegate_for_transport_mode=*/
-            CreateForwardingControllerDelegate(syncer::WEBAUTHN_CREDENTIAL),
-            sync_client_->GetPrefService(), sync_client_->GetIdentityManager(),
-            sync_service));
+            CreateForwardingControllerDelegate(syncer::WEBAUTHN_CREDENTIAL)));
   }
 #endif
 
diff --git a/components/browser_ui/styles/android/java/res/values/styles.xml b/components/browser_ui/styles/android/java/res/values/styles.xml
index 1ec8693..e0861e7 100644
--- a/components/browser_ui/styles/android/java/res/values/styles.xml
+++ b/components/browser_ui/styles/android/java/res/values/styles.xml
@@ -66,11 +66,12 @@
         <item name="android:paddingEnd">@dimen/dialog_padding_sides</item>
         <item name="android:paddingTop">@dimen/dialog_padding_top</item>
     </style>
-    <style name="AlertDialogSummaryViewItem" parent="@android:style/TextAppearance.Small">
+    <style name="AlertDialogSummaryViewItem">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">wrap_content</item>
         <item name="android:textAlignment">viewStart</item>
         <item name="android:paddingTop">10dp</item>
+        <item name="android:textAppearance">@style/TextAppearance.TextMedium.Secondary</item>
     </style>
 
     <style name="ProgressBarStyle" parent="Widget.AppCompat.ProgressBar">
diff --git a/components/capture_mode/camera_video_frame_handler.cc b/components/capture_mode/camera_video_frame_handler.cc
index 846fad8..c9c9e84 100644
--- a/components/capture_mode/camera_video_frame_handler.cc
+++ b/components/capture_mode/camera_video_frame_handler.cc
@@ -42,8 +42,9 @@
 // A constant flag that describes which APIs the shared image mailboxes created
 // for the video frame will be used with.
 constexpr uint32_t kSharedImageUsage =
-    gpu::SHARED_IMAGE_USAGE_GLES2 | gpu::SHARED_IMAGE_USAGE_RASTER |
-    gpu::SHARED_IMAGE_USAGE_DISPLAY_READ | gpu::SHARED_IMAGE_USAGE_SCANOUT;
+    gpu::SHARED_IMAGE_USAGE_GLES2_READ | gpu::SHARED_IMAGE_USAGE_GLES2_WRITE |
+    gpu::SHARED_IMAGE_USAGE_RASTER | gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
+    gpu::SHARED_IMAGE_USAGE_SCANOUT;
 
 // The usage of the GpuMemoryBuffer that backs the video frames on an actual
 // device (of type `NATIVE_PIXMAP`). The buffer is going to be presented on the
diff --git a/components/exo/buffer.cc b/components/exo/buffer.cc
index 9e4ac7b..619a329 100644
--- a/components/exo/buffer.cc
+++ b/components/exo/buffer.cc
@@ -222,9 +222,9 @@
   gpu::SharedImageInterface* sii = context_provider_->SharedImageInterface();
 
   // Add GLES2 usage as it is used by RasterImplementationGLES.
-  const uint32_t usage = gpu::SHARED_IMAGE_USAGE_RASTER |
-                         gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
-                         gpu::SHARED_IMAGE_USAGE_GLES2;
+  const uint32_t usage =
+      gpu::SHARED_IMAGE_USAGE_RASTER | gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
+      gpu::SHARED_IMAGE_USAGE_GLES2_READ | gpu::SHARED_IMAGE_USAGE_GLES2_WRITE;
 
   shared_image_ = sii->CreateSharedImage(
       viz::SinglePlaneFormat::kRGBA_8888, size, color_space,
@@ -259,9 +259,9 @@
   gpu::SharedImageInterface* sii = context_provider_->SharedImageInterface();
 
   // Add GLES2 usage as it is used by RasterImplementationGLES.
-  uint32_t usage = gpu::SHARED_IMAGE_USAGE_RASTER |
-                   gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
-                   gpu::SHARED_IMAGE_USAGE_GLES2;
+  uint32_t usage =
+      gpu::SHARED_IMAGE_USAGE_RASTER | gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
+      gpu::SHARED_IMAGE_USAGE_GLES2_READ | gpu::SHARED_IMAGE_USAGE_GLES2_WRITE;
   if (is_overlay_candidate) {
     usage |= gpu::SHARED_IMAGE_USAGE_SCANOUT;
   }
diff --git a/components/media_effects/DEPS b/components/media_effects/DEPS
index cc881096..d439de7e0 100644
--- a/components/media_effects/DEPS
+++ b/components/media_effects/DEPS
@@ -4,7 +4,11 @@
   "+components/user_prefs",
   "+content/public/browser",
   "+content/public/test",
+  "+media/audio/audio_device_description.h",
+  "+media/base/audio_parameters.h",
   "+mojo/public/cpp/bindings",
+  "+services/audio/public/cpp/fake_system_info.h",
+  "+services/audio/public/mojom",
   "+services/video_capture/public/mojom",
   "+third_party/mediapipe/buildflags.h",
   "+third_party/mediapipe/src",
diff --git a/components/media_effects/test/BUILD.gn b/components/media_effects/test/BUILD.gn
index f9f212a..764dfb2 100644
--- a/components/media_effects/test/BUILD.gn
+++ b/components/media_effects/test/BUILD.gn
@@ -6,6 +6,10 @@
   testonly = true
 
   sources = [
+    "fake_audio_service.cc",
+    "fake_audio_service.h",
+    "fake_audio_system_info.cc",
+    "fake_audio_system_info.h",
     "fake_video_capture_service.cc",
     "fake_video_capture_service.h",
     "fake_video_source_provider.cc",
@@ -14,6 +18,7 @@
 
   deps = [
     "//base",
+    "//services/audio/public/cpp:test_support",
     "//services/video_capture/public/mojom",
   ]
 }
diff --git a/components/media_effects/test/fake_audio_service.cc b/components/media_effects/test/fake_audio_service.cc
new file mode 100644
index 0000000..a9a28a61
--- /dev/null
+++ b/components/media_effects/test/fake_audio_service.cc
@@ -0,0 +1,45 @@
+// 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 "components/media_effects/test/fake_audio_service.h"
+
+#include <utility>
+
+namespace media_effects {
+
+FakeAudioService::FakeAudioService() = default;
+
+FakeAudioService::~FakeAudioService() = default;
+
+void FakeAudioService::AddFakeInputDevice(
+    const media::AudioDeviceDescription& descriptor) {
+  fake_system_info_.AddFakeInputDevice(descriptor);
+}
+
+void FakeAudioService::RemoveFakeInputDevice(const std::string& device_id) {
+  fake_system_info_.RemoveFakeInputDevice(device_id);
+}
+
+void FakeAudioService::SetOnRepliedWithInputDeviceDescriptionsCallback(
+    base::OnceClosure callback) {
+  fake_system_info_.SetOnRepliedWithInputDeviceDescriptionsCallback(
+      std::move(callback));
+}
+
+void FakeAudioService::SetOnGetInputStreamParametersCallback(
+    base::RepeatingCallback<void(const std::string&)> callback) {
+  fake_system_info_.SetOnGetInputStreamParametersCallback(std::move(callback));
+}
+
+void FakeAudioService::BindSystemInfo(
+    mojo::PendingReceiver<audio::mojom::SystemInfo> receiver) {
+  fake_system_info_.Bind(std::move(receiver));
+}
+
+void FakeAudioService::BindStreamFactory(
+    mojo::PendingReceiver<media::mojom::AudioStreamFactory> receiver) {
+  on_bind_stream_factory_callback_.Run();
+}
+
+}  // namespace media_effects
diff --git a/components/media_effects/test/fake_audio_service.h b/components/media_effects/test/fake_audio_service.h
new file mode 100644
index 0000000..fa6f5ec
--- /dev/null
+++ b/components/media_effects/test/fake_audio_service.h
@@ -0,0 +1,73 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_MEDIA_EFFECTS_TEST_FAKE_AUDIO_SERVICE_H_
+#define COMPONENTS_MEDIA_EFFECTS_TEST_FAKE_AUDIO_SERVICE_H_
+
+#include <utility>
+
+#include "base/functional/callback_forward.h"
+#include "base/functional/callback_helpers.h"
+#include "components/media_effects/test/fake_audio_system_info.h"
+#include "media/audio/audio_device_description.h"
+#include "services/audio/public/mojom/audio_service.mojom.h"
+
+namespace media_effects {
+
+class FakeAudioService : public audio::mojom::AudioService {
+ public:
+  FakeAudioService();
+  ~FakeAudioService() override;
+
+  FakeAudioService(const FakeAudioService&) = delete;
+  FakeAudioService& operator=(const FakeAudioService&) = delete;
+  FakeAudioService(FakeAudioService&&) = delete;
+  FakeAudioService& operator=(FakeAudioService&&) = delete;
+
+  // Simulate connecting and disconnecting a mic device with the given
+  // `descriptor`.
+  void AddFakeInputDevice(const media::AudioDeviceDescription& descriptor);
+  void RemoveFakeInputDevice(const std::string& device_id);
+
+  // `callback` will be triggered after the system info replies back to its
+  // client in GetInputDeviceDescriptions(). Useful as a stopping point for a
+  // base::RunLoop.
+  void SetOnRepliedWithInputDeviceDescriptionsCallback(
+      base::OnceClosure callback);
+
+  // `callback` will be triggered when the system info receives a
+  // GetInputStreamParameters call.
+  void SetOnGetInputStreamParametersCallback(
+      base::RepeatingCallback<void(const std::string&)> callback);
+
+  // `callback` will be triggered when the system info receives a
+  // BindStreamFactory call.
+  void SetBindStreamFactoryCallback(base::RepeatingClosure callback) {
+    on_bind_stream_factory_callback_ = std::move(callback);
+  }
+
+  // audio::mojom::AudioService implementation
+  void BindSystemInfo(
+      mojo::PendingReceiver<audio::mojom::SystemInfo> receiver) override;
+  void BindStreamFactory(mojo::PendingReceiver<media::mojom::AudioStreamFactory>
+                             receiver) override;
+  void BindDebugRecording(
+      mojo::PendingReceiver<audio::mojom::DebugRecording> receiver) override {}
+  void BindDeviceNotifier(
+      mojo::PendingReceiver<audio::mojom::DeviceNotifier> receiver) override {}
+  void BindLogFactoryManager(
+      mojo::PendingReceiver<audio::mojom::LogFactoryManager> receiver)
+      override {}
+  void BindTestingApi(
+      mojo::PendingReceiver<audio::mojom::TestingApi> receiver) override {}
+
+ private:
+  FakeAudioSystemInfo fake_system_info_;
+
+  base::RepeatingClosure on_bind_stream_factory_callback_ = base::DoNothing();
+};
+
+}  // namespace media_effects
+
+#endif  // COMPONENTS_MEDIA_EFFECTS_TEST_FAKE_AUDIO_SERVICE_H_
diff --git a/components/media_effects/test/fake_audio_system_info.cc b/components/media_effects/test/fake_audio_system_info.cc
new file mode 100644
index 0000000..7f44a896
--- /dev/null
+++ b/components/media_effects/test/fake_audio_system_info.cc
@@ -0,0 +1,84 @@
+// 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 "components/media_effects/test/fake_audio_system_info.h"
+
+#include <optional>
+#include <utility>
+
+#include "base/check.h"
+#include "base/functional/bind.h"
+#include "base/functional/callback_helpers.h"
+#include "base/system/system_monitor.h"
+#include "media/base/audio_parameters.h"
+
+namespace media_effects {
+
+FakeAudioSystemInfo::FakeAudioSystemInfo() = default;
+
+FakeAudioSystemInfo::~FakeAudioSystemInfo() = default;
+
+void FakeAudioSystemInfo::Bind(
+    mojo::PendingReceiver<audio::mojom::SystemInfo> receiver) {
+  receivers_.Add(this, std::move(receiver));
+}
+
+void FakeAudioSystemInfo::AddFakeInputDevice(
+    const media::AudioDeviceDescription& descriptor) {
+  input_device_descriptions_.emplace(descriptor.unique_id, descriptor);
+  NotifyDevicesChanged();
+}
+
+void FakeAudioSystemInfo::RemoveFakeInputDevice(const std::string& device_id) {
+  input_device_descriptions_.erase(device_id);
+  NotifyDevicesChanged();
+}
+
+void FakeAudioSystemInfo::GetInputStreamParameters(
+    const std::string& device_id,
+    GetInputStreamParametersCallback callback) {
+  if (input_device_descriptions_.find(device_id) ==
+      input_device_descriptions_.end()) {
+    std::move(callback).Run(std::nullopt);
+    return;
+  }
+  on_get_input_stream_params_callback_.Run(device_id);
+  std::move(callback).Run(GetAudioParameters());
+}
+
+void FakeAudioSystemInfo::HasInputDevices(HasInputDevicesCallback callback) {
+  std::move(callback).Run(input_device_descriptions_.size());
+}
+
+void FakeAudioSystemInfo::GetInputDeviceDescriptions(
+    GetInputDeviceDescriptionsCallback callback) {
+  std::vector<media::AudioDeviceDescription> devices;
+  for (const auto& [_, device_info] : input_device_descriptions_) {
+    devices.emplace_back(device_info);
+  }
+
+  // Simulate the asynchronously behavior of the actual SystemInfo
+  // which does a lot of asynchronous and mojo calls.
+  base::SingleThreadTaskRunner::GetCurrentDefault()->PostTaskAndReply(
+      FROM_HERE, base::BindOnce(std::move(callback), devices),
+      std::exchange(on_replied_with_input_device_descriptions_,
+                    base::DoNothing()));
+}
+
+void FakeAudioSystemInfo::NotifyDevicesChanged() {
+  base::SystemMonitor::Get()->ProcessDevicesChanged(
+      base::SystemMonitor::DeviceType::DEVTYPE_AUDIO);
+}
+
+// static
+media::AudioParameters FakeAudioSystemInfo::GetAudioParameters() {
+  // Some arbitrary values, as to guarantee `params`to be valid.
+  media::AudioParameters params(media::AudioParameters::AUDIO_PCM_LOW_LATENCY,
+                                media::ChannelLayoutConfig::Mono(),
+                                /*sample_rate=*/3300, /*frames_per_buffer=*/40);
+  CHECK(params.IsValid());
+  return params;
+}
+
+}  // namespace media_effects
diff --git a/components/media_effects/test/fake_audio_system_info.h b/components/media_effects/test/fake_audio_system_info.h
new file mode 100644
index 0000000..ee1bc25
--- /dev/null
+++ b/components/media_effects/test/fake_audio_system_info.h
@@ -0,0 +1,78 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_MEDIA_EFFECTS_TEST_FAKE_AUDIO_SYSTEM_INFO_H_
+#define COMPONENTS_MEDIA_EFFECTS_TEST_FAKE_AUDIO_SYSTEM_INFO_H_
+
+#include <string>
+#include <utility>
+
+#include "base/functional/callback_forward.h"
+#include "base/functional/callback_helpers.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/receiver_set.h"
+#include "services/audio/public/cpp/fake_system_info.h"
+#include "services/audio/public/mojom/system_info.mojom.h"
+
+namespace media_effects {
+
+class FakeAudioSystemInfo : public audio::FakeSystemInfo {
+ public:
+  FakeAudioSystemInfo();
+
+  FakeAudioSystemInfo(const FakeAudioSystemInfo&) = delete;
+  FakeAudioSystemInfo& operator=(const FakeAudioSystemInfo&) = delete;
+
+  ~FakeAudioSystemInfo() override;
+
+  void Bind(mojo::PendingReceiver<audio::mojom::SystemInfo> receiver);
+
+  // Simulate connecting and disconnecting a mic device with the given
+  // `descriptor`.
+  void AddFakeInputDevice(const media::AudioDeviceDescription& descriptor);
+  void RemoveFakeInputDevice(const std::string& device_id);
+
+  // `callback` will be triggered after the system info replies back to its
+  // client in GetInputDeviceDescriptions(). Useful as a stopping point for a
+  // base::RunLoop.
+  void SetOnRepliedWithInputDeviceDescriptionsCallback(
+      base::OnceClosure callback) {
+    on_replied_with_input_device_descriptions_ = std::move(callback);
+  }
+
+  // `callback` will be triggered when this system info receives a
+  // GetInputStreamParameters call.
+  void SetOnGetInputStreamParametersCallback(
+      base::RepeatingCallback<void(const std::string&)> callback) {
+    on_get_input_stream_params_callback_ = std::move(callback);
+  }
+
+ protected:
+  // audio::mojom::SystemInfo implementation.
+  void GetInputStreamParameters(
+      const std::string& device_id,
+      GetInputStreamParametersCallback callback) override;
+  void HasInputDevices(HasInputDevicesCallback callback) override;
+  void GetInputDeviceDescriptions(
+      GetInputDeviceDescriptionsCallback callback) override;
+
+ private:
+  void NotifyDevicesChanged();
+
+  static media::AudioParameters GetAudioParameters();
+
+  mojo::ReceiverSet<audio::mojom::SystemInfo> receivers_;
+
+  base::flat_map</*device_id=*/std::string, media::AudioDeviceDescription>
+      input_device_descriptions_;
+
+  base::OnceClosure on_replied_with_input_device_descriptions_ =
+      base::DoNothing();
+  base::RepeatingCallback<void(const std::string&)>
+      on_get_input_stream_params_callback_ = base::DoNothing();
+};
+
+}  // namespace media_effects
+
+#endif  // COMPONENTS_MEDIA_EFFECTS_TEST_FAKE_AUDIO_SYSTEM_INFO_H_
diff --git a/components/password_manager/core/browser/sync/BUILD.gn b/components/password_manager/core/browser/sync/BUILD.gn
index 17ea9d787..2346f3fe0 100644
--- a/components/password_manager/core/browser/sync/BUILD.gn
+++ b/components/password_manager/core/browser/sync/BUILD.gn
@@ -7,8 +7,8 @@
 
 source_set("sync") {
   sources = [
-    "credential_model_type_controller.cc",
-    "credential_model_type_controller.h",
+    "password_model_type_controller.cc",
+    "password_model_type_controller.h",
     "password_proto_utils.cc",
     "password_proto_utils.h",
     "password_store_sync.cc",
diff --git a/components/password_manager/core/browser/sync/credential_model_type_controller.cc b/components/password_manager/core/browser/sync/password_model_type_controller.cc
similarity index 67%
rename from components/password_manager/core/browser/sync/credential_model_type_controller.cc
rename to components/password_manager/core/browser/sync/password_model_type_controller.cc
index 15b6ab85..43d96e54 100644
--- a/components/password_manager/core/browser/sync/credential_model_type_controller.cc
+++ b/components/password_manager/core/browser/sync/password_model_type_controller.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "components/password_manager/core/browser/sync/credential_model_type_controller.h"
+#include "components/password_manager/core/browser/sync/password_model_type_controller.h"
 
 #include <utility>
 
@@ -25,8 +25,7 @@
 
 namespace password_manager {
 
-CredentialModelTypeController::CredentialModelTypeController(
-    syncer::ModelType model_type,
+PasswordModelTypeController::PasswordModelTypeController(
     std::unique_ptr<syncer::ModelTypeControllerDelegate>
         delegate_for_full_sync_mode,
     std::unique_ptr<syncer::ModelTypeControllerDelegate>
@@ -34,70 +33,57 @@
     PrefService* pref_service,
     signin::IdentityManager* identity_manager,
     syncer::SyncService* sync_service)
-    : ModelTypeController(model_type,
+    : ModelTypeController(syncer::PASSWORDS,
                           std::move(delegate_for_full_sync_mode),
                           std::move(delegate_for_transport_mode)),
       pref_service_(pref_service),
-#if BUILDFLAG(IS_ANDROID)
-      local_upm_pref_(type() == syncer::PASSWORDS
-                          ? std::make_unique<IntegerPrefMember>()
-                          : nullptr),
-#endif
       identity_manager_(identity_manager),
       sync_service_(sync_service) {
-  CHECK(model_type == syncer::PASSWORDS ||
-        model_type == syncer::WEBAUTHN_CREDENTIAL);
   identity_manager_observation_.Observe(identity_manager_);
 #if BUILDFLAG(IS_ANDROID)
-  if (local_upm_pref_) {
-    // Unretained() is safe because this object outlives `local_upm_pref_`.
-    local_upm_pref_->Init(
-        prefs::kPasswordsUseUPMLocalAndSeparateStores, pref_service_,
-        base::BindRepeating(
-            &CredentialModelTypeController::OnLocalUpmPrefChanged,
-            base::Unretained(this)));
-  }
+  // Unretained() is safe because this object outlives `local_upm_pref_`.
+  local_upm_pref_.Init(
+      prefs::kPasswordsUseUPMLocalAndSeparateStores, pref_service_,
+      base::BindRepeating(&PasswordModelTypeController::OnLocalUpmPrefChanged,
+                          base::Unretained(this)));
 #endif
 }
 
-CredentialModelTypeController::~CredentialModelTypeController() = default;
+PasswordModelTypeController::~PasswordModelTypeController() = default;
 
-void CredentialModelTypeController::LoadModels(
+void PasswordModelTypeController::LoadModels(
     const syncer::ConfigureContext& configure_context,
     const ModelLoadCallback& model_load_callback) {
   DCHECK(CalledOnValidThread());
   syncer::ConfigureContext overridden_context = configure_context;
 #if BUILDFLAG(IS_ANDROID)
-  if (local_upm_pref_) {
-    switch (GetLocalUpmPrefValue()) {
-      case prefs::UseUpmLocalAndSeparateStoresState::kOff:
-        break;
-      case prefs::UseUpmLocalAndSeparateStoresState::kOn:
-        overridden_context.sync_mode = syncer::SyncMode::kTransportOnly;
-        break;
-      case prefs::UseUpmLocalAndSeparateStoresState::kOffAndMigrationPending:
-        // Disallowed by GetPreconditionState().
-        NOTREACHED_NORETURN();
-    }
+  switch (GetLocalUpmPrefValue()) {
+    case prefs::UseUpmLocalAndSeparateStoresState::kOff:
+      break;
+    case prefs::UseUpmLocalAndSeparateStoresState::kOn:
+      overridden_context.sync_mode = syncer::SyncMode::kTransportOnly;
+      break;
+    case prefs::UseUpmLocalAndSeparateStoresState::kOffAndMigrationPending:
+      // Disallowed by GetPreconditionState().
+      NOTREACHED_NORETURN();
   }
 #endif
   ModelTypeController::LoadModels(overridden_context, model_load_callback);
 }
 
-void CredentialModelTypeController::Stop(syncer::SyncStopMetadataFate fate,
-                                         StopCallback callback) {
+void PasswordModelTypeController::Stop(syncer::SyncStopMetadataFate fate,
+                                       StopCallback callback) {
   DCHECK(CalledOnValidThread());
   ModelTypeController::Stop(fate, std::move(callback));
 }
 
 syncer::DataTypeController::PreconditionState
-CredentialModelTypeController::GetPreconditionState() const {
+PasswordModelTypeController::GetPreconditionState() const {
 #if BUILDFLAG(IS_ANDROID)
   // If the local UPM migration is pending, wait until it succeeds/fails, so
   // LoadModels() knows whether to override SyncMode to kTransportOnly or not.
-  return local_upm_pref_ && GetLocalUpmPrefValue() ==
-                                prefs::UseUpmLocalAndSeparateStoresState::
-                                    kOffAndMigrationPending
+  return GetLocalUpmPrefValue() == prefs::UseUpmLocalAndSeparateStoresState::
+                                       kOffAndMigrationPending
              ? PreconditionState::kMustStopAndKeepData
              : PreconditionState::kPreconditionsMet;
 #else
@@ -105,7 +91,7 @@
 #endif
 }
 
-bool CredentialModelTypeController::ShouldRunInTransportOnlyMode() const {
+bool PasswordModelTypeController::ShouldRunInTransportOnlyMode() const {
 #if !BUILDFLAG(IS_IOS)
   // Outside iOS, passphrase errors aren't reported in the UI, so it doesn't
   // make sense to enable this datatype.
@@ -116,7 +102,7 @@
   return true;
 }
 
-void CredentialModelTypeController::OnAccountsInCookieUpdated(
+void PasswordModelTypeController::OnAccountsInCookieUpdated(
     const signin::AccountsInCookieJarInfo& accounts_in_cookie_jar_info,
     const GoogleServiceAuthError& error) {
 #if !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID)
@@ -141,7 +127,7 @@
 #endif  // !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID)
 }
 
-void CredentialModelTypeController::OnAccountsCookieDeletedByUserAction() {
+void PasswordModelTypeController::OnAccountsCookieDeletedByUserAction() {
 #if !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID)
   features_util::KeepAccountStorageSettingsOnlyForUsers(pref_service_, {});
 #endif  // !BUILDFLAG(IS_IOS) && !BUILDFLAG(IS_ANDROID)
@@ -149,10 +135,9 @@
 
 #if BUILDFLAG(IS_ANDROID)
 prefs::UseUpmLocalAndSeparateStoresState
-CredentialModelTypeController::GetLocalUpmPrefValue() const {
-  CHECK(local_upm_pref_);
+PasswordModelTypeController::GetLocalUpmPrefValue() const {
   auto value = static_cast<prefs::UseUpmLocalAndSeparateStoresState>(
-      local_upm_pref_->GetValue());
+      local_upm_pref_.GetValue());
   switch (value) {
     case prefs::UseUpmLocalAndSeparateStoresState::kOff:
     case prefs::UseUpmLocalAndSeparateStoresState::kOn:
@@ -162,7 +147,7 @@
   NOTREACHED_NORETURN();
 }
 
-void CredentialModelTypeController::OnLocalUpmPrefChanged() {
+void PasswordModelTypeController::OnLocalUpmPrefChanged() {
   // No-ops are fine.
   sync_service_->DataTypePreconditionChanged(type());
 }
diff --git a/components/password_manager/core/browser/sync/credential_model_type_controller.h b/components/password_manager/core/browser/sync/password_model_type_controller.h
similarity index 70%
rename from components/password_manager/core/browser/sync/credential_model_type_controller.h
rename to components/password_manager/core/browser/sync/password_model_type_controller.h
index 6351f05..57db619 100644
--- a/components/password_manager/core/browser/sync/credential_model_type_controller.h
+++ b/components/password_manager/core/browser/sync/password_model_type_controller.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_CREDENTIAL_MODEL_TYPE_CONTROLLER_H_
-#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_CREDENTIAL_MODEL_TYPE_CONTROLLER_H_
+#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_MODEL_TYPE_CONTROLLER_H_
+#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_MODEL_TYPE_CONTROLLER_H_
 
 #include <memory>
 
@@ -28,14 +28,13 @@
 enum class UseUpmLocalAndSeparateStoresState;
 }
 
-// A class that manages the startup and shutdown of password & passkey sync.
-class CredentialModelTypeController : public syncer::ModelTypeController,
-                                      public signin::IdentityManager::Observer {
+// A class that manages the startup and shutdown of password sync.
+class PasswordModelTypeController : public syncer::ModelTypeController,
+                                    public signin::IdentityManager::Observer {
  public:
   // Note: Android might always be configured in transport mode if
   // UnifiedPasswordManagerLocalPasswordsAndroid* flags are in place.
-  CredentialModelTypeController(
-      syncer::ModelType model_type,
+  PasswordModelTypeController(
       std::unique_ptr<syncer::ModelTypeControllerDelegate>
           delegate_for_full_sync_mode,
       std::unique_ptr<syncer::ModelTypeControllerDelegate>
@@ -44,11 +43,11 @@
       signin::IdentityManager* identity_manager,
       syncer::SyncService* sync_service);
 
-  CredentialModelTypeController(const CredentialModelTypeController&) = delete;
-  CredentialModelTypeController& operator=(
-      const CredentialModelTypeController&) = delete;
+  PasswordModelTypeController(const PasswordModelTypeController&) = delete;
+  PasswordModelTypeController& operator=(const PasswordModelTypeController&) =
+      delete;
 
-  ~CredentialModelTypeController() override;
+  ~PasswordModelTypeController() override;
 
   // DataTypeController overrides.
   void LoadModels(const syncer::ConfigureContext& configure_context,
@@ -72,8 +71,7 @@
 
   const raw_ptr<PrefService> pref_service_;
 #if BUILDFLAG(IS_ANDROID)
-  // Only set for PASSWORDS.
-  const std::unique_ptr<IntegerPrefMember> local_upm_pref_;
+  IntegerPrefMember local_upm_pref_;
 #endif
   const raw_ptr<signin::IdentityManager> identity_manager_;
   const raw_ptr<syncer::SyncService> sync_service_;
@@ -82,9 +80,9 @@
                           signin::IdentityManager::Observer>
       identity_manager_observation_{this};
 
-  base::WeakPtrFactory<CredentialModelTypeController> weak_ptr_factory_{this};
+  base::WeakPtrFactory<PasswordModelTypeController> weak_ptr_factory_{this};
 };
 
 }  // namespace password_manager
 
-#endif  // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_CREDENTIAL_MODEL_TYPE_CONTROLLER_H_
+#endif  // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_SYNC_PASSWORD_MODEL_TYPE_CONTROLLER_H_
diff --git a/components/privacy_sandbox/privacy_sandbox_attestations/BUILD.gn b/components/privacy_sandbox/privacy_sandbox_attestations/BUILD.gn
index d1fe669f..a6e5ed64 100644
--- a/components/privacy_sandbox/privacy_sandbox_attestations/BUILD.gn
+++ b/components/privacy_sandbox/privacy_sandbox_attestations/BUILD.gn
@@ -71,6 +71,8 @@
       sources = [ "privacy_sandbox_attestations_parser_proto_fuzzer.cc" ]
       deps = [
         ":privacy_sandbox_attestations",
+        "//base",
+        "//base:i18n",
         "//components/privacy_sandbox/privacy_sandbox_attestations/proto:proto",
         "//third_party/libprotobuf-mutator",
       ]
diff --git a/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_parser_proto_fuzzer.cc b/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_parser_proto_fuzzer.cc
index 6ead62854..32706d6c9 100644
--- a/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_parser_proto_fuzzer.cc
+++ b/components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_parser_proto_fuzzer.cc
@@ -8,16 +8,28 @@
 #include <iostream>
 #include <string>
 
+#include "base/at_exit.h"
+#include "base/i18n/icu_util.h"
 #include "components/privacy_sandbox/privacy_sandbox_attestations/proto/privacy_sandbox_attestations.pb.h"
 #include "testing/libfuzzer/proto/lpm_interface.h"
 
 namespace {
 
+class Environment {
+ public:
+  Environment() { CHECK(base::i18n::InitializeICU()); }
+
+ private:
+  base::AtExitManager at_exit_manager;  // Used by ICU integration.
+};
+
 // Use a binary proto fuzzer as the Privacy Sandbox Attestation file is a binary
 // file.
 DEFINE_BINARY_PROTO_FUZZER(
     const privacy_sandbox::PrivacySandboxAttestationsProto&
         attestations_proto) {
+  static Environment env;
+
   std::string native_input = attestations_proto.SerializeAsString();
 
   if (getenv("LPM_DUMP_NATIVE_INPUT")) {
diff --git a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc
index f9cad21..79e0efc 100644
--- a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc
+++ b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate.cc
@@ -333,9 +333,10 @@
 
 void MutableProfileOAuth2TokenServiceDelegate::InvalidateTokenForMultilogin(
     const CoreAccountId& failed_account) {
-  UpdateAuthError(
-      failed_account,
-      GoogleServiceAuthError(GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS));
+  UpdateAuthError(failed_account,
+                  GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
+                      GoogleServiceAuthError::InvalidGaiaCredentialsReason::
+                          CREDENTIALS_REJECTED_BY_SERVER));
 }
 
 void MutableProfileOAuth2TokenServiceDelegate::LoadCredentials(
diff --git a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc
index e93f146..654df64c 100644
--- a/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc
+++ b/components/signin/internal/identity_manager/mutable_profile_oauth2_token_service_delegate_unittest.cc
@@ -722,12 +722,12 @@
   testing::Mock::VerifyAndClearExpectations(&observer);
 
   // This should be fired after error is set.
-  EXPECT_CALL(
-      observer,
-      OnAuthErrorChanged(account_id1,
-                         GoogleServiceAuthError(
-                             GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)))
-      .Times(1);
+  EXPECT_CALL(observer,
+              OnAuthErrorChanged(
+                  account_id1,
+                  GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
+                      GoogleServiceAuthError::InvalidGaiaCredentialsReason::
+                          CREDENTIALS_REJECTED_BY_SERVER)));
 
   oauth2_service_delegate_->InvalidateTokenForMultilogin(account_id1);
   EXPECT_EQ(oauth2_service_delegate_->GetAuthError(account_id1).state(),
diff --git a/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_unittest.cc b/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_unittest.cc
index c5148c999..dab0cfb 100644
--- a/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_unittest.cc
+++ b/components/signin/internal/identity_manager/profile_oauth2_token_service_delegate_unittest.cc
@@ -43,11 +43,12 @@
 TEST_F(ProfileOAuth2TokenServiceDelegateTest, InvalidateTokensForMultilogin) {
   // Check that OnAuthErrorChanged is not fired from
   // InvalidateTokensForMultilogin and refresh tokens are not set in error.
-  EXPECT_CALL(
-      observer_,
-      OnAuthErrorChanged(::testing::_,
-                         GoogleServiceAuthError(
-                             GoogleServiceAuthError::INVALID_GAIA_CREDENTIALS)))
+  EXPECT_CALL(observer_,
+              OnAuthErrorChanged(
+                  ::testing::_,
+                  GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
+                      GoogleServiceAuthError::InvalidGaiaCredentialsReason::
+                          CREDENTIALS_REJECTED_BY_SERVER)))
       .Times(0);
 
   const CoreAccountId account_id1 = CoreAccountId::FromGaiaId("account_id1");
diff --git a/components/sync/base/features.cc b/components/sync/base/features.cc
index 551550ef..d57ea6b 100644
--- a/components/sync/base/features.cc
+++ b/components/sync/base/features.cc
@@ -27,7 +27,7 @@
 
 BASE_FEATURE(kSharingOfferKeyPairBootstrap,
              "SharingOfferKeyPairBootstrap",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 BASE_FEATURE(kSharingOfferKeyPairRead,
              "SharingOfferKeyPairRead",
diff --git a/components/sync/engine/model_type_worker.cc b/components/sync/engine/model_type_worker.cc
index 60be497..c3484499 100644
--- a/components/sync/engine/model_type_worker.cc
+++ b/components/sync/engine/model_type_worker.cc
@@ -66,6 +66,17 @@
              "SyncKeepGcDirectiveDuringSyncCycle",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+enum class CrossUserSharingDecryptionResult {
+  kSuccess = 0,
+  kInvitationMissingFields = 1,
+  kFailedToDecryptInvitation = 2,
+  kFailedToParseDecryptedInvitation = 3,
+
+  kMaxValue = kFailedToParseDecryptedInvitation,
+};
+
 void LogPasswordNotesState(PasswordNotesStateForUMA state) {
   base::UmaHistogramEnumeration(kPasswordNotesStateHistogramName, state);
 }
@@ -78,6 +89,12 @@
       success);
 }
 
+void LogCrossUserSharingDecryptionResult(
+    CrossUserSharingDecryptionResult result) {
+  base::UmaHistogramEnumeration("Sync.CrossUserSharingDecryptionResult",
+                                result);
+}
+
 // A proxy which can be called from any sequence and delegates the work to the
 // commit queue injected on construction.
 class CommitQueueProxy : public CommitQueue {
@@ -248,8 +265,8 @@
     sync_pb::PasswordSharingInvitationData* unencrypted_invitation_data) {
   if (!invitation.has_encrypted_password_sharing_invitation_data() ||
       !invitation.sender_info().has_cross_user_sharing_public_key()) {
-    DLOG(ERROR)
-        << "Incoming password sharing invitation missing required fields";
+    LogCrossUserSharingDecryptionResult(
+        CrossUserSharingDecryptionResult::kInvitationMissingFields);
     return false;
   }
 
@@ -262,16 +279,20 @@
                                              .x25519_public_key())),
           invitation.recipient_key_version());
   if (!decrypted) {
-    DLOG(ERROR) << "Failed to decrypt an incoming password sharing invitation";
+    LogCrossUserSharingDecryptionResult(
+        CrossUserSharingDecryptionResult::kFailedToDecryptInvitation);
     return false;
   }
 
   if (!unencrypted_invitation_data->ParseFromArray(decrypted->data(),
                                                    decrypted->size())) {
-    DLOG(ERROR) << "Failed to parse password sharing invitation";
+    LogCrossUserSharingDecryptionResult(
+        CrossUserSharingDecryptionResult::kFailedToParseDecryptedInvitation);
     return false;
   }
 
+  LogCrossUserSharingDecryptionResult(
+      CrossUserSharingDecryptionResult::kSuccess);
   return true;
 }
 
diff --git a/components/sync/engine/nigori/cross_user_sharing_public_private_key_pair.cc b/components/sync/engine/nigori/cross_user_sharing_public_private_key_pair.cc
index 036f90f..ba075f9 100644
--- a/components/sync/engine/nigori/cross_user_sharing_public_private_key_pair.cc
+++ b/components/sync/engine/nigori/cross_user_sharing_public_private_key_pair.cc
@@ -10,6 +10,7 @@
 #include <vector>
 
 #include "base/check_op.h"
+#include "base/logging.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/boringssl/src/include/openssl/hpke.h"
 
@@ -126,6 +127,7 @@
   bssl::ScopedEVP_HPKE_CTX sender_context;
 
   if (encrypted_data.size() < X25519_PUBLIC_VALUE_LEN) {
+    VLOG(1) << "Invalid size of encrypted data";
     return absl::nullopt;
   }
 
@@ -142,6 +144,7 @@
           /*info_len=*/authenticated_info.size(),
           /*peer_public_key=*/sender_public_key.data(),
           /*peer_public_key_len=*/sender_public_key.size())) {
+    VLOG(1) << "Cross-user sharing decryption: setup auth recipient failed";
     return absl::nullopt;
   }
 
@@ -156,6 +159,7 @@
           /*in=*/ciphertext.data(), /*in_len=*/ciphertext.size(),
           /*ad=*/nullptr,
           /*ad_len=*/0)) {
+    VLOG(1) << "Cross-user sharing decryption: HPKE decryption failed";
     return absl::nullopt;
   }
 
diff --git a/components/sync/nigori/cryptographer_impl.cc b/components/sync/nigori/cryptographer_impl.cc
index d9d9b7e5..ed3846f01 100644
--- a/components/sync/nigori/cryptographer_impl.cc
+++ b/components/sync/nigori/cryptographer_impl.cc
@@ -182,12 +182,12 @@
     base::span<const uint8_t> plaintext,
     base::span<const uint8_t> recipient_public_key) const {
   if (!default_cross_user_sharing_key_version_.has_value()) {
-    DVLOG(1) << "Default encryption key pair version is not set";
+    VLOG(1) << "Default encryption key pair version is not set";
     return absl::nullopt;
   }
   if (!cross_user_sharing_keys_.HasKeyPair(
           default_cross_user_sharing_key_version_.value())) {
-    DVLOG(1) << "Encryption key pair is not available";
+    VLOG(1) << "Encryption key pair is not available";
     return absl::nullopt;
   }
 
@@ -205,6 +205,7 @@
     base::span<const uint8_t> sender_public_key,
     const uint32_t recipient_key_version) const {
   if (!cross_user_sharing_keys_.HasKeyPair(recipient_key_version)) {
+    VLOG(1) << "Decryption key pair does not exist: " << recipient_key_version;
     return absl::nullopt;
   }
 
diff --git a/components/sync/nigori/nigori_sync_bridge_impl.cc b/components/sync/nigori/nigori_sync_bridge_impl.cc
index 84ec2c1..2102f12 100644
--- a/components/sync/nigori/nigori_sync_bridge_impl.cc
+++ b/components/sync/nigori/nigori_sync_bridge_impl.cc
@@ -607,6 +607,8 @@
   if (specifics.passphrase_type() != NigoriSpecifics::IMPLICIT_PASSPHRASE ||
       !specifics.encryption_keybag().blob().empty()) {
     // We received regular Nigori.
+    // TODO(crbug.com/1445056): consider generating a new public-private key
+    // pair after the initial sync.
     return UpdateLocalState(data->specifics.nigori());
   }
   // Ensure we have |keystore_keys| during the initial download, requested to
@@ -1025,6 +1027,8 @@
 
 void NigoriSyncBridgeImpl::QueuePendingLocalCommit(
     std::unique_ptr<PendingLocalNigoriCommit> local_commit) {
+  // TODO(crbug.com/1445056): Consider adding more validations in ctor to get
+  // stronger guarantee around DCHECK() below.
   DCHECK(processor_->IsTrackingMetadata());
 
   pending_local_commit_queue_.push_back(std::move(local_commit));
diff --git a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
index beb9b21..276de69 100644
--- a/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
+++ b/components/sync/nigori/nigori_sync_bridge_impl_unittest.cc
@@ -149,6 +149,15 @@
          expected.entity_metadata->SerializeAsString();
 }
 
+CrossUserSharingKeys CreateNewCrossUserSharingKeys() {
+  const uint32_t kKeyVersion = 0;
+  CrossUserSharingKeys cross_user_sharing_keys =
+      CrossUserSharingKeys::CreateEmpty();
+  cross_user_sharing_keys.AddKeyPair(
+      CrossUserSharingPublicPrivateKeyPair::GenerateNewKeyPair(), kKeyVersion);
+  return cross_user_sharing_keys;
+}
+
 NigoriMetadataBatch CreateDummyNigoriMetadataBatch(
     const std::string& progress_marker_token,
     int64_t entity_metadata_sequence_number) {
@@ -1200,6 +1209,7 @@
   // with previously stored metadata.
   auto processor2 =
       std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>();
+  ON_CALL(*processor2, IsTrackingMetadata()).WillByDefault(Return(true));
   EXPECT_CALL(
       *processor2,
       ModelReadyToSync(NotNull(),
@@ -1668,6 +1678,7 @@
   // Create secondary processor.
   auto processor2 =
       std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>();
+  ON_CALL(*processor2, IsTrackingMetadata()).WillByDefault(Return(true));
   // Once decryption passphrase is provided, bridge should ReportError().
   EXPECT_CALL(*processor2, ReportError);
 
@@ -1733,7 +1744,8 @@
   *entity_data.specifics.mutable_nigori() = BuildKeystoreNigoriSpecifics(
       /*keybag_keys_params=*/{kKeystoreKeyParams, kPassphraseKeyParams},
       /*keystore_decryptor_params=*/kPassphraseKeyParams,
-      /*keystore_key_params=*/kKeystoreKeyParams);
+      /*keystore_key_params=*/kKeystoreKeyParams,
+      CreateNewCrossUserSharingKeys());
   ASSERT_TRUE(bridge1->SetKeystoreKeys({kRawKeystoreKey}));
   ASSERT_THAT(bridge1->MergeFullSyncData(std::move(entity_data)),
               Eq(absl::nullopt));
@@ -1745,6 +1757,7 @@
   auto processor2 =
       std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>();
   ON_CALL(*processor2, IsTrackingMetadata()).WillByDefault(Return(true));
+
   // Upon startup bridge should issue a commit with full keystore Nigori.
   EXPECT_CALL(*processor2, Put(HasKeystoreNigori()));
 
@@ -1798,8 +1811,6 @@
   auto processor2 =
       std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>();
   ON_CALL(*processor2, IsTrackingMetadata()).WillByDefault(Return(true));
-  // No commits should be issued.
-  EXPECT_CALL(*processor2, Put).Times(0);
 
   auto bridge2 = std::make_unique<NigoriSyncBridgeImpl>(std::move(processor2),
                                                         std::move(storage2));
@@ -1838,9 +1849,12 @@
   auto storage2 = std::make_unique<testing::NiceMock<MockNigoriStorage>>();
   ON_CALL(*storage2, RestoreData()).WillByDefault(Return(nigori_local_data));
 
-  auto bridge2 = std::make_unique<NigoriSyncBridgeImpl>(
-      std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>(),
-      std::move(storage2));
+  auto processor2 =
+      std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>();
+  ON_CALL(*processor2, IsTrackingMetadata()).WillByDefault(Return(true));
+
+  auto bridge2 = std::make_unique<NigoriSyncBridgeImpl>(std::move(processor2),
+                                                        std::move(storage2));
 
   testing::NiceMock<MockObserver> observer;
   bridge2->AddObserver(&observer);
@@ -1886,9 +1900,12 @@
   auto storage2 = std::make_unique<testing::NiceMock<MockNigoriStorage>>();
   ON_CALL(*storage2, RestoreData()).WillByDefault(Return(nigori_local_data));
 
-  auto bridge2 = std::make_unique<NigoriSyncBridgeImpl>(
-      std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>(),
-      std::move(storage2));
+  auto processor2 =
+      std::make_unique<testing::NiceMock<MockNigoriLocalChangeProcessor>>();
+  ON_CALL(*processor2, IsTrackingMetadata()).WillByDefault(Return(true));
+
+  auto bridge2 = std::make_unique<NigoriSyncBridgeImpl>(std::move(processor2),
+                                                        std::move(storage2));
 
   testing::NiceMock<MockObserver> observer;
   bridge2->AddObserver(&observer);
diff --git a/components/sync/test/nigori_test_utils.cc b/components/sync/test/nigori_test_utils.cc
index b56b289b..4b0176a 100644
--- a/components/sync/test/nigori_test_utils.cc
+++ b/components/sync/test/nigori_test_utils.cc
@@ -56,6 +56,18 @@
   return {KeyDerivationParams::CreateForScrypt(passphrase), passphrase};
 }
 
+sync_pb::CrossUserSharingPublicKey CrossUserSharingKeysToPublicKeyProto(
+    const CrossUserSharingKeys& cross_user_sharing_keys,
+    size_t key_version) {
+  sync_pb::CrossUserSharingPublicKey public_key;
+  auto raw_public_key =
+      cross_user_sharing_keys.GetKeyPair(key_version).GetRawPublicKey();
+  public_key.set_x25519_public_key(
+      std::string(raw_public_key.begin(), raw_public_key.end()));
+  public_key.set_version(key_version);
+  return public_key;
+}
+
 sync_pb::NigoriSpecifics BuildKeystoreNigoriSpecifics(
     const std::vector<KeyParamsForTesting>& keybag_keys_params,
     const KeyParamsForTesting& keystore_decryptor_params,
@@ -96,6 +108,12 @@
       serialized_keystore_decryptor,
       specifics.mutable_keystore_decryptor_token()));
 
+  if (cross_user_sharing_keys.HasKeyPair(/*key_version=*/0)) {
+    specifics.mutable_cross_user_sharing_public_key()->CopyFrom(
+        CrossUserSharingKeysToPublicKeyProto(cross_user_sharing_keys,
+                                             /*key_version=*/0));
+  }
+
   specifics.set_passphrase_type(sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE);
   specifics.set_keystore_migration_time(TimeToProtoTime(base::Time::Now()));
   return specifics;
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
index 593cf84..126d3f4 100644
--- a/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
+++ b/components/viz/service/display_embedder/skia_output_surface_impl_on_gpu.cc
@@ -826,11 +826,11 @@
     const gfx::Size& size,
     const gfx::ColorSpace& color_space,
     base::StringPiece debug_label) {
-  constexpr uint32_t kUsage = gpu::SHARED_IMAGE_USAGE_GLES2 |
-                              gpu::SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT |
-                              gpu::SHARED_IMAGE_USAGE_RASTER |
-                              gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
-                              gpu::SHARED_IMAGE_USAGE_DISPLAY_WRITE;
+  constexpr uint32_t kUsage =
+      gpu::SHARED_IMAGE_USAGE_GLES2_READ | gpu::SHARED_IMAGE_USAGE_GLES2_WRITE |
+      gpu::SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT |
+      gpu::SHARED_IMAGE_USAGE_RASTER | gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
+      gpu::SHARED_IMAGE_USAGE_DISPLAY_WRITE;
 
   gpu::Mailbox mailbox = gpu::Mailbox::GenerateForSharedImage();
   bool result = shared_image_factory_->CreateSharedImage(
diff --git a/components/viz/test/fake_skia_output_surface.cc b/components/viz/test/fake_skia_output_surface.cc
index 31bbadd..78e58b01e 100644
--- a/components/viz/test/fake_skia_output_surface.cc
+++ b/components/viz/test/fake_skia_output_surface.cc
@@ -286,7 +286,9 @@
     auto client_shared_image = sii->CreateSharedImage(
         SinglePlaneFormat::kRGBA_8888, geometry.result_selection.size(),
         color_space, kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
-        gpu::SHARED_IMAGE_USAGE_GLES2, "CopyOutput", gpu::kNullSurfaceHandle);
+        gpu::SHARED_IMAGE_USAGE_GLES2_READ |
+            gpu::SHARED_IMAGE_USAGE_GLES2_WRITE,
+        "CopyOutput", gpu::kNullSurfaceHandle);
     CHECK(client_shared_image);
     gpu::Mailbox local_mailbox = client_shared_image->mailbox();
 
diff --git a/components/webauthn/core/browser/BUILD.gn b/components/webauthn/core/browser/BUILD.gn
index fc84417fc..53ed0414 100644
--- a/components/webauthn/core/browser/BUILD.gn
+++ b/components/webauthn/core/browser/BUILD.gn
@@ -3,8 +3,11 @@
 # found in the LICENSE file.
 
 source_set("browser") {
-  sources = []
-  deps = []
+  sources = [
+    "passkey_model_type_controller.cc",
+    "passkey_model_type_controller.h",
+  ]
+  deps = [ "//components/sync" ]
 
   if (!is_ios) {
     sources += [ "internal_authenticator.h" ]
@@ -26,10 +29,7 @@
       "passkey_sync_bridge.cc",
       "passkey_sync_bridge.h",
     ]
-    deps += [
-      "//base",
-      "//components/sync",
-    ]
+    deps += [ "//base" ]
   }
 }
 
@@ -51,18 +51,20 @@
 
 static_library("test_support") {
   testonly = true
-  sources = [
-    "mock_internal_authenticator.cc",
-    "mock_internal_authenticator.h",
-  ]
-  deps = [
-    ":browser",
-    "//base/test:test_support",
-    "//components/sync",
-    "//content/public/browser",
-    "//testing/gmock",
-    "//testing/gtest",
-  ]
+  if (!is_ios) {
+    sources = [
+      "mock_internal_authenticator.cc",
+      "mock_internal_authenticator.h",
+    ]
+    deps = [
+      ":browser",
+      "//base/test:test_support",
+      "//components/sync",
+      "//content/public/browser",
+      "//testing/gmock",
+      "//testing/gtest",
+    ]
+  }
   if (!is_ios && !is_android) {
     sources += [
       "test_passkey_model.cc",
diff --git a/components/webauthn/core/browser/passkey_model_type_controller.cc b/components/webauthn/core/browser/passkey_model_type_controller.cc
new file mode 100644
index 0000000..0a28455
--- /dev/null
+++ b/components/webauthn/core/browser/passkey_model_type_controller.cc
@@ -0,0 +1,38 @@
+// 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 "components/webauthn/core/browser/passkey_model_type_controller.h"
+
+#include <utility>
+
+#include "build/build_config.h"
+#include "components/sync/base/model_type.h"
+#include "components/sync/service/sync_service.h"
+#include "components/sync/service/sync_user_settings.h"
+
+namespace webauthn {
+
+PasskeyModelTypeController::PasskeyModelTypeController(
+    syncer::SyncService* sync_service,
+    std::unique_ptr<syncer::ModelTypeControllerDelegate>
+        delegate_for_full_sync_mode,
+    std::unique_ptr<syncer::ModelTypeControllerDelegate>
+        delegate_for_transport_mode)
+    : ModelTypeController(syncer::WEBAUTHN_CREDENTIAL,
+                          std::move(delegate_for_full_sync_mode),
+                          std::move(delegate_for_transport_mode)),
+      sync_service_(sync_service) {}
+
+bool PasskeyModelTypeController::ShouldRunInTransportOnlyMode() const {
+#if !BUILDFLAG(IS_IOS)
+  // Outside iOS, passphrase errors aren't reported in the UI, so it doesn't
+  // make sense to enable this datatype.
+  if (sync_service_->GetUserSettings()->IsUsingExplicitPassphrase()) {
+    return false;
+  }
+#endif  // !BUILDFLAG(IS_IOS)
+  return true;
+}
+
+}  // namespace webauthn
diff --git a/components/webauthn/core/browser/passkey_model_type_controller.h b/components/webauthn/core/browser/passkey_model_type_controller.h
new file mode 100644
index 0000000..dc43e01
--- /dev/null
+++ b/components/webauthn/core/browser/passkey_model_type_controller.h
@@ -0,0 +1,42 @@
+// Copyright 2023 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_WEBAUTHN_CORE_BROWSER_PASSKEY_MODEL_TYPE_CONTROLLER_H_
+#define COMPONENTS_WEBAUTHN_CORE_BROWSER_PASSKEY_MODEL_TYPE_CONTROLLER_H_
+
+#include "base/memory/raw_ptr.h"
+#include "components/sync/service/model_type_controller.h"
+
+namespace syncer {
+class SyncService;
+}
+
+namespace webauthn {
+
+// A class that manages the startup and shutdown of passkey sync.
+class PasskeyModelTypeController : public syncer::ModelTypeController {
+ public:
+  PasskeyModelTypeController(
+      syncer::SyncService* sync_service,
+      std::unique_ptr<syncer::ModelTypeControllerDelegate>
+          delegate_for_full_sync_mode,
+      std::unique_ptr<syncer::ModelTypeControllerDelegate>
+          delegate_for_transport_mode);
+
+  PasskeyModelTypeController(const PasskeyModelTypeController&) = delete;
+  PasskeyModelTypeController& operator=(const PasskeyModelTypeController&) =
+      delete;
+
+  ~PasskeyModelTypeController() override = default;
+
+  // syncer::ModelTypeController overrides.
+  bool ShouldRunInTransportOnlyMode() const override;
+
+ private:
+  const raw_ptr<syncer::SyncService> sync_service_;
+};
+
+}  // namespace webauthn
+
+#endif  // COMPONENTS_WEBAUTHN_CORE_BROWSER_PASSKEY_MODEL_TYPE_CONTROLLER_H_
diff --git a/content/browser/audio/audio_service.cc b/content/browser/audio/audio_service.cc
index 37c4176..2e238c1 100644
--- a/content/browser/audio/audio_service.cc
+++ b/content/browser/audio/audio_service.cc
@@ -46,6 +46,8 @@
 
 namespace {
 
+audio::mojom::AudioService* g_service_override = nullptr;
+
 bool IsAudioServiceOutOfProcess() {
   return !base::CommandLine::ForCurrentProcess()->HasSwitch(
              switches::kSingleProcess) &&
@@ -176,6 +178,9 @@
 
 audio::mojom::AudioService& GetAudioService() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  if (g_service_override) {
+    return *g_service_override;
+  }
 
   // NOTE: We use sequence-local storage slot not because we support access from
   // any sequence, but to limit the lifetime of this Remote to the lifetime of
@@ -208,6 +213,13 @@
   return *remote.get();
 }
 
+base::AutoReset<audio::mojom::AudioService*>
+OverrideAudioServiceForTesting(  // IN-TEST
+    audio::mojom::AudioService* service) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  return {&g_service_override, service};
+}
+
 std::unique_ptr<media::AudioSystem> CreateAudioSystemForAudioService() {
   constexpr auto kServiceDisconnectTimeout = base::Seconds(1);
   return std::make_unique<audio::AudioSystemToServiceAdapter>(
diff --git a/content/browser/webrtc/webrtc_video_capture_service_browsertest.cc b/content/browser/webrtc/webrtc_video_capture_service_browsertest.cc
index 2bcd45f..c02215bd 100644
--- a/content/browser/webrtc/webrtc_video_capture_service_browsertest.cc
+++ b/content/browser/webrtc/webrtc_video_capture_service_browsertest.cc
@@ -208,7 +208,8 @@
                                  kTopLeft_GrSurfaceOrigin, kOpaque_SkAlphaType,
                                  gpu::SHARED_IMAGE_USAGE_RASTER |
                                      gpu::SHARED_IMAGE_USAGE_OOP_RASTERIZATION |
-                                     gpu::SHARED_IMAGE_USAGE_GLES2,
+                                     gpu::SHARED_IMAGE_USAGE_GLES2_READ |
+                                     gpu::SHARED_IMAGE_USAGE_GLES2_WRITE,
                                  "TestLabel", gpu::kNullSurfaceHandle)
               ->mailbox();
 
diff --git a/content/public/browser/audio_service.h b/content/public/browser/audio_service.h
index f2138b6..f1320ec 100644
--- a/content/public/browser/audio_service.h
+++ b/content/public/browser/audio_service.h
@@ -5,6 +5,7 @@
 #ifndef CONTENT_PUBLIC_BROWSER_AUDIO_SERVICE_H_
 #define CONTENT_PUBLIC_BROWSER_AUDIO_SERVICE_H_
 
+#include "base/auto_reset.h"
 #include "base/functional/callback.h"
 #include "content/common/content_export.h"
 #include "media/mojo/mojom/audio_stream_factory.mojom.h"
@@ -22,6 +23,11 @@
 // subprocess.
 CONTENT_EXPORT audio::mojom::AudioService& GetAudioService();
 
+// Provides an override for the reference returned by
+// |GetAudioService()|.
+CONTENT_EXPORT base::AutoReset<audio::mojom::AudioService*>
+OverrideAudioServiceForTesting(audio::mojom::AudioService* service);
+
 // Creates an instance of AudioSystem for use with the Audio Service, bound to
 // the thread it's used on for the first time.
 CONTENT_EXPORT std::unique_ptr<media::AudioSystem>
diff --git a/content/renderer/media/android/stream_texture_wrapper_impl.cc b/content/renderer/media/android/stream_texture_wrapper_impl.cc
index 492bbf0..8b7f4bcd 100644
--- a/content/renderer/media/android/stream_texture_wrapper_impl.cc
+++ b/content/renderer/media/android/stream_texture_wrapper_impl.cc
@@ -75,7 +75,8 @@
   gpu::SharedImageInterface* sii = factory_->SharedImageInterface();
   auto shared_image =
       sii->NotifyMailboxAdded(mailbox, gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
-                                           gpu::SHARED_IMAGE_USAGE_GLES2 |
+                                           gpu::SHARED_IMAGE_USAGE_GLES2_READ |
+                                           gpu::SHARED_IMAGE_USAGE_GLES2_WRITE |
                                            gpu::SHARED_IMAGE_USAGE_RASTER);
 
   // The pixel format doesn't matter here as long as it's valid for texture
diff --git a/content/renderer/media/win/dcomp_texture_wrapper_impl.cc b/content/renderer/media/win/dcomp_texture_wrapper_impl.cc
index f83f5077..fc1ee05 100644
--- a/content/renderer/media/win/dcomp_texture_wrapper_impl.cc
+++ b/content/renderer/media/win/dcomp_texture_wrapper_impl.cc
@@ -170,10 +170,11 @@
     DVLOG_FUNC(1) << "AddMailbox";
     mailbox_added_ = true;
     gpu::SharedImageInterface* sii = factory_->SharedImageInterface();
-    shared_image =
-        sii->NotifyMailboxAdded(mailbox_, gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
-                                              gpu::SHARED_IMAGE_USAGE_GLES2 |
-                                              gpu::SHARED_IMAGE_USAGE_RASTER);
+    shared_image = sii->NotifyMailboxAdded(
+        mailbox_, gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
+                      gpu::SHARED_IMAGE_USAGE_GLES2_READ |
+                      gpu::SHARED_IMAGE_USAGE_GLES2_WRITE |
+                      gpu::SHARED_IMAGE_USAGE_RASTER);
   }
 
   gpu::MailboxHolder holders[media::VideoFrame::kMaxPlanes] = {
diff --git a/content/renderer/pepper/pepper_graphics_2d_host.cc b/content/renderer/pepper/pepper_graphics_2d_host.cc
index afe04ea..a8ccd80 100644
--- a/content/renderer/pepper/pepper_graphics_2d_host.cc
+++ b/content/renderer/pepper/pepper_graphics_2d_host.cc
@@ -687,8 +687,9 @@
       recycled_shared_images_.pop_back();
     }
     if (gpu_mailbox.IsZero()) {
-      uint32_t usage =
-          gpu::SHARED_IMAGE_USAGE_GLES2 | gpu::SHARED_IMAGE_USAGE_DISPLAY_READ;
+      uint32_t usage = gpu::SHARED_IMAGE_USAGE_GLES2_READ |
+                       gpu::SHARED_IMAGE_USAGE_GLES2_WRITE |
+                       gpu::SHARED_IMAGE_USAGE_DISPLAY_READ;
       if (overlays_supported)
         usage |= gpu::SHARED_IMAGE_USAGE_SCANOUT;
       auto client_shared_image = sii->CreateSharedImage(
diff --git a/content/renderer/pepper/pepper_video_decoder_host.cc b/content/renderer/pepper/pepper_video_decoder_host.cc
index 1a28fbf..7374c41 100644
--- a/content/renderer/pepper/pepper_video_decoder_host.cc
+++ b/content/renderer/pepper/pepper_video_decoder_host.cc
@@ -565,7 +565,8 @@
   auto client_shared_image = sii->CreateSharedImage(
       viz::SinglePlaneFormat::kRGBA_8888, size, gfx::ColorSpace(),
       kTopLeft_GrSurfaceOrigin, kOpaque_SkAlphaType,
-      gpu::SHARED_IMAGE_USAGE_GLES2 | gpu::SHARED_IMAGE_USAGE_RASTER,
+      gpu::SHARED_IMAGE_USAGE_GLES2_READ | gpu::SHARED_IMAGE_USAGE_GLES2_WRITE |
+          gpu::SHARED_IMAGE_USAGE_RASTER,
       "PepperVideoDecoder", gpu::SurfaceHandle());
   CHECK(client_shared_image);
   auto mailbox = client_shared_image->mailbox();
diff --git a/content/renderer/pepper/ppb_graphics_3d_impl.cc b/content/renderer/pepper/ppb_graphics_3d_impl.cc
index f8ca2c4d..bf082062 100644
--- a/content/renderer/pepper/ppb_graphics_3d_impl.cc
+++ b/content/renderer/pepper/ppb_graphics_3d_impl.cc
@@ -67,8 +67,9 @@
               bool has_alpha,
               bool is_single_buffered)
       : sii_(sii), size_(size), is_single_buffered_(is_single_buffered) {
-    uint32_t usage =
-        gpu::SHARED_IMAGE_USAGE_DISPLAY_READ | gpu::SHARED_IMAGE_USAGE_GLES2;
+    uint32_t usage = gpu::SHARED_IMAGE_USAGE_DISPLAY_READ |
+                     gpu::SHARED_IMAGE_USAGE_GLES2_READ |
+                     gpu::SHARED_IMAGE_USAGE_GLES2_WRITE;
 
     if (is_single_buffered_)
       usage |= gpu::SHARED_IMAGE_USAGE_CONCURRENT_READ_WRITE;
diff --git a/content/web_test/renderer/test_plugin.cc b/content/web_test/renderer/test_plugin.cc
index d0f8746..2b60575 100644
--- a/content/web_test/renderer/test_plugin.cc
+++ b/content/web_test/renderer/test_plugin.cc
@@ -285,7 +285,9 @@
     shared_image_ = sii->CreateSharedImage(
         viz::SinglePlaneFormat::kRGBA_8888, rect_.size(), gfx::ColorSpace(),
         kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
-        gpu::SHARED_IMAGE_USAGE_GLES2 | gpu::SHARED_IMAGE_USAGE_DISPLAY_READ,
+        gpu::SHARED_IMAGE_USAGE_GLES2_READ |
+            gpu::SHARED_IMAGE_USAGE_GLES2_WRITE |
+            gpu::SHARED_IMAGE_USAGE_DISPLAY_READ,
         "TestLabel", gpu::kNullSurfaceHandle);
     CHECK(shared_image_);
     gl_->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData());
diff --git a/gpu/command_buffer/common/shared_image_usage.cc b/gpu/command_buffer/common/shared_image_usage.cc
index 25e8a867..331e697 100644
--- a/gpu/command_buffer/common/shared_image_usage.cc
+++ b/gpu/command_buffer/common/shared_image_usage.cc
@@ -21,7 +21,7 @@
     return {};
 
   const std::pair<SharedImageUsage, const char*> kUsages[] = {
-      {SHARED_IMAGE_USAGE_GLES2, "Gles2"},
+      {SHARED_IMAGE_USAGE_GLES2_READ, "Gles2Read"},
       {SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT, "Gles2FramebufferHint"},
       {SHARED_IMAGE_USAGE_RASTER, "Raster"},
       {SHARED_IMAGE_USAGE_DISPLAY_READ, "DisplayRead"},
@@ -42,6 +42,7 @@
       {SHARED_IMAGE_USAGE_CPU_UPLOAD, "CpuUpload"},
       {SHARED_IMAGE_USAGE_SCANOUT_DCOMP_SURFACE, "ScanoutDCompSurface"},
       {SHARED_IMAGE_USAGE_WEBGPU_STORAGE_TEXTURE, "WebgpuStorageTexture"},
+      {SHARED_IMAGE_USAGE_GLES2_WRITE, "Gles2Write"},
   };
 
   std::string label;
diff --git a/gpu/command_buffer/common/shared_image_usage.h b/gpu/command_buffer/common/shared_image_usage.h
index 77753a604..47907d5 100644
--- a/gpu/command_buffer/common/shared_image_usage.h
+++ b/gpu/command_buffer/common/shared_image_usage.h
@@ -15,8 +15,8 @@
 // Please update the function, CreateLabelForSharedImageUsage, when adding a new
 // enum value.
 enum SharedImageUsage : uint32_t {
-  // Image will be used in GLES2Interface
-  SHARED_IMAGE_USAGE_GLES2 = 1 << 0,
+  // Image will be read via GLES2Interface
+  SHARED_IMAGE_USAGE_GLES2_READ = 1 << 0,
   // Image will be used as a framebuffer (hint)
   SHARED_IMAGE_USAGE_GLES2_FRAMEBUFFER_HINT = 1 << 1,
   // Image will be used in RasterInterface
@@ -68,18 +68,28 @@
   // Image will be used as a WebGPU storage texture.
   SHARED_IMAGE_USAGE_WEBGPU_STORAGE_TEXTURE = 1 << 18,
 
+  // Image will be written via GLES2Interface
+  SHARED_IMAGE_USAGE_GLES2_WRITE = 1 << 19,
+
   // Start service side only usage flags after this entry. They must be larger
   // than `LAST_CLIENT_USAGE`.
-  LAST_CLIENT_USAGE = SHARED_IMAGE_USAGE_WEBGPU_STORAGE_TEXTURE,
+  LAST_CLIENT_USAGE = SHARED_IMAGE_USAGE_GLES2_WRITE,
 
   // Image will have pixels uploaded from CPU. The backing must implement
   // `UploadFromMemory()` if it supports this usage. Clients should specify
   // SHARED_IMAGE_USAGE_CPU_WRITE if they need to write pixels to the image.
-  SHARED_IMAGE_USAGE_CPU_UPLOAD = 1 << 19,
+  SHARED_IMAGE_USAGE_CPU_UPLOAD = 1 << 20,
 
   LAST_SHARED_IMAGE_USAGE = SHARED_IMAGE_USAGE_CPU_UPLOAD
 };
 
+// Constant left in place while we transition the codebase to use GLES2_READ and
+// GLES2_WRITE.
+// TODO(crbug.com/1510440): Transition all usage of this constant and eliminate
+// the constant.
+inline constexpr uint32_t SHARED_IMAGE_USAGE_GLES2 =
+    SHARED_IMAGE_USAGE_GLES2_READ | SHARED_IMAGE_USAGE_GLES2_WRITE;
+
 // Returns true if usage is a valid client usage.
 GPU_EXPORT bool IsValidClientUsage(uint32_t usage);
 
diff --git a/infra/config/generated/testing/variants.pyl b/infra/config/generated/testing/variants.pyl
index 9a971d9..33978b9 100644
--- a/infra/config/generated/testing/variants.pyl
+++ b/infra/config/generated/testing/variants.pyl
@@ -337,16 +337,16 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'identifier': 'Lacros version skew testing ash canary',
-    'description': 'Run with ash-chrome version 122.0.6179.0',
+    'description': 'Run with ash-chrome version 122.0.6180.0',
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome',
     ],
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v122.0.6179.0',
-          'revision': 'version:122.0.6179.0',
+          'location': 'lacros_version_skew_tests_v122.0.6180.0',
+          'revision': 'version:122.0.6180.0',
         },
       ],
     },
diff --git a/infra/config/targets/lacros-version-skew-variants.json b/infra/config/targets/lacros-version-skew-variants.json
index 4e34622..6e30c798 100644
--- a/infra/config/targets/lacros-version-skew-variants.json
+++ b/infra/config/targets/lacros-version-skew-variants.json
@@ -1,16 +1,16 @@
 {
   "LACROS_VERSION_SKEW_CANARY": {
     "args": [
-      "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome"
+      "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome"
     ],
-    "description": "Run with ash-chrome version 122.0.6179.0",
+    "description": "Run with ash-chrome version 122.0.6180.0",
     "identifier": "Lacros version skew testing ash canary",
     "swarming": {
       "cipd_packages": [
         {
           "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-          "location": "lacros_version_skew_tests_v122.0.6179.0",
-          "revision": "version:122.0.6179.0"
+          "location": "lacros_version_skew_tests_v122.0.6180.0",
+          "revision": "version:122.0.6180.0"
         }
       ]
     }
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn
index b66929f..47eda294 100644
--- a/ios/chrome/app/BUILD.gn
+++ b/ios/chrome/app/BUILD.gn
@@ -398,7 +398,7 @@
     "//components/metrics",
     "//ios/chrome/app/application_delegate:app_state_header",
     "//ios/chrome/app/application_delegate:observing_app_state_agent",
-    "//ios/chrome/browser/discover_feed/model:model",
+    "//ios/chrome/browser/discover_feed/model",
     "//ios/chrome/browser/discover_feed/model:discover_feed_factory",
     "//ios/chrome/browser/shared/model/application_context",
     "//ios/chrome/browser/shared/model/browser_state",
@@ -447,6 +447,7 @@
     ":fast_app_terminate_buildflags",
     ":feed_app_agent",
     ":first_run_app_state_agent",
+    ":launch_screen_ui",
     ":mode",
     ":post_restore_app_agent",
     ":safe_mode_app_state_agent",
diff --git a/ios/chrome/app/main_controller.mm b/ios/chrome/app/main_controller.mm
index a05c821..bb54dfde 100644
--- a/ios/chrome/app/main_controller.mm
+++ b/ios/chrome/app/main_controller.mm
@@ -44,6 +44,7 @@
 #import "ios/chrome/app/features.h"
 #import "ios/chrome/app/feed_app_agent.h"
 #import "ios/chrome/app/first_run_app_state_agent.h"
+#import "ios/chrome/app/launch_screen_view_controller.h"
 #import "ios/chrome/app/memory_monitor.h"
 #import "ios/chrome/app/post_restore_app_agent.h"
 #import "ios/chrome/app/safe_mode_app_state_agent.h"
@@ -384,11 +385,17 @@
 // Initializes the application to the minimum initialization needed in all
 // cases.
 - (void)startUpBrowserBasicInitialization;
-//  Initializes the browser objects for the background handlers.
+// Initializes the browser objects for the background handlers, perform any
+// background initilisation that are required, and then transition to the
+// next stage.
 - (void)startUpBrowserBackgroundInitialization;
 // Initializes the browser objects for the browser UI (e.g., the browser
 // state).
 - (void)startUpBrowserForegroundInitialization;
+// Performs any background initialisation that are required before the app
+// can progress. If there are no initialisation, `completion` must be called
+// synchronously.
+- (void)performBrowserBackgroundInitialisation:(ProceduralBlock)completion;
 @end
 
 @implementation MainController
@@ -463,6 +470,7 @@
   ChromeBrowserState* chromeBrowserState = GetApplicationContext()
                                                ->GetChromeBrowserStateManager()
                                                ->GetLastUsedBrowserState();
+  DCHECK(chromeBrowserState);
 
   // Initialize and set the main browser state.
   [self initializeBrowserState:chromeBrowserState];
@@ -481,9 +489,9 @@
   // this during background initialization when the app is launched into the
   // foreground.
   AuthenticationServiceFactory::CreateAndInitializeForBrowserState(
-      self.appState.mainBrowserState,
+      chromeBrowserState,
       std::make_unique<MainControllerAuthenticationServiceDelegate>(
-          self.appState.mainBrowserState, self));
+          chromeBrowserState, self));
 
   // Initialize the provider UI global state.
   ios::provider::InitializeUI();
@@ -511,18 +519,29 @@
 
   [NSURLCache setSharedURLCache:[EmptyNSURLCache emptyNSURLCache]];
 
-  ChromeBrowserState* browserState = self.appState.mainBrowserState;
-  DCHECK(browserState);
   [self.appState
       addAgent:
           [[PostRestoreAppAgent alloc]
               initWithPromosManager:PromosManagerFactory::GetForBrowserState(
-                                        browserState)
+                                        chromeBrowserState)
               authenticationService:AuthenticationServiceFactory::
-                                        GetForBrowserState(browserState)
+                                        GetForBrowserState(chromeBrowserState)
                     identityManager:IdentityManagerFactory::GetForBrowserState(
-                                        browserState)
+                                        chromeBrowserState)
                          localState:GetApplicationContext()->GetLocalState()]];
+
+  // Perform any background initialisation that is required and then
+  // migrate to the next stage.
+  __weak __typeof(self) weakSelf = self;
+  [self performBrowserBackgroundInitialisation:^{
+    [weakSelf.appState queueTransitionToNextInitStage];
+  }];
+}
+
+- (void)performBrowserBackgroundInitialisation:(ProceduralBlock)completion {
+  // For the moment there are no background initialisation, call `completion`
+  // immediately.
+  completion();
 }
 
 // This initialization must happen before any windows are created.
@@ -547,15 +566,15 @@
 
   RegisterComponentsForUpdate();
 
-#if !defined(NDEBUG)
+  ChromeBrowserState* chromeBrowserState = self.appState.mainBrowserState;
+  DCHECK(chromeBrowserState);
+
   // Legacy code used GetLastUsedBrowserState() in this method. We changed it to
   // use self.appState.mainBrowserState instead. The DCHECK ensures that
   // invariant holds true.
-  ChromeBrowserState* chromeBrowserState = GetApplicationContext()
-                                               ->GetChromeBrowserStateManager()
-                                               ->GetLastUsedBrowserState();
-  DCHECK_EQ(chromeBrowserState, self.appState.mainBrowserState);
-#endif  // !defined(NDEBUG)
+  DCHECK_EQ(chromeBrowserState, GetApplicationContext()
+                                    ->GetChromeBrowserStateManager()
+                                    ->GetLastUsedBrowserState());
 
   if (!base::ios::IsMultipleScenesSupported()) {
     NSSet<NSString*>* previousSessions =
@@ -567,7 +586,7 @@
 
   feature_engagement::Tracker* tracker =
       feature_engagement::TrackerFactory::GetForBrowserState(
-          self.appState.mainBrowserState);
+          chromeBrowserState);
   // Send "Chrome Opened" event to the feature_engagement::Tracker on cold
   // start.
   tracker->NotifyEvent(feature_engagement::events::kChromeOpened);
@@ -579,18 +598,16 @@
         feature_engagement::events::kDefaultBrowserVideoPromoConditionsMet);
   }
 
-  _spotlightManager = [SpotlightManager
-      spotlightManagerWithBrowserState:self.appState.mainBrowserState];
+  _spotlightManager =
+      [SpotlightManager spotlightManagerWithBrowserState:chromeBrowserState];
 
   ShareExtensionService* service =
-      ShareExtensionServiceFactory::GetForBrowserState(
-          self.appState.mainBrowserState);
+      ShareExtensionServiceFactory::GetForBrowserState(chromeBrowserState);
   service->Initialize();
 
 #if BUILDFLAG(IOS_CREDENTIAL_PROVIDER_ENABLED)
   if (IsCredentialProviderExtensionSupported()) {
-    CredentialProviderServiceFactory::GetForBrowserState(
-        self.appState.mainBrowserState);
+    CredentialProviderServiceFactory::GetForBrowserState(chromeBrowserState);
   }
 #endif
 
@@ -668,6 +685,16 @@
 
 - (void)appState:(AppState*)appState sceneConnected:(SceneState*)sceneState {
   [sceneState addObserver:self];
+
+  // If the application is not yet ready to present the UI, install
+  // a LaunchScreenViewController as the root view of the connected
+  // SceneState. This ensures that there is no "blank" window.
+  if (self.appState.initStage < InitStageBrowserObjectsForUI) {
+    LaunchScreenViewController* launchScreen =
+        [[LaunchScreenViewController alloc] init];
+    [sceneState.window setRootViewController:launchScreen];
+    [sceneState.window makeKeyAndVisible];
+  }
 }
 
 // Called when the first scene becomes active.
@@ -706,7 +733,6 @@
       break;
     case InitStageBrowserObjectsForBackgroundHandlers:
       [self startUpBrowserBackgroundInitialization];
-      [appState queueTransitionToNextInitStage];
       break;
     case InitStageEnterprise:
       break;
@@ -1031,7 +1057,7 @@
 
                     if (browserState) {
                       SessionRestorationServiceFactory::GetForBrowserState(
-                          self.appState.mainBrowserState)
+                          browserState)
                           ->PurgeUnassociatedData(base::DoNothing());
                     }
                   }];
@@ -1045,13 +1071,14 @@
 
   // ClearSessionCookies() is not synchronous.
   if (cookie_util::ShouldClearSessionCookies()) {
+    ChromeBrowserState* browserState = self.appState.mainBrowserState;
     cookie_util::ClearSessionCookies(
-        self.appState.mainBrowserState->GetOriginalChromeBrowserState());
+        browserState->GetOriginalChromeBrowserState());
     Browser* otrBrowser =
         self.browserProviderInterface.incognitoBrowserProvider.browser;
     if (otrBrowser && !(otrBrowser->GetWebStateList()->empty())) {
       cookie_util::ClearSessionCookies(
-          self.appState.mainBrowserState->GetOffTheRecordChromeBrowserState());
+          browserState->GetOffTheRecordChromeBrowserState());
     }
   }
 
diff --git a/ios/chrome/app/spotlight/open_tabs_spotlight_manager.mm b/ios/chrome/app/spotlight/open_tabs_spotlight_manager.mm
index dffbd85b..e01227ad 100644
--- a/ios/chrome/app/spotlight/open_tabs_spotlight_manager.mm
+++ b/ios/chrome/app/spotlight/open_tabs_spotlight_manager.mm
@@ -58,10 +58,9 @@
   std::map<web::WebStateID, GURL> _lastCommittedURLs;
   // Tracks the number of open tabs with this URL.
   std::map<GURL, NSUInteger> _knownURLCounts;
-  // Bridges that observe all web state lists in all non-incognito browsers.
+  // Bridge that observes all web state lists in all non-incognito browsers.
   // Used to keep track of closing tabs.
-  std::map<WebStateList*, std::unique_ptr<WebStateListObserverBridge>>
-      _webStateListObserverBridges;
+  std::unique_ptr<WebStateListObserverBridge> _webStateListObserverBridge;
 
   // At full reindex of a WebStateList, this queue is used for WebStates that
   // require indexing.
@@ -111,6 +110,8 @@
         std::make_unique<BrowserListObserverBridge>(self);
     _webStateObserverBridge =
         std::make_unique<web::WebStateObserverBridge>(self);
+    _webStateListObserverBridge =
+        std::make_unique<WebStateListObserverBridge>(self);
     _browserList->AddObserver(_browserListObserverBridge.get());
     [self startObservingAllWebStates];
   }
@@ -162,9 +163,7 @@
   WebStateList* webStateList = browser->GetWebStateList();
   [self addAllURLsFromWebStateList:webStateList];
 
-  _webStateListObserverBridges[webStateList] =
-      std::make_unique<WebStateListObserverBridge>(self);
-  webStateList->AddObserver(_webStateListObserverBridges[webStateList].get());
+  webStateList->AddObserver(_webStateListObserverBridge.get());
 }
 
 - (void)browserList:(const BrowserList*)browserList
@@ -173,11 +172,7 @@
 
   [self removeAllURLsFromWebStateList:webStateList];
 
-  if (_webStateListObserverBridges[webStateList]) {
-    webStateList->RemoveObserver(
-        _webStateListObserverBridges[webStateList].get());
-    _webStateListObserverBridges.erase(webStateList);
-  }
+  webStateList->RemoveObserver(_webStateListObserverBridge.get());
 }
 
 - (void)browserListWillShutdown:(const BrowserList*)browserList {
@@ -214,9 +209,7 @@
 - (void)webStateListDestroyed:(WebStateList*)webStateList {
   [self removeAllURLsFromWebStateList:webStateList];
 
-  webStateList->RemoveObserver(
-      _webStateListObserverBridges[webStateList].get());
-  _webStateListObserverBridges.erase(webStateList);
+  webStateList->RemoveObserver(_webStateListObserverBridge.get());
 }
 
 #pragma mark - CRWWebStateObserver
@@ -459,15 +452,12 @@
       WebState* webState = webStateList->GetWebStateAt(i);
       webState->RemoveObserver(_webStateObserverBridge.get());
     }
+    webStateList->RemoveObserver(_webStateListObserverBridge.get());
   }
-  _webStateObserverBridge = std::make_unique<web::WebStateObserverBridge>(self);
 
-  // Stop observing all web state lists
-  for (auto it = _webStateListObserverBridges.begin();
-       it != _webStateListObserverBridges.end(); ++it) {
-    it->first->RemoveObserver(it->second.get());
-  }
-  _webStateListObserverBridges.clear();
+  _webStateObserverBridge = std::make_unique<web::WebStateObserverBridge>(self);
+  _webStateListObserverBridge =
+      std::make_unique<WebStateListObserverBridge>(self);
 }
 
 - (void)startObservingAllWebStateLists {
@@ -477,9 +467,7 @@
 
   for (Browser* browser : _browserList->AllRegularBrowsers()) {
     WebStateList* webStateList = browser->GetWebStateList();
-    _webStateListObserverBridges[webStateList] =
-        std::make_unique<WebStateListObserverBridge>(self);
-    webStateList->AddObserver(_webStateListObserverBridges[webStateList].get());
+    webStateList->AddObserver(_webStateListObserverBridge.get());
   }
 }
 
diff --git a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
index 4cde73d..9299956 100644
--- a/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
+++ b/ios/chrome/browser/ui/settings/google_services/accounts_table_egtest.mm
@@ -302,9 +302,7 @@
 
 // Tests that selecting sign-out and clear data from a non-managed user account
 // clears the user's synced data.
-// TODO(crbug.com/1377798): fails on iPhone SE because the screen is too small
-// to present both the prompt to select and account and the background view.
-- (void)DISABLED_testSignOutAndClearDataFromNonManagedAccountClearsData {
+- (void)testSignOutAndClearDataFromNonManagedAccount {
   FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
 
   // Sign In `fakeIdentity`.
@@ -315,9 +313,11 @@
                                    syncTimeout:kSyncOperationTimeout];
   [BookmarkEarlGrey waitForBookmarkModelsLoaded];
   [BookmarkEarlGrey
-      setupStandardBookmarksInStorage:bookmarks::StorageType::kLocalOrSyncable];
+      setupStandardBookmarksInStorage:bookmarks::StorageType::kAccount];
 
-  // Sign out.
+  // TODO(crbug.com/1509737) The parameter is ignored when
+  // kReplaceSyncPromosWithSignInPromos is enabled. Change the method to one
+  // that is more meaningful with Sign-in only Sign out.
   [SigninEarlGreyUI
       signOutWithConfirmationChoice:SignOutConfirmationChoiceClearData];
 
@@ -330,9 +330,7 @@
 }
 
 // Tests that signing out from a managed user account clears the user's data.
-// TODO(crbug.com/1377800): fails on iPhone SE because the screen is too small
-// to present both the prompt to select and account and the background view.
-- (void)DISABLED_testsSignOutFromManagedAccount {
+- (void)testsSignOutFromManagedAccount {
   // Sign In `fakeManagedIdentity`.
   [SigninEarlGreyUI
       signinWithFakeIdentity:[FakeSystemIdentity fakeManagedIdentity]];
@@ -342,9 +340,11 @@
                                    syncTimeout:kSyncOperationTimeout];
   [BookmarkEarlGrey waitForBookmarkModelsLoaded];
   [BookmarkEarlGrey
-      setupStandardBookmarksInStorage:bookmarks::StorageType::kLocalOrSyncable];
+      setupStandardBookmarksInStorage:bookmarks::StorageType::kAccount];
 
-  // Sign out.
+  // TODO(crbug.com/1509737) The parameter is ignored when
+  // kReplaceSyncPromosWithSignInPromos is enabled. Change the method to one
+  // that is more meaningful with Sign-in only Sign out.
   [SigninEarlGreyUI
       signOutWithConfirmationChoice:SignOutConfirmationChoiceClearData];
 
diff --git a/ios_internal b/ios_internal
index 605708f..53bb5db 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit 605708f6f2746b002967aeb2fe96650a4d65890b
+Subproject commit 53bb5db494be728395d42498edc5e395652b20f9
diff --git a/media/mojo/mojom/video_encode_accelerator.mojom b/media/mojo/mojom/video_encode_accelerator.mojom
index 32b0bfcd..d2cea1cc 100644
--- a/media/mojo/mojom/video_encode_accelerator.mojom
+++ b/media/mojo/mojom/video_encode_accelerator.mojom
@@ -176,6 +176,9 @@
   StorageType storage_type;
   bool has_storage_type;  // Whether or not config has storage type config
   ContentType content_type;
+  // See VideoEncodeAccelerator::Config for detail. Since this is a percentage
+  // between 0 and 100, the type is uint8.
+  uint8 drop_frame_thresh_percentage;
   array<SpatialLayer> spatial_layers;
   SVCInterLayerPredMode inter_layer_pred;
   bool require_low_delay;
diff --git a/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc b/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc
index 892f5478..6dae3bad 100644
--- a/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc
+++ b/media/mojo/mojom/video_encode_accelerator_mojom_traits.cc
@@ -504,6 +504,10 @@
   if (!input.ReadContentType(&content_type))
     return false;
 
+  uint8_t drop_frame_thresh_percentage = input.drop_frame_thresh_percentage();
+  if (drop_frame_thresh_percentage > 100) {
+    return false;
+  }
   std::vector<media::VideoEncodeAccelerator::Config::SpatialLayer>
       spatial_layers;
   if (!input.ReadSpatialLayers(&spatial_layers))
@@ -531,6 +535,7 @@
     absl::optional<media::VideoEncodeAccelerator::Config::StorageType>
         storage_type;
     media::VideoEncodeAccelerator::Config::ContentType content_type;
+    uint8_t drop_frame_thresh_percentage;
     std::vector<media::VideoEncodeAccelerator::Config::SpatialLayer>
         spatial_layers;
     media::SVCInterLayerPredMode inter_layer_pred;
@@ -550,6 +555,7 @@
   output->is_constrained_h264 = is_constrained_h264;
   output->storage_type = storage_type;
   output->content_type = content_type;
+  output->drop_frame_thresh_percentage = drop_frame_thresh_percentage;
   output->spatial_layers = spatial_layers;
   output->inter_layer_pred = inter_layer_pred;
   output->require_low_delay = input.require_low_delay();
diff --git a/media/mojo/mojom/video_encode_accelerator_mojom_traits.h b/media/mojo/mojom/video_encode_accelerator_mojom_traits.h
index aa905004..14e2a13 100644
--- a/media/mojo/mojom/video_encode_accelerator_mojom_traits.h
+++ b/media/mojo/mojom/video_encode_accelerator_mojom_traits.h
@@ -514,6 +514,11 @@
     return input.content_type;
   }
 
+  static uint8_t drop_frame_thresh_percentage(
+      const media::VideoEncodeAccelerator::Config& input) {
+    return input.drop_frame_thresh_percentage;
+  }
+
   static const std::vector<media::VideoEncodeAccelerator::Config::SpatialLayer>&
   spatial_layers(const media::VideoEncodeAccelerator::Config& input) {
     return input.spatial_layers;
diff --git a/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc b/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc
index 45c7a3c..050d7f9f 100644
--- a/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc
+++ b/media/mojo/mojom/video_encode_accelerator_mojom_traits_unittest.cc
@@ -186,6 +186,7 @@
       ::media::VideoEncodeAccelerator::Config::StorageType::kGpuMemoryBuffer;
   input_config.content_type =
       ::media::VideoEncodeAccelerator::Config::ContentType::kCamera;
+  input_config.drop_frame_thresh_percentage = 30;
   input_config.spatial_layers = input_spatial_layers;
   input_config.inter_layer_pred = ::media::SVCInterLayerPredMode::kOnKeyPic;
 
diff --git a/media/video/video_encode_accelerator.h b/media/video/video_encode_accelerator.h
index 3504489..c0043ac 100644
--- a/media/video/video_encode_accelerator.h
+++ b/media/video/video_encode_accelerator.h
@@ -133,6 +133,8 @@
                           base::TimeDelta timestamp);
   ~BitstreamBufferMetadata();
 
+  // If |payload_size_bytes| is zero, it indicates the frame corresponded to
+  // |timestamp| is dropped.
   size_t payload_size_bytes;
   bool key_frame;
   base::TimeDelta timestamp;
@@ -289,6 +291,19 @@
     // for the given use case.
     ContentType content_type = ContentType::kCamera;
 
+    // |drop_frame_thresh_percentage| is described as a percentage of the target
+    // data buffer. When the data buffer falls below this percentage of
+    // fullness, a dropped frame is indicated. The default value is zero, which
+    // means a VideoEncodeAccelerator doesn't allow to drop a frame.
+    // Two caveats:
+    // (1) VideoToolboxVideoEncodeAccelerator (macOS) doesn't provide a way to
+    // disallow drop a frame. That's said, the VideoEncodeAccelerator may drop
+    // a frame even if |drop_frame_thresh_percentage| is set to zero.
+    // (2) A VideoENcodeAccelerator doesn't necessarily support a frame drop.
+    // Therefore a frame may not be dropped even if
+    // |drop_frame_thresh_percentage| is set to a positive value.
+    uint8_t drop_frame_thresh_percentage = 0;
+
     // The configuration for spatial layers. This is not empty if and only if
     // either spatial or temporal layer encoding is configured. When this is not
     // empty, VideoEncodeAccelerator should refer the width, height, bitrate and
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json
index 564361d..cd4c6f9 100644
--- a/testing/buildbot/chromium.chromiumos.json
+++ b/testing/buildbot/chromium.chromiumos.json
@@ -6193,9 +6193,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6179.0",
+        "description": "Run with ash-chrome version 122.0.6180.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -6205,8 +6205,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6179.0",
-              "revision": "version:122.0.6179.0"
+              "location": "lacros_version_skew_tests_v122.0.6180.0",
+              "revision": "version:122.0.6180.0"
             }
           ],
           "dimensions": {
@@ -6343,9 +6343,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6179.0",
+        "description": "Run with ash-chrome version 122.0.6180.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -6355,8 +6355,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6179.0",
-              "revision": "version:122.0.6179.0"
+              "location": "lacros_version_skew_tests_v122.0.6180.0",
+              "revision": "version:122.0.6180.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json
index 1893f4c..a47178cf 100644
--- a/testing/buildbot/chromium.coverage.json
+++ b/testing/buildbot/chromium.coverage.json
@@ -20593,9 +20593,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6179.0",
+        "description": "Run with ash-chrome version 122.0.6180.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -20605,8 +20605,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6179.0",
-              "revision": "version:122.0.6179.0"
+              "location": "lacros_version_skew_tests_v122.0.6180.0",
+              "revision": "version:122.0.6180.0"
             }
           ],
           "dimensions": {
@@ -20743,9 +20743,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6179.0",
+        "description": "Run with ash-chrome version 122.0.6180.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -20755,8 +20755,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6179.0",
-              "revision": "version:122.0.6179.0"
+              "location": "lacros_version_skew_tests_v122.0.6180.0",
+              "revision": "version:122.0.6180.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 440e8697..dadbf733 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -43432,9 +43432,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6179.0",
+        "description": "Run with ash-chrome version 122.0.6180.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -43443,8 +43443,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6179.0",
-              "revision": "version:122.0.6179.0"
+              "location": "lacros_version_skew_tests_v122.0.6180.0",
+              "revision": "version:122.0.6180.0"
             }
           ],
           "dimensions": {
@@ -43582,9 +43582,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6179.0",
+        "description": "Run with ash-chrome version 122.0.6180.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -43593,8 +43593,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6179.0",
-              "revision": "version:122.0.6179.0"
+              "location": "lacros_version_skew_tests_v122.0.6180.0",
+              "revision": "version:122.0.6180.0"
             }
           ],
           "dimensions": {
@@ -44906,9 +44906,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6179.0",
+        "description": "Run with ash-chrome version 122.0.6180.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -44917,8 +44917,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6179.0",
-              "revision": "version:122.0.6179.0"
+              "location": "lacros_version_skew_tests_v122.0.6180.0",
+              "revision": "version:122.0.6180.0"
             }
           ],
           "dimensions": {
@@ -45056,9 +45056,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6179.0",
+        "description": "Run with ash-chrome version 122.0.6180.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -45067,8 +45067,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6179.0",
-              "revision": "version:122.0.6179.0"
+              "location": "lacros_version_skew_tests_v122.0.6180.0",
+              "revision": "version:122.0.6180.0"
             }
           ],
           "dimensions": {
@@ -45766,9 +45766,9 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome"
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome"
         ],
-        "description": "Run with ash-chrome version 122.0.6179.0",
+        "description": "Run with ash-chrome version 122.0.6180.0",
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
         },
@@ -45777,8 +45777,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6179.0",
-              "revision": "version:122.0.6179.0"
+              "location": "lacros_version_skew_tests_v122.0.6180.0",
+              "revision": "version:122.0.6180.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json
index 7b385fb4..a645e4fd 100644
--- a/testing/buildbot/chromium.memory.json
+++ b/testing/buildbot/chromium.memory.json
@@ -16313,12 +16313,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 122.0.6179.0",
+        "description": "Run with ash-chrome version 122.0.6180.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -16328,8 +16328,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6179.0",
-              "revision": "version:122.0.6179.0"
+              "location": "lacros_version_skew_tests_v122.0.6180.0",
+              "revision": "version:122.0.6180.0"
             }
           ],
           "dimensions": {
@@ -16483,12 +16483,12 @@
       {
         "args": [
           "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.filter;../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter",
-          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome",
+          "--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome",
           "--test-launcher-print-test-stdio=always",
           "--combine-ash-logs-on-bots",
           "--asan-symbolize-output"
         ],
-        "description": "Run with ash-chrome version 122.0.6179.0",
+        "description": "Run with ash-chrome version 122.0.6180.0",
         "isolate_profile_data": true,
         "merge": {
           "script": "//testing/merge_scripts/standard_gtest_merge.py"
@@ -16498,8 +16498,8 @@
           "cipd_packages": [
             {
               "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip",
-              "location": "lacros_version_skew_tests_v122.0.6179.0",
-              "revision": "version:122.0.6179.0"
+              "location": "lacros_version_skew_tests_v122.0.6180.0",
+              "revision": "version:122.0.6180.0"
             }
           ],
           "dimensions": {
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl
index 9a971d9..33978b9 100644
--- a/testing/buildbot/variants.pyl
+++ b/testing/buildbot/variants.pyl
@@ -337,16 +337,16 @@
   },
   'LACROS_VERSION_SKEW_CANARY': {
     'identifier': 'Lacros version skew testing ash canary',
-    'description': 'Run with ash-chrome version 122.0.6179.0',
+    'description': 'Run with ash-chrome version 122.0.6180.0',
     'args': [
-      '--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6179.0/test_ash_chrome',
+      '--ash-chrome-path-override=../../lacros_version_skew_tests_v122.0.6180.0/test_ash_chrome',
     ],
     'swarming': {
       'cipd_packages': [
         {
           'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip',
-          'location': 'lacros_version_skew_tests_v122.0.6179.0',
-          'revision': 'version:122.0.6179.0',
+          'location': 'lacros_version_skew_tests_v122.0.6180.0',
+          'revision': 'version:122.0.6180.0',
         },
       ],
     },
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 74fd17f..c8036f7 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -1501,6 +1501,26 @@
             ]
         }
     ],
+    "AutofillEnableUserAvatarInSaveCardFooter": [
+        {
+            "platforms": [
+                "chromeos",
+                "chromeos_lacros",
+                "fuchsia",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "AutofillEnableUserAvatarInSaveCardFooter"
+                    ]
+                }
+            ]
+        }
+    ],
     "AutofillEnableVirtualCardOnFile": [
         {
             "platforms": [
@@ -10030,6 +10050,45 @@
             ]
         }
     ],
+    "LCPPFontURLPredictor": [
+        {
+            "platforms": [
+                "android",
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "params": {
+                        "lcpp_font_url_frequency_threshold": "0.1",
+                        "lcpp_max_font_url_count_per_origin": "5",
+                        "lcpp_max_font_url_length": "1024",
+                        "lcpp_max_font_url_to_preload": "5"
+                    },
+                    "enable_features": [
+                        "LCPPFontURLPredictor"
+                    ]
+                },
+                {
+                    "name": "WithPrefetch",
+                    "params": {
+                        "lcpp_enable_font_prefetch": "true",
+                        "lcpp_font_url_frequency_threshold": "0.1",
+                        "lcpp_max_font_url_count_per_origin": "5",
+                        "lcpp_max_font_url_length": "1024",
+                        "lcpp_max_font_url_to_preload": "5"
+                    },
+                    "enable_features": [
+                        "LCPPFontURLPredictor"
+                    ]
+                }
+            ]
+        }
+    ],
     "LCPPLazyLoadImagePreload": [
         {
             "platforms": [
@@ -14006,7 +14065,7 @@
                 {
                     "name": "Enabled_PrivacyPage",
                     "params": {
-                        "en_site_id": "bdvp8ChpozaWgPeqbAgLqk",
+                        "en_site_id": "gyxt1wCrg0ugnJ3q1cK0TeuAxb15",
                         "probability": "1.0",
                         "settings-time": "20s"
                     },
@@ -14022,7 +14081,7 @@
                 {
                     "name": "Enabled_TopicsSubpage",
                     "params": {
-                        "en_site_id": "gtn5YQSHLkSR9gFowXd9Vz",
+                        "en_site_id": "HkMzAEAUa0ugnJ3q1cK0UCYW2Hyw",
                         "probability": "1.0",
                         "settings-time": "20s"
                     },
@@ -14038,7 +14097,7 @@
                 {
                     "name": "Enabled_FledgeSubpage",
                     "params": {
-                        "en_site_id": "2dGnANURDhBTE2k3EAWFh2",
+                        "en_site_id": "YhMPu6WWx0ugnJ3q1cK0PfKSV3YR",
                         "probability": "1.0",
                         "settings-time": "20s"
                     },
@@ -14054,7 +14113,7 @@
                 {
                     "name": "Enabled_AdMeasurementSubpage",
                     "params": {
-                        "en_site_id": "65rT88y3uMyV6NRZefFxEw",
+                        "en_site_id": "vzxsxSxGk0ugnJ3q1cK0PHvFhzka",
                         "probability": "1.0",
                         "settings-time": "20s"
                     },
@@ -17191,27 +17250,6 @@
             ]
         }
     ],
-    "SharingOfferKeyPairBootstrap": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "chromeos_lacros",
-                "ios",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "SharingOfferKeyPairBootstrap"
-                    ]
-                }
-            ]
-        }
-    ],
     "ShelfStackedHotseat": [
         {
             "platforms": [
diff --git a/third_party/angle b/third_party/angle
index de591cf..398cfb4 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit de591cff03161df5601291ac3deef54933d209a4
+Subproject commit 398cfb4b1421901b8c18be07faf5f54bf14c7633
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn
index f3d367c..eabe192 100644
--- a/third_party/blink/renderer/core/BUILD.gn
+++ b/third_party/blink/renderer/core/BUILD.gn
@@ -1485,6 +1485,7 @@
   sources += rebase_path(blink_core_tests_clipboard, "", "clipboard")
   sources +=
       rebase_path(blink_core_tests_content_capture, "", "content_capture")
+  sources += rebase_path(blink_core_tests_display_lock, "", "display_lock")
   sources += rebase_path(blink_core_tests_events, "", "events")
   sources += rebase_path(blink_core_tests_fullscreen, "", "fullscreen")
   sources += rebase_path(blink_core_tests_highlight, "", "highlight")
diff --git a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
index 3a944fb..2498feb 100644
--- a/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
+++ b/third_party/blink/renderer/core/display_lock/display_lock_context_test.cc
@@ -37,6 +37,7 @@
 #include "third_party/blink/renderer/core/style/computed_style.h"
 #include "third_party/blink/renderer/core/testing/core_unit_test_helper.h"
 #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 #include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
 
 namespace blink {
@@ -194,6 +195,8 @@
   const int FAKE_FIND_ID = 1;
 
  private:
+  test::TaskEnvironment task_environment;
+
   frame_test_helpers::WebViewHelper web_view_helper_;
 };
 
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.cc b/third_party/blink/renderer/core/frame/local_dom_window.cc
index 5e23d2f..285d076 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.cc
+++ b/third_party/blink/renderer/core/frame/local_dom_window.cc
@@ -54,6 +54,7 @@
 #include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_scroll_to_options.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_throw_dom_exception.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_void_function.h"
 #include "third_party/blink/renderer/bindings/core/v8/window_proxy.h"
 #include "third_party/blink/renderer/core/accessibility/ax_context.h"
@@ -161,6 +162,10 @@
 
 namespace blink {
 
+using mojom::blink::PermissionDescriptor;
+using mojom::blink::PermissionDescriptorPtr;
+using mojom::blink::PermissionName;
+
 namespace {
 bool IsRunningMicrotasks(ScriptState* script_state) {
   if (auto* microtask_queue = ToMicrotaskQueue(script_state))
@@ -186,6 +191,31 @@
   return document->RequestAnimationFrame(frame_callback);
 }
 
+PermissionDescriptorPtr CreatePermissionDescriptor(PermissionName name) {
+  auto descriptor = PermissionDescriptor::New();
+  descriptor->name = name;
+  return descriptor;
+}
+
+bool IsPermissionGranted(ScriptPromiseResolver* resolver,
+                         mojom::blink::PermissionStatus status) {
+  if (!resolver->GetScriptState()->ContextIsValid()) {
+    return false;
+  }
+
+  if (status != mojom::blink::PermissionStatus::GRANTED) {
+    ScriptState::Scope scope(resolver->GetScriptState());
+    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
+        resolver->GetScriptState()->GetIsolate(),
+        DOMExceptionCode::kNotAllowedError,
+        status == mojom::blink::PermissionStatus::DENIED
+            ? "Permission denied."
+            : "Permission decision deferred."));
+    return false;
+  }
+  return true;
+}
+
 }  // namespace
 
 class LocalDOMWindow::NetworkStateObserver final
@@ -2537,52 +2567,118 @@
 #endif
 }
 
-void LocalDOMWindow::maximize(ExceptionState& exception_state) {
-  if (!CanUseWindowingControls(exception_state)) {
-    return;
+ScriptPromise LocalDOMWindow::MaybePromptWindowManagementPermission(
+    ScriptPromiseResolver* resolver,
+    AdditionalWindowingControlsActionCallback callback) {
+  auto* permission_service =
+      document()->GetPermissionService(GetExecutionContext());
+  CHECK(permission_service);
+
+  auto permission_descriptor =
+      CreatePermissionDescriptor(PermissionName::WINDOW_MANAGEMENT);
+
+  // Only allow the user prompts when the frame has a transient activation.
+  // Otherwise, resolve or reject the promise with the current permission state.
+  if (LocalFrame::HasTransientUserActivation(GetFrame())) {
+    permission_service->RequestPermission(std::move(permission_descriptor),
+                                          /*user_gesture=*/true,
+                                          std::move(callback));
+  } else {
+    permission_service->HasPermission(std::move(permission_descriptor),
+                                      std::move(callback));
   }
 
-  // Require user activation.
-  if (!LocalFrame::ConsumeTransientUserActivation(GetFrame())) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kNotAllowedError,
-                                      "API requires user activation.");
+  return resolver->Promise();
+}
+
+void LocalDOMWindow::OnMaximizePermissionRequestComplete(
+    ScriptPromiseResolver* resolver,
+    mojom::blink::PermissionStatus status) {
+  if (!IsPermissionGranted(resolver, status)) {
     return;
   }
 
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
   GetFrame()->GetLocalFrameHostRemote().Maximize();
 #endif
+
+  // TODO(crbug.com/1505666): Add wait for the display state change to be
+  // completed before resolving the promise.
+
+  resolver->Resolve();
 }
 
-void LocalDOMWindow::minimize(ExceptionState& exception_state) {
+ScriptPromise LocalDOMWindow::maximize(ScriptState* script_state,
+                                       ExceptionState& exception_state) {
   if (!CanUseWindowingControls(exception_state)) {
-    return;
+    return ScriptPromise();
   }
 
-  // Require user activation.
-  if (!LocalFrame::ConsumeTransientUserActivation(GetFrame())) {
-    exception_state.ThrowDOMException(DOMExceptionCode::kNotAllowedError,
-                                      "API requires user activation.");
+  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+  return MaybePromptWindowManagementPermission(
+      resolver,
+      WTF::BindOnce(&LocalDOMWindow::OnMaximizePermissionRequestComplete,
+                    WrapPersistent(this), WrapPersistent(resolver)));
+}
+
+void LocalDOMWindow::OnMinimizePermissionRequestComplete(
+    ScriptPromiseResolver* resolver,
+    mojom::blink::PermissionStatus status) {
+  if (!IsPermissionGranted(resolver, status)) {
     return;
   }
 
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
   GetFrame()->GetLocalFrameHostRemote().Minimize();
 #endif
+
+  // TODO(crbug.com/1505666): Add wait for the display state change to be
+  // completed before resolving the promise.
+
+  resolver->Resolve();
 }
 
-void LocalDOMWindow::restore(ExceptionState& exception_state) {
+ScriptPromise LocalDOMWindow::minimize(ScriptState* script_state,
+                                       ExceptionState& exception_state) {
   if (!CanUseWindowingControls(exception_state)) {
-    return;
+    return ScriptPromise();
   }
 
-  // TODO(crbug.com/1466853): Add transient user activation for window.restore.
-  // This one is a bit more involved compared to minimize/maximize since it
-  // requires capability delegation.
+  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+  return MaybePromptWindowManagementPermission(
+      resolver,
+      WTF::BindOnce(&LocalDOMWindow::OnMinimizePermissionRequestComplete,
+                    WrapPersistent(this), WrapPersistent(resolver)));
+}
+
+void LocalDOMWindow::OnRestorePermissionRequestComplete(
+    ScriptPromiseResolver* resolver,
+    mojom::blink::PermissionStatus status) {
+  if (!IsPermissionGranted(resolver, status)) {
+    return;
+  }
 
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
   GetFrame()->GetLocalFrameHostRemote().Restore();
 #endif
+
+  // TODO(crbug.com/1505666): Add wait for the display state change to be
+  // completed before resolving the promise.
+
+  resolver->Resolve();
+}
+
+ScriptPromise LocalDOMWindow::restore(ScriptState* script_state,
+                                      ExceptionState& exception_state) {
+  if (!CanUseWindowingControls(exception_state)) {
+    return ScriptPromise();
+  }
+
+  auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>(script_state);
+  return MaybePromptWindowManagementPermission(
+      resolver,
+      WTF::BindOnce(&LocalDOMWindow::OnRestorePermissionRequestComplete,
+                    WrapPersistent(this), WrapPersistent(resolver)));
 }
 
 void LocalDOMWindow::setResizable(bool resizable,
diff --git a/third_party/blink/renderer/core/frame/local_dom_window.h b/third_party/blink/renderer/core/frame/local_dom_window.h
index 6b91a87e..f00f39df 100644
--- a/third_party/blink/renderer/core/frame/local_dom_window.h
+++ b/third_party/blink/renderer/core/frame/local_dom_window.h
@@ -29,6 +29,7 @@
 
 #include <memory>
 
+#include "base/functional/callback_forward.h"
 #include "base/task/single_thread_task_runner.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
 #include "services/metrics/public/cpp/ukm_source_id.h"
@@ -37,6 +38,7 @@
 #include "third_party/blink/public/common/frame/history_user_activation_state.h"
 #include "third_party/blink/public/common/metrics/post_message_counter.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
+#include "third_party/blink/public/mojom/permissions/permission.mojom-blink.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_value.h"
 #include "third_party/blink/renderer/core/core_export.h"
 #include "third_party/blink/renderer/core/dom/document.h"
@@ -538,9 +540,25 @@
   // given window, it cannot be taken away.
   void SetHasStorageAccess();
 
-  void maximize(ExceptionState&);
-  void minimize(ExceptionState&);
-  void restore(ExceptionState&);
+  void OnMaximizePermissionRequestComplete(
+      ScriptPromiseResolver* resolver,
+      mojom::blink::PermissionStatus status);
+  void OnMinimizePermissionRequestComplete(
+      ScriptPromiseResolver* resolver,
+      mojom::blink::PermissionStatus status);
+  void OnRestorePermissionRequestComplete(
+      ScriptPromiseResolver* resolver,
+      mojom::blink::PermissionStatus status);
+
+  using AdditionalWindowingControlsActionCallback =
+      base::OnceCallback<void(mojom::blink::PermissionStatus)>;
+  ScriptPromise MaybePromptWindowManagementPermission(
+      ScriptPromiseResolver* resolver,
+      AdditionalWindowingControlsActionCallback callback);
+
+  ScriptPromise maximize(ScriptState*, ExceptionState&);
+  ScriptPromise minimize(ScriptState*, ExceptionState&);
+  ScriptPromise restore(ScriptState*, ExceptionState&);
   void setResizable(bool resizable, ExceptionState&);
 
  protected:
diff --git a/third_party/blink/renderer/core/frame/window.idl b/third_party/blink/renderer/core/frame/window.idl
index e3d96d9..7daae8c 100644
--- a/third_party/blink/renderer/core/frame/window.idl
+++ b/third_party/blink/renderer/core/frame/window.idl
@@ -58,9 +58,9 @@
     [CrossOrigin] void blur();
 
     // Additional Windowing Controls (AWC)
-    [RuntimeEnabled=DesktopPWAsAdditionalWindowingControls, RaisesException] void maximize();
-    [RuntimeEnabled=DesktopPWAsAdditionalWindowingControls, RaisesException] void minimize();
-    [RuntimeEnabled=DesktopPWAsAdditionalWindowingControls, RaisesException] void restore();
+    [CallWith=ScriptState, RuntimeEnabled=DesktopPWAsAdditionalWindowingControls, RaisesException] Promise<undefined> maximize();
+    [CallWith=ScriptState, RuntimeEnabled=DesktopPWAsAdditionalWindowingControls, RaisesException] Promise<undefined> minimize();
+    [CallWith=ScriptState, RuntimeEnabled=DesktopPWAsAdditionalWindowingControls, RaisesException] Promise<undefined> restore();
     [RuntimeEnabled=DesktopPWAsAdditionalWindowingControls, RaisesException] void setResizable(boolean resizable);
 
     // other browsing contexts
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern.cc b/third_party/blink/renderer/core/url_pattern/url_pattern.cc
index 46db62d..c1464c2 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern.cc
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern.cc
@@ -6,6 +6,7 @@
 
 #include "base/ranges/algorithm.h"
 #include "base/strings/string_util.h"
+#include "third_party/blink/public/common/safe_url_pattern.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_regexp.h"
 #include "third_party/blink/renderer/bindings/core/v8/to_v8_traits.h"
 #include "third_party/blink/renderer/bindings/core/v8/v8_union_urlpattern_urlpatterninit_usvstring.h"
@@ -707,6 +708,46 @@
   NOTREACHED();
 }
 
+std::optional<SafeUrlPattern> URLPattern::ToSafeUrlPattern(
+    ExceptionState& exception_state) const {
+  const std::pair<const url_pattern::Component*, const char*>
+      components_with_names[] = {
+          {protocol_, "protocol"}, {username_, "username"},
+          {password_, "password"}, {hostname_, "hostname"},
+          {port_, "port"},         {pathname_, "pathname"},
+          {search_, "search"},     {hash_, "hash"}};
+  String components_with_regexp;
+  for (auto [component, name] : components_with_names) {
+    if (component->HasRegexpGroups()) {
+      components_with_regexp = components_with_regexp +
+                               (components_with_regexp.IsNull() ? "" : ", ") +
+                               name + " (" +
+                               component->GeneratePatternString() + ")";
+    }
+  }
+  if (!components_with_regexp.IsNull()) {
+    exception_state.ThrowTypeError(
+        "The pattern cannot contain regexp groups, but did in the following "
+        "components: " +
+        components_with_regexp);
+    return std::nullopt;
+  }
+  CHECK(!hasRegExpGroups());
+
+  SafeUrlPattern safe_url_pattern;
+  safe_url_pattern.protocol = protocol_->PartList();
+  safe_url_pattern.username = username_->PartList();
+  safe_url_pattern.password = password_->PartList();
+  safe_url_pattern.hostname = hostname_->PartList();
+  safe_url_pattern.port = port_->PartList();
+  safe_url_pattern.pathname = pathname_->PartList();
+  safe_url_pattern.search = search_->PartList();
+  safe_url_pattern.hash = hash_->PartList();
+  safe_url_pattern.options.ignore_case = options_.ignore_case;
+
+  return safe_url_pattern;
+}
+
 String URLPattern::ToString() const {
   StringBuilder builder;
   builder.Append("(");
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern.h b/third_party/blink/renderer/core/url_pattern/url_pattern.h
index e42e108..34761eb 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern.h
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern.h
@@ -18,6 +18,7 @@
 
 class ExceptionState;
 class KURL;
+struct SafeUrlPattern;
 class URLPatternInit;
 class URLPatternOptions;
 class URLPatternResult;
@@ -109,6 +110,11 @@
                               const URLPattern* left,
                               const URLPattern* right);
 
+  // Throws a TypeError if the pattern does not meet the requirements to be
+  // safe. i.e. has no regexp groups.
+  std::optional<SafeUrlPattern> ToSafeUrlPattern(
+      ExceptionState& exception_state) const;
+
   // Used for testing and debugging.
   String ToString() const;
 
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc b/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc
index 51304085..8e7f8cd0 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern_component.cc
@@ -422,6 +422,10 @@
   return *should_treat_as_standard_url_;
 }
 
+const std::vector<liburlpattern::Part>& Component::PartList() const {
+  return pattern_.PartList();
+}
+
 void Component::Trace(Visitor* visitor) const {
   visitor->Trace(regexp_);
 }
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern_component.h b/third_party/blink/renderer/core/url_pattern/url_pattern_component.h
index b12d64d..187c375 100644
--- a/third_party/blink/renderer/core/url_pattern/url_pattern_component.h
+++ b/third_party/blink/renderer/core/url_pattern/url_pattern_component.h
@@ -90,6 +90,8 @@
   // regular expression.
   bool HasRegexpGroups() const { return pattern_.HasRegexGroups(); }
 
+  const std::vector<liburlpattern::Part>& PartList() const;
+
   void Trace(Visitor* visitor) const;
 
  private:
diff --git a/third_party/blink/renderer/modules/BUILD.gn b/third_party/blink/renderer/modules/BUILD.gn
index 8063ac1..2ff13b0 100644
--- a/third_party/blink/renderer/modules/BUILD.gn
+++ b/third_party/blink/renderer/modules/BUILD.gn
@@ -1009,6 +1009,7 @@
     "//third_party/blink/renderer/core:unit_test_support",
     "//third_party/blink/renderer/modules/gamepad:unit_tests",
     "//third_party/blink/renderer/modules/hid:unit_tests",
+    "//third_party/blink/renderer/modules/idle:unit_tests",
     "//third_party/blink/renderer/modules/indexeddb:unit_tests",
     "//third_party/blink/renderer/modules/mediarecorder:buildflags",
     "//third_party/blink/renderer/modules/mediastream:test_support",
diff --git a/third_party/blink/renderer/modules/idle/BUILD.gn b/third_party/blink/renderer/modules/idle/BUILD.gn
index 57303724..e19900be 100644
--- a/third_party/blink/renderer/modules/idle/BUILD.gn
+++ b/third_party/blink/renderer/modules/idle/BUILD.gn
@@ -32,6 +32,7 @@
     "//third_party/blink/renderer/controller:blink_bindings_test_sources",
     "//third_party/blink/renderer/modules",
     "//third_party/blink/renderer/platform",
+    "//third_party/blink/renderer/platform:test_support",
     "//third_party/blink/renderer/platform/wtf",
   ]
 }
diff --git a/third_party/blink/renderer/modules/idle/idle_detector_test.cc b/third_party/blink/renderer/modules/idle/idle_detector_test.cc
index d0f3237..5fb5545 100644
--- a/third_party/blink/renderer/modules/idle/idle_detector_test.cc
+++ b/third_party/blink/renderer/modules/idle/idle_detector_test.cc
@@ -14,6 +14,7 @@
 #include "third_party/blink/renderer/bindings/modules/v8/v8_idle_options.h"
 #include "third_party/blink/renderer/core/dom/events/native_event_listener.h"
 #include "third_party/blink/renderer/modules/idle/idle_manager.h"
+#include "third_party/blink/renderer/platform/testing/task_environment.h"
 
 namespace blink {
 
@@ -65,6 +66,7 @@
 }  // namespace
 
 TEST(IdleDetectorTest, Start) {
+  test::TaskEnvironment task_environment;
   V8TestingScope scope;
   FakeIdleService idle_service;
 
@@ -90,6 +92,7 @@
 }
 
 TEST(IdleDetectorTest, StartIdleWithLongThreshold) {
+  test::TaskEnvironment task_environment;
   V8TestingScope scope;
   FakeIdleService idle_service;
   auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
@@ -133,6 +136,7 @@
 }
 
 TEST(IdleDetectorTest, LockScreen) {
+  test::TaskEnvironment task_environment;
   V8TestingScope scope;
   FakeIdleService idle_service;
 
@@ -162,6 +166,7 @@
 }
 
 TEST(IdleDetectorTest, BecomeIdle) {
+  test::TaskEnvironment task_environment;
   V8TestingScope scope;
   FakeIdleService idle_service;
 
@@ -192,6 +197,7 @@
 }
 
 TEST(IdleDetectorTest, BecomeIdleAndLockScreen) {
+  test::TaskEnvironment task_environment;
   V8TestingScope scope;
   FakeIdleService idle_service;
 
@@ -221,6 +227,7 @@
 }
 
 TEST(IdleDetectorTest, BecomeIdleAndLockScreenWithLongThreshold) {
+  test::TaskEnvironment task_environment;
   V8TestingScope scope;
   FakeIdleService idle_service;
   auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
@@ -263,6 +270,7 @@
 }
 
 TEST(IdleDetectorTest, BecomeIdleAndLockAfterWithLongThreshold) {
+  test::TaskEnvironment task_environment;
   V8TestingScope scope;
   FakeIdleService idle_service;
   auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
@@ -318,6 +326,7 @@
 }
 
 TEST(IdleDetectorTest, BecomeIdleThenActiveBeforeThreshold) {
+  test::TaskEnvironment task_environment;
   V8TestingScope scope;
   FakeIdleService idle_service;
   auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
@@ -359,6 +368,7 @@
 }
 
 TEST(IdleDetectorTest, SetAndClearOverrides) {
+  test::TaskEnvironment task_environment;
   V8TestingScope scope;
   FakeIdleService idle_service;
   auto task_runner = base::MakeRefCounted<base::TestMockTimeTaskRunner>();
diff --git a/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc b/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc
index 1263493..2e69c189 100644
--- a/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc
+++ b/third_party/blink/renderer/modules/media_capabilities/media_capabilities.cc
@@ -513,7 +513,7 @@
   DCHECK(parsed_content_type.IsValid());
   const String codec_name =
       WebrtcCodecNameFromMimeType(parsed_content_type.MimeType(), "video");
-  const webrtc::SdpVideoFormat::Parameters parameters =
+  const std::map<std::string, std::string> parameters =
       ConvertToSdpVideoFormatParameters(parsed_content_type.GetParameters());
   return {codec_name.Utf8(), parameters};
 }
diff --git a/third_party/blink/renderer/modules/ml/DEPS b/third_party/blink/renderer/modules/ml/DEPS
index 9a2f4bb..81326f0 100644
--- a/third_party/blink/renderer/modules/ml/DEPS
+++ b/third_party/blink/renderer/modules/ml/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+base/types/fixed_array.h",
   "+components/ml/mojom",
   "+components/ml/webnn",
   "+services/webnn/public/mojom",
diff --git a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc
index 063faaf..6bb59204 100644
--- a/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc
+++ b/third_party/blink/renderer/modules/ml/webnn/ml_graph_xnnpack.cc
@@ -15,6 +15,7 @@
 #include "base/task/thread_pool.h"
 #include "base/thread_annotations.h"
 #include "base/trace_event/typed_macros.h"
+#include "base/types/fixed_array.h"
 #include "build/buildflag.h"
 #include "components/ml/webnn/graph_validation_utils.h"
 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
@@ -1430,7 +1431,7 @@
   // already calculated by `MLGraphBuilder::reshape()`.
   const auto& output_dimensions = reshape->Outputs()[0]->Dimensions();
   const auto output_rank = output_dimensions.size();
-  size_t new_shape[output_rank];
+  base::FixedArray<size_t> new_shape(output_rank);
   for (wtf_size_t i = 0; i < output_rank; ++i) {
     new_shape[i] = base::checked_cast<size_t>(output_dimensions[i]);
   }
@@ -1440,7 +1441,7 @@
   // Please refer to the implementation at:
   // https://source.chromium.org/chromium/chromium/src/+/main:third_party/xnnpack/src/src/subgraph/static-reshape.c;l=246
   XNN_CHECK_STATUS_AND_SET_ERROR_MESSAGE(xnn_define_static_reshape(
-      subgraph, output_rank, new_shape, input_id, output_id, flags));
+      subgraph, output_rank, new_shape.data(), input_id, output_id, flags));
   return xnn_status_success;
 }
 
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter.cc b/third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter.cc
index ca07f1c..374229e 100644
--- a/third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter.cc
+++ b/third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter.cc
@@ -52,39 +52,6 @@
   return false;
 }
 
-absl::optional<std::vector<liburlpattern::Part>> ToPartList(
-    const String& pattern,
-    const String& field_name,
-    ExceptionState& exception_state) {
-  // This means that the field should not exist.
-  if (pattern.empty()) {
-    return std::vector<liburlpattern::Part>();
-  }
-  // TODO(crbug.com/1371756): unify the code with manifest_parser.cc
-  WTF::StringUTF8Adaptor utf8(pattern);
-  auto parse_result = liburlpattern::Parse(
-      base::StringPiece(utf8.data(), utf8.size()),
-      [](base::StringPiece input) { return std::string(input); });
-  if (!parse_result.ok()) {
-    exception_state.ThrowTypeError("Failed to parse URLPattern '" + pattern +
-                                   "'");
-    return absl::nullopt;
-  }
-  std::vector<liburlpattern::Part> part_list;
-  for (auto& part : parse_result.value().PartList()) {
-    // We don't allow custom regex for security reasons as this will be used
-    // in the browser process.
-    if (part.type == liburlpattern::PartType::kRegex) {
-      DLOG(INFO) << "regex URLPattern is not allowed as Router Condition";
-      exception_state.ThrowTypeError("Used regular expression in '" + pattern +
-                                     "', which is prohibited.");
-      return absl::nullopt;
-    }
-    part_list.push_back(std::move(part));
-  }
-  return part_list;
-}
-
 // TODO(crbug.com/1371756): Make URLPattern has a method to construct the
 // SafeURLPattern and remove the conversion from here.
 // The method should take a exception_state to raise on regex usage.
@@ -109,26 +76,12 @@
     return absl::nullopt;
   }
 
-  SafeUrlPattern safe_url_pattern;
-#define TO_PART(field)                                             \
-  do {                                                             \
-    auto part_list =                                               \
-        ToPartList(url_pattern->field(), #field, exception_state); \
-    if (!part_list.has_value()) {                                  \
-      CHECK(exception_state.HadException());                       \
-      return absl::nullopt;                                        \
-    }                                                              \
-    safe_url_pattern.field = std::move(*part_list);                \
-  } while (0)
-  TO_PART(protocol);
-  TO_PART(username);
-  TO_PART(password);
-  TO_PART(hostname);
-  TO_PART(port);
-  TO_PART(pathname);
-  TO_PART(search);
-  TO_PART(hash);
-#undef TO_PART
+  std::optional<SafeUrlPattern> safe_url_pattern =
+      url_pattern->ToSafeUrlPattern(exception_state);
+  if (!safe_url_pattern) {
+    CHECK(exception_state.HadException());
+    return absl::nullopt;
+  }
   // TODO(crbug.com/1371756): support URLPatternOptions.
   // Currently, URLPatternOptions are not included in URLPatternInit,
   // and we do not pass the option to the browser side.
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index ac6df96..c181125 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -54,10 +54,10 @@
 
   build_scripts_output_dir = "$blink_platform_output_dir/../build/scripts"
   outputs = [
+    "$blink_platform_output_dir/exported/web_runtime_features_base.cc",
     "$blink_platform_output_dir/runtime_enabled_features.cc",
     "$blink_platform_output_dir/runtime_enabled_features.h",
     "$blink_platform_output_dir/testing/runtime_enabled_features_test_helpers.h",
-    "$blink_platform_output_dir/exported/web_runtime_features_base.cc",
     "$build_scripts_output_dir/runtime_enabled_features.pickle",
   ]
 
@@ -83,8 +83,8 @@
              "../build/scripts/templates/runtime_feature_state_override_context.cc.tmpl",
            ]
   outputs = [
-    "$blink_platform_output_dir/runtime_feature_state/runtime_feature_state_override_context.h",
     "$blink_platform_output_dir/runtime_feature_state/runtime_feature_state_override_context.cc",
+    "$blink_platform_output_dir/runtime_feature_state/runtime_feature_state_override_context.h",
   ]
 
   args = [
@@ -996,8 +996,6 @@
     "graphics/gpu/xr_frame_transport.h",
     "graphics/gpu/xr_webgl_drawing_buffer.cc",
     "graphics/gpu/xr_webgl_drawing_buffer.h",
-    "graphics/gpu_memory_buffer_image_copy.cc",
-    "graphics/gpu_memory_buffer_image_copy.h",
     "graphics/gradient.cc",
     "graphics/gradient.h",
     "graphics/gradient_generated_image.cc",
@@ -1027,6 +1025,8 @@
     "graphics/image_orientation_enum.h",
     "graphics/image_pattern.cc",
     "graphics/image_pattern.h",
+    "graphics/image_to_buffer_copier.cc",
+    "graphics/image_to_buffer_copier.h",
     "graphics/intercepting_canvas.cc",
     "graphics/intercepting_canvas.h",
     "graphics/interpolation_space.cc",
diff --git a/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.cc b/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.cc
index ffa6fd69..f8093be 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.cc
+++ b/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.cc
@@ -13,7 +13,7 @@
 #include "gpu/command_buffer/common/mailbox_holder.h"
 #include "mojo/public/cpp/system/platform_handle.h"
 #include "third_party/blink/public/platform/task_type.h"
-#include "third_party/blink/renderer/platform/graphics/gpu_memory_buffer_image_copy.h"
+#include "third_party/blink/renderer/platform/graphics/image_to_buffer_copier.h"
 #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
 #include "third_party/blink/renderer/platform/mojo/mojo_binding_context.h"
 #include "ui/gfx/gpu_fence.h"
@@ -118,7 +118,7 @@
     if (transport_options_->wait_for_transfer_notification)
       WaitForPreviousTransfer();
     if (!frame_copier_ || !last_transfer_succeeded_) {
-      frame_copier_ = std::make_unique<GpuMemoryBufferImageCopy>(gl, sii);
+      frame_copier_ = std::make_unique<ImageToBufferCopier>(gl, sii);
     }
     auto [gpu_memory_buffer_handle, sync_token] =
         frame_copier_->CopyImage(image_ref.get());
diff --git a/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.h b/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.h
index 87be643f..222e371e 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.h
+++ b/third_party/blink/renderer/platform/graphics/gpu/xr_frame_transport.h
@@ -29,7 +29,7 @@
 
 namespace blink {
 
-class GpuMemoryBufferImageCopy;
+class ImageToBufferCopier;
 class Image;
 
 class PLATFORM_EXPORT XRFrameTransport final
@@ -97,7 +97,7 @@
 
   device::mojom::blink::XRPresentationTransportOptionsPtr transport_options_;
 
-  std::unique_ptr<GpuMemoryBufferImageCopy> frame_copier_;
+  std::unique_ptr<ImageToBufferCopier> frame_copier_;
   scoped_refptr<base::SequencedTaskRunner> task_runner_;
 };
 
diff --git a/third_party/blink/renderer/platform/graphics/gpu_memory_buffer_image_copy.cc b/third_party/blink/renderer/platform/graphics/image_to_buffer_copier.cc
similarity index 89%
rename from third_party/blink/renderer/platform/graphics/gpu_memory_buffer_image_copy.cc
rename to third_party/blink/renderer/platform/graphics/image_to_buffer_copier.cc
index c7363629e..488dcbf8 100644
--- a/third_party/blink/renderer/platform/graphics/gpu_memory_buffer_image_copy.cc
+++ b/third_party/blink/renderer/platform/graphics/image_to_buffer_copier.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "third_party/blink/renderer/platform/graphics/gpu_memory_buffer_image_copy.h"
+#include "third_party/blink/renderer/platform/graphics/image_to_buffer_copier.h"
 
 #include "gpu/GLES2/gl2extchromium.h"
 #include "gpu/command_buffer/client/client_shared_image.h"
@@ -18,16 +18,16 @@
 
 namespace blink {
 
-GpuMemoryBufferImageCopy::GpuMemoryBufferImageCopy(
+ImageToBufferCopier::ImageToBufferCopier(
     gpu::gles2::GLES2Interface* gl,
     gpu::SharedImageInterface* sii)
     : gl_(gl), sii_(sii) {}
 
-GpuMemoryBufferImageCopy::~GpuMemoryBufferImageCopy() {
+ImageToBufferCopier::~ImageToBufferCopier() {
   CleanupDestImage();
 }
 
-bool GpuMemoryBufferImageCopy::EnsureDestImage(const gfx::Size& size) {
+bool ImageToBufferCopier::EnsureDestImage(const gfx::Size& size) {
   // Create a new SharedImage if the size has changed, or we don't have one.
   if (dest_image_size_ != size || !dest_shared_image_) {
     // Cleanup old copy image before allocating a new one.
@@ -38,7 +38,7 @@
     dest_shared_image_ = sii_->CreateSharedImage(
         viz::SinglePlaneFormat::kRGBA_8888, size, gfx::ColorSpace(),
         kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType,
-        gpu::SHARED_IMAGE_USAGE_GLES2, "GpuMemoryBufferImageCopy",
+        gpu::SHARED_IMAGE_USAGE_GLES2, "ImageToBufferCopier",
         gpu::kNullSurfaceHandle, gfx::BufferUsage::SCANOUT);
     CHECK(dest_shared_image_);
     gl_->WaitSyncTokenCHROMIUM(sii_->GenUnverifiedSyncToken().GetConstData());
@@ -47,11 +47,11 @@
 }
 
 std::pair<gfx::GpuMemoryBufferHandle, gpu::SyncToken>
-GpuMemoryBufferImageCopy::CopyImage(Image* image) {
+ImageToBufferCopier::CopyImage(Image* image) {
   if (!image)
     return {};
 
-  TRACE_EVENT0("gpu", "GpuMemoryBufferImageCopy::CopyImage");
+  TRACE_EVENT0("gpu", "ImageToBufferCopier::CopyImage");
 
   gfx::Size size = image->Size();
   if (!EnsureDestImage(size))
@@ -110,7 +110,7 @@
                         sync_token);
 }
 
-void GpuMemoryBufferImageCopy::CleanupDestImage() {
+void ImageToBufferCopier::CleanupDestImage() {
   if (!dest_shared_image_) {
     return;
   }
diff --git a/third_party/blink/renderer/platform/graphics/gpu_memory_buffer_image_copy.h b/third_party/blink/renderer/platform/graphics/image_to_buffer_copier.h
similarity index 68%
rename from third_party/blink/renderer/platform/graphics/gpu_memory_buffer_image_copy.h
rename to third_party/blink/renderer/platform/graphics/image_to_buffer_copier.h
index d3131d6..b4bf890a 100644
--- a/third_party/blink/renderer/platform/graphics/gpu_memory_buffer_image_copy.h
+++ b/third_party/blink/renderer/platform/graphics/image_to_buffer_copier.h
@@ -1,5 +1,5 @@
-#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_MEMORY_BUFFER_IMAGE_COPY_H_
-#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_MEMORY_BUFFER_IMAGE_COPY_H_
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_IMAGE_TO_BUFFER_COPIER_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_IMAGE_TO_BUFFER_COPIER_H_
 
 #include <memory>
 #include "base/memory/raw_ptr.h"
@@ -13,13 +13,15 @@
 
 class Image;
 
-class PLATFORM_EXPORT GpuMemoryBufferImageCopy {
-  USING_FAST_MALLOC(GpuMemoryBufferImageCopy);
+// Supports copying an Image to a native buffer, returning a handle to the
+// native buffer.
+class PLATFORM_EXPORT ImageToBufferCopier {
+  USING_FAST_MALLOC(ImageToBufferCopier);
 
  public:
-  GpuMemoryBufferImageCopy(gpu::gles2::GLES2Interface*,
+  ImageToBufferCopier(gpu::gles2::GLES2Interface*,
                            gpu::SharedImageInterface*);
-  ~GpuMemoryBufferImageCopy();
+  ~ImageToBufferCopier();
 
   // SyncToken will be completed after access to the buffer is finished by
   // GPU process.
@@ -40,4 +42,4 @@
 
 }  // namespace blink
 
-#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_MEMORY_BUFFER_IMAGE_COPY_H_
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_IMAGE_TO_BUFFER_COPIER_H_
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_factory_test.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_factory_test.cc
index 4ef249c..a7bdfff 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_factory_test.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_decoder_factory_test.cc
@@ -92,9 +92,6 @@
 
 }  // anonymous namespace
 
-typedef webrtc::SdpVideoFormat Sdp;
-typedef webrtc::SdpVideoFormat::Parameters Params;
-
 class RTCVideoDecoderFactoryTest : public ::testing::Test {
  public:
   RTCVideoDecoderFactoryTest()
@@ -111,51 +108,58 @@
       .WillRepeatedly(Return(true));
 
   // VP8 is not supported
-  EXPECT_TRUE(Equals(decoder_factory_.QueryCodecSupport(
-                         Sdp("VP8"), false /*reference_scaling*/),
-                     kUnsupported));
+  EXPECT_TRUE(
+      Equals(decoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("VP8"),
+                                                false /*reference_scaling*/),
+             kUnsupported));
 
   // H264 high profile is not supported
-  EXPECT_TRUE(Equals(decoder_factory_.QueryCodecSupport(
-                         Sdp("H264", Params{{"level-asymmetry-allowed", "1"},
-                                            {"packetization-mode", "1"},
-                                            {"profile-level-id", "64001f"}}),
-                         false /*reference_scaling*/),
-                     kUnsupported));
+  EXPECT_TRUE(Equals(
+      decoder_factory_.QueryCodecSupport(
+          webrtc::SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"},
+                                          {"packetization-mode", "1"},
+                                          {"profile-level-id", "64001f"}}),
+          false /*reference_scaling*/),
+      kUnsupported));
 
   // VP9, H264 & AV1 decode should be supported without reference scaling.
-  EXPECT_TRUE(Equals(decoder_factory_.QueryCodecSupport(
-                         Sdp("VP9"), false /*reference_scaling*/),
-                     kSupportedPowerEfficient));
-  EXPECT_TRUE(Equals(decoder_factory_.QueryCodecSupport(
-                         Sdp("AV1"), false /*reference_scaling*/),
-                     kSupportedPowerEfficient));
-  EXPECT_TRUE(Equals(decoder_factory_.QueryCodecSupport(
-                         Sdp("H264", Params{{"level-asymmetry-allowed", "1"},
-                                            {"packetization-mode", "1"},
-                                            {"profile-level-id", "42001f"}}),
-                         false /*reference_scaling*/),
-                     kSupportedPowerEfficient));
+  EXPECT_TRUE(
+      Equals(decoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("VP9"),
+                                                false /*reference_scaling*/),
+             kSupportedPowerEfficient));
+  EXPECT_TRUE(
+      Equals(decoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("AV1"),
+                                                false /*reference_scaling*/),
+             kSupportedPowerEfficient));
+  EXPECT_TRUE(Equals(
+      decoder_factory_.QueryCodecSupport(
+          webrtc::SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"},
+                                          {"packetization-mode", "1"},
+                                          {"profile-level-id", "42001f"}}),
+          false /*reference_scaling*/),
+      kSupportedPowerEfficient));
 
   // AV1 decode should be supported with reference scaling.
-  EXPECT_TRUE(Equals(decoder_factory_.QueryCodecSupport(
-                         Sdp("AV1"), true /*reference_scaling*/),
-                     kSupportedPowerEfficient));
+  EXPECT_TRUE(
+      Equals(decoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("AV1"),
+                                                true /*reference_scaling*/),
+             kSupportedPowerEfficient));
 
   // VP9 decode supported depending on platform.
-  EXPECT_TRUE(Equals(decoder_factory_.QueryCodecSupport(
-                         Sdp("VP9"), true /*reference_scaling*/),
-                     media::IsVp9kSVCHWDecodingEnabled()
-                         ? kSupportedPowerEfficient
-                         : kUnsupported));
+  EXPECT_TRUE(
+      Equals(decoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("VP9"),
+                                                true /*reference_scaling*/),
+             media::IsVp9kSVCHWDecodingEnabled() ? kSupportedPowerEfficient
+                                                 : kUnsupported));
 
   // H264 decode not supported with reference scaling.
-  EXPECT_TRUE(Equals(decoder_factory_.QueryCodecSupport(
-                         Sdp("H264", Params{{"level-asymmetry-allowed", "1"},
-                                            {"packetization-mode", "1"},
-                                            {"profile-level-id", "42001f"}}),
-                         true /*reference_scaling*/),
-                     kUnsupported));
+  EXPECT_TRUE(Equals(
+      decoder_factory_.QueryCodecSupport(
+          webrtc::SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"},
+                                          {"packetization-mode", "1"},
+                                          {"profile-level-id", "42001f"}}),
+          true /*reference_scaling*/),
+      kUnsupported));
 }
 
 TEST_F(RTCVideoDecoderFactoryTest, GetSupportedFormatsReturnsAllExpectedModes) {
diff --git a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory_test.cc b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory_test.cc
index 03288f7..1a8ce233 100644
--- a/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory_test.cc
+++ b/third_party/blink/renderer/platform/peerconnection/rtc_video_encoder_factory_test.cc
@@ -22,6 +22,7 @@
 namespace blink {
 
 namespace {
+
 constexpr webrtc::VideoEncoderFactory::CodecSupport kSupportedPowerEfficient = {
     true, true};
 constexpr webrtc::VideoEncoderFactory::CodecSupport kUnsupported = {false,
@@ -70,9 +71,6 @@
 
 }  // anonymous namespace
 
-typedef webrtc::SdpVideoFormat Sdp;
-typedef webrtc::SdpVideoFormat::Parameters Params;
-
 class RTCVideoEncoderFactoryTest : public ::testing::Test {
  public:
   RTCVideoEncoderFactoryTest()
@@ -95,61 +93,72 @@
   EXPECT_CALL(mock_gpu_factories_, IsEncoderSupportKnown())
       .WillRepeatedly(Return(true));
   // H.264 BP/CBP, VP8 and VP9 profile 0 are supported.
-  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(
-                         Sdp("VP8"), /*scalability_mode=*/absl::nullopt),
-                     kSupportedPowerEfficient));
-  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(
-                         Sdp("VP9"), /*scalability_mode=*/absl::nullopt),
-                     kSupportedPowerEfficient));
+  EXPECT_TRUE(Equals(
+      encoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("VP8"),
+                                         /*scalability_mode=*/absl::nullopt),
+      kSupportedPowerEfficient));
+  EXPECT_TRUE(Equals(
+      encoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("VP9"),
+                                         /*scalability_mode=*/absl::nullopt),
+      kSupportedPowerEfficient));
 #if BUILDFLAG(RTC_USE_H264)
-  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(
-                         Sdp("H264", Params{{"level-asymmetry-allowed", "1"},
-                                            {"packetization-mode", "1"},
-                                            {"profile-level-id", "42001f"}}),
-                         /*scalability_mode=*/absl::nullopt),
-                     kSupportedPowerEfficient));
+  EXPECT_TRUE(Equals(
+      encoder_factory_.QueryCodecSupport(
+          webrtc::SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"},
+                                          {"packetization-mode", "1"},
+                                          {"profile-level-id", "42001f"}}),
+          /*scalability_mode=*/absl::nullopt),
+      kSupportedPowerEfficient));
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX)
-  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(
-                         Sdp("H264", Params{{"level-asymmetry-allowed", "1"},
-                                            {"packetization-mode", "1"},
-                                            {"profile-level-id", "42c01f"}}),
-                         /*scalability_mode=*/absl::nullopt),
-                     kSupportedPowerEfficient));
+  EXPECT_TRUE(Equals(
+      encoder_factory_.QueryCodecSupport(
+          webrtc::SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"},
+                                          {"packetization-mode", "1"},
+                                          {"profile-level-id", "42c01f"}}),
+          /*scalability_mode=*/absl::nullopt),
+      kSupportedPowerEfficient));
 #endif
 #endif
 
   // H264 > BP, VP9 profile 2 and AV1 are unsupported.
+  EXPECT_TRUE(Equals(
+      encoder_factory_.QueryCodecSupport(
+          webrtc::SdpVideoFormat("H264", {{"level-asymmetry-allowed", "1"},
+                                          {"packetization-mode", "1"},
+                                          {"profile-level-id", "4d001f"}}),
+          /*scalability_mode=*/absl::nullopt),
+      kUnsupported));
   EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(
-                         Sdp("H264", Params{{"level-asymmetry-allowed", "1"},
-                                            {"packetization-mode", "1"},
-                                            {"profile-level-id", "4d001f"}}),
+                         webrtc::SdpVideoFormat("VP9", {{"profile-id", "2"}}),
                          /*scalability_mode=*/absl::nullopt),
                      kUnsupported));
-  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(
-                         Sdp("VP9", Params{{"profile-id", "2"}}),
-                         /*scalability_mode=*/absl::nullopt),
-                     kUnsupported));
-  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(
-                         Sdp("AV1"), /*scalability_mode=*/absl::nullopt),
-                     kUnsupported));
+  EXPECT_TRUE(Equals(
+      encoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("AV1"),
+                                         /*scalability_mode=*/absl::nullopt),
+      kUnsupported));
 }
 
 TEST_F(RTCVideoEncoderFactoryTest, QueryCodecSupportSvc) {
   EXPECT_CALL(mock_gpu_factories_, IsEncoderSupportKnown())
       .WillRepeatedly(Return(true));
   // Test supported modes.
-  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(Sdp("VP8"), "L1T2"),
-                     kSupportedPowerEfficient));
-  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(Sdp("VP9"), "L1T3"),
-                     kSupportedPowerEfficient));
+  EXPECT_TRUE(Equals(
+      encoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("VP8"), "L1T2"),
+      kSupportedPowerEfficient));
+  EXPECT_TRUE(Equals(
+      encoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("VP9"), "L1T3"),
+      kSupportedPowerEfficient));
 
   // Test unsupported modes.
-  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(Sdp("AV1"), "L2T1"),
+  EXPECT_TRUE(Equals(
+      encoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("AV1"), "L2T1"),
+      kUnsupported));
+  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(
+                         webrtc::SdpVideoFormat("H264"), "L2T2"),
                      kUnsupported));
-  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(Sdp("H264"), "L2T2"),
-                     kUnsupported));
-  EXPECT_TRUE(Equals(encoder_factory_.QueryCodecSupport(Sdp("VP8"), "L3T3"),
-                     kUnsupported));
+  EXPECT_TRUE(Equals(
+      encoder_factory_.QueryCodecSupport(webrtc::SdpVideoFormat("VP8"), "L3T3"),
+      kUnsupported));
 }
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/peerconnection/webrtc_decoding_info_handler_test.cc b/third_party/blink/renderer/platform/peerconnection/webrtc_decoding_info_handler_test.cc
index d140e2ac..62c894c 100644
--- a/third_party/blink/renderer/platform/peerconnection/webrtc_decoding_info_handler_test.cc
+++ b/third_party/blink/renderer/platform/peerconnection/webrtc_decoding_info_handler_test.cc
@@ -24,7 +24,6 @@
 namespace blink {
 
 namespace {
-using Params = webrtc::SdpVideoFormat::Parameters;
 const webrtc::SdpVideoFormat kVideoFormatVp9{"VP9"};
 const webrtc::SdpVideoFormat kVideoFormatFoo{"Foo"};
 
@@ -75,7 +74,7 @@
 
 }  // namespace
 
-typedef webrtc::VideoDecoderFactory::CodecSupport CodecSupport;
+using CodecSupport = webrtc::VideoDecoderFactory::CodecSupport;
 
 class WebrtcDecodingInfoHandlerTests : public ::testing::Test {
  public:
diff --git a/third_party/blink/renderer/platform/peerconnection/webrtc_encoding_info_handler_test.cc b/third_party/blink/renderer/platform/peerconnection/webrtc_encoding_info_handler_test.cc
index e19646a..e586262d 100644
--- a/third_party/blink/renderer/platform/peerconnection/webrtc_encoding_info_handler_test.cc
+++ b/third_party/blink/renderer/platform/peerconnection/webrtc_encoding_info_handler_test.cc
@@ -24,7 +24,6 @@
 namespace blink {
 
 namespace {
-using Params = webrtc::SdpVideoFormat::Parameters;
 const webrtc::SdpVideoFormat kVideoFormatVp9{"VP9"};
 const webrtc::SdpVideoFormat kVideoFormatFoo{"Foo"};
 
@@ -76,7 +75,7 @@
 
 }  // namespace
 
-typedef webrtc::VideoEncoderFactory::CodecSupport CodecSupport;
+using CodecSupport = webrtc::VideoEncoderFactory::CodecSupport;
 
 class WebrtcEncodingInfoHandlerTests : public ::testing::Test {
  public:
diff --git a/third_party/blink/renderer/platform/peerconnection/webrtc_util.cc b/third_party/blink/renderer/platform/peerconnection/webrtc_util.cc
index f3d2bbeff..bd88e2f4 100644
--- a/third_party/blink/renderer/platform/peerconnection/webrtc_util.cc
+++ b/third_party/blink/renderer/platform/peerconnection/webrtc_util.cc
@@ -23,9 +23,9 @@
   return "";
 }
 
-webrtc::SdpVideoFormat::Parameters ConvertToSdpVideoFormatParameters(
+std::map<std::string, std::string> ConvertToSdpVideoFormatParameters(
     const ParsedContentHeaderFieldParameters& parameters) {
-  webrtc::SdpVideoFormat::Parameters sdp_parameters;
+  std::map<std::string, std::string> sdp_parameters;
   for (const auto& parameter : parameters) {
     sdp_parameters[parameter.name.Utf8()] = parameter.value.Utf8();
   }
diff --git a/third_party/blink/renderer/platform/peerconnection/webrtc_util.h b/third_party/blink/renderer/platform/peerconnection/webrtc_util.h
index c4ab9538..ae6bbef 100644
--- a/third_party/blink/renderer/platform/peerconnection/webrtc_util.h
+++ b/third_party/blink/renderer/platform/peerconnection/webrtc_util.h
@@ -16,8 +16,7 @@
 
 String PLATFORM_EXPORT WebrtcCodecNameFromMimeType(const String& mime_type,
                                                    const char* prefix);
-
-webrtc::SdpVideoFormat::Parameters PLATFORM_EXPORT
+std::map<std::string, std::string> PLATFORM_EXPORT
 ConvertToSdpVideoFormatParameters(
     const ParsedContentHeaderFieldParameters& parameters);
 
diff --git a/third_party/blink/renderer/platform/scheduler/common/frame_or_worker_scheduler.cc b/third_party/blink/renderer/platform/scheduler/common/frame_or_worker_scheduler.cc
index 2b0e789..dfcf235 100644
--- a/third_party/blink/renderer/platform/scheduler/common/frame_or_worker_scheduler.cc
+++ b/third_party/blink/renderer/platform/scheduler/common/frame_or_worker_scheduler.cc
@@ -115,8 +115,9 @@
     if (v8::Isolate::TryGetCurrent()) {
       OnStartedUsingStickyFeature(feature, policy, CaptureSourceLocation());
     }
+  } else {
+    OnStartedUsingStickyFeature(feature, policy, nullptr);
   }
-  OnStartedUsingStickyFeature(feature, policy, nullptr);
 }
 
 std::unique_ptr<FrameOrWorkerScheduler::LifecycleObserverHandle>
diff --git a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
index 3fd79cb..fc68084 100755
--- a/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
+++ b/third_party/blink/tools/blinkpy/presubmit/audit_non_blink_usage.py
@@ -1961,7 +1961,6 @@
     },
     {
         'paths': [
-            'third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter.cc',
             'third_party/blink/renderer/modules/service_worker/service_worker_router_type_converter_test.cc',
             # TODO(crbug.com/1371756): consolidate code using liburlpattern.
             # Especially, consolidate manifest and this code.
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
index b17d12e..5f14a2a 100644
--- a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
+++ b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
@@ -45,14 +45,14 @@
 crbug.com/910979 http/tests/html/validation-bubble-oopif-clip.html [ Failure ]
 
 # These started failing when network service was enabled by default.
-crbug.com/933880 external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ]
+crbug.com/933880 [ Linux ] external/wpt/service-workers/service-worker/request-end-to-end.https.html [ Failure ]
 crbug.com/933880 [ Release ] http/tests/inspector-protocol/network/raw-headers-for-protected-document.js [ Failure ]
 crbug.com/933880 [ Release ] http/tests/inspector-protocol/network/security-info-on-response.js [ Failure ]
 crbug.com/933880 http/tests/inspector-protocol/network/xhr-interception-auth-fail.js [ Failure ]
 crbug.com/933880 http/tests/misc/redirect-to-about-blank.html [ Timeout ]
 
-crbug.com/1106413 external/wpt/webmessaging/multi-globals/broadcastchannel-current.sub.html [ Failure ]
-crbug.com/1106413 external/wpt/webmessaging/multi-globals/broadcastchannel-incumbent.sub.html [ Failure ]
+crbug.com/1106413 [ Linux ] external/wpt/webmessaging/multi-globals/broadcastchannel-current.sub.html [ Failure ]
+crbug.com/1106413 [ Linux ] external/wpt/webmessaging/multi-globals/broadcastchannel-incumbent.sub.html [ Failure ]
 
 # Opt-in origin-keying is intentionally disabled with --disable-site-isolation-trials.
 virtual/no-auto-wpt-origin-isolation/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/* [ Skip ]
@@ -78,8 +78,8 @@
 # Fix to unblock wpt-importer
 # The paths for these tests' baselines (with an `-expected.{txt,png}` suffix) is
 # too long on Windows. Skip for now.
-crbug.com/1209223 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-multi-globals.sub.html [ Failure ]
-crbug.com/1209223 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html [ Failure ]
+crbug.com/1209223 [ Linux ] external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-multi-globals.sub.html [ Failure ]
+crbug.com/1209223 [ Linux ] external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
 crbug.com/626703 virtual/fedcm-login-status/external/wpt/credential-management/fedcm-login-status/confirm-idp-login.https.html [ Timeout ]
@@ -133,9 +133,9 @@
 crbug.com/626703 external/wpt/webrtc/RTCConfiguration-iceTransportPolicy.html [ Timeout ]
 crbug.com/626703 external/wpt/speculation-rules/prerender/restrictions.html [ Failure Timeout ]
 crbug.com/626703 external/wpt/selection/textcontrols/onselectionchange-content-attribute.html [ Timeout ]
-crbug.com/626703 external/wpt/infrastructure/channels/test_call.html [ Timeout ]
-crbug.com/626703 external/wpt/infrastructure/channels/test_postMessage.html [ Timeout ]
-crbug.com/626703 external/wpt/infrastructure/channels/test_serialize.html [ Timeout ]
+crbug.com/626703 [ Linux ] external/wpt/infrastructure/channels/test_call.html [ Timeout ]
+crbug.com/626703 [ Linux ] external/wpt/infrastructure/channels/test_postMessage.html [ Timeout ]
+crbug.com/626703 [ Linux ] external/wpt/infrastructure/channels/test_serialize.html [ Timeout ]
 
 # crbug.com/1339051: some ref tests generate output with minor differences.
 
diff --git a/third_party/blink/web_tests/FlagExpectations/highdpi b/third_party/blink/web_tests/FlagExpectations/highdpi
index 8b03d3a6..6fee212 100644
--- a/third_party/blink/web_tests/FlagExpectations/highdpi
+++ b/third_party/blink/web_tests/FlagExpectations/highdpi
@@ -237,7 +237,6 @@
 crbug.com/1179565 svg/custom/focus-ring-2.svg [ Failure ]
 crbug.com/1179565 svg/custom/rgba-color-outline.svg [ Failure ]
 crbug.com/1179565 svg/custom/svg-root-padding-border-margin.html [ Failure ]
-crbug.com/1179565 svg/dom/filter-reference-in-shadow-tree.html [ Failure ]
 crbug.com/1179565 svg/filters/color-space-conversion.svg [ Failure ]
 crbug.com/1179565 svg/filters/feComposite-operator-lighter.svg [ Failure ]
 crbug.com/1179565 svg/filters/feDisplacementMap-filterUnits.svg [ Failure ]
@@ -395,7 +394,6 @@
 # Existing failures. Mark these as [ Pass ] when these tests are fixed.
 crbug.com/626703 external/wpt/acid/acid3/test.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-fill-stroke/paint-order-001.tentative.html [ Failure ]
-crbug.com/694218 external/wpt/css/css-masking/clip-path/clip-path-viewBox-1b.html [ Failure ]
 crbug.com/1129522 external/wpt/css/css-shapes/shape-outside/shape-box/shape-outside-border-box-border-radius-011.html [ Failure ]
 crbug.com/591099 external/wpt/css/css-text/shaping/shaping-011.html [ Failure ]
 crbug.com/970200 external/wpt/css/css-text/text-indent/text-indent-tab-positions-001.html [ Failure ]
@@ -431,7 +429,6 @@
 crbug.com/1315309 external/wpt/css/css-layout-api/position-fragment/vrl-ltr.https.html [ Failure ]
 # Letter spacing is different.
 crbug.com/1315309 external/wpt/css/css-text/letter-spacing/letter-spacing-201.html [ Failure ]
-crbug.com/1315309 external/wpt/css/css-text/word-boundary/word-boundary-009.html [ Failure ]
 # Resize observer scrollbar size slightly off.
 crbug.com/1315309 external/wpt/resize-observer/scrollbars-2.html [ Failure ]
 
diff --git a/third_party/blink/web_tests/LeakExpectations b/third_party/blink/web_tests/LeakExpectations
index 3f2a540..773c407 100644
--- a/third_party/blink/web_tests/LeakExpectations
+++ b/third_party/blink/web_tests/LeakExpectations
@@ -19,7 +19,6 @@
 
 crbug.com/1181667 [ Linux ] external/wpt/css/selectors/focus-visible-011.html [ Failure Pass ]
 
-crbug.com/733494 [ Linux ] media/autoplay/document-user-activation.html [ Pass Failure ]
 
 crbug.com/769885 [ Linux ] virtual/android/fullscreen/video-scrolled-iframe.html [ Failure ]
 
@@ -27,8 +26,6 @@
 # a prior crash.
 crbug.com/1103082 [ Linux ] fast/forms/select/select-change-layout-object-crash.html [ Failure ]
 
-# Sheriff 2021-02-25
-crbug.com/1182675 [ Linux ] dom/mutation-event-tests/dom/attr/id-update-map-crash.html [ Failure Pass ]
 
 # Sheriff 2021-03-02
 crbug.com/1183788 [ Linux ] external/wpt/pointerevents/pointerevent_fractional_coordinates.html?touch [ Pass Failure ]
@@ -47,8 +44,6 @@
 crbug.com/1219915 [ Linux ] touchadjustment/focusout-on-touch.html [ Failure ]
 crbug.com/1219915 [ Linux ] touchadjustment/touch-links-longpress.html [ Failure ]
 
-# Sheriff 2021-11-18
-crbug.com/1271392 [ Linux ] external/wpt/service-workers/service-worker/navigation-headers.https.html [ Failure Pass ]
 
 # This has been marked as Skip in the TestExpectations file.
 crbug.com/1385278 [ Linux ] external/wpt/resource-timing/iframe-failed-commit.html [ Skip ]
@@ -62,9 +57,6 @@
 crbug.com/1499775 external/wpt/pointerevents/pointerevent_attributes_hoverable_rightbutton.html?mouse [ Failure Pass ]
 crbug.com/1499775 external/wpt/pointerevents/pointerevent_attributes_hoverable_rightbutton.html?pen [ Failure Pass ]
 
-# Sheriff 2023-11-28
-crbug.com/1483398 external/wpt/accelerometer/Accelerometer-enabled-on-self-origin-by-feature-policy.https.html [ Failure Pass ]
-crbug.com/1483398 external/wpt/accelerometer/Accelerometer-enabled-by-feature-policy.https.html [ Failure Pass ]
 
 ###########################################################################
 # WARNING: Memory leaks must be fixed asap. Sheriff is expected to revert #
diff --git a/third_party/blink/web_tests/MSANExpectations b/third_party/blink/web_tests/MSANExpectations
index faa3c44b..5725e81 100644
--- a/third_party/blink/web_tests/MSANExpectations
+++ b/third_party/blink/web_tests/MSANExpectations
@@ -109,8 +109,6 @@
 crbug.com/1378044 [ Linux ] external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/microtasks/basic.any.worker.html [ Timeout ]
 
 # Suppress blink canvas web tests that cause MSAN builder failure
-crbug.com/1419916 [ Linux ] virtual/oopr-canvas2d/fast/canvas/canvas-fillPath-shadow.html [ Crash ]
-crbug.com/1419916 [ Linux ] virtual/oopr-canvas2d/fast/canvas/canvas-fillPath-alpha-shadow.html [ Crash ]
 crbug.com/1419916 [ Linux ] virtual/oopr-canvas2d/fast/canvas/canvas-fillPath-gradient-shadow.html [ Crash ]
 
 crbug.com/1457275 [ Linux ] external/wpt/dom/ranges/Range-surroundContents.html [ Skip ]
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests
index 8c559e9..2653ac6 100644
--- a/third_party/blink/web_tests/SlowTests
+++ b/third_party/blink/web_tests/SlowTests
@@ -16,23 +16,33 @@
 # https://chromium.googlesource.com/chromium/src/+/main/docs/testing/web_test_expectations.md
 
 crbug.com/24182 [ Linux ] storage/indexeddb/objectstore-cursor.html [ Slow ]
-crbug.com/24182 [ Mac10.15 Release ] storage/indexeddb/objectstore-cursor.html [ Slow ]
 crbug.com/24182 [ Mac11 Release ] storage/indexeddb/objectstore-cursor.html [ Slow ]
 crbug.com/24182 [ Mac12 ] storage/indexeddb/objectstore-cursor.html [ Slow ]
 crbug.com/24182 [ Release Win ] storage/indexeddb/objectstore-cursor.html [ Slow ]
 crbug.com/24182 editing/selection/modify_move/move-by-word-visually-mac.html [ Slow ]
 crbug.com/24182 compositing/culling/filter-occlusion-blur-large.html [ Slow ]
 crbug.com/24182 [ Linux ] editing/selection/caret-at-bidi-boundary.html [ Slow ]
-crbug.com/24182 [ Mac10.15 Release ] editing/selection/caret-at-bidi-boundary.html [ Slow ]
 crbug.com/24182 [ Mac11 Release ] editing/selection/caret-at-bidi-boundary.html [ Slow ]
 crbug.com/24182 [ Mac12 ] editing/selection/caret-at-bidi-boundary.html [ Slow ]
 crbug.com/24182 [ Mac13 ] editing/selection/caret-at-bidi-boundary.html [ Slow ]
-crbug.com/24182 [ Release Win ] editing/selection/caret-at-bidi-boundary.html [ Slow ]
-crbug.com/24182 editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Slow ]
+crbug.com/24182 [ Release Win10.20h2 ] editing/selection/caret-at-bidi-boundary.html [ Slow ]
+crbug.com/24182 [ Release Win11 ] editing/selection/caret-at-bidi-boundary.html [ Slow ]
+crbug.com/24182 [ Debug Mac13-arm64 ] editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Slow ]
+crbug.com/24182 [ Linux ] editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Slow ]
+crbug.com/24182 [ Mac11 Release ] editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Slow ]
+crbug.com/24182 [ Mac12 Release ] editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Slow ]
+crbug.com/24182 [ Mac13 ] editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Slow ]
+crbug.com/24182 [ Release Win ] editing/selection/modify_move/move-by-word-visually-crash-test-5.html [ Slow ]
 crbug.com/24182 fast/canvas/canvas-toBlob-toDataURL-race-imageEncoder-jpeg.html [ Slow ]
 crbug.com/24182 fast/canvas/canvas-toBlob-toDataURL-race-imageEncoder-png.html [ Slow ]
 crbug.com/24182 fast/canvas/canvas-toBlob-toDataURL-race-imageEncoder-webp.html [ Slow ]
-crbug.com/24182 fast/dom/SelectorAPI/resig-SelectorsAPI-test.xhtml [ Slow ]
+crbug.com/24182 [ Debug Mac13-arm64 ] fast/dom/SelectorAPI/resig-SelectorsAPI-test.xhtml [ Slow ]
+crbug.com/24182 [ Linux ] fast/dom/SelectorAPI/resig-SelectorsAPI-test.xhtml [ Slow ]
+crbug.com/24182 [ Mac11 Release ] fast/dom/SelectorAPI/resig-SelectorsAPI-test.xhtml [ Slow ]
+crbug.com/24182 [ Mac12 Release ] fast/dom/SelectorAPI/resig-SelectorsAPI-test.xhtml [ Slow ]
+crbug.com/24182 [ Mac13 ] fast/dom/SelectorAPI/resig-SelectorsAPI-test.xhtml [ Slow ]
+crbug.com/24182 [ Release Win10.20h2 ] fast/dom/SelectorAPI/resig-SelectorsAPI-test.xhtml [ Slow ]
+crbug.com/24182 [ Release Win11 ] fast/dom/SelectorAPI/resig-SelectorsAPI-test.xhtml [ Slow ]
 crbug.com/24182 fast/frames/cached-frame-counter.html [ Slow ]
 crbug.com/24182 fast/overflow/lots-of-sibling-inline-boxes.html [ Slow ] # Particularly slow in Debug: >12x slower!
 crbug.com/24182 http/tests/accessibility/slow-document-load.html [ Slow ]
@@ -48,12 +58,10 @@
 crbug.com/24182 http/tests/notifications/close-dispatch-asynchronous.html [ Slow ]
 crbug.com/24182 images/png-suite/test.html [ Slow ]
 crbug.com/24182 [ Linux ] jquery/attributes.html [ Slow ]
-crbug.com/24182 [ Mac10.15 Release ] jquery/attributes.html [ Slow ]
 crbug.com/24182 [ Mac11 Release ] jquery/attributes.html [ Slow ]
 crbug.com/24182 [ Mac12 ] jquery/attributes.html [ Slow ]
 crbug.com/24182 [ Release Win ] jquery/attributes.html [ Slow ]
 crbug.com/24182 [ Linux ] jquery/core.html [ Slow ]
-crbug.com/24182 [ Mac10.15 Release ] jquery/core.html [ Slow ]
 crbug.com/24182 [ Mac11 Release ] jquery/core.html [ Slow ]
 crbug.com/24182 [ Mac12 ] jquery/core.html [ Slow ]
 crbug.com/1453740 [ Mac13 ] jquery/core.html [ Slow ]
@@ -62,19 +70,17 @@
 crbug.com/24182 jquery/data.html [ Slow ]
 crbug.com/24182 jquery/dimensions.html [ Slow ]
 crbug.com/24182 [ Linux ] jquery/event.html [ Slow ]
-crbug.com/24182 [ Mac10.15 Release ] jquery/event.html [ Slow ]
 crbug.com/24182 [ Mac11 Release ] jquery/event.html [ Slow ]
 crbug.com/24182 [ Mac12 ] jquery/event.html [ Slow ]
 crbug.com/24182 [ Release Win ] jquery/event.html [ Slow ]
 crbug.com/24182 jquery/manipulation.html [ Slow ]
 crbug.com/24182 [ Debug ] jquery/offset.html [ Slow ]
 crbug.com/24182 [ Linux Release ] jquery/offset.html [ Slow ]
-crbug.com/24182 [ Mac10.15 Release ] jquery/offset.html [ Slow ]
 crbug.com/24182 [ Mac11 Release ] jquery/offset.html [ Slow ]
 crbug.com/24182 [ Mac12 Release ] jquery/offset.html [ Slow ]
-crbug.com/24182 [ Release Win ] jquery/offset.html [ Slow ]
+crbug.com/24182 [ Release Win10.20h2 ] jquery/offset.html [ Slow ]
+crbug.com/24182 [ Release Win11 ] jquery/offset.html [ Slow ]
 crbug.com/24182 [ Linux ] jquery/traversing.html [ Slow ]
-crbug.com/24182 [ Mac10.15 Release ] jquery/traversing.html [ Slow ]
 crbug.com/24182 [ Mac11 Release ] jquery/traversing.html [ Slow ]
 crbug.com/24182 [ Mac12 ] jquery/traversing.html [ Slow ]
 crbug.com/24182 [ Release Win ] jquery/traversing.html [ Slow ]
@@ -89,22 +95,21 @@
 crbug.com/24182 http/tests/perf/large-inlined-script.html [ Slow ]
 crbug.com/24182 [ Debug Linux ] fast/css/should-not-insert-stylesheet-into-detached-document.html [ Slow ]
 crbug.com/24182 [ Linux Release ] fast/css/should-not-insert-stylesheet-into-detached-document.html [ Slow ]
-crbug.com/24182 [ Mac10.15 Release ] fast/css/should-not-insert-stylesheet-into-detached-document.html [ Slow ]
 crbug.com/24182 [ Mac11 Release ] fast/css/should-not-insert-stylesheet-into-detached-document.html [ Slow ]
 crbug.com/24182 [ Mac12 Release ] fast/css/should-not-insert-stylesheet-into-detached-document.html [ Slow ]
 crbug.com/24182 [ Mac12-arm64 Release ] fast/css/should-not-insert-stylesheet-into-detached-document.html [ Slow ]
-crbug.com/24182 [ Release Win ] fast/css/should-not-insert-stylesheet-into-detached-document.html [ Slow ]
+crbug.com/24182 [ Release Win10.20h2 ] fast/css/should-not-insert-stylesheet-into-detached-document.html [ Slow ]
+crbug.com/24182 [ Release Win11 ] fast/css/should-not-insert-stylesheet-into-detached-document.html [ Slow ]
 crbug.com/24182 [ Linux ] fast/encoding/char-encoding.html [ Slow ]
-crbug.com/24182 [ Mac10.15 Release ] fast/encoding/char-encoding.html [ Slow ]
 crbug.com/24182 [ Mac11 Release ] fast/encoding/char-encoding.html [ Slow ]
 crbug.com/24182 [ Mac12 ] fast/encoding/char-encoding.html [ Slow ]
-crbug.com/24182 [ Release Win ] fast/encoding/char-encoding.html [ Slow ]
+crbug.com/24182 [ Release Win10.20h2 ] fast/encoding/char-encoding.html [ Slow ]
+crbug.com/24182 [ Release Win11 ] fast/encoding/char-encoding.html [ Slow ]
 crbug.com/24182 fast/frames/sandboxed-iframe-navigation-targetlink.html [ Slow ]
 crbug.com/24182 html/marquee/marquee-destroyed-without-removed-from-crash.html [ Slow ]
 crbug.com/24182 fast/js/regress/string-cons-tower.html [ Slow ]
 crbug.com/24182 [ Debug Mac13-arm64 ] fast/events/tabindex-focus-blur-all.html [ Slow ]
 crbug.com/24182 [ Linux ] fast/events/tabindex-focus-blur-all.html [ Slow ]
-crbug.com/24182 [ Mac10.15 Release ] fast/events/tabindex-focus-blur-all.html [ Slow ]
 crbug.com/24182 [ Mac11 Release ] fast/events/tabindex-focus-blur-all.html [ Slow ]
 crbug.com/24182 [ Mac12 ] fast/events/tabindex-focus-blur-all.html [ Slow ]
 crbug.com/24182 [ Release Win ] fast/events/tabindex-focus-blur-all.html [ Slow ]
@@ -119,7 +124,6 @@
 # DevTools tests cause flakes on slow hardware in Release as well.
 crbug.com/1063051 [ Release ] http/tests/devtools/* [ Slow ]
 crbug.com/420008 [ Linux ] virtual/threaded/http/tests/devtools/tracing/* [ Slow ]
-crbug.com/420008 [ Mac10.15 Release ] virtual/threaded/http/tests/devtools/tracing/* [ Slow ]
 crbug.com/420008 [ Mac11 Release ] virtual/threaded/http/tests/devtools/tracing/* [ Slow ]
 crbug.com/420008 [ Mac11-arm64 Release ] virtual/threaded/http/tests/devtools/tracing/* [ Slow ]
 crbug.com/420008 [ Mac12 Release ] virtual/threaded/http/tests/devtools/tracing/* [ Slow ]
@@ -130,7 +134,6 @@
 # Misc DevTools tests that are slow
 crbug.com/243492 inspector-protocol/injected-script-discard.js [ Slow ]
 crbug.com/678482 [ Linux ] http/tests/devtools/debugger/fetch-breakpoints.js [ Slow ]
-crbug.com/678482 [ Mac10.15 Release ] http/tests/devtools/debugger/fetch-breakpoints.js [ Slow ]
 crbug.com/678482 [ Mac11 Release ] http/tests/devtools/debugger/fetch-breakpoints.js [ Slow ]
 crbug.com/678482 [ Mac12 ] http/tests/devtools/debugger/fetch-breakpoints.js [ Slow ]
 crbug.com/678482 [ Release Win ] http/tests/devtools/debugger/fetch-breakpoints.js [ Slow ]
@@ -138,7 +141,6 @@
 crbug.com/1236466 inspector-protocol/runtime/runtime-execution-contexts-events.js [ Slow ]
 crbug.com/1229701 [ Debug Mac13-arm64 ] http/tests/inspector-protocol/network/disable-cache-media-resource.js [ Slow ]
 crbug.com/1229701 [ Linux ] http/tests/inspector-protocol/network/disable-cache-media-resource.js [ Slow ]
-crbug.com/1229701 [ Mac10.15 Release ] http/tests/inspector-protocol/network/disable-cache-media-resource.js [ Slow ]
 crbug.com/1229701 [ Mac11 Release ] http/tests/inspector-protocol/network/disable-cache-media-resource.js [ Slow ]
 crbug.com/1229701 [ Mac12 ] http/tests/inspector-protocol/network/disable-cache-media-resource.js [ Slow ]
 crbug.com/1229701 [ Release Win ] http/tests/inspector-protocol/network/disable-cache-media-resource.js [ Slow ]
@@ -148,7 +150,6 @@
 crbug.com/1280585 http/tests/inspector-protocol/network/xhr-post-replay-cors.js [ Slow ]
 crbug.com/1280537 http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-browser-navigate.js [ Slow ]
 crbug.com/1280537 [ Linux ] http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-navigate.js [ Slow ]
-crbug.com/1280537 [ Mac10.15 Release ] http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-navigate.js [ Slow ]
 crbug.com/1280537 [ Mac11 Release ] http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-navigate.js [ Slow ]
 crbug.com/1280537 [ Mac12 ] http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-navigate.js [ Slow ]
 crbug.com/1280537 [ Release Win ] http/tests/inspector-protocol/network/blocked-cookie-same-site-lax-js-navigate.js [ Slow ]
@@ -192,39 +193,34 @@
 crbug.com/453312 html5lib/generated/run-entities01-data.html [ Slow ]
 crbug.com/453312 html5lib/generated/run-entities02-data.html [ Slow ]
 crbug.com/453312 [ Linux ] html5lib/generated/run-template-data.html [ Slow ]
-crbug.com/453312 [ Mac10.15 Release ] html5lib/generated/run-template-data.html [ Slow ]
 crbug.com/453312 [ Mac11 Release ] html5lib/generated/run-template-data.html [ Slow ]
 crbug.com/453312 [ Mac12 ] html5lib/generated/run-template-data.html [ Slow ]
 crbug.com/453312 [ Release Win ] html5lib/generated/run-template-data.html [ Slow ]
 crbug.com/453312 [ Linux ] html5lib/generated/run-tests1-data.html [ Slow ]
-crbug.com/453312 [ Mac10.15 Release ] html5lib/generated/run-tests1-data.html [ Slow ]
 crbug.com/453312 [ Mac11 Release ] html5lib/generated/run-tests1-data.html [ Slow ]
 crbug.com/453312 [ Mac12 ] html5lib/generated/run-tests1-data.html [ Slow ]
-crbug.com/453312 [ Release Win ] html5lib/generated/run-tests1-data.html [ Slow ]
+crbug.com/453312 [ Release Win10.20h2 ] html5lib/generated/run-tests1-data.html [ Slow ]
+crbug.com/453312 [ Release Win11 ] html5lib/generated/run-tests1-data.html [ Slow ]
 crbug.com/453312 [ Debug Linux ] html5lib/generated/run-tests2-data.html [ Slow ]
 crbug.com/453312 [ Debug Mac13 ] html5lib/generated/run-tests2-data.html [ Slow ]
 crbug.com/453312 [ Linux Release ] html5lib/generated/run-tests2-data.html [ Slow ]
-crbug.com/453312 [ Mac10.15 Release ] html5lib/generated/run-tests2-data.html [ Slow ]
-crbug.com/453312 [ Mac12 Release ] html5lib/generated/run-tests2-data.html [ Slow ]
 crbug.com/453312 [ Release Win ] html5lib/generated/run-tests2-data.html [ Slow ]
 crbug.com/453312 html5lib/generated/run-tests6-data.html [ Slow ]
 crbug.com/453312 html5lib/generated/run-tests7-data.html [ Slow ]
 crbug.com/453312 html5lib/generated/run-tests9-data.html [ Slow ]
 crbug.com/453312 html5lib/generated/run-tests10-data.html [ Slow ]
 crbug.com/453312 [ Linux ] html5lib/generated/run-tests16-data.html [ Slow ]
-crbug.com/453312 [ Mac10.15 Release ] html5lib/generated/run-tests16-data.html [ Slow ]
 crbug.com/453312 [ Mac11 Release ] html5lib/generated/run-tests16-data.html [ Slow ]
 crbug.com/453312 [ Mac12 ] html5lib/generated/run-tests16-data.html [ Slow ]
 crbug.com/453312 [ Release Win ] html5lib/generated/run-tests16-data.html [ Slow ]
 crbug.com/453312 [ Linux ] html5lib/generated/run-tests19-data.html [ Slow ]
-crbug.com/453312 [ Mac10.15 Release ] html5lib/generated/run-tests19-data.html [ Slow ]
 crbug.com/453312 [ Mac11 Release ] html5lib/generated/run-tests19-data.html [ Slow ]
 crbug.com/453312 [ Mac12 ] html5lib/generated/run-tests19-data.html [ Slow ]
-crbug.com/453312 [ Release Win ] html5lib/generated/run-tests19-data.html [ Slow ]
+crbug.com/453312 [ Release Win10.20h2 ] html5lib/generated/run-tests19-data.html [ Slow ]
+crbug.com/453312 [ Release Win11 ] html5lib/generated/run-tests19-data.html [ Slow ]
 crbug.com/453312 html5lib/generated/run-tests20-data.html [ Slow ]
 crbug.com/453312 html5lib/generated/run-webkit01-data.html [ Slow ]
 crbug.com/453312 [ Linux ] html5lib/webkit-resumer.html [ Slow ]
-crbug.com/453312 [ Mac10.15 Release ] html5lib/webkit-resumer.html [ Slow ]
 crbug.com/453312 [ Mac11 Release ] html5lib/webkit-resumer.html [ Slow ]
 crbug.com/453312 [ Mac12 ] html5lib/webkit-resumer.html [ Slow ]
 crbug.com/453312 [ Release Win ] html5lib/webkit-resumer.html [ Slow ]
@@ -233,7 +229,6 @@
 # Double-check the data after they've been running another week or so.
 crbug.com/245154 [ Debug ] editing/selection/modify_move/move-by-character-brute-force.html [ Slow ]
 crbug.com/245154 [ Linux Release ] editing/selection/modify_move/move-by-character-brute-force.html [ Slow ]
-crbug.com/245154 [ Mac10.15 Release ] editing/selection/modify_move/move-by-character-brute-force.html [ Slow ]
 crbug.com/245154 [ Mac11 Release ] editing/selection/modify_move/move-by-character-brute-force.html [ Slow ]
 crbug.com/245154 [ Mac12 Release ] editing/selection/modify_move/move-by-character-brute-force.html [ Slow ]
 crbug.com/245154 [ Release Win ] editing/selection/modify_move/move-by-character-brute-force.html [ Slow ]
@@ -250,7 +245,6 @@
 crbug.com/357427 http/tests/workers/terminate-during-sync-operation-filesystem.html [ Slow ]
 crbug.com/402379 [ Debug Linux ] storage/indexeddb/cursor-continue-validity.html [ Slow ]
 crbug.com/402379 [ Linux ] storage/indexeddb/mozilla/indexes.html [ Slow ]
-crbug.com/402379 [ Mac10.15 Release ] storage/indexeddb/mozilla/indexes.html [ Slow ]
 crbug.com/402379 [ Mac11 Release ] storage/indexeddb/mozilla/indexes.html [ Slow ]
 crbug.com/402379 [ Mac12 ] storage/indexeddb/mozilla/indexes.html [ Slow ]
 crbug.com/402379 [ Release Win ] storage/indexeddb/mozilla/indexes.html [ Slow ]
@@ -260,13 +254,11 @@
 crbug.com/331186 [ Debug Linux ] css3/flexbox/position-absolute-child.html [ Slow ]
 
 crbug.com/372424 [ Linux ] fast/dom/DOMImplementation/createDocument-with-used-doctype.html [ Slow ]
-crbug.com/372424 [ Mac10.15 Release ] fast/dom/DOMImplementation/createDocument-with-used-doctype.html [ Slow ]
 crbug.com/372424 [ Mac11 Release ] fast/dom/DOMImplementation/createDocument-with-used-doctype.html [ Slow ]
 crbug.com/372424 [ Mac12 ] fast/dom/DOMImplementation/createDocument-with-used-doctype.html [ Slow ]
 crbug.com/372424 [ Release Win ] fast/dom/DOMImplementation/createDocument-with-used-doctype.html [ Slow ]
 
 crbug.com/372424 [ Linux ] http/tests/serviceworker/registration-stress.html [ Slow ]
-crbug.com/372424 [ Mac10.15 Release ] http/tests/serviceworker/registration-stress.html [ Slow ]
 crbug.com/372424 [ Mac11 Release ] http/tests/serviceworker/registration-stress.html [ Slow ]
 crbug.com/372424 [ Mac12 ] http/tests/serviceworker/registration-stress.html [ Slow ]
 crbug.com/372424 [ Release Win ] http/tests/serviceworker/registration-stress.html [ Slow ]
@@ -276,7 +268,6 @@
 # Most crypto/subtle tests are slow some or most of the time.
 crbug.com/459009 [ Debug Mac13-arm64 ] crypto/subtle/* [ Slow ]
 crbug.com/459009 [ Linux ] crypto/subtle/* [ Slow ]
-crbug.com/459009 [ Mac10.15 Release ] crypto/subtle/* [ Slow ]
 crbug.com/459009 [ Mac11 Release ] crypto/subtle/* [ Slow ]
 crbug.com/459009 [ Mac12 ] crypto/subtle/* [ Slow ]
 crbug.com/459009 [ Release Win ] crypto/subtle/* [ Slow ]
@@ -290,7 +281,6 @@
 
 crbug.com/606649 [ Debug ] fast/dom/gc-dom-tree-lifetime.html [ Slow ]
 crbug.com/606649 [ Linux Release ] fast/dom/gc-dom-tree-lifetime.html [ Slow ]
-crbug.com/606649 [ Mac10.15 Release ] fast/dom/gc-dom-tree-lifetime.html [ Slow ]
 crbug.com/606649 [ Mac11 Release ] fast/dom/gc-dom-tree-lifetime.html [ Slow ]
 crbug.com/606649 [ Mac11-arm64 Release ] fast/dom/gc-dom-tree-lifetime.html [ Slow ]
 crbug.com/606649 [ Mac12 Release ] fast/dom/gc-dom-tree-lifetime.html [ Slow ]
@@ -298,7 +288,6 @@
 
 # Slow on many platforms.
 crbug.com/866165 [ Linux ] webexposed/global-interface-listing.html [ Slow ]
-crbug.com/866165 [ Mac10.15 Release ] webexposed/global-interface-listing.html [ Slow ]
 crbug.com/866165 [ Mac11 Release ] webexposed/global-interface-listing.html [ Slow ]
 crbug.com/866165 [ Mac12 ] webexposed/global-interface-listing.html [ Slow ]
 crbug.com/866165 [ Release Win ] webexposed/global-interface-listing.html [ Slow ]
@@ -314,15 +303,19 @@
 crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-blending-color-over-pattern.html [ Slow ]
 crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-blending-pattern-over-image.html [ Slow ]
 crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-blending-image-over-image.html [ Slow ]
-crbug.com/1152496 virtual/oopr-canvas2d/fast/canvas/canvas-composite-alpha.html [ Slow ]
+crbug.com/1152496 [ Debug Mac13-arm64 ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-alpha.html [ Slow ]
+crbug.com/1152496 [ Linux ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-alpha.html [ Slow ]
+crbug.com/1152496 [ Mac11 Release ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-alpha.html [ Slow ]
+crbug.com/1152496 [ Mac12 Release ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-alpha.html [ Slow ]
+crbug.com/1152496 [ Mac13 ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-alpha.html [ Slow ]
+crbug.com/1152496 [ Release Win10.20h2 ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-alpha.html [ Slow ]
+crbug.com/1152496 [ Release Win11 ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-alpha.html [ Slow ]
 crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-composite.html [ Slow ]
 crbug.com/1081534 [ Linux ] virtual/oopr-canvas2d/fast/canvas/canvas-composite.html [ Slow ]
 crbug.com/1081534 [ Linux ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-canvas.html [ Slow ]
 crbug.com/1081534 virtual/oopr-canvas2d/fast/canvas/canvas-composite-image.html [ Slow ]
-crbug.com/1081534 [ Mac10.15 Release ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow-part4.html [ Slow ]
 crbug.com/1081534 [ Mac11 Release ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow-part4.html [ Slow ]
 crbug.com/1081534 [ Mac12 ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-shadow-part4.html [ Slow ]
-crbug.com/1081534 [ Mac10.15 Release ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip.html [ Slow ]
 crbug.com/1081534 [ Mac11 Release ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip.html [ Slow ]
 crbug.com/1081534 [ Mac12 ] virtual/oopr-canvas2d/fast/canvas/canvas-composite-transformclip.html [ Slow ]
 crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-blending-gradient-over-pattern.html [ Slow ]
@@ -332,7 +325,9 @@
 crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-blend-image.html [ Slow ]
 crbug.com/1081534 [ Linux ] virtual/oopr-canvas2d/fast/canvas/canvas-blend-image.html [ Slow ]
 crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-incremental-repaint.html [ Slow ]
-crbug.com/1081534 [ Mac ] virtual/oopr-canvas2d/fast/canvas/fillrect_gradient.html [ Slow ]
+crbug.com/1081534 [ Mac11 Release ] virtual/oopr-canvas2d/fast/canvas/fillrect_gradient.html [ Slow ]
+crbug.com/1081534 [ Mac12 Release ] virtual/oopr-canvas2d/fast/canvas/fillrect_gradient.html [ Slow ]
+crbug.com/1081534 [ Mac13 ] virtual/oopr-canvas2d/fast/canvas/fillrect_gradient.html [ Slow ]
 crbug.com/1302791 [ Linux ] virtual/oopr-canvas2d/fast/canvas/canvas-blending-image-over-pattern.html [ Slow ]
 crbug.com/1302791 [ Mac ] virtual/oopr-canvas2d/fast/canvas/canvas-blending-image-over-pattern.html [ Slow ]
 
@@ -346,7 +341,6 @@
 
 # Media controls tests have to wait for panel to fade out.
 crbug.com/722825 [ Linux Release ] media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Slow ]
-crbug.com/722825 [ Mac10.15 Release ] media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Slow ]
 crbug.com/722825 [ Mac11 Release ] media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Slow ]
 crbug.com/722825 [ Mac11-arm64 Release ] media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Slow ]
 crbug.com/722825 [ Mac12 Release ] media/controls/video-enter-exit-fullscreen-without-hovering-doesnt-show-controls.html [ Slow ]
@@ -362,7 +356,6 @@
 
 crbug.com/741259 [ Debug Mac13-arm64 ] editing/selection/select-bidi-run.html [ Slow ]
 crbug.com/741259 [ Linux ] editing/selection/select-bidi-run.html [ Slow ]
-crbug.com/741259 [ Mac10.15 Release ] editing/selection/select-bidi-run.html [ Slow ]
 crbug.com/741259 [ Mac11 Release ] editing/selection/select-bidi-run.html [ Slow ]
 crbug.com/741259 [ Mac12 ] editing/selection/select-bidi-run.html [ Slow ]
 crbug.com/741259 [ Release Win ] editing/selection/select-bidi-run.html [ Slow ]
@@ -396,9 +389,9 @@
 crbug.com/942951 [ Debug Linux ] media/controls/controls-layout-in-different-size.html [ Slow ]
 crbug.com/942951 [ Release ] media/controls/controls-layout-in-different-size.html [ Slow ]
 
-crbug.com/910627 [ Debug ] webexposed/global-interface-listing-shared-worker.html [ Slow ]
+crbug.com/910627 [ Debug Linux ] webexposed/global-interface-listing-shared-worker.html [ Slow ]
+crbug.com/910627 [ Debug Mac13 ] webexposed/global-interface-listing-shared-worker.html [ Slow ]
 crbug.com/910627 [ Linux Release ] webexposed/global-interface-listing-shared-worker.html [ Slow ]
-crbug.com/910627 [ Mac10.15 Release ] webexposed/global-interface-listing-shared-worker.html [ Slow ]
 crbug.com/910627 [ Mac11 Release ] webexposed/global-interface-listing-shared-worker.html [ Slow ]
 crbug.com/910627 [ Mac12 Release ] webexposed/global-interface-listing-shared-worker.html [ Slow ]
 crbug.com/910627 [ Mac13 Release ] webexposed/global-interface-listing-shared-worker.html [ Slow ]
@@ -407,7 +400,6 @@
 ### virtual/gpu/fast/canvas/ blending layout tests are slow
 crbug.com/866850 [ Debug Mac13-arm64 ] virtual/gpu/fast/canvas/canvas-blend-image.html [ Slow ]
 crbug.com/866850 [ Linux ] virtual/gpu/fast/canvas/canvas-blend-image.html [ Slow ]
-crbug.com/866850 [ Mac10.15 Release ] virtual/gpu/fast/canvas/canvas-blend-image.html [ Slow ]
 crbug.com/866850 [ Mac11 Release ] virtual/gpu/fast/canvas/canvas-blend-image.html [ Slow ]
 crbug.com/866850 [ Mac12 ] virtual/gpu/fast/canvas/canvas-blend-image.html [ Slow ]
 crbug.com/866850 [ Mac12-arm64 Release ] virtual/gpu/fast/canvas/canvas-blend-image.html [ Slow ]
@@ -426,7 +418,6 @@
 crbug.com/866850 [ Mac ] virtual/gpu/fast/canvas/canvas-blending-pattern-over-pattern.html [ Slow ]
 crbug.com/866850 [ Linux ] virtual/gpu/fast/canvas/canvas-shadow-source-in.html [ Slow ]
 crbug.com/866850 [ Linux ] virtual/gpu/fast/canvas/OffscreenCanvas-filter.html [ Slow ]
-crbug.com/866850 [ Mac10.15 Release ] virtual/gpu/fast/canvas/OffscreenCanvas-filter.html [ Slow ]
 crbug.com/866850 [ Mac11 Release ] virtual/gpu/fast/canvas/OffscreenCanvas-filter.html [ Slow ]
 crbug.com/866850 [ Mac12 ] virtual/gpu/fast/canvas/OffscreenCanvas-filter.html [ Slow ]
 crbug.com/866850 [ Linux ] virtual/gpu/fast/canvas/OffscreenCanvas-filter-in-worker.html [ Slow ]
@@ -456,7 +447,6 @@
 crbug.com/874695 css3/filters/effect-reference-colorspace-hw.html [ Slow ]
 crbug.com/874695 [ Debug ] css3/filters/effect-reference-hidpi-hw.html [ Slow ]
 crbug.com/874695 [ Linux Release ] css3/filters/effect-reference-hidpi-hw.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] css3/filters/effect-reference-hidpi-hw.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] css3/filters/effect-reference-hidpi-hw.html [ Slow ]
 crbug.com/874695 [ Mac12 Release ] css3/filters/effect-reference-hidpi-hw.html [ Slow ]
 crbug.com/874695 [ Release Win ] css3/filters/effect-reference-hidpi-hw.html [ Slow ]
@@ -468,94 +458,80 @@
 crbug.com/874695 css3/filters/filter-repaint-composited-fallback-crash.html [ Slow ]
 crbug.com/874695 css3/filters/filter-repaint-composited-fallback.html [ Slow ]
 crbug.com/874695 [ Linux Release ] fast/canvas-api/canvas-layerBridgeCrashTest.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/canvas-api/canvas-layerBridgeCrashTest.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/canvas-api/canvas-layerBridgeCrashTest.html [ Slow ]
 crbug.com/874695 [ Mac12 Release ] fast/canvas-api/canvas-layerBridgeCrashTest.html [ Slow ]
-crbug.com/874695 [ Release Win ] fast/canvas-api/canvas-layerBridgeCrashTest.html [ Slow ]
+crbug.com/874695 [ Release Win10.20h2 ] fast/canvas-api/canvas-layerBridgeCrashTest.html [ Slow ]
+crbug.com/874695 [ Release Win11 ] fast/canvas-api/canvas-layerBridgeCrashTest.html [ Slow ]
 crbug.com/874695 fast/canvas/canvas-drawImage-animated-images.html [ Slow ]
 crbug.com/874695 fast/css-grid-layout/crash-large-positions.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-001.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-001.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-001.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-001.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-001.html [ Slow ]
 crbug.com/874695 fast/css-grid-layout/grid-auto-repeat-huge-grid-002.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-003.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-003.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-003.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-003.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-003.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-004.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-004.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-004.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-004.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-004.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-005.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-005.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-005.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-005.html [ Slow ]
-crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-005.html [ Slow ]
+crbug.com/874695 [ Release Win10.20h2 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-005.html [ Slow ]
+crbug.com/874695 [ Release Win11 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-005.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-006.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-006.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-006.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-006.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-006.html [ Slow ]
 crbug.com/874695 fast/css-grid-layout/grid-auto-repeat-huge-grid-007.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-008.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-008.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-008.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-008.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-008.html [ Slow ]
 crbug.com/874695 [ Debug ] fast/css-grid-layout/grid-auto-repeat-huge-grid-009.html [ Slow ]
 crbug.com/874695 [ Linux Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-009.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-009.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-009.html [ Slow ]
 crbug.com/874695 [ Mac11-arm64 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-009.html [ Slow ]
 crbug.com/874695 [ Mac12 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-009.html [ Slow ]
 crbug.com/874695 [ Mac12-arm64 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-009.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-009.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-010.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-010.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-010.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-010.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-010.html [ Slow ]
 crbug.com/874695 fast/css-grid-layout/grid-auto-repeat-huge-grid-011.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-012.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-012.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-012.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-012.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-012.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-013.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-013.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-013.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-013.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-013.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-014.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-014.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-014.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-014.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-014.html [ Slow ]
 crbug.com/874695 fast/css-grid-layout/grid-auto-repeat-huge-grid-015.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-016.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-016.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-016.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-016.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-016.html [ Slow ]
 crbug.com/874695 fast/css-grid-layout/grid-auto-repeat-huge-grid-017.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-018.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-018.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-018.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-018.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-018.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/css-grid-layout/grid-auto-repeat-huge-grid-019.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-019.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/css-grid-layout/grid-auto-repeat-huge-grid-019.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/css-grid-layout/grid-auto-repeat-huge-grid-019.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/css-grid-layout/grid-auto-repeat-huge-grid-019.html [ Slow ]
 crbug.com/874695 fast/dnd/dropEffect-for-link.html [ Slow ]
 crbug.com/874695 [ Release ] fast/dom/HTMLLinkElement/link-preload-unused.html [ Slow ]
 crbug.com/874695 [ Linux Release ] fast/dom/timer-throttling-hidden-page.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/dom/timer-throttling-hidden-page.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/dom/timer-throttling-hidden-page.html [ Slow ]
 crbug.com/874695 [ Mac11-arm64 Release ] fast/dom/timer-throttling-hidden-page.html [ Slow ]
 crbug.com/874695 [ Mac12 Release ] fast/dom/timer-throttling-hidden-page.html [ Slow ]
@@ -571,18 +547,15 @@
 crbug.com/874695 fast/forms/select/input-select-after-resize.html [ Slow ]
 crbug.com/874695 fast/media/mq-color-gamut-picture.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/peerconnection/RTCPeerConnection-many.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/peerconnection/RTCPeerConnection-many.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/peerconnection/RTCPeerConnection-many.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/peerconnection/RTCPeerConnection-many.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/peerconnection/RTCPeerConnection-many.html [ Slow ]
 crbug.com/874695 [ Debug ] fast/peerconnection/RTCRtpSender-setParameters.html [ Slow ]
 crbug.com/874695 [ Linux Release ] fast/peerconnection/RTCRtpSender-setParameters.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/peerconnection/RTCRtpSender-setParameters.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/peerconnection/RTCRtpSender-setParameters.html [ Slow ]
 crbug.com/874695 [ Mac12 Release ] fast/peerconnection/RTCRtpSender-setParameters.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/peerconnection/RTCRtpSender-setParameters.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/scroll-behavior/overscroll-behavior.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/scroll-behavior/overscroll-behavior.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/scroll-behavior/overscroll-behavior.html [ Slow ]
 crbug.com/874695 [ Mac11-arm64 Release ] fast/scroll-behavior/overscroll-behavior.html [ Slow ]
 crbug.com/874695 [ Mac12 Release ] fast/scroll-behavior/overscroll-behavior.html [ Slow ]
@@ -592,7 +565,6 @@
 crbug.com/874695 [ Release ] fast/table/multiple-captions-crash3.html [ Slow ]
 crbug.com/874695 [ Release ] fast/table/multiple-captions-crash4.html [ Slow ]
 crbug.com/874695 [ Linux ] fast/webgl/canvas-toDataURL-crash.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] fast/webgl/canvas-toDataURL-crash.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] fast/webgl/canvas-toDataURL-crash.html [ Slow ]
 crbug.com/874695 [ Mac12 ] fast/webgl/canvas-toDataURL-crash.html [ Slow ]
 crbug.com/874695 [ Release Win ] fast/webgl/canvas-toDataURL-crash.html [ Slow ]
@@ -639,7 +611,6 @@
 crbug.com/874695 [ Mac Release ] http/tests/images/webp-progressive-load.html [ Slow ]
 crbug.com/874695 [ Release Win ] http/tests/images/webp-progressive-load.html [ Slow ]
 crbug.com/874695 [ Linux ] http/tests/media/controls/toggle-class-with-state-source-buffer.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] http/tests/media/controls/toggle-class-with-state-source-buffer.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] http/tests/media/controls/toggle-class-with-state-source-buffer.html [ Slow ]
 crbug.com/874695 [ Mac11-arm64 Release ] http/tests/media/controls/toggle-class-with-state-source-buffer.html [ Slow ]
 crbug.com/874695 [ Mac12 Release ] http/tests/media/controls/toggle-class-with-state-source-buffer.html [ Slow ]
@@ -718,12 +689,10 @@
 crbug.com/874695 pointer-lock/locked-element-iframe-removed-from-dom.html [ Slow ]
 crbug.com/874695 [ Debug Linux ] printing/webgl-oversized-printing.html [ Slow ]
 crbug.com/874695 [ Linux Release ] printing/webgl-oversized-printing.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] printing/webgl-oversized-printing.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] printing/webgl-oversized-printing.html [ Slow ]
 crbug.com/874695 [ Mac12 Release ] printing/webgl-oversized-printing.html [ Slow ]
 crbug.com/874695 virtual/android/fullscreen/video-specified-size.html [ Slow ]
 crbug.com/874695 [ Linux ] virtual/display-compositor-pixel-dump/fast/canvas/display-compositor-pixel-dump/OffscreenCanvas-opaque-background-compositing.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] virtual/display-compositor-pixel-dump/fast/canvas/display-compositor-pixel-dump/OffscreenCanvas-opaque-background-compositing.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] virtual/display-compositor-pixel-dump/fast/canvas/display-compositor-pixel-dump/OffscreenCanvas-opaque-background-compositing.html [ Slow ]
 crbug.com/874695 [ Mac12 ] virtual/display-compositor-pixel-dump/fast/canvas/display-compositor-pixel-dump/OffscreenCanvas-opaque-background-compositing.html [ Slow ]
 crbug.com/874695 [ Mac12-arm64 Release ] virtual/display-compositor-pixel-dump/fast/canvas/display-compositor-pixel-dump/OffscreenCanvas-opaque-background-compositing.html [ Slow ]
@@ -747,17 +716,14 @@
 crbug.com/874695 [ Release ] virtual/stable/http/tests/navigation/new-window-redirect-history.html [ Slow ]
 crbug.com/874695 [ Debug Linux ] virtual/stable/media/stable/video-object-fit-stable.html [ Slow ]
 crbug.com/874695 [ Linux Release ] virtual/stable/media/stable/video-object-fit-stable.html [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] virtual/stable/media/stable/video-object-fit-stable.html [ Slow ]
 crbug.com/874695 [ Mac11 Release ] virtual/stable/media/stable/video-object-fit-stable.html [ Slow ]
 crbug.com/874695 [ Mac12 Release ] virtual/stable/media/stable/video-object-fit-stable.html [ Slow ]
-crbug.com/874695 [ Mac12-arm64 Release ] virtual/stable/media/stable/video-object-fit-stable.html [ Slow ]
 crbug.com/874695 [ Mac13 Release ] virtual/stable/media/stable/video-object-fit-stable.html [ Slow ]
 crbug.com/874695 [ Release Win ] virtual/stable/media/stable/video-object-fit-stable.html [ Slow ]
 crbug.com/874695 virtual/scalefactor200/css3/filters/effect-reference-zoom-hw.html [ Slow ]
 crbug.com/874695 virtual/threaded/fast/idle-callback/idle_periods.html [ Slow ]
 crbug.com/874695 virtual/threaded/fast/idle-callback/long_idle_periods.html [ Slow ]
 crbug.com/874695 [ Linux ] virtual/threaded/http/tests/devtools/tracing/timeline-layout/timeline-layout-with-invalidations.js [ Slow ]
-crbug.com/874695 [ Mac10.15 Release ] virtual/threaded/http/tests/devtools/tracing/timeline-layout/timeline-layout-with-invalidations.js [ Slow ]
 crbug.com/874695 [ Mac11 Release ] virtual/threaded/http/tests/devtools/tracing/timeline-layout/timeline-layout-with-invalidations.js [ Slow ]
 crbug.com/874695 [ Mac12 ] virtual/threaded/http/tests/devtools/tracing/timeline-layout/timeline-layout-with-invalidations.js [ Slow ]
 crbug.com/874695 [ Release Win ] virtual/threaded/http/tests/devtools/tracing/timeline-layout/timeline-layout-with-invalidations.js [ Slow ]
@@ -765,7 +731,9 @@
 crbug.com/1494075 virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchpad-zoom-in-slow.html [ Slow ]
 crbug.com/1494075 virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchpad-zoom-out-slow.html [ Slow ]
 crbug.com/871139 virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-in-slow-desktop.html [ Slow ]
-crbug.com/871139 virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-in-slow.html [ Slow ]
+crbug.com/871139 [ Linux ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-in-slow.html [ Slow ]
+crbug.com/871139 [ Mac ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-in-slow.html [ Slow ]
+crbug.com/871139 [ Release Win ] virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-in-slow.html [ Slow ]
 crbug.com/871139 virtual/threaded/synthetic_gestures/synthetic-pinch-zoom-gesture-touchscreen-zoom-out-slow.html [ Slow ]
 
 crbug.com/868956 virtual/gpu/fast/canvas/canvas-composite-video-shadow.html [ Slow ]
@@ -784,7 +752,6 @@
 
 crbug.com/983642 [ Debug ] virtual/gpu/fast/canvas/canvas-composite-alpha.html [ Slow ]
 crbug.com/983642 [ Linux Release ] virtual/gpu/fast/canvas/canvas-composite-alpha.html [ Slow ]
-crbug.com/983642 [ Mac10.15 Release ] virtual/gpu/fast/canvas/canvas-composite-alpha.html [ Slow ]
 crbug.com/983642 [ Mac11 Release ] virtual/gpu/fast/canvas/canvas-composite-alpha.html [ Slow ]
 crbug.com/983642 [ Mac12 Release ] virtual/gpu/fast/canvas/canvas-composite-alpha.html [ Slow ]
 crbug.com/983642 [ Release Win ] virtual/gpu/fast/canvas/canvas-composite-alpha.html [ Slow ]
@@ -808,93 +775,76 @@
 crbug.com/1066517 http/tests/websocket/workers/worker-reload.html [ Slow ]
 
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-auto-auto-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-auto-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-auto-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-auto-auto-no-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-auto-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-auto-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-auto-fixed-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-auto-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-auto-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-auto-fixed-no-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-fixed-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-fixed-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-auto-fixed-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-auto-fixed-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-auto-percentage-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-auto-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-auto-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-auto-percentage-no-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-percentage-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-auto-percentage-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-auto-percentage-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-auto-percentage-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-fixed-auto-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-fixed-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-fixed-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-fixed-auto-no-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-fixed-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-fixed-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-fixed-fixed-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-fixed-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-fixed-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-fixed-fixed-no-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-fixed-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-fixed-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-fixed-fixed-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-fixed-fixed-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-fixed-percentage-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-fixed-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-fixed-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-fixed-percentage-no-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-percentage-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-fixed-percentage-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-fixed-percentage-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-fixed-percentage-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-percentage-auto-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-percentage-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-percentage-auto-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Debug Linux ] svg/as-object/sizing/svg-in-object-placeholder-percentage-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-auto-no-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-percentage-auto-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-no-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-no-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-no-intrinsic-ratio.html [ Slow ]
+crbug.com/1091716 [ Release Win10.20h2 ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-no-intrinsic-ratio.html [ Slow ]
+crbug.com/1091716 [ Release Win11 ] svg/as-object/sizing/svg-in-object-placeholder-percentage-fixed-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-percentage-percentage-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-percentage-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-percentage-percentage-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Linux ] svg/as-object/sizing/svg-in-object-placeholder-percentage-percentage-no-intrinsic-ratio.html [ Slow ]
-crbug.com/1091716 [ Mac10.15 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-percentage-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac11 Release ] svg/as-object/sizing/svg-in-object-placeholder-percentage-percentage-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Mac12 ] svg/as-object/sizing/svg-in-object-placeholder-percentage-percentage-no-intrinsic-ratio.html [ Slow ]
 crbug.com/1091716 [ Release Win ] svg/as-object/sizing/svg-in-object-placeholder-percentage-percentage-no-intrinsic-ratio.html [ Slow ]
@@ -906,7 +856,6 @@
 crbug.com/1093849 external/wpt/dom/nodes/Element-classlist.html [ Slow ]
 crbug.com/1093853 [ Debug ] external/wpt/dom/ranges/Range-surroundContents.html [ Slow ]
 crbug.com/1093853 [ Linux Release ] external/wpt/dom/ranges/Range-surroundContents.html [ Slow ]
-crbug.com/1093853 [ Mac10.15 Release ] external/wpt/dom/ranges/Range-surroundContents.html [ Slow ]
 crbug.com/1093853 [ Mac11 Release ] external/wpt/dom/ranges/Range-surroundContents.html [ Slow ]
 crbug.com/1093853 [ Mac12 Release ] external/wpt/dom/ranges/Range-surroundContents.html [ Slow ]
 crbug.com/1093853 [ Release Win ] external/wpt/dom/ranges/Range-surroundContents.html [ Slow ]
@@ -932,7 +881,6 @@
 crbug.com/983788 [ Release ] http/tests/cookies/same-site/popup-cross-site.https.html [ Slow ]
 crbug.com/1049641 [ Debug ] http/tests/devtools/sources/debugger/debugger-disable-enable.js [ Slow ]
 crbug.com/1049641 [ Linux Release ] http/tests/devtools/sources/debugger/debugger-disable-enable.js [ Slow ]
-crbug.com/1049641 [ Mac10.15 Release ] http/tests/devtools/sources/debugger/debugger-disable-enable.js [ Slow ]
 crbug.com/1049641 [ Mac11 Release ] http/tests/devtools/sources/debugger/debugger-disable-enable.js [ Slow ]
 crbug.com/1049641 [ Mac12 Release ] http/tests/devtools/sources/debugger/debugger-disable-enable.js [ Slow ]
 crbug.com/1049641 [ Release Win ] http/tests/devtools/sources/debugger/debugger-disable-enable.js [ Slow ]
@@ -942,7 +890,6 @@
 crbug.com/626703 [ Mac Release ] external/wpt/infrastructure/testdriver/actions/pause.html [ Slow ]
 crbug.com/626703 external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-iframe-messagechannel.https.html [ Slow ]
 crbug.com/982116 [ Linux ] http/tests/devtools/elements/styles-4/styles-new-API.js [ Slow ]
-crbug.com/982116 [ Mac10.15 Release ] http/tests/devtools/elements/styles-4/styles-new-API.js [ Slow ]
 crbug.com/982116 [ Mac11 Release ] http/tests/devtools/elements/styles-4/styles-new-API.js [ Slow ]
 crbug.com/982116 [ Mac12 ] http/tests/devtools/elements/styles-4/styles-new-API.js [ Slow ]
 crbug.com/982116 [ Release Win ] http/tests/devtools/elements/styles-4/styles-new-API.js [ Slow ]
@@ -953,7 +900,6 @@
 crbug.com/799619 [ Debug ] http/tests/devtools/profiler/heap-snapshot-inspect-dom-wrapper.js [ Slow ]
 ###crbug.com/849979 media/video-layer-crash.html [ Slow ]
 crbug.com/831673 [ Linux ] http/tests/devtools/reveal-objects.js [ Slow ]
-crbug.com/831673 [ Mac10.15 Release ] http/tests/devtools/reveal-objects.js [ Slow ]
 crbug.com/831673 [ Mac11 Release ] http/tests/devtools/reveal-objects.js [ Slow ]
 crbug.com/831673 [ Mac12 ] http/tests/devtools/reveal-objects.js [ Slow ]
 crbug.com/831673 [ Mac12-arm64 Release ] http/tests/devtools/reveal-objects.js [ Slow ]
@@ -962,37 +908,31 @@
 crbug.com/1064522 external/wpt/html/user-activation/propagation-crossorigin.sub.html [ Slow ]
 crbug.com/863599 [ Debug Linux ] external/wpt/requestidlecallback/callback-iframe.html [ Slow ]
 crbug.com/869364 [ Linux ] http/tests/devtools/console/console-correct-suggestions.js [ Slow ]
-crbug.com/869364 [ Mac10.15 Release ] http/tests/devtools/console/console-correct-suggestions.js [ Slow ]
 crbug.com/869364 [ Mac11 Release ] http/tests/devtools/console/console-correct-suggestions.js [ Slow ]
 crbug.com/869364 [ Mac12 ] http/tests/devtools/console/console-correct-suggestions.js [ Slow ]
 crbug.com/869364 [ Release Win ] http/tests/devtools/console/console-correct-suggestions.js [ Slow ]
-crbug.com/886566 [ Mac10.15 Release ] http/tests/csspaint/invalidation-background-image.html [ Slow ]
 crbug.com/886566 [ Mac11 Release ] http/tests/csspaint/invalidation-background-image.html [ Slow ]
 crbug.com/886566 [ Mac12 ] http/tests/csspaint/invalidation-background-image.html [ Slow ]
-crbug.com/886566 [ Mac12-arm64 Release ] http/tests/csspaint/invalidation-background-image.html [ Slow ]
 crbug.com/886566 [ Linux ] http/tests/csspaint/invalidation-content-image.html [ Slow ]
-crbug.com/886566 [ Mac10.15 Release ] http/tests/csspaint/invalidation-content-image.html [ Slow ]
 crbug.com/886566 [ Mac11 Release ] http/tests/csspaint/invalidation-content-image.html [ Slow ]
 crbug.com/886566 [ Mac12 ] http/tests/csspaint/invalidation-content-image.html [ Slow ]
 crbug.com/886566 [ Mac12-arm64 Release ] http/tests/csspaint/invalidation-content-image.html [ Slow ]
 crbug.com/886566 [ Release Win ] http/tests/csspaint/invalidation-content-image.html [ Slow ]
 crbug.com/907412 [ Linux ] external/wpt/domxpath/xml_xpath_runner.html [ Slow ]
-crbug.com/907412 [ Mac10.15 Release ] external/wpt/domxpath/xml_xpath_runner.html [ Slow ]
 crbug.com/907412 [ Mac11 Release ] external/wpt/domxpath/xml_xpath_runner.html [ Slow ]
 crbug.com/907412 [ Mac12 ] external/wpt/domxpath/xml_xpath_runner.html [ Slow ]
-crbug.com/907412 [ Release Win ] external/wpt/domxpath/xml_xpath_runner.html [ Slow ]
+crbug.com/907412 [ Release Win10.20h2 ] external/wpt/domxpath/xml_xpath_runner.html [ Slow ]
+crbug.com/907412 [ Release Win11 ] external/wpt/domxpath/xml_xpath_runner.html [ Slow ]
 crbug.com/945774 external/wpt/content-security-policy/frame-ancestors/frame-ancestors-nested-cross-in-same-star-allow.html [ Slow ]
 crbug.com/946714 [ Release ] http/tests/devtools/elements/styles-4/styles-live-locations-leak.js [ Slow ]
 crbug.com/947383 inspector-protocol/css/reattach-after-editing-styles.js [ Slow ]
 crbug.com/949167 external/wpt/html/semantics/links/links-created-by-a-and-area-elements/target_blank_implicit_noopener.html [ Slow ]
 crbug.com/949207 external/wpt/html/semantics/links/links-created-by-a-and-area-elements/target_blank_implicit_noopener_base.html [ Slow ]
 crbug.com/959002 crbug.com/959042 [ Linux ] http/tests/devtools/elements/styles-3/style-autocomplete.js [ Slow ]
-crbug.com/959002 crbug.com/959042 [ Mac10.15 Release ] http/tests/devtools/elements/styles-3/style-autocomplete.js [ Slow ]
 crbug.com/959002 crbug.com/959042 [ Mac11 Release ] http/tests/devtools/elements/styles-3/style-autocomplete.js [ Slow ]
 crbug.com/959002 crbug.com/959042 [ Mac12 ] http/tests/devtools/elements/styles-3/style-autocomplete.js [ Slow ]
 crbug.com/959002 crbug.com/959042 [ Release Win ] http/tests/devtools/elements/styles-3/style-autocomplete.js [ Slow ]
 crbug.com/959002 crbug.com/959042 [ Linux ] http/tests/devtools/elements/styles-4/styles-keyframes.js [ Slow ]
-crbug.com/959002 crbug.com/959042 [ Mac10.15 Release ] http/tests/devtools/elements/styles-4/styles-keyframes.js [ Slow ]
 crbug.com/959002 crbug.com/959042 [ Mac11 Release ] http/tests/devtools/elements/styles-4/styles-keyframes.js [ Slow ]
 crbug.com/959002 crbug.com/959042 [ Mac12 ] http/tests/devtools/elements/styles-4/styles-keyframes.js [ Slow ]
 crbug.com/959002 crbug.com/959042 [ Release Win ] http/tests/devtools/elements/styles-4/styles-keyframes.js [ Slow ]
@@ -1007,7 +947,6 @@
 crbug.com/982290 [ Win ] http/tests/devtools/elements/styles-4/styles-do-not-detach-sourcemap-on-edits.js [ Slow ]
 crbug.com/986477 [ Win ] external/wpt/cookies/path/match.html [ Slow ]
 crbug.com/991243 [ Linux ] external/wpt/workers/semantics/multiple-workers/003.html [ Slow ]
-crbug.com/999799 [ Mac10.15 Release ] external/wpt/html/rendering/dimension-attributes.html [ Slow ]
 crbug.com/999799 [ Mac11 Release ] external/wpt/html/rendering/dimension-attributes.html [ Slow ]
 crbug.com/999799 [ Mac12 ] external/wpt/html/rendering/dimension-attributes.html [ Slow ]
 crbug.com/999799 [ Linux ] external/wpt/html/rendering/dimension-attributes.html [ Slow ]
@@ -1016,10 +955,8 @@
 crbug.com/1017626 [ Linux ] external/wpt/compat/idlharness.window.html [ Slow ]
 crbug.com/1019662 external/wpt/html/dom/idlharness.worker.html [ Slow ]
 crbug.com/1032451 virtual/threaded-no-composited-antialiasing/animations/stability/animation-iteration-event-destroy-renderer.html [ Slow ]
-crbug.com/1026712 [ Mac10.15 Release ] fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html [ Slow ]
 crbug.com/1026712 [ Mac11 Release ] fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html [ Slow ]
 crbug.com/1026712 [ Mac12 ] fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer-hour.html [ Slow ]
-crbug.com/1026712 [ Mac10.15 Release ] fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer.html [ Slow ]
 crbug.com/1026712 [ Mac11 Release ] fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer.html [ Slow ]
 crbug.com/1026712 [ Mac12 ] fast/forms/time-multiple-fields/time-multiple-fields-stepup-stepdown-from-renderer.html [ Slow ]
 crbug.com/1044715 [ Win ] external/wpt/pointerevents/pointerevent_touch-action-pan-right-css_touch.html [ Slow ]
@@ -1030,28 +967,22 @@
 crbug.com/1044715 [ Linux ] external/wpt/pointerevents/pointerevent_touch-action-inherit_child-pan-x-child-pan-x_touch.html [ Slow ]
 crbug.com/1479003 [ Mac ] external/wpt/pointerevents/coalesced_events_attributes_under_load.https.html?mouse [ Slow ]
 crbug.com/1479003 [ Mac ] external/wpt/pointerevents/coalesced_events_attributes_under_load.https.html?pen [ Slow ]
-crbug.com/1479003 [ Mac ] external/wpt/pointerevents/coalesced_events_attributes_under_load.https.html?touch [ Slow ]
 crbug.com/1043396 [ Linux ] http/tests/devtools/network/network-eventsource.js [ Slow ]
-crbug.com/1043396 [ Mac10.15 Release ] http/tests/devtools/network/network-eventsource.js [ Slow ]
 crbug.com/1043396 [ Mac11 Release ] http/tests/devtools/network/network-eventsource.js [ Slow ]
 crbug.com/1043396 [ Mac12 ] http/tests/devtools/network/network-eventsource.js [ Slow ]
 crbug.com/1043396 [ Release Win ] http/tests/devtools/network/network-eventsource.js [ Slow ]
 crbug.com/1043381 [ Release Win ] http/tests/devtools/elements/highlight/highlight-node-scroll.js [ Slow ]
-crbug.com/1043381 [ Mac10.15 Release ] http/tests/devtools/elements/highlight/highlight-node-scroll.js [ Slow ]
 crbug.com/1043381 [ Mac11 Release ] http/tests/devtools/elements/highlight/highlight-node-scroll.js [ Slow ]
 crbug.com/1043381 [ Mac12 Release ] http/tests/devtools/elements/highlight/highlight-node-scroll.js [ Slow ]
 crbug.com/1043356 [ Linux Release ] http/tests/devtools/elements/styles-4/keyframes-source-offsets.js [ Slow ]
-crbug.com/1043356 [ Mac10.15 Release ] http/tests/devtools/elements/styles-4/keyframes-source-offsets.js [ Slow ]
 crbug.com/1043356 [ Mac11 Release ] http/tests/devtools/elements/styles-4/keyframes-source-offsets.js [ Slow ]
 crbug.com/1043356 [ Mac12 Release ] http/tests/devtools/elements/styles-4/keyframes-source-offsets.js [ Slow ]
 crbug.com/1043356 [ Release Win ] http/tests/devtools/elements/styles-4/keyframes-source-offsets.js [ Slow ]
 crbug.com/1043354 [ Linux Release ] http/tests/devtools/service-workers/service-worker-pause.js [ Slow ]
-crbug.com/1043354 [ Mac10.15 Release ] http/tests/devtools/service-workers/service-worker-pause.js [ Slow ]
 crbug.com/1043354 [ Mac11 Release ] http/tests/devtools/service-workers/service-worker-pause.js [ Slow ]
 crbug.com/1043354 [ Mac12 Release ] http/tests/devtools/service-workers/service-worker-pause.js [ Slow ]
 crbug.com/1043354 [ Release Win ] http/tests/devtools/service-workers/service-worker-pause.js [ Slow ]
 crbug.com/1043350 [ Linux Release ] http/tests/devtools/elements/edit/set-attribute.js [ Slow ]
-crbug.com/1043350 [ Mac10.15 Release ] http/tests/devtools/elements/edit/set-attribute.js [ Slow ]
 crbug.com/1043350 [ Mac11 Release ] http/tests/devtools/elements/edit/set-attribute.js [ Slow ]
 crbug.com/1043350 [ Mac12 Release ] http/tests/devtools/elements/edit/set-attribute.js [ Slow ]
 crbug.com/1043350 [ Release Win ] http/tests/devtools/elements/edit/set-attribute.js [ Slow ]
@@ -1059,261 +990,210 @@
 crbug.com/1043310 [ Mac11 Release ] external/wpt/css/cssom-view/idlharness.html [ Slow ]
 crbug.com/1043310 [ Mac12 Release ] external/wpt/css/cssom-view/idlharness.html [ Slow ]
 crbug.com/1043285 [ Linux Release ] http/tests/devtools/elements/styles/selector-line.js [ Slow ]
-crbug.com/1043285 [ Mac10.15 Release ] http/tests/devtools/elements/styles/selector-line.js [ Slow ]
 crbug.com/1043285 [ Mac11 Release ] http/tests/devtools/elements/styles/selector-line.js [ Slow ]
 crbug.com/1043285 [ Mac12 Release ] http/tests/devtools/elements/styles/selector-line.js [ Slow ]
 crbug.com/1043285 [ Release Win ] http/tests/devtools/elements/styles/selector-line.js [ Slow ]
 crbug.com/1043453 [ Release Win ] virtual/threaded/external/wpt/css/css-animations/idlharness.html [ Slow ]
 crbug.com/1043453 [ Mac Release ] virtual/threaded/external/wpt/css/css-animations/idlharness.html [ Slow ]
 crbug.com/1043454 [ Linux Release ] http/tests/devtools/console-xhr-logging-async.js [ Slow ]
-crbug.com/1043454 [ Mac10.15 Release ] http/tests/devtools/console-xhr-logging-async.js [ Slow ]
 crbug.com/1043454 [ Mac11 Release ] http/tests/devtools/console-xhr-logging-async.js [ Slow ]
 crbug.com/1043454 [ Mac12 Release ] http/tests/devtools/console-xhr-logging-async.js [ Slow ]
 crbug.com/1043454 [ Release Win ] http/tests/devtools/console-xhr-logging-async.js [ Slow ]
 crbug.com/1043792 [ Release Win ] http/tests/devtools/template-content-inspect-crash.js [ Slow ]
-crbug.com/1043792 [ Mac10.15 Release ] http/tests/devtools/template-content-inspect-crash.js [ Slow ]
 crbug.com/1043792 [ Mac11 Release ] http/tests/devtools/template-content-inspect-crash.js [ Slow ]
 crbug.com/1043792 [ Mac12 Release ] http/tests/devtools/template-content-inspect-crash.js [ Slow ]
 crbug.com/1043920 [ Release Win ] http/tests/devtools/stylesheet-source-mapping.js [ Slow ]
-crbug.com/1043920 [ Mac10.15 Release ] http/tests/devtools/stylesheet-source-mapping.js [ Slow ]
 crbug.com/1043920 [ Mac11 Release ] http/tests/devtools/stylesheet-source-mapping.js [ Slow ]
 crbug.com/1043920 [ Mac12 Release ] http/tests/devtools/stylesheet-source-mapping.js [ Slow ]
 crbug.com/1044350 [ Linux Release ] http/tests/devtools/network/network-xhr-replay.js [ Slow ]
-crbug.com/1044350 [ Mac10.15 Release ] http/tests/devtools/network/network-xhr-replay.js [ Slow ]
 crbug.com/1044350 [ Mac11 Release ] http/tests/devtools/network/network-xhr-replay.js [ Slow ]
 crbug.com/1044350 [ Mac12 Release ] http/tests/devtools/network/network-xhr-replay.js [ Slow ]
 crbug.com/1044350 [ Release Win ] http/tests/devtools/network/network-xhr-replay.js [ Slow ]
 crbug.com/1044414 [ Linux Release ] http/tests/devtools/elements/styles/selector-line-sourcemap-header.js [ Slow ]
-crbug.com/1044414 [ Mac10.15 Release ] http/tests/devtools/elements/styles/selector-line-sourcemap-header.js [ Slow ]
 crbug.com/1044414 [ Mac11 Release ] http/tests/devtools/elements/styles/selector-line-sourcemap-header.js [ Slow ]
 crbug.com/1044414 [ Mac12 Release ] http/tests/devtools/elements/styles/selector-line-sourcemap-header.js [ Slow ]
 crbug.com/1044414 [ Release Win ] http/tests/devtools/elements/styles/selector-line-sourcemap-header.js [ Slow ]
 crbug.com/1044415 [ Linux Release ] http/tests/devtools/runtime/evaluate-without-side-effects.js [ Slow ]
-crbug.com/1044415 [ Mac10.15 Release ] http/tests/devtools/runtime/evaluate-without-side-effects.js [ Slow ]
 crbug.com/1044415 [ Mac11 Release ] http/tests/devtools/runtime/evaluate-without-side-effects.js [ Slow ]
 crbug.com/1044415 [ Mac12 Release ] http/tests/devtools/runtime/evaluate-without-side-effects.js [ Slow ]
 crbug.com/1044415 [ Release Win ] http/tests/devtools/runtime/evaluate-without-side-effects.js [ Slow ]
 crbug.com/1044425 [ Linux Release ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-1.js [ Slow ]
-crbug.com/1044425 [ Mac10.15 Release ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-1.js [ Slow ]
 crbug.com/1044425 [ Mac11 Release ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-1.js [ Slow ]
 crbug.com/1044425 [ Mac12 Release ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-1.js [ Slow ]
 crbug.com/1044425 [ Release Win ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-1.js [ Slow ]
 crbug.com/1044429 [ Linux Release ] http/tests/devtools/oopif/oopif-navigator.js [ Slow ]
-crbug.com/1044429 [ Mac10.15 Release ] http/tests/devtools/oopif/oopif-navigator.js [ Slow ]
 crbug.com/1044429 [ Mac11 Release ] http/tests/devtools/oopif/oopif-navigator.js [ Slow ]
 crbug.com/1044429 [ Mac12 Release ] http/tests/devtools/oopif/oopif-navigator.js [ Slow ]
 crbug.com/1044429 [ Release Win ] http/tests/devtools/oopif/oopif-navigator.js [ Slow ]
 crbug.com/1044459 [ Linux Release ] http/tests/devtools/elements/edit/set-outer-html-for-xhtml.js [ Slow ]
-crbug.com/1044459 [ Mac10.15 Release ] http/tests/devtools/elements/edit/set-outer-html-for-xhtml.js [ Slow ]
 crbug.com/1044459 [ Mac11 Release ] http/tests/devtools/elements/edit/set-outer-html-for-xhtml.js [ Slow ]
 crbug.com/1044459 [ Mac12 Release ] http/tests/devtools/elements/edit/set-outer-html-for-xhtml.js [ Slow ]
 crbug.com/1044459 [ Release Win ] http/tests/devtools/elements/edit/set-outer-html-for-xhtml.js [ Slow ]
 crbug.com/1044516 [ Linux Release ] http/tests/devtools/elements/edit/undo-set-outer-html-2.js [ Slow ]
-crbug.com/1044516 [ Mac10.15 Release ] http/tests/devtools/elements/edit/undo-set-outer-html-2.js [ Slow ]
 crbug.com/1044516 [ Mac11 Release ] http/tests/devtools/elements/edit/undo-set-outer-html-2.js [ Slow ]
 crbug.com/1044516 [ Mac12 Release ] http/tests/devtools/elements/edit/undo-set-outer-html-2.js [ Slow ]
 crbug.com/1044516 [ Release Win ] http/tests/devtools/elements/edit/undo-set-outer-html-2.js [ Slow ]
 crbug.com/1044518 [ Release Win ] http/tests/devtools/bindings/suspendtarget-navigator.js [ Slow ]
-crbug.com/1044518 [ Mac10.15 Release ] http/tests/devtools/bindings/suspendtarget-navigator.js [ Slow ]
 crbug.com/1044518 [ Mac11 Release ] http/tests/devtools/bindings/suspendtarget-navigator.js [ Slow ]
 crbug.com/1044518 [ Mac12 Release ] http/tests/devtools/bindings/suspendtarget-navigator.js [ Slow ]
 crbug.com/1044544 [ Linux Release ] http/tests/devtools/network/network-disable-cache-preloads-twice.js [ Slow ]
-crbug.com/1044544 [ Mac10.15 Release ] http/tests/devtools/network/network-disable-cache-preloads-twice.js [ Slow ]
 crbug.com/1044544 [ Mac11 Release ] http/tests/devtools/network/network-disable-cache-preloads-twice.js [ Slow ]
 crbug.com/1044544 [ Mac12 Release ] http/tests/devtools/network/network-disable-cache-preloads-twice.js [ Slow ]
 crbug.com/1044544 [ Release Win ] http/tests/devtools/network/network-disable-cache-preloads-twice.js [ Slow ]
 crbug.com/1044545 [ Linux Release ] http/tests/devtools/service-workers/service-workers-bypass-for-network-cors.js [ Slow ]
-crbug.com/1044545 [ Mac10.15 Release ] http/tests/devtools/service-workers/service-workers-bypass-for-network-cors.js [ Slow ]
 crbug.com/1044545 [ Mac11 Release ] http/tests/devtools/service-workers/service-workers-bypass-for-network-cors.js [ Slow ]
 crbug.com/1044545 [ Mac12 Release ] http/tests/devtools/service-workers/service-workers-bypass-for-network-cors.js [ Slow ]
 crbug.com/1044545 [ Release Win ] http/tests/devtools/service-workers/service-workers-bypass-for-network-cors.js [ Slow ]
 crbug.com/1044561 [ Linux Release ] http/tests/devtools/elements/styles/show-all-properties.js [ Slow ]
-crbug.com/1044561 [ Mac10.15 Release ] http/tests/devtools/elements/styles/show-all-properties.js [ Slow ]
 crbug.com/1044561 [ Mac11 Release ] http/tests/devtools/elements/styles/show-all-properties.js [ Slow ]
 crbug.com/1044561 [ Mac12 Release ] http/tests/devtools/elements/styles/show-all-properties.js [ Slow ]
 crbug.com/1044561 [ Release Win ] http/tests/devtools/elements/styles/show-all-properties.js [ Slow ]
 crbug.com/1044562 [ Release Win ] http/tests/devtools/modify-cross-domain-rule.js [ Slow ]
-crbug.com/1044562 [ Mac10.15 Release ] http/tests/devtools/modify-cross-domain-rule.js [ Slow ]
 crbug.com/1044562 [ Mac11 Release ] http/tests/devtools/modify-cross-domain-rule.js [ Slow ]
 crbug.com/1044562 [ Mac12 Release ] http/tests/devtools/modify-cross-domain-rule.js [ Slow ]
 crbug.com/1044563 [ Linux Release ] http/tests/devtools/background-services/background-services-panel.js [ Slow ]
-crbug.com/1044563 [ Mac10.15 Release ] http/tests/devtools/background-services/background-services-panel.js [ Slow ]
 crbug.com/1044563 [ Mac11 Release ] http/tests/devtools/background-services/background-services-panel.js [ Slow ]
 crbug.com/1044563 [ Mac12 Release ] http/tests/devtools/background-services/background-services-panel.js [ Slow ]
 crbug.com/1044563 [ Release Win ] http/tests/devtools/background-services/background-services-panel.js [ Slow ]
 crbug.com/1044822 [ Linux Release ] http/tests/devtools/cache-storage/cache-entry-deletion.js [ Slow ]
-crbug.com/1044822 [ Mac10.15 Release ] http/tests/devtools/cache-storage/cache-entry-deletion.js [ Slow ]
 crbug.com/1044822 [ Mac11 Release ] http/tests/devtools/cache-storage/cache-entry-deletion.js [ Slow ]
 crbug.com/1044822 [ Mac12 Release ] http/tests/devtools/cache-storage/cache-entry-deletion.js [ Slow ]
 crbug.com/1044822 [ Release Win ] http/tests/devtools/cache-storage/cache-entry-deletion.js [ Slow ]
 crbug.com/1044823 [ Linux ] http/tests/devtools/extensions/extensions-resources.js [ Slow ]
-crbug.com/1044823 [ Mac10.15 Release ] http/tests/devtools/extensions/extensions-resources.js [ Slow ]
 crbug.com/1044823 [ Mac11 Release ] http/tests/devtools/extensions/extensions-resources.js [ Slow ]
 crbug.com/1044823 [ Mac12 ] http/tests/devtools/extensions/extensions-resources.js [ Slow ]
 crbug.com/1044823 [ Release Win ] http/tests/devtools/extensions/extensions-resources.js [ Slow ]
 crbug.com/1044823 [ Debug ] http/tests/devtools/extensions/extensions-timeline-api.js [ Slow ]
 crbug.com/1044823 [ Linux Release ] http/tests/devtools/extensions/extensions-timeline-api.js [ Slow ]
-crbug.com/1044823 [ Mac10.15 Release ] http/tests/devtools/extensions/extensions-timeline-api.js [ Slow ]
 crbug.com/1044823 [ Mac11 Release ] http/tests/devtools/extensions/extensions-timeline-api.js [ Slow ]
 crbug.com/1044823 [ Mac12 Release ] http/tests/devtools/extensions/extensions-timeline-api.js [ Slow ]
 crbug.com/1044823 [ Release Win ] http/tests/devtools/extensions/extensions-timeline-api.js [ Slow ]
 crbug.com/1044829 [ Release Win ] http/tests/devtools/cache-storage/cache-deletion.js [ Slow ]
-crbug.com/1044829 [ Mac10.15 Release ] http/tests/devtools/cache-storage/cache-deletion.js [ Slow ]
 crbug.com/1044829 [ Mac11 Release ] http/tests/devtools/cache-storage/cache-deletion.js [ Slow ]
 crbug.com/1044829 [ Mac12 Release ] http/tests/devtools/cache-storage/cache-deletion.js [ Slow ]
 crbug.com/1043901 [ Release Win ] external/wpt/preload/preload-with-type.html [ Slow ]
-crbug.com/1044418 [ Mac10.15 Release ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Slow ]
 crbug.com/1044418 [ Mac11 Release ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Slow ]
 crbug.com/1044418 [ Mac12 Release ] http/tests/devtools/elements/shadow/elements-panel-shadow-selection-on-refresh-2.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/styles-4/styles-formatting.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/styles-4/styles-formatting.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/styles-4/styles-formatting.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/styles-4/styles-formatting.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/styles-4/styles-formatting.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/search/search-in-sourcemap.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/search/search-in-sourcemap.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/search/search-in-sourcemap.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/search/search-in-sourcemap.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/search/search-in-sourcemap.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/styles-1/edit-inspector-stylesheet.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/animation/animation-after-navigation.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/animation/animation-after-navigation.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/animation/animation-after-navigation.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/animation/animation-after-navigation.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/animation/animation-after-navigation.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/search/search-in-script.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/search/search-in-script.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/search/search-in-script.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/search/search-in-script.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/search/search-in-script.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/service-workers/service-worker-network-fetch-blocked.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/fragment.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/fragment.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/fragment.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/fragment.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/fragment.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/coverage/coverage-view.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/coverage/coverage-view.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/coverage/coverage-view.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/coverage/coverage-view.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/coverage/coverage-view.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/edit/set-outer-html-body.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/edit/set-outer-html-body.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/edit/set-outer-html-body.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/edit/set-outer-html-body.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/edit/set-outer-html-body.js [ Slow ]
 crbug.com/1046784 [ Debug ] http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Slow ]
 crbug.com/1046784 [ Linux Release ] http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Slow ]
 crbug.com/1046784 [ Mac12 Release ] http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/styles-1/add-new-rule-inline-style-csp.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/styles-3/styles-disable-then-enable-overriden-ua.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/styles-3/styles-disable-then-enable-overriden-ua.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/styles-3/styles-disable-then-enable-overriden-ua.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/styles-3/styles-disable-then-enable-overriden-ua.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/styles-3/styles-disable-then-enable-overriden-ua.js [ Slow ]
 crbug.com/1046784 [ Debug ] http/tests/devtools/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.js [ Slow ]
 crbug.com/1046784 [ Linux Release ] http/tests/devtools/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.js [ Slow ]
 crbug.com/1046784 [ Mac12 Release ] http/tests/devtools/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/styles-4/styles-inline-element-style-changes-should-not-force-style-recalc.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/styles-3/styles-add-invalid-property.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/styles-3/styles-add-invalid-property.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/styles-3/styles-add-invalid-property.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/styles-3/styles-add-invalid-property.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/styles-3/styles-add-invalid-property.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/resolve-node-blocked.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/resolve-node-blocked.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/resolve-node-blocked.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/resolve-node-blocked.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/resolve-node-blocked.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/animation/animation-group-matching-transitions.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/animation/animation-group-matching-transitions.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/animation/animation-group-matching-transitions.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/animation/animation-group-matching-transitions.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/animation/animation-group-matching-transitions.js [ Slow ]
 crbug.com/1046784 [ Debug ] http/tests/devtools/storage-panel-dom-storage.js [ Slow ]
 crbug.com/1046784 [ Linux Release ] http/tests/devtools/storage-panel-dom-storage.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/storage-panel-dom-storage.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/storage-panel-dom-storage.js [ Slow ]
 crbug.com/1046784 [ Mac12 Release ] http/tests/devtools/storage-panel-dom-storage.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/storage-panel-dom-storage.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/event-listener-sidebar-jquery1.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/event-listener-sidebar-jquery1.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/event-listener-sidebar-jquery1.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/event-listener-sidebar-jquery1.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/event-listener-sidebar-jquery1.js [ Slow ]
 crbug.com/1046784 [ Debug ] http/tests/devtools/persistence/persistence-tabbed-editor-tabs-order.js [ Slow ]
 crbug.com/1046784 [ Linux Release ] http/tests/devtools/persistence/persistence-tabbed-editor-tabs-order.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/persistence/persistence-tabbed-editor-tabs-order.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/persistence/persistence-tabbed-editor-tabs-order.js [ Slow ]
 crbug.com/1046784 [ Mac12 Release ] http/tests/devtools/persistence/persistence-tabbed-editor-tabs-order.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/persistence/persistence-tabbed-editor-tabs-order.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/styles-4/styles-update-links-3.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/styles-4/styles-update-links-3.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/styles-4/styles-update-links-3.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/styles-4/styles-update-links-3.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/styles-4/styles-update-links-3.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/styles-4/styles-update-links-2.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/styles-4/styles-update-links-2.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/styles-4/styles-update-links-2.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/styles-4/styles-update-links-2.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/styles-4/styles-update-links-2.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/coverage/coverage-suspended.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/coverage/coverage-suspended.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/coverage/coverage-suspended.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/coverage/coverage-suspended.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/coverage/coverage-suspended.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/network/network-search.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/network/network-search.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/network/network-search.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/network/network-search.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/network/network-search.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/styles-4/styles-update-links-1.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/styles-4/styles-update-links-1.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/styles-4/styles-update-links-1.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/styles-4/styles-update-links-1.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/styles-4/styles-update-links-1.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/edit/set-outer-html.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/edit/set-outer-html.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/edit/set-outer-html.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/edit/set-outer-html.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/edit/set-outer-html.js [ Slow ]
 crbug.com/1046784 [ Debug ] http/tests/devtools/network/failed-request-response-mimetype.js [ Slow ]
 crbug.com/1046784 [ Linux Release ] http/tests/devtools/network/failed-request-response-mimetype.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/network/failed-request-response-mimetype.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/network/failed-request-response-mimetype.js [ Slow ]
 crbug.com/1046784 [ Mac12 Release ] http/tests/devtools/network/failed-request-response-mimetype.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/network/failed-request-response-mimetype.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/elements/selected-element-changes-execution-context.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/elements/selected-element-changes-execution-context.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/elements/selected-element-changes-execution-context.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/elements/selected-element-changes-execution-context.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/elements/selected-element-changes-execution-context.js [ Slow ]
 crbug.com/1046784 http/tests/devtools/file-system-project.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/bindings/navigator-frame-attach-detach.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/bindings/navigator-frame-attach-detach.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/bindings/navigator-frame-attach-detach.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/bindings/navigator-frame-attach-detach.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/bindings/navigator-frame-attach-detach.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/forced-layout-in-microtask.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/forced-layout-in-microtask.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/forced-layout-in-microtask.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/forced-layout-in-microtask.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/forced-layout-in-microtask.js [ Slow ]
 crbug.com/1046784 http/tests/devtools/application-panel/resources-panel-iframe-idb.js [ Slow ]
 crbug.com/1046784 [ Linux ] http/tests/devtools/a11y-axe-core/sources/scope-pane-a11y-test.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/a11y-axe-core/sources/scope-pane-a11y-test.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/a11y-axe-core/sources/scope-pane-a11y-test.js [ Slow ]
 crbug.com/1046784 [ Mac12 ] http/tests/devtools/a11y-axe-core/sources/scope-pane-a11y-test.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/a11y-axe-core/sources/scope-pane-a11y-test.js [ Slow ]
@@ -1323,7 +1203,6 @@
 crbug.com/1057807 http/tests/misc/destroy-middle-click-locked-target-crash.html [ Slow ]
 crbug.com/1042694 [ Debug Mac ] fast/forms/form-control-with-state-eager-tracing-crashTest.html [ Slow ]
 crbug.com/1042694 [ Linux ] fast/forms/form-control-with-state-eager-tracing-crashTest.html [ Slow ]
-crbug.com/1042694 [ Mac10.15 Release ] fast/forms/form-control-with-state-eager-tracing-crashTest.html [ Slow ]
 crbug.com/1042694 [ Mac11 Release ] fast/forms/form-control-with-state-eager-tracing-crashTest.html [ Slow ]
 crbug.com/1042694 [ Mac12 Release ] fast/forms/form-control-with-state-eager-tracing-crashTest.html [ Slow ]
 crbug.com/1042694 [ Mac13 Release ] fast/forms/form-control-with-state-eager-tracing-crashTest.html [ Slow ]
@@ -1334,7 +1213,6 @@
 crbug.com/1044825 http/tests/devtools/network/resource-priority.js [ Slow ]
 crbug.com/1046784 [ Debug ] http/tests/devtools/profiler/cpu-profiler-bottom-up-large-tree-search.js [ Slow ]
 crbug.com/1046784 [ Linux Release ] http/tests/devtools/profiler/cpu-profiler-bottom-up-large-tree-search.js [ Slow ]
-crbug.com/1046784 [ Mac10.15 Release ] http/tests/devtools/profiler/cpu-profiler-bottom-up-large-tree-search.js [ Slow ]
 crbug.com/1046784 [ Mac11 Release ] http/tests/devtools/profiler/cpu-profiler-bottom-up-large-tree-search.js [ Slow ]
 crbug.com/1046784 [ Mac12 Release ] http/tests/devtools/profiler/cpu-profiler-bottom-up-large-tree-search.js [ Slow ]
 crbug.com/1046784 [ Release Win ] http/tests/devtools/profiler/cpu-profiler-bottom-up-large-tree-search.js [ Slow ]
@@ -1395,7 +1273,6 @@
 
 crbug.com/1353929 editing/spelling/cold_mode_spellcheck_reenable.html [ Slow ]
 crbug.com/1356029 [ Linux ] editing/spelling/cold_mode_no_repeated_full_testing.html [ Slow ]
-crbug.com/1356029 [ Mac10.15 Release ] editing/spelling/cold_mode_no_repeated_full_testing.html [ Slow ]
 crbug.com/1356029 [ Mac11 Release ] editing/spelling/cold_mode_no_repeated_full_testing.html [ Slow ]
 crbug.com/1356029 [ Mac12 ] editing/spelling/cold_mode_no_repeated_full_testing.html [ Slow ]
 crbug.com/1356029 [ Release Win ] editing/spelling/cold_mode_no_repeated_full_testing.html [ Slow ]
@@ -1410,7 +1287,6 @@
 crbug.com/1361922 virtual/view-transition/external/wpt/css/css-view-transitions/japanese-tag.html [ Slow ]
 
 crbug.com/1381545 [ Linux ] virtual/wasm-code-caching/http/tests/wasm/caching/code-cache.html [ Slow ]
-crbug.com/1381545 [ Mac10.15 Release ] virtual/wasm-code-caching/http/tests/wasm/caching/code-cache.html [ Slow ]
 crbug.com/1381545 [ Mac11 Release ] virtual/wasm-code-caching/http/tests/wasm/caching/code-cache.html [ Slow ]
 crbug.com/1381545 [ Mac12 ] virtual/wasm-code-caching/http/tests/wasm/caching/code-cache.html [ Slow ]
 crbug.com/1381545 [ Mac12-arm64 Release ] virtual/wasm-code-caching/http/tests/wasm/caching/code-cache.html [ Slow ]
@@ -1432,7 +1308,6 @@
 
 crbug.com/1404951 [ Debug Mac ] external/wpt/credential-management/fedcm-iframe.https.html [ Slow ]
 crbug.com/1404951 [ Linux ] external/wpt/credential-management/fedcm-iframe.https.html [ Slow ]
-crbug.com/1404951 [ Mac10.15 Release ] external/wpt/credential-management/fedcm-iframe.https.html [ Slow ]
 crbug.com/1404951 [ Mac11 Release ] external/wpt/credential-management/fedcm-iframe.https.html [ Slow ]
 crbug.com/1404951 [ Mac12 Release ] external/wpt/credential-management/fedcm-iframe.https.html [ Slow ]
 crbug.com/1404951 [ Mac13 Release ] external/wpt/credential-management/fedcm-iframe.https.html [ Slow ]
@@ -1440,9 +1315,7 @@
 crbug.com/1494119 virtual/fedcm-login-status/external/wpt/credential-management/fedcm-login-status/confirm-idp-login.https.html [ Slow ]
 
 # Slow because it contains thousands of subtests
-crbug.com/1423483 [ Debug Mac13-arm64 ] external/wpt/css/css-color/parsing/color-computed-hsl.html [ Slow ]
 crbug.com/1423483 [ Linux ] external/wpt/css/css-color/parsing/color-computed-hsl.html [ Slow ]
-crbug.com/1423483 [ Mac10.15 Release ] external/wpt/css/css-color/parsing/color-computed-hsl.html [ Slow ]
 crbug.com/1423483 [ Mac11 Release ] external/wpt/css/css-color/parsing/color-computed-hsl.html [ Slow ]
 crbug.com/1423483 [ Mac12 ] external/wpt/css/css-color/parsing/color-computed-hsl.html [ Slow ]
 crbug.com/1423483 [ Release Win ] external/wpt/css/css-color/parsing/color-computed-hsl.html [ Slow ]
@@ -1454,7 +1327,6 @@
 
 crbug.com/626703 [ Debug Mac13 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/view-timeline-inset-animation.html [ Slow ]
 crbug.com/626703 [ Mac Release ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/view-timeline-inset-animation.html [ Slow ]
-crbug.com/1376679 [ Mac10.15 Release ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/scroll-timeline-dynamic.tentative.html [ Slow ]
 crbug.com/1376679 [ Mac11 Release ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/scroll-timeline-dynamic.tentative.html [ Slow ]
 crbug.com/1376679 [ Mac11-arm64 Release ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/scroll-timeline-dynamic.tentative.html [ Slow ]
 crbug.com/1376679 [ Mac12 Release ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/scroll-timeline-dynamic.tentative.html [ Slow ]
@@ -1468,17 +1340,14 @@
 
 crbug.com/626703 [ Debug ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Slow ]
 crbug.com/626703 [ Linux Release ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Slow ]
-crbug.com/626703 [ Mac10.15 Release ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Slow ]
 crbug.com/626703 [ Mac11 Release ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Slow ]
 crbug.com/626703 [ Mac11-arm64 Release ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Slow ]
 crbug.com/626703 [ Mac12 Release ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Slow ]
 crbug.com/626703 [ Mac13 Release ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Slow ]
-crbug.com/626703 [ Mac13-arm64 Release ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Slow ]
 crbug.com/626703 [ Release Win ] external/wpt/html/semantics/forms/form-submission-0/multipart-formdata.window.html [ Slow ]
 
 crbug.com/1457660 [ Debug ] external/wpt/editing/other/white-spaces-after-execCommand-forwarddelete.tentative.html [ Slow ]
 crbug.com/1457660 [ Linux Release ] external/wpt/editing/other/white-spaces-after-execCommand-forwarddelete.tentative.html [ Slow ]
-crbug.com/1457660 [ Mac10.15 Release ] external/wpt/editing/other/white-spaces-after-execCommand-forwarddelete.tentative.html [ Slow ]
 crbug.com/1457660 [ Mac11 Release ] external/wpt/editing/other/white-spaces-after-execCommand-forwarddelete.tentative.html [ Slow ]
 crbug.com/1457660 [ Mac12 Release ] external/wpt/editing/other/white-spaces-after-execCommand-forwarddelete.tentative.html [ Slow ]
 crbug.com/1457660 [ Mac13 Release ] external/wpt/editing/other/white-spaces-after-execCommand-forwarddelete.tentative.html [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 05238864..a1e8f4f 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -65,14 +65,10 @@
 
 # The following tests pass or fail depending on the underlying protocol (HTTP/1.1 vs HTTP/2).
 # The results of failures could be also different depending on the underlying protocol.
-crbug.com/1048761 external/wpt/websockets/interfaces/WebSocket/close/close-connecting.html?wss [ Failure Pass ]
-crbug.com/1048761 external/wpt/websockets/interfaces/WebSocket/close/close-nested.html?wss [ Failure Pass ]
-crbug.com/1048761 external/wpt/websockets/interfaces/WebSocket/readyState/003.html?wss [ Failure Pass ]
 crbug.com/1048761 external/wpt/websockets/unload-a-document/002.html?wss [ Failure Pass ]
 
 # Flaking on WebKit Linux MSAN
 crbug.com/1207373 [ Linux ] external/wpt/uievents/order-of-events/mouse-events/mousemove-across.html [ Failure Timeout ]
-crbug.com/1339285 [ Linux ] fast/loader/iframe-window-open-stealing-focus.html [ Failure Pass Timeout ]
 crbug.com/1339285 [ Mac ] fast/loader/iframe-window-open-stealing-focus.html [ Pass Timeout ]
 
 crbug.com/1393073 [ Linux ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/anchor-focus.https.html [ Failure Pass ]
@@ -122,11 +118,7 @@
 crbug.com/1459010 fast/events/hit-test-counts.html [ Failure ]
 
 # Image isn't present:
-crbug.com/1254944 svg/dynamic-updates/SVGFEComponentTransferElement-dom-intercept-attr.html [ Failure Pass ]
-crbug.com/1254944 svg/dynamic-updates/SVGFEComponentTransferElement-dom-offset-attr.html [ Failure Pass ]
 crbug.com/1254944 svg/dynamic-updates/SVGFEComponentTransferElement-dom-tableValues-attr.html [ Failure Pass ]
-crbug.com/1254944 svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-intercept-prop.html [ Failure Pass ]
-crbug.com/1254944 svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-offset-prop.html [ Failure Pass ]
 crbug.com/1254944 svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-tableValues-prop.html [ Failure Pass ]
 
 # Fails flakily or times out
@@ -239,7 +231,6 @@
 
 # These tests are flaky with BFCache, which is enabled by default.
 crbug.com/1311546 http/tests/test-runner/back-forward.html [ Failure Pass ]
-crbug.com/1456489 [ Linux ] fast/events/touch/gesture/gesture-tap-click-common-ancestor.html [ Failure Pass ]
 
 crbug.com/1225630 fast/multicol/infinite-height-causing-fractional-row-height-crash.html [ Skip Timeout ]
 crbug.com/1225630 fast/multicol/infinitely-tall-content-in-outer-crash.html [ Skip Timeout ]
@@ -352,7 +343,6 @@
 crbug.com/1226218 external/wpt/editing/other/typing-around-link-element-at-collapsed-selection.tentative.html?target=ContentEditable&parent=b&child=i [ Failure Timeout ]
 crbug.com/893480 external/wpt/editing/other/select-all-and-delete-in-html-element-having-contenteditable.html [ Failure Timeout ]
 crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=backspace&left-white-space=normal&right-white-space=nowrap [ Failure ]
-crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=backspace&left-white-space=normal&right-white-space=pre [ Failure ]
 crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=backspace&left-white-space=normal&right-white-space=pre-line [ Failure ]
 crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=backspace&left-white-space=normal&right-white-space=pre-wrap [ Failure ]
 crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=backspace&left-white-space=nowrap&right-white-space=pre-line [ Failure ]
@@ -381,7 +371,6 @@
 crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=select-boundary&left-white-space=normal&right-white-space=nowrap [ Failure ]
 crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=select-boundary&left-white-space=normal&right-white-space=pre-line [ Failure ]
 crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=select-boundary&left-white-space=normal&right-white-space=pre-wrap [ Failure ]
-crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=select-boundary&left-white-space=nowrap&right-white-space=normal [ Failure ]
 crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=select-boundary&left-white-space=nowrap&right-white-space=pre-line [ Failure ]
 crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=select-boundary&left-white-space=nowrap&right-white-space=pre-wrap [ Failure ]
 crbug.com/1370704 external/wpt/editing/other/join-different-white-space-style-left-line-and-right-paragraph.html?method=select-boundary&left-white-space=pre&right-white-space=nowrap [ Failure ]
@@ -970,7 +959,6 @@
 # `text-decoration-skip-ink: all` not implemented yet.
 crbug.com/1054656 external/wpt/css/css-text-decor/text-decoration-skip-ink-005.html [ Crash Failure Pass Timeout ]
 
-crbug.com/846753 [ Mac ] http/tests/media/reload-after-dialog.html [ Failure Pass Timeout ]
 
 ### external/wpt/css/css-tables/
 crbug.com/708345 external/wpt/css/css-tables/height-distribution/extra-height-given-to-all-row-groups-004.html [ Failure ]
@@ -1219,9 +1207,6 @@
 crbug.com/1219058 external/wpt/css/css-text/letter-spacing/letter-spacing-bidi-001.html [ Failure ]
 crbug.com/1219058 external/wpt/css/css-text/letter-spacing/letter-spacing-end-of-line-001.html [ Failure ]
 crbug.com/1098801 external/wpt/css/css-text/overflow-wrap/overflow-wrap-normal-keep-all-001.html [ Failure ]
-crbug.com/1219041 external/wpt/css/css-text/white-space/text-space-collapse-preserve-breaks-001.xht [ Failure ]
-crbug.com/1219041 external/wpt/css/css-text/white-space/text-space-collapse-discard-001.xht [ Failure ]
-crbug.com/1219041 external/wpt/css/css-text/white-space/text-space-trim-trim-inner-001.xht [ Failure ]
 
 # css counters failures to be fixed with new implementation.
 crbug.com/990657 external/wpt/css/css-contain/contain-style-counters-005.html [ Failure ]
@@ -1358,11 +1343,6 @@
 
 # Mac failures - antialiasing of ref
 crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-087.xht [ Failure ]
-crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-088.xht [ Failure ]
-crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-089.xht [ Failure ]
-crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-090.xht [ Failure ]
-crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-091.xht [ Failure ]
-crbug.com/958381 [ Mac ] external/wpt/css/CSS2/tables/table-anonymous-objects-092.xht [ Failure ]
 crbug.com/958381 [ Mac ] virtual/text-antialias/hyphen-min-preferred-width.html [ Failure ]
 crbug.com/1449411 [ Mac13 ] virtual/text-antialias/word-break-soft-hyphen.html [ Failure Pass ]
 crbug.com/1449411 [ Mac13-arm64 ] virtual/text-antialias/word-break-soft-hyphen.html [ Failure Pass ]
@@ -1440,11 +1420,11 @@
 crbug.com/1172333 external/wpt/css/css-pseudo/first-letter-digraph.html [ Failure ]
 crbug.com/1147859 external/wpt/css/css-pseudo/target-text-004.html [ Failure ]
 crbug.com/1179938 external/wpt/css/css-pseudo/target-text-dynamic-004.html [ Failure ]
-crbug.com/1353352 fast/css3-text/css3-text-decoration/text-decoration-line-grammar-error.html [ Failure ]
-crbug.com/1353352 fast/css3-text/css3-text-decoration/text-decoration-line-spelling-error.html [ Failure ]
+crbug.com/1353352 [ Mac ] fast/css3-text/css3-text-decoration/text-decoration-line-grammar-error.html [ Failure ]
+crbug.com/1353352 [ Release Win11-arm64 ] fast/css3-text/css3-text-decoration/text-decoration-line-grammar-error.html [ Failure ]
+crbug.com/1353352 [ Release Win11-arm64 ] fast/css3-text/css3-text-decoration/text-decoration-line-spelling-error.html [ Failure ]
 crbug.com/1350475 external/wpt/css/css-pseudo/highlight-currentcolor-painting-text-shadow-001.html [ Failure ]
 crbug.com/1350475 external/wpt/css/css-pseudo/highlight-currentcolor-painting-text-shadow-002.html [ Failure ]
-crbug.com/1351020 [ Mac ] external/wpt/compat/webkit-text-fill-color-property-002.html [ Failure ]
 crbug.com/1432038 external/wpt/css/css-pseudo/svg-text-selection-002.html [ Failure ]
 crbug.com/1500288 external/wpt/css/css-pseudo/spelling-error-001.html [ Failure ]
 crbug.com/1500288 external/wpt/css/css-pseudo/grammar-error-001.html [ Failure ]
@@ -1535,7 +1515,8 @@
 crbug.com/1004760 [ Mac11-arm64 ] external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html [ Timeout ]
 crbug.com/1004760 [ Mac12 Release ] external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html [ Timeout ]
 crbug.com/1004760 [ Mac12-arm64 ] external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html [ Timeout ]
-crbug.com/1191547 external/wpt/html/semantics/forms/the-label-element/proxy-modifier-click-to-associated-element.tentative.html [ Timeout ]
+crbug.com/1191547 [ Debug ] external/wpt/html/semantics/forms/the-label-element/proxy-modifier-click-to-associated-element.tentative.html [ Timeout ]
+crbug.com/1191547 [ Release ] external/wpt/html/semantics/forms/the-label-element/proxy-modifier-click-to-associated-element.tentative.html [ Timeout ]
 crbug.com/1404463 external/wpt/html/semantics/embedded-content/the-img-element/responsive-image-select-print.html [ Failure ]
 crbug.com/1401590 [ Mac ] external/wpt/html/semantics/links/hyperlink-auditing/headers.optional.html [ Failure Pass Timeout ]
 
@@ -1681,7 +1662,6 @@
 # Flaky tests on Mac after enabling scroll animations in web_tests
 crbug.com/944583 [ Mac ] fast/events/platform-wheelevent-paging-xy-in-scrolling-div.html [ Failure Pass ]
 crbug.com/944583 [ Mac10.15 Release ] fast/scrolling/percentage-mousewheel-scroll-on-iframe.html [ Failure Pass ]
-crbug.com/944583 [ Mac11 Release ] fast/scrolling/percentage-mousewheel-scroll-on-iframe.html [ Failure Pass ]
 crbug.com/944583 [ Mac11-arm64 Release ] fast/scrolling/percentage-mousewheel-scroll-on-iframe.html [ Failure Pass ]
 crbug.com/944583 [ Mac12 ] fast/scrolling/percentage-mousewheel-scroll-on-iframe.html [ Failure Pass ]
 crbug.com/944583 [ Mac12-arm64 Release ] fast/scrolling/percentage-mousewheel-scroll-on-iframe.html [ Failure Pass ]
@@ -1716,7 +1696,7 @@
 
 crbug.com/821455 editing/pasteboard/drag-files-to-editable-element.html [ Failure ]
 
-crbug.com/1174937 external/wpt/mediacapture-streams/MediaStream-clone.https.html [ Crash ]
+crbug.com/1174937 [ Release Win11-arm64 ] external/wpt/mediacapture-streams/MediaStream-clone.https.html [ Crash ]
 crbug.com/1505380 [ Mac ] external/wpt/mediacapture-streams/MediaStreamTrack-getCapabilities.https.html [ Failure ]
 
 # Ref tests that needs investigation.
@@ -1745,7 +1725,6 @@
 crbug.com/710214 [ Mac11-arm64 Release ] external/wpt/css/css-overflow/scrollbar-gutter-vertical-lr-002.html [ Failure ]
 crbug.com/710214 [ Mac12 ] external/wpt/css/css-overflow/scrollbar-gutter-vertical-lr-002.html [ Failure ]
 crbug.com/710214 [ Mac12-arm64 Release ] external/wpt/css/css-overflow/scrollbar-gutter-vertical-lr-002.html [ Failure ]
-crbug.com/710214 [ Mac10.15 Release ] external/wpt/css/css-overflow/scrollbar-gutter-vertical-rl-002.html [ Crash Failure ]
 crbug.com/710214 [ Mac11 Release ] external/wpt/css/css-overflow/scrollbar-gutter-vertical-rl-002.html [ Crash Failure ]
 crbug.com/710214 [ Mac11-arm64 Release ] external/wpt/css/css-overflow/scrollbar-gutter-vertical-rl-002.html [ Crash Failure ]
 crbug.com/710214 [ Mac12 ] external/wpt/css/css-overflow/scrollbar-gutter-vertical-rl-002.html [ Crash Failure ]
@@ -2154,14 +2133,14 @@
 
 # needs implementation of test_driver_internal.action_sequence
 # tests in this group need implementation of keyDown/keyUp
-crbug.com/893480 external/wpt/inert/inert-node-is-uneditable.html [ Failure Pass ]
 crbug.com/893480 [ Mac ] external/wpt/input-events/input-events-typing.html [ Failure Timeout ]
 crbug.com/893480 [ Win ] external/wpt/input-events/input-events-typing.html [ Failure Timeout ]
 crbug.com/893480 [ Mac ] external/wpt/infrastructure/testdriver/actions/eventOrder.html [ Timeout ]
 crbug.com/893480 [ Win ] external/wpt/infrastructure/testdriver/actions/eventOrder.html [ Timeout ]
 crbug.com/893480 external/wpt/infrastructure/testdriver/actions/multiDevice.html [ Failure Timeout ]
 crbug.com/893480 external/wpt/infrastructure/testdriver/actions/actionsWithKeyPressed.html [ Failure Timeout ]
-crbug.com/893480 external/wpt/infrastructure/testdriver/actions/textEditCommands.html [ Failure Timeout ]
+crbug.com/893480 [ Debug ] external/wpt/infrastructure/testdriver/actions/textEditCommands.html [ Failure Timeout ]
+crbug.com/893480 [ Release ] external/wpt/infrastructure/testdriver/actions/textEditCommands.html [ Failure Timeout ]
 crbug.com/893480 [ Mac ] external/wpt/input-events/input-events-get-target-ranges.html [ Failure Timeout ]
 crbug.com/893480 [ Win ] external/wpt/input-events/input-events-get-target-ranges.html [ Failure Timeout ]
 crbug.com/893480 [ Mac ] external/wpt/input-events/input-events-cut-paste.html [ Failure Timeout ]
@@ -2183,14 +2162,13 @@
 crbug.com/893480 external/wpt/shadow-dom/focus-navigation/focus-navigation-web-component-radio.html [ Failure ]
 crbug.com/893480 external/wpt/shadow-dom/focus-navigation/focus-navigation-with-delegatesFocus.html [ Failure Timeout ]
 crbug.com/893480 external/wpt/shadow-dom/focus-navigation/focus-nested-slots.html [ Failure ]
-crbug.com/893480 external/wpt/shadow-dom/focus-navigation/focus-reverse-unassignable-slot.html [ Failure ]
 crbug.com/893480 external/wpt/shadow-dom/focus-navigation/focus-reverse-unassigned-slot.html [ Failure ]
-crbug.com/893480 external/wpt/shadow-dom/focus-navigation/focus-unassignable-slot.html [ Failure ]
 crbug.com/893480 external/wpt/shadow-dom/focus-navigation/focus-with-negative-index.html [ Failure ]
 
 # needs implementation of test_driver_internal.action_sequence
 # for these tests there is an exception when scrolling: element click intercepted error
-crbug.com/1040611 external/wpt/uievents/order-of-events/mouse-events/wheel-basic.html [ Failure Timeout ]
+crbug.com/1040611 [ Debug ] external/wpt/uievents/order-of-events/mouse-events/wheel-basic.html [ Failure Timeout ]
+crbug.com/1040611 [ Release ] external/wpt/uievents/order-of-events/mouse-events/wheel-basic.html [ Failure Timeout ]
 crbug.com/1040611 external/wpt/uievents/order-of-events/mouse-events/wheel-scrolling.html [ Failure Timeout ]
 
 # crbug.com/1298321: "element click intercepted error" when <body style="zoom:2">.
@@ -2467,15 +2445,11 @@
 
 crbug.com/1002514 external/wpt/web-share/share-sharePromise-internal-slot.https.html [ Crash Failure ]
 
-crbug.com/1029514 [ Debug Mac13-arm64 ] external/wpt/html/semantics/embedded-content/the-video-element/resize-during-playback.html [ Failure Pass ]
 
 # ::first-line issues
 crbug.com/1085772 external/wpt/css/css-pseudo/first-line-opacity-001.html [ Failure ]
 crbug.com/798257 external/wpt/css/css-pseudo/first-line-line-height-002.html [ Failure ]
 
-crbug.com/1472118 [ Fuchsia ] fast/autoresize/basic.html [ Failure Timeout ]
-crbug.com/1472118 [ Fuchsia ] fast/autoresize/turn-off-autoresize.html [ Failure Timeout ]
-crbug.com/1472118 [ Fuchsia ] http/tests/worklet/webexposed/global-interface-listing-paint-worklet.html [ Failure ]
 
 # Various css-values WPT failures
 crbug.com/759914 external/wpt/css/css-values/ch-unit-011.html [ Failure ]
@@ -2663,11 +2637,7 @@
 crbug.com/626703 external/wpt/css/css-text/text-align/text-align-justify-tabs-002.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/text-align/text-align-justify-tabs-003.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/text-align/text-align-justify-tabs-004.html [ Failure ]
-crbug.com/626703 external/wpt/xhr/send-authentication-basic-repeat-no-args.htm [ Failure ]
-crbug.com/626703 external/wpt/xhr/send-authentication-basic-setrequestheader-and-arguments.htm [ Failure ]
-crbug.com/626703 external/wpt/xhr/send-authentication-basic-setrequestheader.htm [ Failure ]
 crbug.com/626703 external/wpt/xhr/send-authentication-basic.htm [ Failure ]
-crbug.com/626703 external/wpt/web-animations/animation-model/keyframe-effects/effect-value-opacity-replaced-effect.html [ Failure ]
 crbug.com/626703 external/wpt/service-workers/service-worker/controlled-dedicatedworker-postMessage.https.html [ Failure Timeout ]
 crbug.com/626703 external/wpt/service-workers/service-worker/controlled-iframe-postMessage.https.html [ Failure Timeout ]
 crbug.com/626703 external/wpt/fetch/metadata/generated/worker-dedicated-constructor.sub.html [ Failure ]
@@ -2685,11 +2655,10 @@
 # These tests generate baselines whose names are too long.
 crbug.com/626703 external/wpt/editing/other/insertparagraph-in-editing-host-cannot-have-div.tentative.html* [ Failure ]
 crbug.com/626703 [ Mac ] virtual/webcodecs-without-task-runner-with-custom-deleter/external/wpt/webcodecs/videoDecoder-codec-specific.https.any.html?h265_annexb [ Failure ]
-crbug.com/626703 [ Mac ] virtual/webcodecs-without-task-runner-with-custom-deleter/external/wpt/webcodecs/videoDecoder-codec-specific.https.any.html?h265_hevc [ Failure ]
-crbug.com/626703 [ Mac ] virtual/webcodecs-without-task-runner-with-custom-deleter/external/wpt/webcodecs/videoDecoder-codec-specific.https.any.worker.html?h265_annexb [ Failure ]
-crbug.com/626703 [ Mac ] virtual/webcodecs-without-task-runner-with-custom-deleter/external/wpt/webcodecs/videoDecoder-codec-specific.https.any.worker.html?h265_hevc [ Failure ]
 
 # ====== New tests from wpt-importer added here ======
+crbug.com/626703 [ Mac ] external/wpt/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-005.html [ Failure ]
+crbug.com/626703 [ Mac ] external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-005.html [ Failure ]
 crbug.com/626703 [ Mac13-arm64 ] external/wpt/long-animation-frame/tentative/loaf-source-location-redirect.html [ Skip Timeout ]
 crbug.com/626703 [ Mac12-arm64 ] external/wpt/long-animation-frame/tentative/loaf-source-location-redirect.html [ Skip Timeout ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/long-animation-frame/tentative/loaf-source-location-redirect.html [ Skip Timeout ]
@@ -2699,7 +2668,6 @@
 crbug.com/626703 external/wpt/css/css-transforms/transform-box/svgbox-stroke-box-004.html [ Failure ]
 crbug.com/626703 virtual/backface-visibility-interop/external/wpt/css/css-transforms/transform-box/svgbox-stroke-box-003.html [ Failure ]
 crbug.com/626703 virtual/backface-visibility-interop/external/wpt/css/css-transforms/transform-box/svgbox-stroke-box-004.html [ Failure ]
-crbug.com/626703 [ Mac11 ] external/wpt/infrastructure/expected-fail/window-onload-test.html [ Failure Timeout ]
 crbug.com/626703 external/wpt/webnn/elementwise_logical.https.any.worker.html [ Skip Timeout ]
 crbug.com/626703 virtual/webnn-service-enabled/external/wpt/webnn/gpu/elementwise_logical.https.any.worker.html [ Skip Timeout ]
 crbug.com/626703 [ Win10.20h2 ] external/wpt/pointerevents/pointerevent_after_target_appended.html?mouse [ Timeout ]
@@ -2742,7 +2710,6 @@
 crbug.com/626703 external/wpt/css/css-pseudo/slider/slider-track-001.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-pseudo/slider/slider-track-002.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-pseudo/slider/slider-track-003.html [ Failure ]
-crbug.com/626703 [ Mac11 ] external/wpt/html/cross-origin-opener-policy/resource-popup.https.html [ Timeout ]
 crbug.com/626703 external/wpt/content-security-policy/connect-src/connect-src-json-import-blocked.sub.html [ Timeout ]
 crbug.com/626703 external/wpt/content-security-policy/style-src/import-style-blocked.sub.html [ Timeout ]
 crbug.com/626703 external/wpt/jpegxl/3x3_jpeg_recompression.html [ Failure ]
@@ -2750,59 +2717,34 @@
 crbug.com/626703 external/wpt/jpegxl/3x3_srgb_lossy.html [ Failure ]
 crbug.com/626703 external/wpt/jpegxl/3x3a_srgb_lossless.html [ Failure ]
 crbug.com/626703 external/wpt/jpegxl/3x3a_srgb_lossy.html [ Failure ]
-crbug.com/626703 [ Mac11 ] external/wpt/service-workers/service-worker/worker-interception-redirect.https.html [ Failure Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/service-workers/service-worker/worker-interception-redirect.https.html [ Failure Timeout ]
-crbug.com/626703 external/wpt/jpegxl/srgb.html [ Failure ]
-crbug.com/626703 [ Mac12 ] external/wpt/content-security-policy/generic/only-valid-whitespaces-are-allowed.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/css/css-grid/animation/grid-template-rows-interpolation.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] external/wpt/css/css-images/parsing/gradient-interpolation-method-valid.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/css/css-masking/animations/clip-path-interpolation-002.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/editing/other/join-pre-and-other-block.html?method=backspace&block=div [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/html/browsers/origin/cross-origin-objects/window-location-and-location-href-cross-realm-set.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] external/wpt/html/cross-origin-embedder-policy/credentialless/image.https.window.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] external/wpt/html/semantics/embedded-content/bfcache/embedded-not-found.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/performance-timeline/back-forward-cache-restoration.tentative.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/api/response/response-clone.any.sharedworker.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/metadata/generated/element-img.https.sub.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/no-auto-wpt-origin-isolation/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/regression-1399759.https.sub.html?pipe=header(Origin-Agent-Cluster,%253F0) [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/pna-navigations-warning/external/wpt/fetch/private-network-access/shared-worker-fetch.tentative.https.window.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/pna-workers-disabled/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/pna-workers-disabled/external/wpt/fetch/private-network-access/shared-worker-blob-fetch.tentative.window.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/pna-workers-enabled/external/wpt/fetch/private-network-access/worker-blob-fetch.tentative.window.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/prefetch-no-vary-search/external/wpt/speculation-rules/prefetch/no-vary-search/prefetch-single-with-hint.https.html?3-3 [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/prefetch-no-vary-search/external/wpt/speculation-rules/prefetch/no-vary-search/prefetch-single.https.html?16-16 [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/prefetch-reusable/external/wpt/speculation-rules/prefetch/no-vary-search/prefetch-single-with-hint.https.html?27-27 [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/prefetch-reusable/external/wpt/speculation-rules/prefetch/no-vary-search/prefetch-single.https.html?6-6 [ Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/prefetch-reusable/external/wpt/speculation-rules/prefetch/referrer-policy-from-rules.https.html?4-4 [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/prefetch/external/wpt/speculation-rules/prefetch/document-rules.https.html?include=newRuleSetAdded [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/prefetch/external/wpt/speculation-rules/prefetch/no-vary-search/prefetch-single-with-hint.https.html?28-last [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/prefetch/external/wpt/speculation-rules/prefetch/no-vary-search/prefetch-single.https.html?15-15 [ Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/prefetch/external/wpt/speculation-rules/prefetch/referrer-policy-from-rules.https.html?6-6 [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/shared-storage-fenced-frame-mparch/external/wpt/shared-storage/shared-storage-writable-clear.tentative.https.sub.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/shared-storage-fenced-frame-mparch/external/wpt/shared-storage/shared-storage-writable-delete.tentative.https.sub.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/split-http-cache/external/wpt/signed-exchange/reporting/sxg-reporting-navigation-ok-origin-referrer.tentative.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/split-http-cache/external/wpt/signed-exchange/subresource/sxg-subresource-header-integrity-mismatch.tentative.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/threaded-preload-scanner/external/wpt/html/semantics/scripting-1/the-script-element/module/dynamic-import/microtasks/basic.any.sharedworker.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-backgrounds/border-image-image-type-001.htm [ Failure ]
 crbug.com/626703 virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-001.htm [ Failure ]
-crbug.com/626703 [ Mac11-arm64 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure ]
-crbug.com/626703 [ Linux ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure ]
-crbug.com/626703 [ Mac13-arm64 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure ]
-crbug.com/626703 [ Mac11 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure ]
-crbug.com/626703 [ Mac12-arm64 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure ]
 crbug.com/626703 [ Mac13 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure ]
 crbug.com/626703 [ Mac12 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure ]
-crbug.com/626703 [ Win ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure ]
 crbug.com/626703 [ Mac10.15 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-004.htm [ Failure Timeout ]
-crbug.com/626703 [ Mac11-arm64 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure ]
-crbug.com/626703 [ Linux ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure ]
-crbug.com/626703 [ Mac13-arm64 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure ]
 crbug.com/626703 [ Mac11 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure ]
-crbug.com/626703 [ Mac12-arm64 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure ]
 crbug.com/626703 [ Mac13 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure ]
 crbug.com/626703 [ Mac12 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure ]
-crbug.com/626703 [ Win ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure ]
 crbug.com/626703 [ Mac10.15 ] virtual/threaded/external/wpt/css/css-backgrounds/border-image-image-type-005.htm [ Failure Timeout ]
 crbug.com/626703 external/wpt/css/css-contain/content-visibility/content-visibility-on-g.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/hyphens/i18n/hyphens-i18n-auto-006.html [ Failure ]
@@ -2815,7 +2757,6 @@
 crbug.com/626703 external/wpt/css/css-text/white-space/text-wrap-balance-float-004.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/white-space/text-wrap-balance-float-005.html [ Failure ]
 crbug.com/626703 [ Mac13 ] virtual/third-party-storage-partitioning/external/wpt/IndexedDB/idb-explicit-commit.any.worker.html [ Timeout ]
-crbug.com/626703 [ Win10.20h2 ] virtual/threaded/external/wpt/css/css-backgrounds/background-attachment-margin-root-001.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-align/blocks/align-content-block-break-content-020.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-align/blocks/align-content-block-break-overflow-020.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-align/blocks/align-content-block-overflow-000.html [ Failure ]
@@ -2845,7 +2786,6 @@
 crbug.com/626703 external/wpt/css/css-color/relative-currentcolor-xyzd65-01.html [ Crash Failure ]
 crbug.com/626703 [ Win10.20h2 ] external/wpt/css/css-fonts/font-display/font-display-feature-policy-02.tentative.html [ Failure ]
 crbug.com/626703 [ Win10.20h2 ] external/wpt/fetch/api/redirect/redirect-keepalive.any.html [ Timeout ]
-crbug.com/626703 [ Win10.20h2 ] external/wpt/fetch/api/response/response-clone.any.sharedworker.html [ Timeout ]
 crbug.com/626703 [ Win11 ] external/wpt/fetch/metadata/generated/element-meta-refresh.https.optional.sub.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/html/semantics/embedded-content/media-elements/autoplay-allowed-by-feature-policy-attribute.https.sub.html [ Timeout ]
 crbug.com/626703 [ Win10.20h2 ] external/wpt/resource-timing/iframe-sequence-of-events.html [ Timeout ]
@@ -2853,7 +2793,6 @@
 crbug.com/626703 [ Win ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/get-nested-configs.https.html [ Timeout ]
 crbug.com/626703 [ Win11 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/api/redirect/redirect-keepalive.any.html [ Timeout ]
 crbug.com/626703 [ Win10.20h2 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/metadata/generated/element-meta-refresh.optional.sub.html [ Timeout ]
-crbug.com/626703 [ Win ] virtual/shared-storage-fenced-frame-mparch-selecturl-limit/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-origins.tentative.https.sub.html [ Timeout ]
 crbug.com/626703 [ Mac13 ] virtual/third-party-storage-partitioning/external/wpt/IndexedDB/idbobjectstore_getKey.any.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-transforms/backface-visibility-hidden-003.html [ Failure ]
 crbug.com/626703 virtual/backface-visibility-interop/external/wpt/css/css-transforms/backface-visibility-hidden-003.html [ Failure ]
@@ -2889,8 +2828,6 @@
 crbug.com/626703 [ Win ] external/wpt/html/cross-origin-embedder-policy/dedicated-worker.https.html [ Failure Timeout ]
 crbug.com/626703 external/wpt/html/links/stylesheet/quirk-origin-check-recursive-import.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/html/semantics/embedded-content/media-elements/autoplay-allowed-by-feature-policy.https.sub.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] external/wpt/webtransport/echo-large-bidirectional-streams.https.html [ Timeout ]
-crbug.com/626703 [ Mac13 ] external/wpt/webtransport/echo-large-bidirectional-streams.https.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/webxr/exclusive_requestFrame_nolayer.https.html [ Timeout ]
 crbug.com/626703 external/wpt/workers/modules/dedicated-worker-options-credentials.html [ Skip Timeout ]
 crbug.com/626703 external/wpt/workers/modules/shared-worker-options-credentials.html [ Skip Timeout ]
@@ -2909,8 +2846,6 @@
 crbug.com/626703 [ Mac10.15 ] external/wpt/speculation-rules/prerender/service-workers.https.html [ Skip Timeout ]
 crbug.com/626703 external/wpt/css/selectors/selectors-4/lang-017.html [ Failure ]
 crbug.com/626703 external/wpt/css/selectors/selectors-4/lang-018.html [ Failure ]
-crbug.com/626703 [ Mac12 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/view-timelines/view-timeline-range.html [ Timeout ]
-crbug.com/626703 [ Mac13 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/view-timelines/view-timeline-range.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-text/line-breaking/line-breaking-atomic-010.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/line-breaking/line-breaking-atomic-011.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-text/line-breaking/line-breaking-atomic-012.html [ Failure ]
@@ -2933,14 +2868,15 @@
 crbug.com/626703 external/wpt/css/motion/offset-path-url-008.html [ Failure ]
 crbug.com/626703 external/wpt/css/motion/offset-path-url-009.html [ Failure ]
 crbug.com/626703 external/wpt/css/motion/offset-path-url-010.html [ Failure ]
-crbug.com/626703 [ Mac13 ] external/wpt/IndexedDB/idbcursor_iterating.htm [ Timeout ]
+crbug.com/626703 [ Mac13 Release ] external/wpt/IndexedDB/idbcursor_iterating.htm [ Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/IndexedDB/idbobjectstore_getAllKeys.any.html [ Timeout ]
 crbug.com/626703 [ Mac13 ] external/wpt/IndexedDB/idbobjectstore_getAllKeys.any.html [ Timeout ]
 crbug.com/626703 external/wpt/css/css-highlight-api/painting/custom-highlight-painting-prioritization-003.html [ Failure ]
 crbug.com/626703 external/wpt/html/semantics/scripting-1/the-script-element/css-module/content-type-checking.html [ Timeout ]
 crbug.com/626703 external/wpt/html/semantics/scripting-1/the-script-element/css-module/load-error-events.html [ Timeout ]
 crbug.com/626703 external/wpt/html/semantics/scripting-1/the-script-element/json-module-assertions/parse-error.html [ Timeout ]
-crbug.com/626703 external/wpt/html/semantics/scripting-1/the-script-element/json-module/load-error-events.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/html/semantics/scripting-1/the-script-element/json-module/load-error-events.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/html/semantics/scripting-1/the-script-element/json-module/load-error-events.html [ Timeout ]
 crbug.com/626703 external/wpt/html/semantics/scripting-1/the-script-element/json-module/module.html [ Timeout ]
 crbug.com/626703 external/wpt/html/semantics/scripting-1/the-script-element/json-module/valid-content-type.html [ Timeout ]
 crbug.com/626703 external/wpt/mathml/presentation-markup/operators/embellished-op-1-4.html [ Failure ]
@@ -2968,7 +2904,6 @@
 crbug.com/626703 virtual/produce-compile-hints/external/wpt/html/semantics/scripting-1/the-script-element/json-module/load-error-events.html [ Timeout ]
 crbug.com/626703 virtual/produce-compile-hints/external/wpt/html/semantics/scripting-1/the-script-element/json-module/module.html [ Timeout ]
 crbug.com/626703 virtual/produce-compile-hints/external/wpt/html/semantics/scripting-1/the-script-element/json-module/valid-content-type.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/third-party-storage-partitioning/external/wpt/IndexedDB/idbobjectstore_getAll.any.html [ Timeout ]
 crbug.com/626703 [ Mac13 ] virtual/third-party-storage-partitioning/external/wpt/IndexedDB/reading-autoincrement-indexes-cursors.any.html [ Timeout ]
 crbug.com/626703 [ Mac13 ] virtual/third-party-storage-partitioning/external/wpt/IndexedDB/reading-autoincrement-indexes-cursors.any.serviceworker.html [ Timeout ]
 crbug.com/626703 [ Mac13 ] virtual/third-party-storage-partitioning/external/wpt/IndexedDB/reading-autoincrement-indexes.any.sharedworker.html [ Timeout ]
@@ -3002,31 +2937,15 @@
 crbug.com/626703 virtual/scalefactor200/external/wpt/css/filter-effects/filter-function/filter-function-repeating-radial-gradient.html [ Failure ]
 crbug.com/626703 virtual/composite-clip-path-animation/external/wpt/css/css-masking/clip-path/animations/clip-path-xywh-interpolation-001.html [ Failure ]
 crbug.com/626703 virtual/main-thread-clip-path-animation/external/wpt/css/css-masking/clip-path/animations/clip-path-xywh-interpolation-001.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/html/canvas/element/text/2d.text.fontVariantCaps3.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/html/canvas/element/text/2d.text.fontVariantCaps3.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/html/canvas/element/text/2d.text.fontVariantCaps4.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/html/canvas/element/text/2d.text.fontVariantCaps4.html [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/html/canvas/offscreen/text/2d.text.fontVariantCaps3.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/html/canvas/offscreen/text/2d.text.fontVariantCaps3.html [ Failure ]
-crbug.com/626703 [ Mac ] external/wpt/html/canvas/offscreen/text/2d.text.fontVariantCaps4.html [ Failure ]
-crbug.com/626703 [ Linux ] external/wpt/html/canvas/offscreen/text/2d.text.fontVariantCaps4.html [ Failure ]
-crbug.com/626703 [ Mac12 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/view-timelines/view-timeline-inset.html [ Timeout ]
-crbug.com/626703 [ Mac13 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/view-timelines/view-timeline-inset.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/scroll-timelines/effect-updateTiming.html [ Timeout ]
 crbug.com/626703 external/wpt/editing/crashtests/insertparagraph-in-listitem-in-svg-followed-by-collapsible-spaces.html [ Timeout ]
 crbug.com/626703 [ Mac10.15 ] external/wpt/workers/modules/shared-worker-import-failure.html [ Failure Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/threaded/external/wpt/scroll-animations/view-timelines/view-timeline-inset.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] virtual/threaded/external/wpt/scroll-animations/view-timelines/view-timeline-range.html [ Timeout ]
-crbug.com/626703 [ Mac13 ] virtual/threaded/external/wpt/scroll-animations/view-timelines/view-timeline-range.html [ Timeout ]
-crbug.com/626703 virtual/threaded/external/wpt/css/css-backgrounds/border-image-002.html [ Failure ]
 crbug.com/626703 [ Mac11 ] external/wpt/fetch/api/cors/cors-keepalive.any.html [ Skip Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/fetch/api/cors/cors-keepalive.any.html [ Skip Timeout ]
 crbug.com/626703 [ Mac13 Release ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html [ Skip Timeout ]
 crbug.com/626703 external/wpt/css/css-backgrounds/box-shadow-border-radius-001.html [ Failure ]
 crbug.com/626703 virtual/threaded/external/wpt/css/css-backgrounds/box-shadow-border-radius-001.html [ Failure ]
 crbug.com/626703 [ Mac13 ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Timeout ]
-crbug.com/626703 [ Mac13 Release ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/scroll-timelines/effect-updateTiming.html [ Timeout ]
-crbug.com/626703 [ Mac13 Release ] virtual/threaded/external/wpt/scroll-animations/scroll-timelines/effect-updateTiming.html [ Timeout ]
 crbug.com/626703 [ Mac13-arm64 Release ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/threaded-prefer-compositing/external/wpt/scroll-animations/css/animation-timeline-view-functional-notation.tentative.html [ Skip Timeout ]
 crbug.com/626703 [ Mac13 Release ] external/wpt/html/semantics/embedded-content/media-elements/ready-states/autoplay-hidden.optional.html [ Timeout ]
@@ -3108,8 +3027,6 @@
 crbug.com/626703 external/wpt/css/css-text/white-space/white-space-vs-joiners-002.html [ Failure ]
 crbug.com/626703 [ Linux ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/background-fetch.https.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/background-fetch.https.html [ Timeout ]
-crbug.com/626703 external/wpt/html/semantics/interactive-elements/the-dialog-element/modal-dialog-backdrop-opacity.html [ Failure ]
-crbug.com/626703 [ Mac11 ] external/wpt/url/IdnaTestV2.window.html [ Failure Timeout ]
 crbug.com/626703 external/wpt/css/css-box/margin-trim/block-container-non-adjoining-item.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-box/margin-trim/flex-block-end-trimmed-only.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-box/margin-trim/flex-block-start-trimmed-only.html [ Failure ]
@@ -3139,14 +3056,13 @@
 crbug.com/626703 external/wpt/css/css-values/ic-unit-015.html [ Failure ]
 crbug.com/626703 external/wpt/css/css-transforms/animation/translate-animation-on-svg.html [ Failure ]
 crbug.com/626703 virtual/backface-visibility-interop/external/wpt/css/css-transforms/animation/translate-animation-on-svg.html [ Failure ]
-crbug.com/626703 virtual/media-foundation-for-clear-dcomp/external/wpt/media-source/dedicated-worker/mediasource-worker-detach-element.html [ Timeout ]
+crbug.com/626703 [ Win10.20h2 ] virtual/media-foundation-for-clear-dcomp/external/wpt/media-source/dedicated-worker/mediasource-worker-detach-element.html [ Timeout ]
+crbug.com/626703 [ Win11 ] virtual/media-foundation-for-clear-dcomp/external/wpt/media-source/dedicated-worker/mediasource-worker-detach-element.html [ Timeout ]
 crbug.com/626703 virtual/threaded/external/wpt/css/css-transforms/animation/translate-animation-on-svg.html [ Failure ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/density-size-correction/density-corrected-image-in-canvas.html [ Failure Timeout ]
 crbug.com/626703 [ Mac12-arm64 ] external/wpt/density-size-correction/density-corrected-image-in-canvas.html [ Failure Timeout ]
 crbug.com/626703 [ Mac13-arm64 ] external/wpt/density-size-correction/density-corrected-image-in-canvas.html [ Failure Timeout ]
-crbug.com/626703 [ Mac12-arm64 ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/background-sync.https.html [ Timeout ]
 crbug.com/626703 [ Win11 ] wpt_internal/geolocation-api/watchPosition-page-visibility.https.html [ Timeout ]
-crbug.com/626703 [ Win10.20h2 ] external/wpt/web-animations/idlharness.window.html [ Crash Failure ]
 crbug.com/626703 [ Mac ] external/wpt/url/a-element-xhtml.xhtml?exclude=(file|javascript|mailto) [ Crash Failure ]
 crbug.com/626703 [ Win10.20h2 ] wpt_internal/geolocation-api/watchPosition-page-visibility.https.html [ Timeout ]
 crbug.com/626703 [ Win ] external/wpt/fetch/metadata/generated/element-meta-refresh.optional.sub.html [ Timeout ]
@@ -3163,7 +3079,6 @@
 crbug.com/626703 [ Linux Release ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/forms/file/file-input-webkitdirectory-key-enter-prevent-keypress.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html [ Timeout ]
-crbug.com/626703 [ Mac12 ] wpt_internal/webxr/ar/ar_hittestsource_lifetimes.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webxr/xrDevice_supportsSession_immersive.https.html [ Timeout ]
 crbug.com/626703 [ Linux ] wpt_internal/webxr/xrSession_dataProviderDisconnect_immersive.https.html [ Timeout ]
 crbug.com/626703 [ Mac12 ] virtual/pending-beacon/external/wpt/pending-beacon/pending_beacon-sendonhidden.tentative.https.window.html [ Timeout ]
@@ -3233,9 +3148,12 @@
 crbug.com/626703 external/wpt/webrtc/RTCConfiguration-iceTransportPolicy.html [ Skip Timeout ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/websockets/unload-a-document/005.html?wpt_flags=h2 [ Skip Timeout ]
 crbug.com/626703 external/wpt/selection/textcontrols/onselectionchange-content-attribute.html [ Timeout ]
-crbug.com/626703 external/wpt/infrastructure/channels/test_call.html [ Timeout ]
-crbug.com/626703 external/wpt/infrastructure/channels/test_postMessage.html [ Timeout ]
-crbug.com/626703 external/wpt/infrastructure/channels/test_serialize.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/infrastructure/channels/test_call.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/infrastructure/channels/test_call.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/infrastructure/channels/test_postMessage.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/infrastructure/channels/test_postMessage.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/infrastructure/channels/test_serialize.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/infrastructure/channels/test_serialize.html [ Timeout ]
 crbug.com/626703 [ Win10.20h2 ] external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Failure Timeout ]
 crbug.com/626703 [ Win10.20h2 ] virtual/feature-policy-permissions/external/wpt/mediacapture-streams/MediaDevices-enumerateDevices-per-origin-ids.sub.https.html [ Failure Timeout ]
 crbug.com/626703 [ Mac11-arm64 ] external/wpt/navigation-timing/nav2_test_response_end_and_duration_before_during_and_after_load_event.html [ Skip Timeout ]
@@ -3260,8 +3178,10 @@
 crbug.com/626703 external/wpt/geolocation-API/non-fully-active.https.html [ Timeout ]
 crbug.com/626703 external/wpt/selection/textcontrols/selectionchange-bubble.html [ Timeout ]
 crbug.com/626703 external/wpt/density-size-correction/density-corrected-image-svg-aspect-ratio-cross-origin.sub.html [ Failure ]
-crbug.com/626703 external/wpt/webrtc-extensions/transfer-datachannel-service-worker.https.html [ Timeout ]
-crbug.com/626703 external/wpt/webrtc-extensions/transfer-datachannel.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/webrtc-extensions/transfer-datachannel-service-worker.https.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/webrtc-extensions/transfer-datachannel-service-worker.https.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/webrtc-extensions/transfer-datachannel.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/webrtc-extensions/transfer-datachannel.html [ Timeout ]
 crbug.com/626703 [ Win ] external/wpt/websockets/Create-blocked-port.any.worker.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/1209223 external/wpt/html/syntax/xmldecl/xmldecl-2.html [ Failure ]
 crbug.com/626703 [ Mac ] editing/pasteboard/drag-selected-image-to-contenteditable.html [ Failure ]
@@ -3270,20 +3190,25 @@
 crbug.com/626703 external/wpt/focus/focus-already-focused-iframe-different-site.html [ Timeout ]
 crbug.com/626703 external/wpt/focus/focus-already-focused-iframe-same-site.html [ Timeout ]
 crbug.com/626703 external/wpt/focus/focus-already-focused-iframe-deep-different-site.html [ Timeout ]
-crbug.com/626703 [ Mac10.15 ] external/wpt/websockets/stream/tentative/backpressure-receive.any.html?wpt_flags=h2 [ Failure Pass ]
-crbug.com/626703 external/wpt/websockets/stream/tentative/close.any.worker.html?wpt_flags=h2 [ Failure Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/websockets/stream/tentative/close.any.worker.html?wpt_flags=h2 [ Failure Timeout ]
+crbug.com/626703 [ Release ] external/wpt/websockets/stream/tentative/close.any.worker.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 [ Mac12 ] external/wpt/websockets/stream/tentative/abort.any.serviceworker.html?wpt_flags=h2 [ Crash Failure Pass ]
-crbug.com/626703 external/wpt/websockets/stream/tentative/close.any.html?wpt_flags=h2 [ Failure Timeout ]
-crbug.com/626703 external/wpt/websockets/stream/tentative/close.any.sharedworker.html?wpt_flags=h2 [ Failure Timeout ]
-crbug.com/626703 external/wpt/websockets/stream/tentative/close.any.serviceworker.html?wpt_flags=h2 [ Failure Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/websockets/stream/tentative/close.any.html?wpt_flags=h2 [ Failure Timeout ]
+crbug.com/626703 [ Release ] external/wpt/websockets/stream/tentative/close.any.html?wpt_flags=h2 [ Failure Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/websockets/stream/tentative/close.any.sharedworker.html?wpt_flags=h2 [ Failure Timeout ]
+crbug.com/626703 [ Release ] external/wpt/websockets/stream/tentative/close.any.sharedworker.html?wpt_flags=h2 [ Failure Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/websockets/stream/tentative/close.any.serviceworker.html?wpt_flags=h2 [ Failure Timeout ]
+crbug.com/626703 [ Release ] external/wpt/websockets/stream/tentative/close.any.serviceworker.html?wpt_flags=h2 [ Failure Timeout ]
 crbug.com/626703 external/wpt/websockets/cookies/001.html?wss&wpt_flags=https [ Failure ]
 crbug.com/626703 external/wpt/websockets/cookies/002.html?wss&wpt_flags=https [ Failure ]
 crbug.com/626703 external/wpt/websockets/cookies/003.html?wss&wpt_flags=https [ Failure ]
 crbug.com/626703 external/wpt/websockets/cookies/005.html?wss&wpt_flags=https [ Failure ]
 crbug.com/626703 external/wpt/websockets/cookies/007.html?wss&wpt_flags=https [ Failure ]
 crbug.com/626703 [ Mac ] external/wpt/preload/download-resources.html [ Failure Pass Timeout ]
-crbug.com/626703 external/wpt/uievents/keyboard/modifier-keys-combinations.html [ Timeout ]
-crbug.com/626703 external/wpt/uievents/keyboard/modifier-keys.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/uievents/keyboard/modifier-keys-combinations.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/uievents/keyboard/modifier-keys-combinations.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/uievents/keyboard/modifier-keys.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/uievents/keyboard/modifier-keys.html [ Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-joining-dl-element-and-another-list.tentative.html?Backspace [ Failure Timeout ]
 crbug.com/1462168 external/wpt/input-events/input-events-get-target-ranges-deleting-in-list-items.tentative.html?Backspace,ul [ Crash Failure Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-joining-dl-elements.tentative.html?Backspace [ Failure Timeout ]
@@ -3296,7 +3221,8 @@
 crbug.com/626703 [ Mac11 Release ] external/wpt/webxr/xr_viewport_scale.https.html [ Failure Timeout ]
 crbug.com/626703 [ Mac12 Release ] external/wpt/webxr/xr_viewport_scale.https.html [ Failure Timeout ]
 crbug.com/626703 [ Mac13 Release ] external/wpt/webxr/xr_viewport_scale.https.html [ Failure Timeout ]
-crbug.com/626703 external/wpt/infrastructure/testdriver/actions/crossOrigin.sub.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/infrastructure/testdriver/actions/crossOrigin.sub.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/infrastructure/testdriver/actions/crossOrigin.sub.html [ Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-during-and-after-dispatch.tentative.html [ Failure Timeout ]
 crbug.com/626703 [ Mac11 ] external/wpt/scroll-to-text-fragment/redirects.html [ Skip Timeout ]
 crbug.com/626703 external/wpt/input-events/input-events-get-target-ranges-non-collapsed-selection.tentative.html?Backspace [ Failure Timeout ]
@@ -3310,13 +3236,15 @@
 crbug.com/626703 external/wpt/workers/postMessage_block.https.html [ Timeout ]
 crbug.com/626703 external/wpt/uievents/order-of-events/focus-events/focus-management-expectations.html [ Timeout ]
 crbug.com/626703 external/wpt/workers/shared-worker-parse-error-failure.html [ Timeout ]
-crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-operations.https.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/webrtc/RTCPeerConnection-operations.https.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/webrtc/RTCPeerConnection-operations.https.html [ Timeout ]
 crbug.com/626703 external/wpt/content-dpr/content-dpr-various-elements.html [ Failure ]
 crbug.com/626703 external/wpt/workers/abrupt-completion.html [ Timeout ]
 crbug.com/626703 external/wpt/service-workers/service-worker/ready.https.window.html [ Timeout ]
 crbug.com/626703 external/wpt/fetch/corb/script-resource-with-nonsniffable-types.tentative.sub.html [ Timeout ]
 crbug.com/626703 external/wpt/webvtt/rendering/cues-with-video/processing-model/snap-to-line.html [ Failure ]
-crbug.com/626703 external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-offer.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-offer.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/webrtc/RTCPeerConnection-setRemoteDescription-offer.html [ Timeout ]
 crbug.com/626703 external/wpt/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html [ Timeout ]
 crbug.com/626703 crbug.com/606367 external/wpt/pointerevents/pointerevent_touch-action-pan-x-pan-y-pan-y_touch.html [ Failure Pass Timeout ]
 crbug.com/626703 external/wpt/xhr/event-readystatechange-loaded.any.worker.html [ Failure Timeout ]
@@ -3388,7 +3316,8 @@
 crbug.com/367760 external/wpt/svg/pservers/reftests/meshgradient-basic-005.svg [ Failure ]
 crbug.com/367760 external/wpt/svg/pservers/reftests/meshgradient-basic-002.svg [ Failure ]
 crbug.com/367760 external/wpt/svg/pservers/reftests/meshgradient-basic-003.svg [ Failure ]
-crbug.com/626703 external/wpt/speech-api/SpeechSynthesis-pause-resume.tentative.html [ Timeout ]
+crbug.com/626703 [ Debug ] external/wpt/speech-api/SpeechSynthesis-pause-resume.tentative.html [ Timeout ]
+crbug.com/626703 [ Release ] external/wpt/speech-api/SpeechSynthesis-pause-resume.tentative.html [ Timeout ]
 crbug.com/626703 external/wpt/css/CSS2/floats/float-nowrap-9.html [ Failure ]
 crbug.com/626703 external/wpt/css/CSS2/floats/float-nowrap-8.html [ Failure ]
 crbug.com/626703 external/wpt/css/CSS2/floats/float-nowrap-7.html [ Failure ]
@@ -3513,7 +3442,6 @@
 crbug.com/614667 external/wpt/css/css-break/grid/grid-item-fragmentation-039.html [ Failure ]
 crbug.com/1058792 external/wpt/css/css-break/transform-007.html [ Failure ]
 crbug.com/1224888 external/wpt/css/css-break/transform-009.html [ Failure ]
-crbug.com/1225630 external/wpt/css/css-multicol/large-actual-column-count.html [ Crash Failure Pass Timeout ]
 crbug.com/481431 external/wpt/css/css-multicol/multicol-breaking-004.html [ Failure ]
 crbug.com/481431 external/wpt/css/css-multicol/multicol-breaking-nobackground-004.html [ Failure ]
 crbug.com/963109 external/wpt/css/css-multicol/multicol-span-all-button-001.html [ Failure ]
@@ -3717,8 +3645,6 @@
 
 crbug.com/676229 plugins/mouse-click-plugin-clears-selection.html [ Failure Pass ]
 crbug.com/742670 ppapi/plugins/iframe-plugin-bgcolor.html [ Failure Pass ]
-crbug.com/780398 [ Mac ] plugins/mouse-capture-inside-shadow.html [ Failure Pass ]
-crbug.com/1331239 [ Mac ] ppapi/plugins/plugin-remove-subframe.html [ Crash Pass ]
 
 crbug.com/678493 http/tests/permissions/chromium/test-request-window.html [ Pass Timeout ]
 
@@ -3728,7 +3654,6 @@
 
 crbug.com/1359409 [ Mac12 ] http/tests/media/video-preload-metadata.html [ Pass Timeout ]
 
-crbug.com/1358638 [ Mac11 ] fast/scroll-behavior/middleclick-autoscroll-nested-elements.html [ Failure Pass ]
 
 crbug.com/1157857 virtual/percent-based-scrolling/max-percent-delta-cross-origin-iframes.html [ Failure Pass Timeout ]
 
@@ -3794,8 +3719,6 @@
 # Expect to fail. The test is applicable only when DigitalGoods flag is disabled.
 crbug.com/1080870 http/tests/payments/payment-request-app-store-billing-mandatory-total.html [ Failure ]
 
-# Layout Tests on Swarming (Windows) - https://crbug.com/717347
-crbug.com/713094 [ Win ] fast/css/fontfaceset-check-platform-fonts.html [ Failure Pass ]
 
 # Image decode failures due to document destruction.
 crbug.com/721435 external/wpt/html/semantics/embedded-content/the-img-element/decode/image-decode-iframe.html [ Crash Failure Pass Timeout ]
@@ -3852,7 +3775,8 @@
 crbug.com/757165 [ Win ] fast/spatial-navigation/snav-single-select.html [ Crash Failure Pass Timeout ]
 crbug.com/757165 [ Win ] fast/spatial-navigation/snav-symmetrically-positioned.html [ Crash Failure Pass Timeout ]
 crbug.com/757165 [ Win ] fast/spatial-navigation/snav-table-traversal.html [ Crash Failure Pass Timeout ]
-crbug.com/757165 [ Win ] fast/spatial-navigation/snav-tiny-table-traversal.html [ Crash Failure Pass Timeout ]
+crbug.com/757165 [ Win10.20h2 ] fast/spatial-navigation/snav-tiny-table-traversal.html [ Crash Failure Pass Timeout ]
+crbug.com/757165 [ Win11 ] fast/spatial-navigation/snav-tiny-table-traversal.html [ Crash Failure Pass Timeout ]
 crbug.com/757165 [ Win ] fast/spatial-navigation/snav-two-elements-one-line.html [ Crash Failure Pass Timeout ]
 crbug.com/757165 [ Win ] fast/spatial-navigation/snav-z-index.html [ Crash Failure Pass Timeout ]
 crbug.com/757165 [ Win ] paint/invalidation/filters/filter-repaint-accelerated-child-with-filter-child.html [ Crash Failure Pass Timeout ]
@@ -3884,8 +3808,6 @@
 # WPT for the missing caretPositionFromPoint implementation
 crbug.com/388976 external/wpt/css/cssom/caretPositionFromPoint-with-transformation.html [ Timeout ]
 
-# Sheriff failure 2017-09-18
-crbug.com/766404 [ Debug Mac13 ] plugins/keyboard-events.html [ Failure Pass ]
 
 # Sheriff failures 2017-09-21
 crbug.com/767469 http/tests/navigation/start-load-during-provisional-loader-detach.html [ Failure Pass ]
@@ -4023,7 +3945,8 @@
 crbug.com/849978 http/tests/devtools/elements/styles-4/stylesheet-source-url-comment.js [ Failure Pass Timeout ]
 
 # User Activation
-crbug.com/736415 crbug.com/1066190 external/wpt/html/user-activation/navigation-state-reset-crossorigin.sub.html [ Failure Timeout ]
+crbug.com/736415 crbug.com/1066190 [ Debug ] external/wpt/html/user-activation/navigation-state-reset-crossorigin.sub.html [ Failure Timeout ]
+crbug.com/736415 crbug.com/1066190 [ Release ] external/wpt/html/user-activation/navigation-state-reset-crossorigin.sub.html [ Failure Timeout ]
 crbug.com/736415 external/wpt/html/user-activation/navigation-state-reset-sameorigin.html [ Failure ]
 
 # S13N Sheriff 2018-7-11
@@ -4324,15 +4247,9 @@
 # Ref_Tests which fail when SkiaRenderer is enable, and which cannot be
 # rebaselined. TODO(jonross): triage these into any existing bugs or file more
 # specific bugs.
-crbug.com/1043675 [ Linux ] animations/animation-paused-hardware.html [ Failure ]
 crbug.com/1043675 [ Linux ] external/wpt/css/filter-effects/backdrop-filter-basic-opacity-2.html [ Failure ]
-crbug.com/1043675 [ Linux ] external/wpt/css/filter-effects/backdrop-filters-brightness.html [ Failure Pass ]
-crbug.com/1043675 [ Linux ] external/wpt/css/filter-effects/backdrop-filters-invert.html [ Failure Pass ]
 crbug.com/1043675 [ Linux ] http/tests/media/video-frame-size-change.html [ Failure ]
 crbug.com/1043675 [ Linux ] svg/custom/svg-root-with-opacity.html [ Failure ]
-crbug.com/1043675 [ Linux ] virtual/scalefactor200/external/wpt/css/filter-effects/backdrop-filters-brightness.html [ Failure ]
-crbug.com/1043675 [ Linux ] virtual/scalefactor200/external/wpt/css/filter-effects/backdrop-filters-invert.html [ Failure ]
-crbug.com/1043675 [ Win ] animations/animation-paused-hardware.html [ Failure ]
 crbug.com/1043675 [ Win ] external/wpt/css/filter-effects/backdrop-filter-basic-opacity-2.html [ Failure ]
 crbug.com/1043675 [ Win ] svg/custom/svg-root-with-opacity.html [ Failure ]
 
@@ -4346,7 +4263,6 @@
 crbug.com/995663 [ Linux ] http/tests/media/autoplay/document-user-activation-cross-origin-feature-policy-header.html [ Failure Pass Timeout ]
 
 # Sheriff 2020-01-30
-crbug.com/1047208 http/tests/serviceworker/update-served-from-cache.html [ Failure Pass ]
 crbug.com/1047293 [ Mac ] editing/pasteboard/pasteboard_with_unfocused_selection.html [ Failure Pass ]
 
 crbug.com/1405829 [ Mac11-arm64 ] external/wpt/css/css-transforms/animation/canvas-webgl-translate-in-animation.html [ Failure Timeout ]
@@ -4446,8 +4362,10 @@
 crbug.com/1317067 external/wpt/html/browsers/history/joint-session-history/joint-session-history-remove-iframe.html [ Skip Timeout ]
 crbug.com/1317067 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/location-setter-user-click.html [ Failure Timeout ]
 crbug.com/1317067 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/location-setter-user-mouseup.html [ Failure Timeout ]
-crbug.com/1317067 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-user-click-during-pageshow.html [ Timeout ]
-crbug.com/1317067 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-user-click-during-load.html [ Timeout ]
+crbug.com/1317067 [ Debug ] external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-user-click-during-pageshow.html [ Timeout ]
+crbug.com/1317067 [ Release ] external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-user-click-during-pageshow.html [ Timeout ]
+crbug.com/1317067 [ Debug ] external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-user-click-during-load.html [ Timeout ]
+crbug.com/1317067 [ Release ] external/wpt/html/browsers/browsing-the-web/navigating-across-documents/replace-before-load/a-user-click-during-load.html [ Timeout ]
 
 # Tests time out, and also give different results.
 crbug.com/1299834 external/wpt/html/browsers/the-window-object/open-close/open-features-non-integer-screenx.html [ Skip Timeout ]
@@ -4479,10 +4397,7 @@
 crbug.com/1317079 external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/window-sharedworker-failure.https.html [ Timeout ]
 crbug.com/1317079 external/wpt/html/infrastructure/safe-passing-of-structured-data/shared-array-buffers/broadcastchannel-success.https.html [ Timeout ]
 crbug.com/1223883 external/wpt/html/webappapis/dynamic-markup-insertion/opening-the-input-stream/location-set-and-document-open.html [ Timeout ]
-crbug.com/1222729 external/wpt/html/dom/elements/global-attributes/dir_auto-N-EN-ref.html [ Failure ]
 crbug.com/678633 external/wpt/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html [ Failure ]
-crbug.com/1317071 [ Mac ] virtual/no-auto-wpt-origin-isolation/external/wpt/html/browsers/origin/origin-keyed-agent-clusters/1-iframe/parent-yes-child-no-port.sub.https.html [ Failure Timeout ]
-crbug.com/1350975 external/wpt/html/dom/directionality/bdi-element-invalid-dir.html [ Failure ]
 
 crbug.com/1416204 external/wpt/scroll-animations/css/printing/animation-timeline-none-with-progress-print.tentative.html [ Failure ]
 crbug.com/1416204 external/wpt/scroll-animations/css/printing/scroll-timeline-default-iframe-print.html [ Failure ]
@@ -4515,8 +4430,6 @@
 crbug.com/1084256 [ Linux ] http/tests/misc/insert-iframe-into-xml-document-before-xsl-transform.html [ Failure Pass ]
 crbug.com/1084256 [ Mac ] http/tests/misc/insert-iframe-into-xml-document-before-xsl-transform.html [ Failure Pass ]
 
-# Assorted virtual/threaded/.../wpt/scroll-animations tests
-crbug.com/1279648 virtual/threaded/external/wpt/scroll-animations/css/view-timeline-inset-animation.html [ Failure Pass Timeout ]
 
 crbug.com/1071189 [ Debug Linux ] editing/selection/programmatic-selection-on-mac-is-directionless.html [ Pass Timeout ]
 
@@ -4782,7 +4695,6 @@
 
 crbug.com/1195295 fast/events/touch/multi-touch-timestamp.html [ Failure Pass ]
 
-crbug.com/1196745 [ Mac10.15 ] editing/selection/editable-links.html [ Crash Failure Pass Timeout ]
 
 # Is fixed by PlzDedicatedWorker.
 crbug.com/1060837 external/wpt/html/cross-origin-embedder-policy/reporting-to-frame-owner.https.html [ Timeout ]
@@ -4802,7 +4714,6 @@
 # Sheriff 2021-04-15
 crbug.com/1196118 plugins/mouse-move-over-plugin-in-frame.html [ Failure Pass ]
 crbug.com/1199528 http/tests/inspector-protocol/css/css-edit-redirected-css.js [ Failure Pass ]
-crbug.com/1196317 [ Mac10.15 Release ] scrollbars/custom-scrollbar-thumb-width-changed-on-inactive-pseudo.html [ Failure Pass ]
 crbug.com/1196317 [ Mac11 Release ] scrollbars/custom-scrollbar-thumb-width-changed-on-inactive-pseudo.html [ Failure Pass ]
 crbug.com/1196317 [ Mac11-arm64 Release ] scrollbars/custom-scrollbar-thumb-width-changed-on-inactive-pseudo.html [ Failure Pass ]
 crbug.com/1196317 [ Mac12 Release ] scrollbars/custom-scrollbar-thumb-width-changed-on-inactive-pseudo.html [ Failure Pass ]
@@ -4832,7 +4743,6 @@
 # Some plzServiceWorker and plzDedicatedWorker singled out from generic sheriff rounds above
 
 # For SkiaRenderer on MacOS
-crbug.com/1208173 [ Mac ] animations/animation-paused-hardware.html [ Failure ]
 crbug.com/1208173 [ Mac ] css3/filters/backdrop-filter-boundary.html [ Failure ]
 crbug.com/1208173 [ Mac ] external/wpt/css/filter-effects/backdrop-filter-basic-opacity-2.html [ Failure ]
 crbug.com/1208173 [ Mac ] svg/custom/svg-root-with-opacity.html [ Failure ]
@@ -4985,8 +4895,6 @@
 crbug.com/1455239 http/tests/security/drag-drop-different-origin.html [ Failure Pass ]
 crbug.com/1455579 virtual/disable-device-id-pointer-event/fast/events/pointerevents/device-id/get-device-id-from-pointer-event.html [ Failure Pass ]
 crbug.com/1456442 virtual/compositor-threaded-percent-based-scrolling/fast/events/wheel/wheel-latched-scroll-node-removed.html [ Failure Pass Timeout ]
-crbug.com/1467833 [ Mac ] virtual/main-threaded-percent-based-scrolling/fast/events/wheel/wheel-latched-scroll-node-removed.html [ Failure Pass Timeout ]
-crbug.com/1462420 fast/dnd/dragtriggerdommove/drag-trigger-dom-move-image.html [ Failure Pass Timeout ]
 
 # Green Mac11 Test
 crbug.com/1201406 http/tests/credentialmanagement/publickeycredential-same-origin-with-ancestors.html [ Crash Pass Timeout ]
@@ -5010,8 +4918,6 @@
 crbug.com/1223601 [ Linux ] fast/scrolling/autoscroll-latch-clicked-node-if-parent-unscrollable.html [ Failure Pass ]
 crbug.com/1223601 [ Linux ] fast/scrolling/reset-scroll-in-onscroll.html [ Failure Pass ]
 
-# Sheriff 2021-06-29
-crbug.com/1197464 [ Mac ] ppapi/plugins/refcount-leaks.html [ Failure Pass ]
 
 # Sheriff 2021-07-12
 crbug.com/1228432 [ Linux ] external/wpt/video-rvfc/request-video-frame-callback-before-xr-session.https.html [ Pass Timeout ]
@@ -5030,8 +4936,6 @@
 crbug.com/1231699 [ Linux ] fast/canvas/canvas-composite-video.html [ Failure Pass ]
 crbug.com/1231699 [ Linux ] fast/reflections/opacity-reflection-transform.html [ Failure Pass ]
 
-# Other devtools flaky tests outside of http/tests/inspector-protocol/network.
-crbug.com/1228261 [ Release Win ] http/tests/inspector-protocol/browser-grant-permissions.js [ Failure Pass Timeout ]
 
 # Flakes that might be caused or aggravated by PlzServiceWorker
 crbug.com/996511 external/wpt/service-workers/service-worker/getregistrations.https.html [ Crash Failure Pass Timeout ]
@@ -5143,8 +5047,6 @@
 crbug.com/1249176 [ Mac11-arm64 ] paint/markers/document-markers-zoom-2000.html [ Failure Pass ]
 crbug.com/1249176 [ Mac12-arm64 ] paint/markers/document-markers-zoom-2000.html [ Failure Pass ]
 crbug.com/1249176 [ Mac11-arm64 ] inspector-protocol/layout-fonts/lang-fallback.js [ Failure Pass ]
-crbug.com/1249176 [ Mac11-arm64 ] external/wpt/layout-instability/recent-input.html [ Failure Pass ]
-crbug.com/1249176 [ Mac12-arm64 ] external/wpt/layout-instability/recent-input.html [ Failure Pass ]
 crbug.com/1249176 virtual/gpu-rasterization/images/12-55.html [ Crash Failure Pass Timeout ]
 crbug.com/1249176 [ Mac11-arm64 ] external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-015.html [ Failure Pass ]
 crbug.com/1249176 [ Mac11-arm64 ] external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-003.html [ Failure Pass ]
@@ -5161,7 +5063,6 @@
 crbug.com/1249176 [ Mac12-arm64 ] virtual/gpu-rasterization/images/directly-composited-image-orientation.html [ Failure Pass ]
 
 crbug.com/1249176 [ Mac11-arm64 ] external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-011.html [ Crash Failure Pass ]
-crbug.com/1249176 [ Mac12-arm64 ] external/wpt/css/css-shapes/shape-outside/shape-image/shape-image-011.html [ Crash Failure Pass ]
 
 # Sheriff 2021-09-16
 crbug.com/1250457 [ Mac ] virtual/prefer_compositing_to_lcd_text/scrollbars/custom-scrollbar-inactive-pseudo.html [ Timeout ]
@@ -5198,8 +5099,6 @@
 crbug.com/1339051 [ Linux ] virtual/oopr-canvas2d/fast/canvas/canvas-createImageBitmap-out-of-bounds-src.html [ Failure ]
 crbug.com/1339051 [ Linux ] virtual/prefer_compositing_to_lcd_text/compositing/overflow/nested-render-surfaces.html [ Failure ]
 
-# Sheriff 2021-10-01
-crbug.com/1255221 http/tests/devtools/elements/styles-4/svg-style.js [ Failure Pass ]
 
 # Temporarily disable test to land https://crrev.com/c/5046564
 crbug.com/1444349 http/tests/devtools/sources/debugger-pause/debugger-eval-on-call-frame-inside-iframe.js [ Failure Pass ]
@@ -5228,12 +5127,7 @@
 crbug.com/1270355 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/009.html [ Timeout ]
 
 # Sheriff 2021-11-19
-crbug.com/1186771 [ Debug Mac13-arm64 ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ]
 crbug.com/1186771 [ Mac10.15 Release ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ]
-crbug.com/1186771 [ Mac11 Release ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ]
-crbug.com/1186771 [ Mac11-arm64 Release ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ]
-crbug.com/1186771 [ Mac12 ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ]
-crbug.com/1186771 [ Mac12-arm64 Release ] fast/scroll-snap/snaps-after-scrollbar-scrolling-track.html [ Crash ]
 crbug.com/894077 [ Linux ] virtual/android/fullscreen/video-fixed-background.html [ Failure Pass ]
 
 # Sheriff 2021-11-22
@@ -5265,8 +5159,6 @@
 
 # Sheriff 2021-11-29
 crbug.com/1274458 external/wpt/audio-output/selectAudioOutput-permissions-policy.https.sub.html [ Failure Pass ]
-crbug.com/1239485 [ Mac Release ] ppapi/fast/frames/iframe-plugin-load-remove-document-crash.html [ Failure Pass ]
-crbug.com/1239485 [ Mac Release ] ppapi/plugins/plugin-scroll.html [ Failure Pass ]
 
 # Sheriff 2021-12-01
 crbug.com/1275658 http/tests/misc/script-after-slow-stylesheet-removed.html [ Failure Pass ]
@@ -5322,9 +5214,6 @@
 
 # Sheriff 2022-02-01
 # Flaky test on Mac
-crbug.com/1292843 [ Mac11-arm64 Release ] external/wpt/css/css-transforms/animation/perspective-origin-interpolation.html [ Failure Pass ]
-crbug.com/1292869 [ Mac11-arm64 Release ] external/wpt/webaudio/the-audio-api/the-audioparam-interface/audioparam-cancel-and-hold.html [ Failure Pass ]
-crbug.com/1292871 [ Mac11-arm64 Release ] external/wpt/webaudio/the-audio-api/the-audioparam-interface/k-rate-dynamics-compressor-connections.html [ Failure Pass ]
 crbug.com/1292876 [ Mac ] http/tests/devtools/console/console-time.js [ Failure Pass ]
 
 crbug.com/1038139 [ Linux ] virtual/gpu-rasterization/images/2-comp.html [ Failure Pass ]
@@ -5384,7 +5273,6 @@
 crbug.com/1304956 storage/indexeddb/dont-wedge.html [ Failure Pass ]
 
 # Sheriff 2022-03-15
-crbug.com/626703 external/wpt/scroll-to-text-fragment/force-load-at-top.html [ Pass Timeout ]
 crbug.com/1269534 fast/spatial-navigation/snav-zero-margin-content.html [ Failure Pass ]
 crbug.com/1295980 virtual/fenced-frame-mparch/external/wpt/fenced-frame/user-activation.https.html [ Failure Pass Timeout ]
 crbug.com/1298633 http/tests/inspector-protocol/network/cross-origin-isolation/coep-load-error-reporting-worker.js [ Pass Timeout ]
@@ -5397,8 +5285,6 @@
 crbug.com/1312164 webaudio/internals/mediaelementaudiosourcenode-gc.html [ Failure Skip ]
 crbug.com/1312164 webaudio/internals/audiocontext-gc.html [ Failure Skip ]
 
-# Sheriff 2022-03-21: More flaky tests.
-crbug.com/1450306 [ Mac ] ppapi/plugins/plugin-document-back-forward.html [ Failure Pass ]
 
 # Tests that need updates due to rounding math in layout
 crbug.com/1309975 http/tests/devtools/console/console-viewport-indices.js [ Failure ]
@@ -5412,7 +5298,6 @@
 crbug.com/1309756 [ Mac13-arm64 ] http/tests/images/force-reload.html [ Crash Failure Pass Timeout ]
 crbug.com/1309756 [ Mac11-arm64 Release ] http/tests/images/force-reload.html [ Crash Failure Pass Timeout ]
 crbug.com/1309756 [ Mac12-arm64 Release ] http/tests/images/force-reload.html [ Crash Failure Pass Timeout ]
-crbug.com/1309756 [ Mac11-arm64 ] http/tests/images/force-reload-image-document.html [ Crash Failure Pass Timeout ]
 
 # Sheriff 2022-03-25
 crbug.com/1197296 [ Debug Linux ] virtual/unified-autoplay/external/wpt/feature-policy/feature-policy-frame-policy-timing.https.sub.html [ Failure Pass ]
@@ -5468,7 +5353,6 @@
 # Selectlist flakes
 crbug.com/1253971 external/wpt/html/semantics/forms/the-selectlist-element/selectlist-parts-structure.tentative.html [ Crash Timeout ]
 crbug.com/1394524 external/wpt/html/semantics/forms/the-selectlist-element/selectlist-form-state-restore.tentative.html [ Failure Pass Timeout ]
-crbug.com/1481245 [ Mac ] external/wpt/html/semantics/forms/the-selectlist-element/selectlist-popover.tentative.html [ Pass Timeout ]
 
 # Sheriff 2022-04-21
 crbug.com/1318318 external/wpt/fetch/private-network-access/service-worker-background-fetch.tentative.https.window.html [ Failure Pass Timeout ]
@@ -5626,7 +5510,6 @@
 # Flakes on all platforms.
 
 # Sheriff 2022-08-12
-crbug.com/1352248 [ Release Win ] virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-non-ad-followed-by-ad.html [ Failure Pass ]
 crbug.com/1352545 [ Debug Linux ] external/wpt/html/cross-origin-opener-policy/coop-sandbox-redirects-cuts-opener.https.html [ Failure Pass ]
 crbug.com/1352545 [ Linux ] external/wpt/html/interaction/focus/chrome-object-tab-focus-bug.html [ Failure Pass ]
 crbug.com/1352566 [ Mac ] external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice.html [ Failure Pass ]
@@ -5645,8 +5528,6 @@
 # Disable step failure trigger flaky tests
 crbug.com/1358333 [ Mac ] external/wpt/webmessaging/event.origin.sub.htm [ Failure Pass ]
 
-# Sheriff 2022-08-31
-crbug.com/1306304 [ Mac ] ppapi/plugins/multiple-plugins.html [ Failure Pass ]
 
 # Sheriff 2022-09-06
 crbug.com/1358298 external/wpt/html/cross-origin-embedder-policy/require-corp.https.html [ Failure Pass ]
@@ -5656,8 +5537,6 @@
 crbug.com/1359541 [ Win ] virtual/threaded-prefer-compositing/fast/scrolling/scrollbars/mouse-scrolling-on-div-custom-scrollbar.html [ Failure Pass Timeout ]
 
 
-# Disable media security policy test on Linux (dbg, ASAN) and Mac12 (dbg)
-crbug.com/1349180 [ Linux ] external/wpt/content-security-policy/media-src/media-src-7_2_2.sub.html [ Failure Pass Timeout ]
 
 # Disable flakes on mac builders
 crbug.com/1363708 [ Mac12 Release ] http/tests/media/gc-while-network-loading.html [ Pass Timeout ]
@@ -5687,7 +5566,10 @@
 crbug.com/1367067 [ Linux ] external/wpt/preload/preload-dynamic-csp.html [ Crash Failure Pass Timeout ]
 
 # Sheriff 2022-09-29
-crbug.com/1369642 [ Mac ] external/wpt/encoding/unsupported-labels.window.html [ Failure Timeout ]
+crbug.com/1369642 [ Debug Mac13-arm64 ] external/wpt/encoding/unsupported-labels.window.html [ Failure Timeout ]
+crbug.com/1369642 [ Mac11 Release ] external/wpt/encoding/unsupported-labels.window.html [ Failure Timeout ]
+crbug.com/1369642 [ Mac12 Release ] external/wpt/encoding/unsupported-labels.window.html [ Failure Timeout ]
+crbug.com/1369642 [ Mac13 ] external/wpt/encoding/unsupported-labels.window.html [ Failure Timeout ]
 
 # Temporarily expect timeouts related to post message blocking
 crbug.com/1159586 virtual/post-message-first-party-to-third-party-different-bucket-same-origin-blocked/external/wpt/html/browsers/windows/post-message/third-party-to-first-party-cross-partition-same-origin.sub.html [ Timeout ]
@@ -5743,7 +5625,6 @@
 crbug.com/1386214 [ Win ] external/wpt/html/semantics/forms/the-input-element/show-picker-user-gesture.html [ Skip Timeout ]
 crbug.com/1375147 [ Win ] virtual/media-foundation-for-clear-dcomp/media/controls/singletap-on-overlay-closes-overflow-menu.html [ Failure ]
 crbug.com/1396079 [ Mac ] inspector-protocol/memory/forcibly-purge-javascript-memory.js [ Crash Failure ]
-crbug.com/1395840 [ Mac11-arm64 Release ] http/tests/accessibility/slow-document-load.html [ Failure ]
 crbug.com/1395840 [ Mac12 Release ] http/tests/accessibility/slow-document-load.html [ Failure ]
 crbug.com/1406027 [ Win ] virtual/media-foundation-for-clear-dcomp/media/controls/overflow-menu-hide-on-resize.html [ Failure ]
 crbug.com/1289607 [ Linux ] external/wpt/cookie-store/cookieStore_subscribe_arguments.https.any.html [ Failure ]
@@ -5756,15 +5637,11 @@
 crbug.com/1434123 media/video-source-type-params.html [ Failure Pass ]
 crbug.com/1418393 [ Debug Linux ] external/wpt/performance-timeline/not-restored-reasons/performance-navigation-timing-attributes.tentative.window.html [ Failure ]
 crbug.com/1445674 [ Linux ] webaudio/internals/audioworkletprocessor-gc.https.html [ Timeout ]
-crbug.com/1463024 [ Debug Linux ] fast/forms/date/date-input-vertical-lr.html [ Failure ]
-crbug.com/1463024 [ Debug Linux ] fast/forms/date/date-input-vertical-rl.html [ Failure ]
 crbug.com/1407279 [ Win ] external/wpt/fullscreen/api/element-request-fullscreen-cross-origin.sub.html [ Failure ]
 crbug.com/1407279 [ Mac ] external/wpt/fullscreen/api/element-request-fullscreen-cross-origin.sub.html [ Failure ]
 crbug.com/1407279 [ Linux ] external/wpt/fullscreen/api/element-request-fullscreen-cross-origin.sub.html [ Failure ]
 crbug.com/1454956 [ Linux ] external/wpt/mediacapture-record/MediaRecorder-canvas-media-source.https.html [ Failure ]
 crbug.com/1454956 [ Mac ] virtual/gpu/external/wpt/mediacapture-record/MediaRecorder-canvas-media-source.https.html [ Failure ]
-crbug.com/1345886 [ Linux ] plugins/user-gesture.html [ Failure ]
-crbug.com/1464848 [ Mac10.15 ] http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ]
 crbug.com/1466578 external/wpt/event-timing/event-click-visibilitychange.html [ Failure Pass ]
 crbug.com/1446711 [ Mac ] media/controls/playback-speed-menu.html [ Timeout ]
 crbug.com/1446711 [ Win ] virtual/media-foundation-for-clear-dcomp/media/controls/accessibility-playback-speed-button.html [ Timeout ]
@@ -5794,14 +5671,11 @@
 # Sheriff 2022-10-12
 
 crbug.com/1280883 [ Debug Linux ] virtual/compositor-threaded-percent-based-scrolling-dsf-2/virtual/percent-based-scrolling/max-percent-delta.html [ Failure Pass ]
-crbug.com/1280883 [ Win ] virtual/main-threaded-percent-based-scrolling/virtual/percent-based-scrolling/max-percent-delta.html [ Failure Pass ]
-crbug.com/1280883 [ Mac12 ] virtual/compositor-threaded-percent-based-scrolling-dsf-2/virtual/percent-based-scrolling/max-percent-delta.html [ Pass Timeout ]
+crbug.com/1280883 [ Win11-arm64 ] virtual/main-threaded-percent-based-scrolling/virtual/percent-based-scrolling/max-percent-delta.html [ Failure Pass ]
 
 # Temporarily disable tests to investigate test_driver.click issue
 crbug.com/1374264 [ Mac ] external/wpt/screen-capture/permissions-policy-audio+video.https.sub.html [ Crash Failure Pass Timeout ]
 crbug.com/1374264 [ Mac ] external/wpt/screen-capture/permissions-policy-audio.https.sub.html [ Crash Failure Pass Timeout ]
-crbug.com/1374264 [ Debug Mac13-arm64 ] external/wpt/screen-capture/permissions-policy-video.https.sub.html [ Crash Failure Pass Timeout ]
-crbug.com/1374264 [ Mac10.15 Release ] external/wpt/screen-capture/permissions-policy-video.https.sub.html [ Crash Failure Pass Timeout ]
 crbug.com/1374264 [ Mac11 Release ] external/wpt/screen-capture/permissions-policy-video.https.sub.html [ Crash Failure Pass Timeout ]
 crbug.com/1374264 [ Mac12 Release ] external/wpt/screen-capture/permissions-policy-video.https.sub.html [ Crash Failure Pass Timeout ]
 
@@ -6238,7 +6112,6 @@
 
 crbug.com/1472353 external/wpt/credential-management/fedcm-context.https.html [ Pass Timeout ]
 
-crbug.com/1475772 [ Win ] external/wpt/credential-management/fedcm-hosteddomain.https.html [ Pass Timeout ]
 
 crbug.com/1404951 [ Win ] external/wpt/credential-management/fedcm-nonce-is-optional.https.html [ Pass Timeout ]
 
@@ -6290,8 +6163,6 @@
 # Sheriff 2022-11-21
 crbug.com/1380188 external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash.html [ Failure Pass ]
 crbug.com/1385809 external/wpt/clipboard-apis/async-navigator-clipboard-basics.https.html [ Failure Pass Timeout ]
-crbug.com/1385548 [ Mac10.15 ] external/wpt/close-watcher/user-activation.html [ Pass Timeout ]
-crbug.com/1385548 [ Mac10.15 ] virtual/close-watcher/external/wpt/close-watcher/user-activation.html [ Pass Timeout ]
 
 # Sheriff 2022-11-21 - EMEA
 crbug.com/1392077 external/wpt/screen-orientation/orientation-reading.html [ Failure Timeout ]
@@ -6386,8 +6257,6 @@
 # This test time out because it triggers the legacy SVC path.
 crbug.com/webrtc/14889 external/wpt/webrtc/simulcast/vp9.https.html [ Skip Timeout ]
 
-#Sheriff 2023-02-21
-crbug.com/1308826 ppapi/fast/loader/reload-zero-byte-plugin.html [ Failure Pass Timeout ]
 
 # Sheriff 2023-03-23
 crbug.com/952717 [ Win10.20h2 ] http/tests/xmlhttprequest/redirect-cross-origin-post.html [ Failure Pass ]
@@ -6404,7 +6273,6 @@
 # Sheriff 2023-04-06
 crbug.com/1362106 [ Linux ] media/video-source-error-no-candidate.html [ Failure Pass ]
 crbug.com/1362106 [ Linux ] media/video-source.html [ Failure Pass ]
-crbug.com/1431085 external/wpt/html/semantics/embedded-content/media-elements/loading-the-media-resource/resource-selection-source-media.html [ Failure Pass ]
 
 # Sheriff 2023-04-07
 crbug.com/1431236 external/wpt/long-animation-frame/tentative/loaf-user-callback.html [ Failure Pass ]
@@ -6471,13 +6339,11 @@
 [ Debug Mac13 ] virtual/threaded-no-composited-antialiasing/animations/interpolation/webkit-background-size-interpolation.html [ Skip Timeout ]
 [ Debug Mac13 ] http/tests/devtools/resource-tree/resource-tree-non-unique-url.js [ Skip Timeout ]
 [ Debug Mac13 ] virtual/keepalive-in-browser-migration/external/wpt/fetch/metadata/generated/element-meta-refresh.optional.sub.html [ Skip Timeout ]
-[ Debug Mac13 ] external/wpt/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/Document-parseHTMLUnsafe-url.html [ Failure ]
 [ Debug Mac13 ] http/tests/devtools/network/network-not-modified-images-mime-type.js [ Skip Timeout ]
 [ Debug Mac13 ] external/wpt/scroll-to-text-fragment/percent-encoding.html [ Skip Timeout ]
 [ Debug Mac13 ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/disallowed-navigations-dangling-markup-urn.https.html [ Failure ]
 [ Debug Mac13 ] virtual/threaded-prefer-compositing/fast/scrolling/overflow-hidden-viewport-scrolling.html [ Skip Timeout ]
 [ Debug Mac13 ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/can-load-api.https.html [ Skip Timeout ]
-[ Debug Mac13 ] external/wpt/content-security-policy/frame-src/frame-src-cross-origin-load.sub.html [ Failure ]
 [ Debug Mac13 ] virtual/pna-workers-disabled/external/wpt/fetch/private-network-access/mixed-content-fetch.tentative.https.window.html [ Skip Timeout ]
 [ Debug Mac13 ] external/wpt/webtransport/streams-close.https.any.serviceworker.html [ Failure ]
 [ Debug Mac13 ] virtual/threaded/transitions/retargeted-matching-rotation-transforms.html [ Skip Timeout ]
@@ -6503,7 +6369,6 @@
 [ Debug Mac13 ] virtual/threaded/animations/stability/pause-set-current-time.html [ Skip Timeout ]
 [ Debug Mac13 ] external/wpt/css/css-color/parsing/color-computed-hsl.html [ Skip Timeout ]
 [ Debug Mac13 ] virtual/controls-refresh-hc/fast/forms/color-scheme/button/button-pressed-state.html [ Skip Timeout ]
-[ Debug Mac13 ] external/wpt/html/webappapis/dynamic-markup-insertion/html-unsafe-methods/Document-parseHTMLUnsafe-url-base.html [ Failure ]
 [ Debug Mac13 ] http/tests/devtools/profiler/heap-snapshot-comparison-sorting.js [ Skip Timeout ]
 [ Debug Mac13 ] external/wpt/html/browsers/browsing-the-web/overlapping-navigations-and-traversals/same-document-traversal-cross-document-nav.html [ Failure ]
 [ Debug Mac13 ] virtual/threaded-no-composited-antialiasing/animations/interpolation/text-decoration-color-interpolation.html [ Skip Timeout ]
@@ -6514,7 +6379,6 @@
 [ Debug Mac13 ] virtual/threaded/printing/css2.1/page-break-after-002.html [ Skip Timeout ]
 [ Debug Mac13 ] virtual/fenced-frame-mparch/external/wpt/html/anonymous-iframe/embedding.tentative.https.window.html?13-last [ Failure ]
 [ Debug Mac13 ] http/tests/devtools/profiler/heap-snapshot-containment-sorting.js [ Skip Timeout ]
-[ Debug Mac13 ] editing/selection/wrapped-line-caret-1.html [ Failure ]
 [ Debug Mac13 ] virtual/dark-color-scheme/fast/forms/color-scheme/media/video-playback-speed-menu.html [ Failure Skip Timeout ]
 [ Debug Mac13 ] http/tests/devtools/persistence/persistence-tabbed-editor-tabs-order.js [ Skip Timeout ]
 [ Debug Mac13 ] fast/dom/shadow/selections-in-shadow.html [ Skip Timeout ]
@@ -6626,23 +6490,21 @@
 # Sheriff 2023-05-29
 # Those tests seems to be flaky on mac13-arm64
 crbug.com/1449995 [ Mac13-arm64 ] svg/text/text-selection-fonts-01-t.svg [ Failure Pass ]
-crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/atsui-multiple-renderers.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/decorations-with-text-combine.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/firstline/001.html [ Failure Pass ]
-crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/font-features/caps-native-synthesis.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/font-initial.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/font-stretch.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/font-weight.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/in-rendered-text-rtl.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/international/bidi-LDB-2-formatting-characters.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/international/bidi-neutral-directionality-paragraph-start.html [ Failure Pass ]
-crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/international/lang-glyph-cache-separation.html [ Failure Pass ]
+crbug.com/1449995 [ Mac13-arm64 Release ] virtual/text-antialias/international/lang-glyph-cache-separation.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/international/plane2.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/international/text-combine-image-test.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/international/vertical-text-glyph-test.html [ Failure Pass ]
-crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/justify-ideograph-complex.html [ Failure Pass ]
+crbug.com/1449995 [ Mac13-arm64 Release ] virtual/text-antialias/justify-ideograph-complex.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/justify-ideograph-leading-expansion.html [ Failure Pass ]
-crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/justify-ideograph-simple.html [ Failure Pass ]
+crbug.com/1449995 [ Mac13-arm64 Release ] virtual/text-antialias/justify-ideograph-simple.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/justify-ideograph-vertical.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/midword-break-after-breakable-char.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/selection/atsui-kerning-and-ligatures.html [ Failure Pass ]
@@ -6650,7 +6512,6 @@
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/selection/should-use-atsui.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/stroking-decorations.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/trailing-white-space-2.html [ Failure Pass ]
-crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/trailing-white-space.html [ Failure Pass ]
 crbug.com/1449995 [ Mac13-arm64 ] virtual/text-antialias/whitespace/pre-wrap-last-char.html [ Failure Pass ]
 
 crbug.com/1448011 http/tests/devtools/application-panel/resources-panel-iframe-idb.js [ Failure Pass ]
@@ -6666,7 +6527,6 @@
 crbug.com/1451210 [ Mac ] external/wpt/scroll-to-text-fragment/iframe-scroll.sub.html [ Failure Pass ]
 crbug.com/1452222 [ Debug Linux ] http/tests/devtools/sources/debugger-breakpoints/breakpoint-manager-listeners-count.js [ Failure Pass ]
 crbug.com/1453235 [ Mac ] external/wpt/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-video.https.html [ Failure Pass Timeout ]
-crbug.com/1453398 [ Linux ] images/image-hover-display-alt.html [ Failure Pass ]
 
 # Since HTTPS upgrades run in the //chrome layer, these will fail when ran in content shell.
 external/wpt/https-upgrades/tentative/upgrade.https.sub.html [ Timeout ]
@@ -6691,7 +6551,6 @@
 crbug.com/1453965 [ Mac13-arm64 ] external/wpt/webgl/texSubImage2D.html [ Failure Pass ]
 crbug.com/1453965 [ Mac12-arm64 ] external/wpt/webgl/uniformMatrixNfv.html [ Failure Pass ]
 crbug.com/1453965 [ Mac13-arm64 ] external/wpt/webgl/uniformMatrixNfv.html [ Failure Pass ]
-crbug.com/1453977 [ Linux ] fast/events/touch/gesture/gesture-tap-paragraph-end.html [ Failure Pass ]
 crbug.com/1454064 [ Debug Linux ] fast/events/autoscroll-should-not-stop-on-keypress.html [ Failure Pass ]
 
 crbug.com/1453772 [ Win ] external/wpt/window-management/multi-screen-fullscreen-companion.tentative.https.html [ Failure Pass ]
@@ -6706,7 +6565,6 @@
 crbug.com/1454689 http/tests/inspector-protocol/tracing/cpu-profiling.js [ Failure Pass ]
 
 crbug.com/1455245 virtual/fedcm-multi-idp/external/wpt/credential-management/fedcm-multi-idp/abort-multiple-gets-through-first-idp.https.html [ Pass Timeout ]
-crbug.com/1455245 virtual/fedcm-multi-idp/external/wpt/credential-management/fedcm-multi-idp/abort-multiple-gets-through-second-idp.https.html [ Pass Timeout ]
 crbug.com/1455245 virtual/fedcm-multi-idp/external/wpt/credential-management/fedcm-multi-idp/get-before-and-after-onload.https.html [ Failure Pass Timeout ]
 crbug.com/1455245 virtual/fedcm-multi-idp/external/wpt/credential-management/fedcm-multi-idp/get-before-and-during-onload.https.html [ Pass Timeout ]
 crbug.com/1455245 virtual/fedcm-multi-idp/external/wpt/credential-management/fedcm-multi-idp/get-before-onload-and-during-dom-content-loaded.https.html [ Pass Timeout ]
@@ -6721,7 +6579,6 @@
 crbug.com/1455314 external/wpt/longtask-timing/longtask-in-childiframe-crossorigin.html [ Failure Pass ]
 
 # Gardener 2023-06-16
-crbug.com/1455487 fast/layers/no-clipping-overflow-hidden-hardware-acceleration.html [ Failure Pass ]
 crbug.com/1413770 wpt_internal/storage/estimate-usage-details-filesystem.https.tentative.any.html [ Failure Pass ]
 
 crbug.com/1455325 external/wpt/html/semantics/forms/form-submission-0/form-double-submit-requestsubmit.html [ Pass Timeout ]
@@ -6731,15 +6588,11 @@
 
 # Sheriff 2023-06-21
 crbug.com/1464993 [ Linux ] fast/forms/accent-color/range-accent-color-hover-dark-appearance.html [ Failure Pass ]
-crbug.com/1464993 [ Linux ] fast/forms/number/number-appearance-spinbutton-disabled-readonly.html [ Failure Pass ]
 
 
 # Fix importer 2023-06-27
 crbug.com/626703 external/wpt/loading/early-hints/modulepreload-as-worker.h2.window.html [ Failure ]
 
-# Gardener 2023-06-29
-# Failing on Webkit Linux Leak
-crbug.com/1459159 [ Linux ] fast/events/touch/gesture/gesture-tap-mouse-events.html [ Failure Pass ]
 # Flaky
 crbug.com/1459333 [ Mac11 ] virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-ad-viewport-resize.html [ Failure Pass ]
 # Slightly flaky
@@ -6753,7 +6606,6 @@
 crbug.com/1459304 [ Linux ] virtual/fenced-frame-mparch/http/tests/inspector-protocol/fenced-frame/device-emulation-fenced-frame.https.js [ Failure Pass ]
 crbug.com/1459304 [ Linux ] virtual/fenced-frame-mparch/external/wpt/fenced-frame/navigator-vibrate.https.html [ Failure Pass ]
 crbug.com/1459304 [ Linux ] fast/peerconnection/RTCPeerConnection-iframe-gc.html [ Failure Pass ]
-crbug.com/1459304 [ Linux ] virtual/threaded-prefer-compositing/fast/scrolling/scrollbars/mouse-autoscrolling-on-scrollbar.html [ Failure Pass ]
 crbug.com/1459347 [ Fuchsia ] virtual/text-antialias/stroking-decorations.html [ Failure Pass ]
 crbug.com/1459347 [ Fuchsia ] paint/invalidation/shadow-multiple.html [ Failure Pass ]
 
@@ -6806,13 +6658,10 @@
 # Very flaky on most Mac builders
 crbug.com/1465321 [ Mac ] virtual/prefetch-no-vary-search/wpt_internal/speculation-rules/prefetch/no-vary-search/prefetch-single-non-eager-with-hint.https.html?26-26 [ Failure Pass Timeout ]
 crbug.com/1465321 [ Mac ] external/wpt/pointerevents/compat/pointerevent_mouse-pointer-preventdefault.html [ Failure Pass Timeout ]
-# Slightly flaky on individual builders
-crbug.com/1465321 [ Mac10.15 ] external/wpt/scroll-to-text-fragment/redirects.html [ Failure Pass Timeout ]
 
 # Gardener 2023-07-20
 crbug.com/1465723 [ Mac ] virtual/prefetch-no-vary-search/wpt_internal/speculation-rules/prefetch/no-vary-search/prefetch-single-non-eager-with-hint.https.html* [ Pass Timeout ]
 
-crbug.com/1466938 [ Mac11-arm64 ] webaudio/codec-tests/webm/webm-decode.html [ Failure ]
 
 # Gardener 2023-07-21
 crbug.com/1180274 http/tests/inspector-protocol/network/navigate-iframe-out2in.js [ Crash Failure Pass Timeout ]
@@ -6820,8 +6669,6 @@
 # This test is unreliable because of delayed update of history.length during cross-document navigation.
 crbug.com/1466474 fast/history/history-back-twice-with-subframes-assert.html [ Pass Timeout ]
 
-# Gardener 2023-07-24
-crbug.com/1466702 [ Mac ] inspector-protocol/debugger/debugger-evaluate-in-worker-while-pause-in-page.js [ Failure Pass Timeout ]
 
 crbug.com/1462784 rootscroller/fixed-chaining-with-implicit.html [ Failure Pass ]
 
@@ -6842,10 +6689,6 @@
 
 # Gardener 2023-07-26
 crbug.com/1364187 http/tests/misc/scroll-cross-origin-iframes.html [ Failure Pass ]
-crbug.com/1467833 [ Mac12 ] virtual/compositor-threaded-percent-based-scrolling-dsf-2/virtual/percent-based-scrolling/max-percent-delta-page-zoom.html [ Crash Failure Pass Timeout ]
-crbug.com/1467833 [ Mac12 ] virtual/compositor-threaded-percent-based-scrolling/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-thumb-rtl.html [ Crash Failure Pass Timeout ]
-crbug.com/1467833 [ Mac12 ] virtual/compositor-threaded-percent-based-scrolling/fast/scrolling/scrollbars/mouse-scrolling-on-div-scrollbar-thumb.html [ Crash Failure Pass Timeout ]
-crbug.com/1467833 [ Mac12 ] virtual/percent-based-scrolling/max-percent-delta-pinch-zoom.html [ Crash Failure Pass Timeout ]
 
 crbug.com/1430516 virtual/prefetch/external/wpt/speculation-rules/prefetch/out-of-document-rule-set.https.html?include=* [ Failure Pass Timeout ]
 crbug.com/1430516 virtual/prefetch-reusable/external/wpt/speculation-rules/prefetch/out-of-document-rule-set.https.html?include=* [ Failure Pass Timeout ]
@@ -6857,7 +6700,6 @@
 crbug.com/1468996 fast/events/touch/gesture/gesture-tap-active-state.html [ Failure Pass ] # flaky
 crbug.com/1468996 fast/events/touch/gesture/gesture-tap-active-state-hidden-iframe.html [ Failure Pass ] # flaky
 
-crbug.com/1457263 [ Linux ] fast/events/touch/gesture/gesture-tap-scrolled.html [ Failure Pass ]
 
 # Gardener 2023-08-01
 crbug.com/1469087 virtual/fenced-frame-mparch/external/wpt/fetch/private-network-access/fenced-frame.tentative.https.window.html [ Failure Pass ]
@@ -6874,10 +6716,6 @@
 # Gardner 2023-08-10
 crbug.com/1459188 [ Linux ] inspector-protocol/input/dispatchMouseEvent-dragging.js [ Failure Pass ]
 
-# Gardener 2023-08-14
-crbug.com/1472631 [ Linux ] virtual/text-antialias/whitespace/normal-after-nowrap-breaking.html [ Failure Pass ]
-crbug.com/1472721 [ Linux ] virtual/scalefactor150/fast/hidpi/static/pointerevents/pointerevent_touch-adjustment_click_target.html [ Failure Pass ]
-crbug.com/1472721 [ Linux ] virtual/scalefactor200/fast/hidpi/static/pointerevents/pointerevent_touch-adjustment_click_target.html [ Failure Pass ]
 
 # Re-enable after new baselines are generated
 crbug.com/1456636 [ Linux ] virtual/view-transition/view-transition/parent-transition-cancels-child.html [ Failure ]  # Reftest image failure
@@ -6935,7 +6773,6 @@
 crbug.com/1486105 animations/responsive/zoom-responsive-transform-animation-003.html [ Failure Pass ]
 
 # Gardener 2023-09-28
-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.
@@ -6944,8 +6781,6 @@
 
 # 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 ]
-crbug.com/1487886 [ Linux ] external/wpt/long-animation-frame/tentative/loaf-trusted-types.html [ Pass Timeout ]
 crbug.com/1487899 [ Linux ] fast/canvas/canvas-toBlob-jpeg-medium-quality.html [ Failure Pass ]
 
 # Gardener 2023-10-02
@@ -6976,8 +6811,6 @@
 crbug.com/1481694 [ Linux ] accessibility/selection-change-notification-on-selection-removed.html [ Failure Pass ]
 crbug.com/1492371 [ Mac ] virtual/shared-storage-fenced-frame-mparch/http/tests/inspector-protocol/shared-storage/event-breakpoints.js [ Pass Timeout ]
 
-# Gardener 2023-10-16
-crbug.com/1492850 [ Linux ] http/tests/devtools/elements/accessibility/edit-aria-attributes.js [ Failure Pass ]
 
 crbug.com/1467464 http/tests/devtools/security/interstitial-sidebar.js [ Failure Pass ]
 crbug.com/1467464 http/tests/devtools/security/mixed-content-sidebar.js [ Failure Pass ]
@@ -7028,10 +6861,6 @@
 # Gardener 2023-10-23
 crbug.com/1363683 [ Mac10.15 ] virtual/oopr-canvas2d/fast/canvas/OffscreenCanvas-2d-drawImage.html [ Failure ]
 
-# Gardener 2023-10-24
-crbug.com/1495422 [ Mac10.15 ] external/wpt/css/css-text/parsing/white-space-shorthand-text-wrap.html [ Failure ]
-crbug.com/1495422 [ Mac10.15 ] external/wpt/html/semantics/popovers/popover-light-dismiss-flat-tree-nested.html [ Failure ]
-crbug.com/1495422 [ Mac10.15 ] external/wpt/css/css-typed-om/the-stylepropertymap/properties/white-space.html [ Failure ]
 
 # Gardener 2023-10-31
 crbug.com/1497825 [ Linux ] virtual/private-aggregation-developer-mode/wpt_internal/private-aggregation/shared-storage-aggregation-coordinator.https.html [ Pass Timeout ]
@@ -7054,7 +6883,6 @@
 # Gardener 2023-11-17
 crbug.com/1503108 [ Mac ] external/wpt/credential-management/fedcm-disconnect.sub.https.html [ Timeout ]
 crbug.com/1503051 [ Mac ] virtual/keepalive-in-browser-migration/external/wpt/fetch/metadata/generated/audioworklet.https.sub.html [ Failure Pass ]
-crbug.com/1503067 [ Linux ] virtual/pna-navigations-enabled/external/wpt/fetch/private-network-access/iframe.tentative.https.window.html [ Failure Pass ]
 crbug.com/1503119 [ Mac11 ] external/wpt/webtransport/echo-large-bidirectional-streams.https.any.html [ Timeout ]
 
 # Gardener 2023-11-21
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 03618c9..cd685ad1 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
@@ -19486,6 +19486,69 @@
        {}
       ]
      ],
+     "page-rule-specificity-001-print.html": [
+      "dc28ad75db381a3297080bd867397a0f51a30220",
+      [
+       null,
+       [
+        [
+         "/css/css-page/page-rule-specificity-print-landscape-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "page_ranges": {
+         "/css/css-page/page-rule-specificity-001-print.html": [
+          [
+           2
+          ]
+         ]
+        }
+       }
+      ]
+     ],
+     "page-rule-specificity-002-print.html": [
+      "01d9b2b92d8e0175981520aad9706708dd2edff8",
+      [
+       null,
+       [
+        [
+         "/css/css-page/page-rule-specificity-print-landscape-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "page_ranges": {
+         "/css/css-page/page-rule-specificity-002-print.html": [
+          [
+           2
+          ]
+         ]
+        }
+       }
+      ]
+     ],
+     "page-rule-specificity-003-print.html": [
+      "eda6c7ee51bdd5ea60a06bdf98e99b384d80ec22",
+      [
+       null,
+       [
+        [
+         "/css/css-page/page-rule-specificity-print-portrait-ref.html",
+         "=="
+        ]
+       ],
+       {
+        "page_ranges": {
+         "/css/css-page/page-rule-specificity-003-print.html": [
+          [
+           2
+          ]
+         ]
+        }
+       }
+      ]
+     ],
      "pseudo-first-margin-001-print.html": [
       "c2c04514f39b0869605ae8bf1b5d3c9ce9435261",
       [
@@ -110536,7 +110599,7 @@
        ]
       ],
       "content-visibility-075.html": [
-       "f7f834a68bbc72d57f46f53812e99c0b1860281c",
+       "ade27bdfaa72e776fc268514adcc9899c1341c2d",
        [
         null,
         [
@@ -110549,7 +110612,7 @@
        ]
       ],
       "content-visibility-076.html": [
-       "15d0906f715473036be50e224a4b1ccbd4190a54",
+       "2aadcde0c70bef0b40d15c32609774b23eb5f9cb",
        [
         null,
         [
@@ -110575,7 +110638,7 @@
        ]
       ],
       "content-visibility-079.html": [
-       "2fef671f0e611063fdbcf7180b84590743e022ec",
+       "c2cbbfb5a3d20f1d4888fcc98326ea9d90510a84",
        [
         null,
         [
@@ -110822,7 +110885,7 @@
        ]
       ],
       "content-visibility-vs-scrollIntoView-001.html": [
-       "0f874e660753ea36ba7234281757c3495bba798f",
+       "b7af3462572086263174072990cbe9e4c13e20b8",
        [
         null,
         [
@@ -110900,7 +110963,7 @@
        ]
       ],
       "content-visibility-with-popover-top-layer-004.html": [
-       "bbf4567e37d4c1df68ce9119ec3952722324f12e",
+       "24fef4f67e9d673a0b4098f760412bc01d993a95",
        [
         null,
         [
@@ -110913,7 +110976,7 @@
        ]
       ],
       "content-visibility-with-popover-top-layer-005.html": [
-       "264d7b317e0a3fb2fc655c6cceda29d2fe252f9d",
+       "76b736a6379e2fc1f59223eb169ee363f4ab28e4",
        [
         null,
         [
@@ -111004,7 +111067,7 @@
        ]
       ],
       "content-visibility-with-top-layer-004.html": [
-       "e21b11e92db1fe8e7684536d04371ae077c8e66a",
+       "218251fdcdb5731f808bd16c41e76a3b4cb8c42a",
        [
         null,
         [
@@ -111017,7 +111080,7 @@
        ]
       ],
       "content-visibility-with-top-layer-005.html": [
-       "5283aea19734d1349622a249715c0a190d1ebad5",
+       "c1cb1bcde35e73f0fc33b54e6d2b30e71d330307",
        [
         null,
         [
@@ -258488,19 +258551,6 @@
      ]
     },
     "selectors": {
-     "any-link-dynamic-001.html": [
-      "e84989fd0c27089a821e36145cebfc1423d1b03d",
-      [
-       null,
-       [
-        [
-         "/css/selectors/any-link-dynamic-001-ref.html",
-         "=="
-        ]
-       ],
-       {}
-      ]
-     ],
      "case-insensitive-parent.html": [
       "a684bbb97c870b587b73e616ca1bfa4fa423f4ff",
       [
@@ -259241,6 +259291,19 @@
       ]
      },
      "invalidation": {
+      "any-link-attribute-removal.html": [
+       "9da6b2edeba36fe0a98b661fd1f027e85ea729bf",
+       [
+        null,
+        [
+         [
+          "/css/selectors/invalidation/any-link-attribute-removal-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "class-id-attr.html": [
        "91a6f1a3a544bea376af2916b69a590bb0ac0a9a",
        [
@@ -307348,7 +307411,7 @@
        []
       ],
       "content-visibility-075-ref.html": [
-       "e0c485c59f3be15b9ad3bffc2658b82a73b0380d",
+       "6d33015466c0c203f44a7c7a080854e74cf082f8",
        []
       ],
       "content-visibility-078-ref.html": [
@@ -307356,7 +307419,7 @@
        []
       ],
       "content-visibility-079-ref.html": [
-       "83a2206be2fdf94e144f9d3363ccceb13d67479b",
+       "c4c1bb3beb4a9abb85e040e4455f6359a3f08fc5",
        []
       ],
       "content-visibility-090-expected.txt": [
@@ -307428,7 +307491,7 @@
        []
       ],
       "content-visibility-vs-scrollIntoView-001-ref.html": [
-       "897463844aa4c79a383b2130a1e1f5aea11eea33",
+       "746d770f85a95e50e9b4c3e989fc4949551376ae",
        []
       ],
       "content-visibility-vs-scrollIntoView-002-ref.html": [
@@ -307502,11 +307565,11 @@
        []
       ],
       "spacer-with-popover-top-layer-ref.html": [
-       "6c4c65f58c32679f7396cf6cf9ae094b32546c23",
+       "5ae45afe9ebe7f47c72edeb259db92f4058fe60d",
        []
       ],
       "spacer-with-top-layer-ref.html": [
-       "e274b0fcaa1602c0528c60c1fc022cb9694b1ad4",
+       "7cf1f1581b7710b32d8072fc9128ab9169d090da",
        []
       ]
      },
@@ -325714,6 +325777,14 @@
       "729d0cfdddb61929b0829a557aeb8406f35d25dd",
       []
      ],
+     "page-rule-specificity-print-landscape-ref.html": [
+      "0e39390e8e7367c4959acfaae04823d1ef822bef",
+      []
+     ],
+     "page-rule-specificity-print-portrait-ref.html": [
+      "76ccfed10a884ff7f2f8e75cb6b208381bf8bba8",
+      []
+     ],
      "parsing": {
       "margin-rules-001-expected.txt": [
        "4c2e729165b140449f86d915939aeeb4e813ea12",
@@ -344484,10 +344555,6 @@
       "5e03d9bce08ec1c2c4d3a23b993e8f428c9e68db",
       []
      ],
-     "any-link-dynamic-001-ref.html": [
-      "b5407429be803d9b774c4ca0108318fbd6e5134f",
-      []
-     ],
      "attribute-selectors": {
       "attribute-case": {
        "resources": {
@@ -344641,6 +344708,10 @@
       ]
      },
      "invalidation": {
+      "any-link-attribute-removal-ref.html": [
+       "b5407429be803d9b774c4ca0108318fbd6e5134f",
+       []
+      ],
       "class-id-attr-ref.html": [
        "a3cc6d3d8f56fd31c4b19d23af606d7c65487145",
        []
@@ -344965,6 +345036,10 @@
        "b0696cb90f23c5cb78f071a10ad39a8c2744f4cf",
        []
       ],
+      "parse-is-where-expected.txt": [
+       "b92232a73d509f0b7649f7d9a8af32bfe1fd35a3",
+       []
+      ],
       "parse-state-expected.txt": [
        "9f273b4a145e8585c7799442575f13acaf15d4e5",
        []
@@ -345744,7 +345819,7 @@
      []
     ],
     "requirements.txt": [
-     "b29747cac1704b8ab158a73495160645144cbd7a",
+     "d8fb98888fd7139ff30f50cbbcbd0d042d89f91f",
      []
     ],
     "reviewing-tests": {
@@ -386538,6 +386613,10 @@
      []
     ],
     "declarative": {
+     "clonable.window-expected.txt": [
+      "1bc695efb2f0e4a34cabc11a721e98965b8296f1",
+      []
+     ],
      "declarative-shadow-dom-basic-expected.txt": [
       "2b9e5398b7dedee87ffd469b91eeee3015577d32",
       []
@@ -441125,7 +441204,7 @@
        ]
       ],
       "CSS-supports-CSSStyleDeclaration.html": [
-       "cff0dc2d2773aacb434b1ae99ee187f8718a8f38",
+       "daec039e406d51bfe67587ed096a74d20bbeeee7",
        [
         null,
         {}
@@ -471772,13 +471851,6 @@
      }
     },
     "selectors": {
-     "anplusb-selector-parsing.html": [
-      "b7cfd293515b67d5aa66bfe7b62262e1b64c0942",
-      [
-       null,
-       {}
-      ]
-     ],
      "attribute-selectors": {
       "attribute-case": {
        "cssom.html": [
@@ -472942,6 +473014,15 @@
         {}
        ]
       ],
+      "link-pseudo-class-in-has.html": [
+       "d0c617a17618b24984a61649b5c88064605a2a0b",
+       [
+        null,
+        {
+         "testdriver": true
+        }
+       ]
+      ],
       "link-pseudo-in-has.html": [
        "0ff879768b7da2e052fc916f16f25eba01496a10",
        [
@@ -473133,13 +473214,6 @@
        {}
       ]
      ],
-     "is-where-parsing.html": [
-      "ee73fe0f8879a3384ed2260af9af8d8d5d1a563f",
-      [
-       null,
-       {}
-      ]
-     ],
      "is-where-pseudo-classes.html": [
       "c3f1cfa81856a7c4083ed6a9bd100e098889fff0",
       [
@@ -473245,6 +473319,13 @@
       ]
      ],
      "parsing": {
+      "parse-anplusb.html": [
+       "b7cfd293515b67d5aa66bfe7b62262e1b64c0942",
+       [
+        null,
+        {}
+       ]
+      ],
       "parse-attribute.html": [
        "a8fcfb24f5a9b1350adda6e59af814f1111325c1",
        [
@@ -473308,6 +473389,13 @@
         {}
        ]
       ],
+      "parse-is-where.html": [
+       "ee73fe0f8879a3384ed2260af9af8d8d5d1a563f",
+       [
+        null,
+        {}
+       ]
+      ],
       "parse-is.html": [
        "68236445c5f1e871cd4e0c500057b2ad11955b60",
        [
@@ -523869,49 +523957,6 @@
          }
         ]
        ],
-       "message-port-entangled-after-restore.https.tentative.window.js": [
-        "d1d545e89b0b34f5616d0e135b5387c3c1562db2",
-        [
-         "html/browsers/browsing-the-web/back-forward-cache/message-port-entangled-after-restore.https.tentative.window.html",
-         {
-          "script_metadata": [
-           [
-            "timeout",
-            "long"
-           ],
-           [
-            "title",
-            "Confirm close event is not fired when the page enters BFCache and MessagePort still works after the page is restored."
-           ],
-           [
-            "script",
-            "/common/dispatcher/dispatcher.js"
-           ],
-           [
-            "script",
-            "/common/get-host-info.sub.js"
-           ],
-           [
-            "script",
-            "/common/utils.js"
-           ],
-           [
-            "script",
-            "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
-           ],
-           [
-            "script",
-            "/service-workers/service-worker/resources/test-helpers.sub.js"
-           ],
-           [
-            "script",
-            "resources/rc-helper.js"
-           ]
-          ],
-          "timeout": "long"
-         }
-        ]
-       ],
        "pushstate.https.html": [
         "218562254a6f6396dcf491aa9901463a18aa8090",
         [
@@ -621918,6 +621963,13 @@
      ]
     ],
     "declarative": {
+     "clonable.window.js": [
+      "5ebeacf37cbd8abfd4bf4eae73c28958e1449f81",
+      [
+       "shadow-dom/declarative/clonable.window.html",
+       {}
+      ]
+     ],
      "declarative-after-attachshadow.html": [
       "bfe2d66cfa9d3921bcdb046285fdb0af69b7354a",
       [
@@ -657247,6 +657299,49 @@
         }
        ]
       ],
+      "entangled-after-back-forward-cache-restore.https.tentative.window.js": [
+       "c99e89f02b7ef4e3c9f3df3dcc35fcf020823dd1",
+       [
+        "webmessaging/message-channels/close-event/entangled-after-back-forward-cache-restore.https.tentative.window.html",
+        {
+         "script_metadata": [
+          [
+           "timeout",
+           "long"
+          ],
+          [
+           "title",
+           "Confirm close event is not fired when the page enters BFCache and MessagePort still works after the page is restored."
+          ],
+          [
+           "script",
+           "/common/dispatcher/dispatcher.js"
+          ],
+          [
+           "script",
+           "/common/get-host-info.sub.js"
+          ],
+          [
+           "script",
+           "/common/utils.js"
+          ],
+          [
+           "script",
+           "/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"
+          ],
+          [
+           "script",
+           "/service-workers/service-worker/resources/test-helpers.sub.js"
+          ],
+          [
+           "script",
+           "/html/browsers/browsing-the-web/back-forward-cache/resources/rc-helper.js"
+          ]
+         ],
+         "timeout": "long"
+        }
+       ]
+      ],
       "explicitly-closed.tentative.window.js": [
        "612003d58eaea908ad93294a7bbf777184356a28",
        [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html b/third_party/blink/web_tests/external/wpt/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html
index cff0dc2d..daec039 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html
@@ -85,10 +85,9 @@
   "-moz-tab-size",
   "-moz-text-align-last",
   "-moz-text-size-adjust",
-  // No -moz-transform here, because it might intentionally break the
+  // No -moz-transform/origin here, because it might intentionally break the
   // expectations of this test for compat reasons, see:
   // https://bugzilla.mozilla.org/show_bug.cgi?id=1865332
-  "-moz-transform-origin",
   "-moz-transform-style",
   "-moz-transition",
   "-moz-transition-delay",
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-075-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-075-ref.html
index e0c485c5..6d33015 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-075-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-075-ref.html
@@ -4,7 +4,7 @@
 <title>CSS Content Visibility: auto + scrollIntoView/fragment nav when size estimate is off (reference)</title>
 <link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <script src="/common/reftest-wait.js"></script>
 
 <style>
@@ -18,6 +18,7 @@
 #target {
   position: absolute;
   bottom: 0;
+  font: 25px/1 Ahem;
 }
 </style>
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-075.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-075.html
index f7f834a..ade27bdfa 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-075.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-075.html
@@ -6,7 +6,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
 <link rel="match" href="content-visibility-075-ref.html">
 <meta name="assert" content="With content-visibility: auto, scrollIntoView targets the right element">
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <script src="/common/reftest-wait.js"></script>
 
 <style>
@@ -21,6 +21,7 @@
 #target {
   position: absolute;
   bottom: 0;
+  font: 25px/1 Ahem;
 }
 .before_target {
   height: 40000px;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-076.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-076.html
index 15d0906..2aadcde 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-076.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-076.html
@@ -6,7 +6,7 @@
 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
 <link rel="match" href="content-visibility-075-ref.html">
 <meta name="assert" content="With content-visibility: auto, fragment navigation targets the right element">
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <script src="/common/reftest-wait.js"></script>
 
 <style>
@@ -21,6 +21,7 @@
 #target {
   position: absolute;
   bottom: 0;
+  font: 25px/1 Ahem;
 }
 .before_target {
   height: 40000px;
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-079-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-079-ref.html
index 83a2206..c4c1bb3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-079-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-079-ref.html
@@ -4,6 +4,11 @@
 <title>CSS Content Visibility: auto in overflow hidden paints (reference)</title>
 <link rel="author" title="Vladimir Levin" href="mailto:vmpstr@chromium.org">
 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
-
-<p>Test passes if you see the word “PASS” below.
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
+<style>
+ div {
+  font: 25px/1 Ahem;
+ }
+</style>
+<p>Test passes if you see a black rectangle below.
 <div>PASS</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-079.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-079.html
index 2fef671..c2cbbfb5 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-079.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-079.html
@@ -5,13 +5,16 @@
 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
 <link rel="match" href="content-visibility-079-ref.html">
 <meta name="assert" content="content-visibility auto element paints in an overflow hidden element that is not sized">
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
-.auto { content-visibility: auto; }
+.auto {
+ content-visibility: auto;
+ font: 25px/1 Ahem;
+}
 .overflow { overflow: hidden; }
 </style>
 
-<p>Test passes if you see the word “PASS” below.
+<p>Test passes if you see a black rectangle below.
 <div class=overflow>
   <div class=auto>PASS</div>
 </div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001-ref.html
index 8974638..746d770f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001-ref.html
@@ -5,7 +5,7 @@
 <link rel="author" title="Cathie Chen" href="mailto:cathiechen@igalia.com">
 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
 <meta name="assert" content="Test if target scrollIntoView is visible when it is inside a nested content-visibility: auto">
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <script src="/common/reftest-wait.js"></script>
 
 <style>
@@ -18,6 +18,7 @@
     #target {
         position: absolute;
         bottom: 0;
+        font: 25px/1 Ahem;
     }
 
     .before_target {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001.html
index 0f874e66..b7af346 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-vs-scrollIntoView-001.html
@@ -7,7 +7,7 @@
 <link rel="match" href="content-visibility-vs-scrollIntoView-001-ref.html">
 <meta name="assert"
     content="Test if target scrollIntoView is visible when it is inside a nested content-visibility: auto">
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <script src="/common/reftest-wait.js"></script>
 
 <style>
@@ -24,6 +24,7 @@
     #target {
         position: absolute;
         bottom: 0;
+        font: 25px/1 Ahem;
     }
 
     .before_target {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-004.html
index bbf4567..24fef4f6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-004.html
@@ -6,13 +6,14 @@
 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
 <link rel="match" href="spacer-with-popover-top-layer-ref.html">
 <meta name="assert" content="top layer popovers render under c-v auto">
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <script src="/common/reftest-wait.js"></script>
 
 <style>
 .box { width: 100px; height: 100px; border: 1px solid black; }
 .auto { content-visibility: auto }
 .spacer { width: 10px; height: 3000px; background: lightblue; }
+#popover { font: 25px/1 Ahem }
 </style>
 
 <div class=spacer></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-005.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-005.html
index 264d7b3..76b736a6 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-005.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-popover-top-layer-005.html
@@ -6,13 +6,14 @@
 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
 <link rel="match" href="spacer-with-popover-top-layer-ref.html">
 <meta name="assert" content="top layer popovers render under c-v auto">
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <script src="/common/reftest-wait.js"></script>
 
 <style>
 .box { width: 100px; height: 100px; border: 1px solid black; }
 .auto { content-visibility: auto }
 .spacer { width: 10px; height: 3000px; background: lightblue; }
+#popover { font: 25px/1 Ahem; }
 </style>
 
 <div class=spacer></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-004.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-004.html
index e21b11e..218251f 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-004.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-004.html
@@ -6,13 +6,14 @@
 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
 <link rel="match" href="spacer-with-top-layer-ref.html">
 <meta name="assert" content="top layer dialogs render under c-v auto">
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <script src="/common/reftest-wait.js"></script>
 
 <style>
 .box { width: 100px; height: 100px; border: 1px solid black; }
 .auto { content-visibility: auto }
 .spacer { width: 10px; height: 3000px; background: lightblue; }
+#dialog { font: 25px/1 Ahem; }
 </style>
 
 <div class=spacer></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-005.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-005.html
index 5283aea..c1cb1bc 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-005.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/content-visibility-with-top-layer-005.html
@@ -6,13 +6,14 @@
 <link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility">
 <link rel="match" href="spacer-with-top-layer-ref.html">
 <meta name="assert" content="top layer dialogs render under c-v auto">
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <script src="/common/reftest-wait.js"></script>
 
 <style>
 .box { width: 100px; height: 100px; border: 1px solid black; }
 .auto { content-visibility: auto }
 .spacer { width: 10px; height: 3000px; background: lightblue; }
+#dialog { font: 25px/1 Ahem; }
 </style>
 
 <div class=spacer></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/spacer-with-popover-top-layer-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/spacer-with-popover-top-layer-ref.html
index 6c4c65f..5ae45af 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/spacer-with-popover-top-layer-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/spacer-with-popover-top-layer-ref.html
@@ -1,10 +1,11 @@
 <!doctype html>
 <meta charset="utf8">
 <title>CSS Content Visibility: popover shows under c-v auto (ref)</title>
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 .box { width: 100px; height: 100px; border: 1px solid black; }
 .spacer { width: 10px; height: 3000px; background: lightblue; }
+#popover { font: 25px/1 Ahem; }
 </style>
 
 <div class=spacer></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/spacer-with-top-layer-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/spacer-with-top-layer-ref.html
index e274b0f..7cf1f15 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/spacer-with-top-layer-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/spacer-with-top-layer-ref.html
@@ -1,10 +1,11 @@
 <!doctype html>
 <meta charset="utf8">
 <title>CSS Content Visibility: dialog shows under c-v auto (ref)</title>
-
+<link rel="stylesheet" type="text/css" href="/fonts/ahem.css" />
 <style>
 .box { width: 100px; height: 100px; border: 1px solid black; }
 .spacer { width: 10px; height: 3000px; background: lightblue; }
+#dialog { font: 25px/1 Ahem; }
 </style>
 
 <div class=spacer></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-001-print.html b/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-001-print.html
new file mode 100644
index 0000000..dc28ad7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-001-print.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+  <meta charset="utf-8">
+  <title>CSS Paged Media: @page without selector provides defaults</title>
+  <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"/>
+  <link rel="help" href="https://drafts.csswg.org/css-page/#cascading-and-page-context"/>
+  <meta name="assert" content="@page with a selector should not apply to non-matched pages">
+  <link rel="match" href="page-rule-specificity-print-landscape-ref.html"/>
+  <meta name="reftest-pages" content="2">
+  <style>
+
+/* WPT Print Reftest default size is 5x3in - this should only change that for the first page */
+@page :first {
+  size: portrait;
+}
+div:first-of-type {
+  break-after: page;
+}
+body {
+  margin: 0;
+}
+
+  </style>
+  <body>
+    <div>Portrait</div>
+    <div>Landscape</div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-002-print.html b/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-002-print.html
new file mode 100644
index 0000000..01d9b2b9
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-002-print.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+  <meta charset="utf-8">
+  <title>CSS Paged Media: @page without selector provides defaults</title>
+  <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"/>
+  <link rel="help" href="https://drafts.csswg.org/css-page/#cascading-and-page-context"/>
+  <meta name="assert" content="@page rule without a selector list should apply to pages not matched by rules with selectors">
+  <link rel="match" href="page-rule-specificity-print-landscape-ref.html"/>
+  <meta name="reftest-pages" content="2">
+  <style>
+
+@page :first {
+  size: portrait;
+}
+@page {
+  size: landscape;
+}
+div:first-of-type {
+  break-after: page;
+}
+body {
+  margin: 0;
+}
+
+  </style>
+  <body>
+    <div>Portrait</div>
+    <div>Landscape</div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-003-print.html b/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-003-print.html
new file mode 100644
index 0000000..eda6c7e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-003-print.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<html>
+  <meta charset="utf-8">
+  <title>CSS Paged Media: @page without selector provides defaults</title>
+  <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"/>
+  <link rel="help" href="https://drafts.csswg.org/css-page/#cascading-and-page-context"/>
+  <meta name="assert" content="@page rule without a selector list should apply to pages not matched by rules with selectors">
+  <link rel="match" href="page-rule-specificity-print-portrait-ref.html"/>
+  <meta name="reftest-pages" content="2">
+  <style>
+
+@page :first {
+  size: landscape;
+}
+@page {
+  size: portrait;
+}
+div:first-of-type {
+  break-after: page;
+}
+body {
+  margin: 0;
+}
+
+  </style>
+  <body>
+    <div>Landscape</div>
+    <div>Portrait</div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-print-landscape-ref.html b/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-print-landscape-ref.html
new file mode 100644
index 0000000..0e39390e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-print-landscape-ref.html
@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html>
+  <meta charset="utf-8">
+  <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"/>
+  <style>
+
+body {
+  margin: 0;
+}
+
+  </style>
+  <body>
+    <div>Landscape</div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-print-portrait-ref.html b/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-print-portrait-ref.html
new file mode 100644
index 0000000..76ccfed
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-page/page-rule-specificity-print-portrait-ref.html
@@ -0,0 +1,18 @@
+<!DOCTYPE html>
+<html>
+  <meta charset="utf-8">
+  <link rel="author" title="Jonathan Watt" href="mailto:jwatt@jwatt.org"/>
+  <style>
+
+@page :first {
+  size: portrait;
+}
+body {
+  margin: 0;
+}
+
+  </style>
+  <body>
+    <div>Portrait</div>
+  </body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/any-link-dynamic-001-ref.html b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/any-link-attribute-removal-ref.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/css/selectors/any-link-dynamic-001-ref.html
rename to third_party/blink/web_tests/external/wpt/css/selectors/invalidation/any-link-attribute-removal-ref.html
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/any-link-dynamic-001.html b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/any-link-attribute-removal.html
similarity index 89%
rename from third_party/blink/web_tests/external/wpt/css/selectors/any-link-dynamic-001.html
rename to third_party/blink/web_tests/external/wpt/css/selectors/invalidation/any-link-attribute-removal.html
index e84989f..9da6b2e 100644
--- a/third_party/blink/web_tests/external/wpt/css/selectors/any-link-dynamic-001.html
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/any-link-attribute-removal.html
@@ -2,7 +2,7 @@
 <meta charset="utf-8">
 <title>CSS test: Handling of dynamic changes to :any-link selectors</title>
 <link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu">
-<link rel="match" href="any-link-dynamic-001-ref.html">
+<link rel="match" href="any-link-attribute-removal-ref.html">
 <link rel="help" href="https://drafts.csswg.org/selectors-4/#the-any-link-pseudo">
 <style>
   span { color: green; }
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/link-pseudo-class-in-has.html b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/link-pseudo-class-in-has.html
new file mode 100644
index 0000000..d0c617a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/invalidation/link-pseudo-class-in-has.html
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<meta charset="utf-8" />
+<title>CSS Selectors Invalidation: :any-link and :link pseudo class in :has()</title>
+<link rel="author" title="Tim Nguyen" href="https://github.com/nt1m">
+<link rel="help" href="https://drafts.csswg.org/selectors/#relational">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/testdriver.js"></script>
+<script src="/resources/testdriver-vendor.js"></script>
+
+<style>
+    /* :any-link and :link should match similarly */
+    #subject:has(#target:link:any-link) { color: green; }
+    #subject:has(#svgTarget:link:any-link) { color: blue; }
+</style>
+
+<div id="subject">
+    This is some text.
+    <a id="target">This is an anchor element</a>
+    <svg xmlns="http://www.w3.org/2000/svg">
+        <a id="svgTarget"><text>This is an SVG anchor element</text></a>
+    </svg>
+</div>
+
+<script>
+test(function() {
+    assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 0)",
+                  "ancestor should be black");
+    target.setAttribute("href", "/");
+    assert_equals(getComputedStyle(subject).color, "rgb(0, 128, 0)",
+                  "ancestor should be green since target is a link");
+    target.removeAttribute("href");
+    assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 0)",
+                  "ancestor should be black since target is no longer a link");
+}, ":any-link & :link pseudo-class invalidation with an HTML link");
+
+test(function() {
+    assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 0)",
+                  "ancestor should be black");
+    svgTarget.setAttribute("href", "/")
+    assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 255)",
+                  "ancestor should be blue since target is a link");
+    svgTarget.removeAttribute("href");
+    assert_equals(getComputedStyle(subject).color, "rgb(0, 0, 0)",
+                  "ancestor should be black since target is no longer a link");
+}, ":any-link & :link pseudo-class invalidation with an SVG link");
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/anplusb-selector-parsing.html b/third_party/blink/web_tests/external/wpt/css/selectors/parsing/parse-anplusb.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/css/selectors/anplusb-selector-parsing.html
rename to third_party/blink/web_tests/external/wpt/css/selectors/parsing/parse-anplusb.html
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/parsing/parse-is-where-expected.txt b/third_party/blink/web_tests/external/wpt/css/selectors/parsing/parse-is-where-expected.txt
new file mode 100644
index 0000000..b92232a7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/selectors/parsing/parse-is-where-expected.txt
@@ -0,0 +1,17 @@
+This is a testharness.js-based test.
+[FAIL] ":host(:is(div .foo))" should be a valid selector
+  assert_equals: serialization should be canonical expected ":host(:is(div .foo))" but got ":host(:is())"
+[FAIL] ":host(:where(div .foo))" should be a valid selector
+  assert_equals: serialization should be canonical expected ":host(:where(div .foo))" but got ":host(:where())"
+[FAIL] ":is(::before)" should be a valid selector
+  assert_equals: serialization should be canonical expected ":is(::before)" but got ":is()"
+[FAIL] ":where(::before)" should be a valid selector
+  assert_equals: serialization should be canonical expected ":where(::before)" but got ":where()"
+[FAIL] "::part(foo):is([attr='value'])" should be a valid selector
+  assert_equals: serialization should be canonical expected "::part(foo):is([attr='value'])" but got "::part(foo):is()"
+[FAIL] "::part(foo):where([attr='value'])" should be a valid selector
+  assert_equals: serialization should be canonical expected "::part(foo):where([attr='value'])" but got "::part(foo):where()"
+[FAIL] ":is(# C4єанйтж╕/┘ГЁжЮХєа▓┐ЁЭБМєаСеЁЭЖА%=[ямм0)" should be an invalid selector
+  assert_throws_dom: ":is(# C4єанйтж╕/┘ГЁжЮХєа▓┐ЁЭБМєаСеЁЭЖА%=[ямм0)" should throw in querySelector function "() => document.querySelector(selector)" did not throw
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/selectors/is-where-parsing.html b/third_party/blink/web_tests/external/wpt/css/selectors/parsing/parse-is-where.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/css/selectors/is-where-parsing.html
rename to third_party/blink/web_tests/external/wpt/css/selectors/parsing/parse-is-where.html
diff --git a/third_party/blink/web_tests/external/wpt/docs/requirements.txt b/third_party/blink/web_tests/external/wpt/docs/requirements.txt
index b29747ca..d8fb9888 100644
--- a/third_party/blink/web_tests/external/wpt/docs/requirements.txt
+++ b/third_party/blink/web_tests/external/wpt/docs/requirements.txt
@@ -1,6 +1,6 @@
 recommonmark==0.7.1
 sphinx-argparse==0.4.0
 sphinx-autobuild==2021.3.14
-sphinx-js==3.2.1
+sphinx-js==3.2.2
 sphinx==4.4.0
 markupsafe==2.0.1
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/declarative/clonable.window-expected.txt b/third_party/blink/web_tests/external/wpt/shadow-dom/declarative/clonable.window-expected.txt
new file mode 100644
index 0000000..1bc695e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/declarative/clonable.window-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] attachShadow with clonable: true
+  assert_true: clonable attribute expected true got undefined
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/shadow-dom/declarative/clonable.window.js b/third_party/blink/web_tests/external/wpt/shadow-dom/declarative/clonable.window.js
new file mode 100644
index 0000000..5ebeacf
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/shadow-dom/declarative/clonable.window.js
@@ -0,0 +1,10 @@
+test(() => {
+  const div = document.createElement("div");
+  const root = div.attachShadow({ mode: "open", clonable: true });
+  root.appendChild(document.createElement("input"));
+  assert_true(root.clonable, "clonable attribute");
+
+  const cloned = div.cloneNode(true);
+  assert_equals(cloned.shadowRoot.children.length, 1, "children count");
+  assert_equals(cloned.shadowRoot.children[0].localName, "input", "children content");
+}, "attachShadow with clonable: true");
diff --git a/third_party/blink/web_tests/http/tests/devtools/network/html-preview-encoding-expected.txt b/third_party/blink/web_tests/http/tests/devtools/network/html-preview-encoding-expected.txt
deleted file mode 100644
index d1afa1cb..0000000
--- a/third_party/blink/web_tests/http/tests/devtools/network/html-preview-encoding-expected.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-Verifies that html resources are previewed with the encoding set in their content-type header
-
-Running: testUTF8
-fetchScript: fetch('/devtools/network/resources/content-type-utf8.php')
-iframe.src: data:text/html;charset=utf-8,utf8%20character:%20%E2%80%A6
-
-Running: testISO
-fetchScript: fetch('/devtools/network/resources/content-type-iso.php')
-iframe.src: data:text/html;charset=iso-8859-1,iso-8859-1%20character:%20%C3%82%C2%A9
-
-Running: testNoCharset
-fetchScript: fetch('/devtools/network/resources/content-type-none.php')
-iframe.src: data:text/html,no%20encoding
-
diff --git a/third_party/blink/web_tests/http/tests/devtools/network/html-preview-encoding.js b/third_party/blink/web_tests/http/tests/devtools/network/html-preview-encoding.js
deleted file mode 100644
index 3a6a2c2..0000000
--- a/third_party/blink/web_tests/http/tests/devtools/network/html-preview-encoding.js
+++ /dev/null
@@ -1,44 +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 {TestRunner} from 'test_runner';
-import {NetworkTestRunner} from 'network_test_runner';
-
-import * as Network from 'devtools/panels/network/network.js';
-import * as SDK from 'devtools/core/sdk/sdk.js';
-
-(async function() {
-  TestRunner.addResult(
-    'Verifies that html resources are previewed with the encoding set in their content-type header');
-  await TestRunner.showPanel('network');
-
-  async function runEncodingTest(url, nextTestCallback) {
-    const fetchScript = `fetch('${url}')`;
-    TestRunner.addResult('fetchScript: ' + fetchScript);
-    TestRunner.evaluateInPage(fetchScript);
-
-    const request = await TestRunner.networkManager.once(SDK.NetworkManager.Events.RequestFinished);
-
-    const previewView = new Network.RequestPreviewView.RequestPreviewView(request);
-    previewView.wasShown();
-    const htmlPreviewView = await previewView.contentViewPromise;
-    htmlPreviewView.wasShown();
-    const iframe = htmlPreviewView.contentElement.firstChild;
-    TestRunner.addResult('iframe.src: ' + iframe.src);
-
-    nextTestCallback();
-  }
-
-  TestRunner.runTestSuite([
-      function testUTF8(next) {
-        runEncodingTest('/devtools/network/resources/content-type-utf8.php', next);
-      },
-      function testISO(next) {
-        runEncodingTest('/devtools/network/resources/content-type-iso.php', next);
-      },
-      function testNoCharset(next) {
-        runEncodingTest('/devtools/network/resources/content-type-none.php', next);
-      },
-    ]);
-})();
diff --git a/third_party/chromium-variations b/third_party/chromium-variations
index 83da81f7..3d6311a 160000
--- a/third_party/chromium-variations
+++ b/third_party/chromium-variations
@@ -1 +1 @@
-Subproject commit 83da81f7b150105c5bc7deeb206c60576d2bb4f9
+Subproject commit 3d6311ac2b77b8ce42aaa6615461799232690bc9
diff --git a/third_party/cros-components/src b/third_party/cros-components/src
index 7ce7469..4d5c5a6 160000
--- a/third_party/cros-components/src
+++ b/third_party/cros-components/src
@@ -1 +1 @@
-Subproject commit 7ce7469fd80bcc8710d36caddc894c9a7ef13194
+Subproject commit 4d5c5a69d68bd814b9857800c594f5895cd1204e
diff --git a/third_party/dawn b/third_party/dawn
index cebf227..bc8b99a 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit cebf22738909498596d4c7ede83d229addbd5e9e
+Subproject commit bc8b99afc68f8c7f452df858f7e452913bbee5a6
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal
index f459cb5..a7ff080 160000
--- a/third_party/devtools-frontend-internal
+++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@
-Subproject commit f459cb5acc7db0f2e01f5f03478eea9081990d30
+Subproject commit a7ff080ac0f4814640a0921bc9e0a1da4c419a0e
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index e7d1fad..86df0db 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit e7d1fadae747d4974f42eedd5f1c5acaa23dcd7f
+Subproject commit 86df0dbc1c17c368aea743d13c2633506c299fe8
diff --git a/third_party/perfetto b/third_party/perfetto
index fa59d79..3e779d2 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit fa59d7989d624785db9b505e1832854bb7ff7431
+Subproject commit 3e779d277b408b64778b247b824c5790072e428f
diff --git a/third_party/rust/chromium_crates_io/removed_Cargo.toml.hbs b/third_party/rust/chromium_crates_io/removed_Cargo.toml.hbs
index 91984f0..de1feb7 100644
--- a/third_party/rust/chromium_crates_io/removed_Cargo.toml.hbs
+++ b/third_party/rust/chromium_crates_io/removed_Cargo.toml.hbs
@@ -12,9 +12,14 @@
 name = "{{this.name}}"
 version = "{{this.version}}"
 
+[features]
+{{#each this.features}}
+"{{this}}" = []
+{{/each}}
+
 {{#each this.dependencies}}
 [dependencies.{{this.name}}]
 version = "{{this.version}}"
 default_features = {{this.default_features}}
 features = [{{#each this.featuress}}{{#if @first}}{{this}}{{else}},{{this}}{{/if}}{{/each}}]
-{{/each}}
\ No newline at end of file
+{{/each}}
diff --git a/third_party/rust/chromium_crates_io/vendor/cc-1.0.83/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/cc-1.0.83/Cargo.toml
index c59860b..3a54d06 100644
--- a/third_party/rust/chromium_crates_io/vendor/cc-1.0.83/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/cc-1.0.83/Cargo.toml
@@ -12,6 +12,10 @@
 name = "cc"
 version = "1.0.83"
 
+[features]
+"jobserver" = []
+"parallel" = []
+
 [dependencies.libc]
 version = "*"
 default_features = false
diff --git a/third_party/rust/chromium_crates_io/vendor/link-cplusplus-1.0.9/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/link-cplusplus-1.0.9/Cargo.toml
index e1e9145..09d801c 100644
--- a/third_party/rust/chromium_crates_io/vendor/link-cplusplus-1.0.9/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/link-cplusplus-1.0.9/Cargo.toml
@@ -12,6 +12,14 @@
 name = "link-cplusplus"
 version = "1.0.9"
 
+[features]
+"default" = []
+"libc++" = []
+"libcxx" = []
+"libstdc++" = []
+"libstdcxx" = []
+"nothing" = []
+
 [dependencies.cc]
 version = "*"
 default_features = true
diff --git a/third_party/rust/chromium_crates_io/vendor/minimal-lexical-0.2.1/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/minimal-lexical-0.2.1/Cargo.toml
index a61b93d..7738df06 100644
--- a/third_party/rust/chromium_crates_io/vendor/minimal-lexical-0.2.1/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/minimal-lexical-0.2.1/Cargo.toml
@@ -12,3 +12,11 @@
 name = "minimal-lexical"
 version = "0.2.1"
 
+[features]
+"alloc" = []
+"compact" = []
+"default" = []
+"lint" = []
+"nightly" = []
+"std" = []
+
diff --git a/third_party/rust/chromium_crates_io/vendor/wasi-0.11.0+wasi-snapshot-preview1/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/wasi-0.11.0+wasi-snapshot-preview1/Cargo.toml
index fdc075a..90627cf1 100644
--- a/third_party/rust/chromium_crates_io/vendor/wasi-0.11.0+wasi-snapshot-preview1/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/wasi-0.11.0+wasi-snapshot-preview1/Cargo.toml
@@ -12,3 +12,11 @@
 name = "wasi"
 version = "0.11.0+wasi-snapshot-preview1"
 
+[features]
+"compiler_builtins" = []
+"core" = []
+"default" = []
+"rustc-dep-of-std" = []
+"rustc-std-workspace-alloc" = []
+"std" = []
+
diff --git a/third_party/rust/chromium_crates_io/vendor/winapi-i686-pc-windows-gnu-0.4.0/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/winapi-i686-pc-windows-gnu-0.4.0/Cargo.toml
index ab6931c9..bbc52f44 100644
--- a/third_party/rust/chromium_crates_io/vendor/winapi-i686-pc-windows-gnu-0.4.0/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/winapi-i686-pc-windows-gnu-0.4.0/Cargo.toml
@@ -12,3 +12,5 @@
 name = "winapi-i686-pc-windows-gnu"
 version = "0.4.0"
 
+[features]
+
diff --git a/third_party/rust/chromium_crates_io/vendor/winapi-x86_64-pc-windows-gnu-0.4.0/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/winapi-x86_64-pc-windows-gnu-0.4.0/Cargo.toml
index a7aeb3a..d3a083c 100644
--- a/third_party/rust/chromium_crates_io/vendor/winapi-x86_64-pc-windows-gnu-0.4.0/Cargo.toml
+++ b/third_party/rust/chromium_crates_io/vendor/winapi-x86_64-pc-windows-gnu-0.4.0/Cargo.toml
@@ -12,3 +12,5 @@
 name = "winapi-x86_64-pc-windows-gnu"
 version = "0.4.0"
 
+[features]
+
diff --git a/third_party/skia b/third_party/skia
index 50346ff..fe04635 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 50346ff52bbbb2e32a4cd1ba8ef45dae9ae55f34
+Subproject commit fe04635b125f29a98ac8a15decef3f6bf3eb9aa3
diff --git a/third_party/webrtc b/third_party/webrtc
index bb91f77..601ac2e 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit bb91f77858607536b4a6ea7edb64caba9cb629d7
+Subproject commit 601ac2eea89a496ff32923aab0666376464eba8b
diff --git a/tools/crates/gnrt/vendor.rs b/tools/crates/gnrt/vendor.rs
index bb36745..05c58e8 100644
--- a/tools/crates/gnrt/vendor.rs
+++ b/tools/crates/gnrt/vendor.rs
@@ -356,6 +356,7 @@
         name: &'a str,
         version: &'a semver::Version,
         dependencies: Vec<PlaceholderDependency<'a>>,
+        features: Vec<String>,
     }
     #[derive(serde::Serialize)]
     struct PlaceholderDependency<'a> {
@@ -412,8 +413,11 @@
         })
         .collect();
 
+    let mut features = package.features.keys().cloned().collect::<Vec<String>>();
+    features.sort_unstable();
+
     let placeholder_crate =
-        PlaceholderCrate { name: &package.name, version: &package.version, dependencies };
+        PlaceholderCrate { name: &package.name, version: &package.version, dependencies, features };
 
     {
         let rendered = removed_cargo_template.render("template", &placeholder_crate)?;
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml
index 51a029f..ddbb1368 100644
--- a/tools/metrics/actions/actions.xml
+++ b/tools/metrics/actions/actions.xml
@@ -1092,6 +1092,11 @@
   <description>Please enter the description of this user action.</description>
 </action>
 
+<action name="Accel_Search_RWin" not_user_triggered="true">
+  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
+  <description>Please enter the description of this user action.</description>
+</action>
+
 <action name="Accel_SelectNextTab">
   <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
   <description>Please enter the description of this user action.</description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 9c95eb4..c7f2111 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -24034,13 +24034,6 @@
   <int value="8" label="Unknown Pointer"/>
 </enum>
 
-<enum name="HighEfficiencyModeExceptionListAction">
-  <int value="0" label="Add"/>
-  <int value="1" label="Edit"/>
-  <int value="2" label="Remove"/>
-  <int value="3" label="Add from current"/>
-</enum>
-
 <enum name="HighEfficiencyModeState">
   <int value="0" label="Disabled"/>
   <int value="1" label="Enabled"/>
@@ -39240,6 +39233,13 @@
   <int value="2" label="Expanded chip with savings"/>
 </enum>
 
+<enum name="MemorySaverModeExceptionListAction">
+  <int value="0" label="Add"/>
+  <int value="1" label="Edit"/>
+  <int value="2" label="Remove"/>
+  <int value="3" label="Add from current"/>
+</enum>
+
 <enum name="MenuSourceType">
   <int value="0" label="None"/>
   <int value="1" label="Mouse"/>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml
index b91ba5ee..7fe8fbc 100644
--- a/tools/metrics/histograms/metadata/android/histograms.xml
+++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -1679,7 +1679,7 @@
 </histogram>
 
 <histogram name="Android.InputDevice.Keyboard.Active" enum="Boolean"
-    expires_after="2024-04-04">
+    expires_after="2024-06-09">
   <owner>aishwaryarj@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>
@@ -1688,7 +1688,7 @@
 </histogram>
 
 <histogram name="Android.InputDevice.Mouse.Active" enum="Boolean"
-    expires_after="2024-04-04">
+    expires_after="2024-06-09">
   <owner>aishwaryarj@google.com</owner>
   <owner>clank-large-form-factors@google.com</owner>
   <summary>Emitted when a mouse is connected or disconnected.</summary>
@@ -2532,7 +2532,7 @@
 
 <histogram
     name="Android.Omnibox.{AndroidSearchPrefetch}.GeoLocationHeaderTime.{AndroidNavigationOrSuggestionPrefetch}"
-    units="ms" expires_after="2024-01-15">
+    units="ms" expires_after="2024-06-15">
   <owner>nhiroki@chromium.org</owner>
   <owner>ryansturm@chromium.org</owner>
   <owner>curranmax@chromium.org</owner>
@@ -3425,7 +3425,7 @@
 </histogram>
 
 <histogram name="Android.RestoreTabsOnFRE.ResultActionFirstShow2"
-    enum="RestoreTabsOnFREResultAction" expires_after="2024-03-31">
+    enum="RestoreTabsOnFREResultAction" expires_after="2024-06-09">
   <owner>ckitagawa@chromium.org</owner>
   <owner>bjfong@google.com</owner>
   <owner>fredmello@chromium.org</owner>
@@ -3436,7 +3436,7 @@
 </histogram>
 
 <histogram name="Android.RestoreTabsOnFRE.ResultActionSecondShow2"
-    enum="RestoreTabsOnFREResultAction" expires_after="2024-03-31">
+    enum="RestoreTabsOnFREResultAction" expires_after="2024-06-09">
   <owner>ckitagawa@chromium.org</owner>
   <owner>bjfong@google.com</owner>
   <owner>fredmello@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index c5ed00f..8ee3038 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -5205,7 +5205,7 @@
 </histogram>
 
 <histogram name="Ash.Personalization.App.Duration" units="ms"
-    expires_after="2024-04-05">
+    expires_after="2024-06-09">
   <owner>pzliu@google.com</owner>
   <owner>assistive-eng@google.com</owner>
   <summary>
@@ -5215,7 +5215,7 @@
 </histogram>
 
 <histogram name="Ash.Personalization.DynamicColor.ColorScheme.Settled"
-    enum="PersonalizationDynamicColorColorScheme" expires_after="2024-04-05">
+    enum="PersonalizationDynamicColorColorScheme" expires_after="2024-06-09">
   <owner>ericamlee@chromium.org</owner>
   <owner>assistive-eng@google.com</owner>
   <summary>
@@ -5235,7 +5235,7 @@
 </histogram>
 
 <histogram name="Ash.Personalization.DynamicColor.StaticColor.Settled"
-    enum="PersonalizationDynamicColorStaticColor" expires_after="2024-04-05">
+    enum="PersonalizationDynamicColorStaticColor" expires_after="2024-06-09">
   <owner>ericamlee@chromium.org</owner>
   <owner>assistive-eng@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index ab28105..64cd673 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -1301,7 +1301,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.ClosedSheetType.Android" enum="FedCmSheetType"
-    expires_after="2024-03-24">
+    expires_after="2024-06-09">
   <owner>npm@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1395,7 +1395,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.IdpSigninStatus.ClosePopupWindowReason"
-    enum="FedCmClosePopupWindowReason" expires_after="M125">
+    enum="FedCmClosePopupWindowReason" expires_after="2024-06-09">
   <owner>tanzachary@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1418,7 +1418,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.IdpSigninStatus.MismatchDialogResult"
-    enum="FedCmMismatchDialogResult" expires_after="M125">
+    enum="FedCmMismatchDialogResult" expires_after="2024-06-09">
   <owner>tanzachary@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1428,7 +1428,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.IdpSigninStatus.PopupWindowResult"
-    enum="FedCmPopupWindowResult" expires_after="M125">
+    enum="FedCmPopupWindowResult" expires_after="2024-06-09">
   <owner>tanzachary@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1438,7 +1438,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.IdpSigninStatus.ShowPopupWindowResult"
-    enum="FedCmShowPopupWindowResult" expires_after="M125">
+    enum="FedCmShowPopupWindowResult" expires_after="2024-06-09">
   <owner>tanzachary@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1699,7 +1699,7 @@
 </histogram>
 
 <histogram name="Blink.FedCm.Timing.MismatchDialogShownDuration" units="ms"
-    expires_after="M125">
+    expires_after="2024-06-09">
   <owner>tanzachary@chromium.org</owner>
   <owner>web-identity-eng@google.com</owner>
   <summary>
@@ -1939,7 +1939,7 @@
 </histogram>
 
 <histogram name="Blink.FetchQueuedPreloadsTime.{FrameType}.{IsInitial}"
-    units="ms" expires_after="2024-03-04">
+    units="ms" expires_after="2024-06-09">
   <owner>cduvall@chromium.org</owner>
   <owner>jam@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
@@ -3344,7 +3344,7 @@
 </histogram>
 
 <histogram name="Blink.ScanAndPreloadTime.{FrameType}.{IsInitial}" units="ms"
-    expires_after="2024-03-04">
+    expires_after="2024-06-09">
   <owner>cduvall@chromium.org</owner>
   <owner>jam@chromium.org</owner>
   <owner>chrome-loading@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/borealis/histograms.xml b/tools/metrics/histograms/metadata/borealis/histograms.xml
index d48a4f5..91b8499 100644
--- a/tools/metrics/histograms/metadata/borealis/histograms.xml
+++ b/tools/metrics/histograms/metadata/borealis/histograms.xml
@@ -201,7 +201,7 @@
 </histogram>
 
 <histogram name="Borealis.Install.Result" enum="BorealisInstallResult"
-    expires_after="2024-04-09">
+    expires_after="2024-06-09">
   <owner>danielng@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>
@@ -253,7 +253,7 @@
 </histogram>
 
 <histogram name="Borealis.Startup.NumAttempts" enum="BooleanAttempted"
-    expires_after="2024-04-09">
+    expires_after="2024-06-09">
   <owner>danielng@google.com</owner>
   <owner>src/chrome/browser/ash/borealis/OWNERS</owner>
   <summary>Recording every attempt to start Borealis (via the UI).</summary>
diff --git a/tools/metrics/histograms/metadata/browser/histograms.xml b/tools/metrics/histograms/metadata/browser/histograms.xml
index 78ba727..545d0b5 100644
--- a/tools/metrics/histograms/metadata/browser/histograms.xml
+++ b/tools/metrics/histograms/metadata/browser/histograms.xml
@@ -61,7 +61,7 @@
 </histogram>
 
 <histogram name="Browser.ChromeOS.HatsStatus" enum="HatsStatus"
-    expires_after="2024-03-17">
+    expires_after="2024-06-09">
   <owner>aalsum@chromium.org</owner>
   <owner>cros-telemetry@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml
index fabd960..97faee1 100644
--- a/tools/metrics/histograms/metadata/chromeos/histograms.xml
+++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -2869,7 +2869,7 @@
 
 <histogram
     name="ChromeOS.Settings.Device.{Peripheral}.ButtonRemapping.AcceleratorAction.Initial"
-    enum="AcceleratorAction" expires_after="2024-03-22">
+    enum="AcceleratorAction" expires_after="2024-06-09">
   <owner>dpad@google.com</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
@@ -3029,7 +3029,7 @@
 
 <histogram
     name="ChromeOS.Settings.Device.{Peripheral}.ButtonRemapping.Registered.CustomizableButton"
-    enum="CustomizableButton" expires_after="2024-03-22">
+    enum="CustomizableButton" expires_after="2024-06-09">
   <owner>dpad@google.com</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
@@ -3078,7 +3078,7 @@
 
 <histogram
     name="ChromeOS.Settings.Device.{Peripheral}.ButtonRemapping.StaticShortcutAction.Initial"
-    enum="DeviceSettingsStaticShortcutAction" expires_after="2024-03-22">
+    enum="DeviceSettingsStaticShortcutAction" expires_after="2024-06-09">
   <owner>dpad@google.com</owner>
   <owner>cros-peripherals@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/companion/histograms.xml b/tools/metrics/histograms/metadata/companion/histograms.xml
index 86e816e..9b78c44 100644
--- a/tools/metrics/histograms/metadata/companion/histograms.xml
+++ b/tools/metrics/histograms/metadata/companion/histograms.xml
@@ -149,7 +149,7 @@
 </histogram>
 
 <histogram name="Companion.VisualQuery.Agent.DomImageCount" units="images"
-    expires_after="2024-03-31">
+    expires_after="2024-06-09">
   <owner>srna@google.com</owner>
   <owner>pstjuste@google.com</owner>
   <owner>src/chrome/browser/companion/OWNERS</owner>
diff --git a/tools/metrics/histograms/metadata/compose/histograms.xml b/tools/metrics/histograms/metadata/compose/histograms.xml
index f7eb285e..3abc43f 100644
--- a/tools/metrics/histograms/metadata/compose/histograms.xml
+++ b/tools/metrics/histograms/metadata/compose/histograms.xml
@@ -130,7 +130,7 @@
 </histogram>
 
 <histogram name="Compose.Session.ComposeCount.{Status}" units="count"
-    expires_after="2024-03-31">
+    expires_after="2024-06-09">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -181,7 +181,7 @@
 </histogram>
 
 <histogram name="Compose.Session.DialogShownCount.{FinalStatus}" units="count"
-    expires_after="2024-03-31">
+    expires_after="2024-06-09">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
@@ -195,7 +195,7 @@
 </histogram>
 
 <histogram name="Compose.Session.UndoCount.{Status}" units="count"
-    expires_after="2024-03-31">
+    expires_after="2024-06-09">
   <owner>perrier@chromium.org</owner>
   <owner>chrome-compose-frontend@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/content/histograms.xml b/tools/metrics/histograms/metadata/content/histograms.xml
index d49207d..7299e37 100644
--- a/tools/metrics/histograms/metadata/content/histograms.xml
+++ b/tools/metrics/histograms/metadata/content/histograms.xml
@@ -465,7 +465,7 @@
 
 <histogram
     name="ContentSettings.{RegularProfileFiltered}DefaultRequestDesktopSiteSetting"
-    enum="ContentSetting" expires_after="2024-04-06">
+    enum="ContentSetting" expires_after="2024-06-09">
   <owner>shuyng@google.com</owner>
   <owner>twellington@chromium.org</owner>
   <summary>
@@ -631,7 +631,7 @@
 </histogram>
 
 <histogram name="ContentSuggestions.Feed.ActivityLoggingEnabled" enum="Boolean"
-    expires_after="2024-01-31">
+    expires_after="2024-06-09">
   <owner>dewittj@chromium.org</owner>
   <owner>feed@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml
index 414c5f4..c317a6b3 100644
--- a/tools/metrics/histograms/metadata/enterprise/histograms.xml
+++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -2490,7 +2490,7 @@
 
 <histogram
     name="Enterprise.SecondaryGoogleAccountUsage.PolicyFetch.ResponseLatency"
-    units="ms" expires_after="2023-10-04">
+    units="ms" expires_after="2024-12-11">
   <owner>rodmartin@google.com</owner>
   <owner>chromeos-commercial-identity@google.com</owner>
   <summary>
@@ -2498,6 +2498,9 @@
     the amount of time required to fetch the policy value of
     SecondaryGoogleAccountUsage from the Secure Connect API. This is recorded
     when a user account is added as a secondary account (in-session).
+
+    Warning: this histogram was expired from 2023-10-04 to 2023-12-11; data may
+    be missing.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/file/histograms.xml b/tools/metrics/histograms/metadata/file/histograms.xml
index a971bcc2..e88fac6d 100644
--- a/tools/metrics/histograms/metadata/file/histograms.xml
+++ b/tools/metrics/histograms/metadata/file/histograms.xml
@@ -1383,7 +1383,7 @@
 </histogram>
 
 <histogram name="FileBrowser.Recent.LoadFileSystemProvider" units="ms"
-    expires_after="M125">
+    expires_after="2024-06-09">
   <owner>simmonsjosh@google.com</owner>
   <owner>src/ui/file_manager/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml
index c548b46b..7281a9c4 100644
--- a/tools/metrics/histograms/metadata/gpu/histograms.xml
+++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -1154,7 +1154,7 @@
 </histogram>
 
 <histogram name="GPU.PaintOpReader.DeserializationError"
-    enum="PaintOpDeserializationError" expires_after="2024-03-24">
+    enum="PaintOpDeserializationError" expires_after="2024-06-09">
   <owner>junov@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
   <summary>
@@ -1723,7 +1723,7 @@
 </histogram>
 
 <histogram name="GPU.{GraphiteDawnOrWebGPU}.Support.{FeatureName}"
-    enum="Boolean" expires_after="2024-02-21">
+    enum="Boolean" expires_after="2024-06-09">
   <owner>enga@chromium.org</owner>
   <owner>mdb.webgpu-dev-team@google.com</owner>
   <summary>
@@ -1814,7 +1814,7 @@
 </histogram>
 
 <histogram name="Viz.BeginFrameSource.Accuracy.AverageDelta2"
-    units="microseconds" expires_after="2024-03-17">
+    units="microseconds" expires_after="2024-06-09">
   <owner>magchen@chromium.org</owner>
   <owner>ccameron@chromium.org</owner>
   <owner>graphics-dev@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index 2bd6eca..9322572 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -113,7 +113,7 @@
 </histogram>
 
 <histogram name="IOS.BackgroundTimeBeforeColdStart" units="minutes"
-    expires_after="2024-04-06">
+    expires_after="2024-06-09">
   <owner>thegreenfrog@chromium.org</owner>
   <owner>bling-team@google.com</owner>
   <summary>
@@ -816,7 +816,7 @@
 </histogram>
 
 <histogram name="IOS.ExperienceKitCalendar.Present"
-    enum="ExperienceKitCalendarTypes" expires_after="2024-03-10">
+    enum="ExperienceKitCalendarTypes" expires_after="2024-06-09">
   <owner>djean@chromium.org</owner>
   <owner>erahmaoui@google.com</owner>
   <summary>
@@ -2018,7 +2018,7 @@
 </histogram>
 
 <histogram name="IOS.OverflowMenu.TimeOpen.DestinationChosen" units="ms"
-    expires_after="2024-02-11">
+    expires_after="2024-06-09">
   <owner>rkgibson@google.com</owner>
   <owner>bling-mony-pod@google.com</owner>
   <summary>
@@ -3630,7 +3630,7 @@
 </histogram>
 
 <histogram name="IOS.WhatsNew.InstructionsShown" enum="WhatsNewType"
-    expires_after="2024-03-17">
+    expires_after="2024-06-09">
   <owner>cheickcisse@google.com</owner>
   <owner>sebsg@google.com</owner>
   <summary>
@@ -3640,7 +3640,7 @@
 </histogram>
 
 <histogram name="IOS.WhatsNew.ItemsClickedCount" units="count"
-    expires_after="2024-03-10">
+    expires_after="2024-06-09">
   <owner>cheickcisse@google.com</owner>
   <owner>sebsg@google.com</owner>
   <summary>The number of clicked What's New items per impression</summary>
diff --git a/tools/metrics/histograms/metadata/login/histograms.xml b/tools/metrics/histograms/metadata/login/histograms.xml
index 770118d..d7b96f85e 100644
--- a/tools/metrics/histograms/metadata/login/histograms.xml
+++ b/tools/metrics/histograms/metadata/login/histograms.xml
@@ -107,7 +107,7 @@
 </histogram>
 
 <histogram name="Login.DevicePolicyState" enum="DevicePoliciesState"
-    expires_after="2024-04-10">
+    expires_after="2024-06-09">
   <owner>igorcov@chromium.org</owner>
   <owner>chromeos-commercial-remote-management@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 2e07dea..e92fa620 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -3352,7 +3352,7 @@
 </histogram>
 
 <histogram name="Media.GetDisplayMedia.Constraints.SystemAudio"
-    enum="GetDisplayMediaIncludeExcludeConstraint" expires_after="2023-12-17">
+    enum="GetDisplayMediaIncludeExcludeConstraint" expires_after="2024-12-07">
   <owner>eladalon@chromium.org</owner>
   <owner>fbeaufort@chromium.org</owner>
   <owner>webrtc-audio-uma@google.com</owner>
@@ -5283,7 +5283,7 @@
 </histogram>
 
 <histogram name="Media.Video.Autoplay.Muted.PlayMethod.OffscreenDuration"
-    units="ms" expires_after="2024-01-30">
+    units="ms" expires_after="2024-06-09">
   <owner>dalecurtis@chromium.org</owner>
   <owner>evliu@google.com</owner>
   <owner>media-dev-uma@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/net/histograms.xml b/tools/metrics/histograms/metadata/net/histograms.xml
index 4c57d69..63cace6 100644
--- a/tools/metrics/histograms/metadata/net/histograms.xml
+++ b/tools/metrics/histograms/metadata/net/histograms.xml
@@ -3641,7 +3641,7 @@
 </histogram>
 
 <histogram name="Net.QuicSession.NumPingsSent" units="pings"
-    expires_after="2024-04-03">
+    expires_after="2024-06-09">
   <owner>renjietang@chromium.org</owner>
   <owner>src/net/quic/OWNERS</owner>
   <summary>
@@ -4912,7 +4912,7 @@
 </histogram>
 
 <histogram name="Net.SharedDictionaryTransaction.NetResultWithDict.{CertState}"
-    enum="NetErrorCodes" expires_after="2024-02-15">
+    enum="NetErrorCodes" expires_after="2024-06-09">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -4929,7 +4929,7 @@
 
 <histogram
     name="Net.SharedDictionaryUsedByResponseWhenAvailable.MainFrame.{ConnectionType}.{CertState}"
-    enum="Boolean" expires_after="2024-02-15">
+    enum="Boolean" expires_after="2024-06-09">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
@@ -4952,7 +4952,7 @@
 
 <histogram
     name="Net.SharedDictionaryUsedResponseErrorCodes.{DestinationType}.{CertState}"
-    enum="NetErrorCodes" expires_after="2024-02-15">
+    enum="NetErrorCodes" expires_after="2024-06-09">
   <owner>horo@chromium.org</owner>
   <owner>src/net/extras/shared_dictionary/OWNERS</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index e4b31bc..da5cb44d 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -8288,7 +8288,7 @@
 </histogram>
 
 <histogram name="PushMessaging.UnregistrationStatus"
-    enum="PushUnregistrationStatus" expires_after="2024-02-04">
+    enum="PushUnregistrationStatus" expires_after="2024-06-09">
   <owner>peter@chromium.org</owner>
   <owner>knollr@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml
index 9724b7c3..3902f03 100644
--- a/tools/metrics/histograms/metadata/password/histograms.xml
+++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -215,7 +215,7 @@
 </histogram>
 
 <histogram name="KeyboardAccessory.GenerationDialogChoice.{GenerationType}"
-    enum="GenerationDialogChoice" expires_after="M124">
+    enum="GenerationDialogChoice" expires_after="2024-06-09">
   <owner>ioanap@chromium.org</owner>
   <owner>vasilii@chromium.org</owner>
   <summary>
@@ -473,7 +473,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AccountStorage.NumOptedInAccountsAfterOptOut"
-    units="accounts" expires_after="2023-12-24">
+    units="accounts" expires_after="2024-06-24">
   <owner>mamir@chromium.org</owner>
   <owner>treib@chromium.org</owner>
   <summary>
@@ -574,7 +574,7 @@
 </histogram>
 
 <histogram name="PasswordManager.AccountStoreCredentialsAfterOptIn"
-    units="credentials" expires_after="2024-02-20">
+    units="credentials" expires_after="2024-06-09">
   <owner>treib@chromium.org</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
@@ -2526,7 +2526,7 @@
 
 <histogram name="PasswordManager.PasswordSharingIOS.UserAction"
     enum="PasswordManager.PasswordSharingIOSUserAction"
-    expires_after="2024-03-01">
+    expires_after="2024-06-09">
   <owner>rgod@google.com</owner>
   <owner>mamir@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/performance_controls/histograms.xml b/tools/metrics/histograms/metadata/performance_controls/histograms.xml
index d246c0e..554b10111 100644
--- a/tools/metrics/histograms/metadata/performance_controls/histograms.xml
+++ b/tools/metrics/histograms/metadata/performance_controls/histograms.xml
@@ -89,7 +89,7 @@
 </histogram>
 
 <histogram name="PerformanceControls.MemorySaver.SettingsChangeExceptionList"
-    enum="HighEfficiencyModeExceptionListAction" expires_after="2024-05-19">
+    enum="MemorySaverModeExceptionListAction" expires_after="2024-05-19">
   <owner>charlesmeng@chromium.org</owner>
   <owner>chrome-performance-ui-sea@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/permissions/histograms.xml b/tools/metrics/histograms/metadata/permissions/histograms.xml
index 6cbab71..1ee5df50 100644
--- a/tools/metrics/histograms/metadata/permissions/histograms.xml
+++ b/tools/metrics/histograms/metadata/permissions/histograms.xml
@@ -1247,7 +1247,7 @@
 </histogram>
 
 <histogram name="SiteEngagementService.EngagementType"
-    enum="SiteEngagementServiceEngagementType" expires_after="2024-02-11">
+    enum="SiteEngagementServiceEngagementType" expires_after="2024-06-09">
   <owner>calamity@chromium.org</owner>
   <owner>dominickn@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/platform/histograms.xml b/tools/metrics/histograms/metadata/platform/histograms.xml
index 7c0b6e8..83a849a 100644
--- a/tools/metrics/histograms/metadata/platform/histograms.xml
+++ b/tools/metrics/histograms/metadata/platform/histograms.xml
@@ -1054,7 +1054,7 @@
 
 <histogram
     name="Platform.Libhwsec.RetryAction.PinWeaverManager.{ReplayOperationType}{ReplayEntryType}"
-    enum="HwsecRetryActionEnum" expires_after="2024-02-20">
+    enum="HwsecRetryActionEnum" expires_after="2024-06-09">
   <owner>chensa@google.com</owner>
   <owner>cros-hwsec-userland-eng+uma@google.com</owner>
   <summary>
@@ -1566,7 +1566,7 @@
 </histogram>
 
 <histogram name="Platform.Missive.ResourceExhaustedCase"
-    enum="ResourceExhaustedCase" expires_after="2024-03-24">
+    enum="ResourceExhaustedCase" expires_after="2024-06-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/renderer/histograms.xml b/tools/metrics/histograms/metadata/renderer/histograms.xml
index 8c6c6a5..9ed385da 100644
--- a/tools/metrics/histograms/metadata/renderer/histograms.xml
+++ b/tools/metrics/histograms/metadata/renderer/histograms.xml
@@ -512,7 +512,7 @@
 </histogram>
 
 <histogram name="Renderer.Preload.UnusedResource" enum="BooleanSuccess"
-    expires_after="2024-02-17">
+    expires_after="2024-06-09">
   <owner>yoavweiss@chromium.org</owner>
   <owner>speed-metrics-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
index f710c99..d32aaa3 100644
--- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
+++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -465,7 +465,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.ClientSidePhishingDetection.AllowlistMatchResult"
-    enum="SafeBrowsingAllowlistAsyncMatch" expires_after="2024-03-17">
+    enum="SafeBrowsingAllowlistAsyncMatch" expires_after="2024-06-09">
   <owner>thefrog@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2039,7 +2039,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.RT.AllowlistSizeTooSmall"
-    enum="BooleanUnavailable" expires_after="2024-02-11">
+    enum="BooleanUnavailable" expires_after="2024-06-09">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2359,7 +2359,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.RT.Response.VerdictType.{UserPopulation}"
-    enum="SafeBrowsingRTLookupResponseVerdictType" expires_after="2024-04-09">
+    enum="SafeBrowsingRTLookupResponseVerdictType" expires_after="2024-06-09">
   <owner>zackhan@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
@@ -2921,7 +2921,7 @@
 </histogram>
 
 <histogram name="SafeBrowsing.V4ProcessPartialUpdate.RemovalsHashesCount"
-    units="entries" expires_after="2024-03-17">
+    units="entries" expires_after="2024-06-09">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/sb_client/histograms.xml b/tools/metrics/histograms/metadata/sb_client/histograms.xml
index f4eecec..4f1c72f 100644
--- a/tools/metrics/histograms/metadata/sb_client/histograms.xml
+++ b/tools/metrics/histograms/metadata/sb_client/histograms.xml
@@ -355,7 +355,7 @@
 
 <histogram
     name="SBClientDownload.Warning.DownloadIsHttps.{DangerType}.{Action}"
-    enum="BooleanHttps" expires_after="2024-03-02">
+    enum="BooleanHttps" expires_after="2024-06-09">
   <owner>xinghuilu@chromium.org</owner>
   <owner>chrome-counter-abuse-alerts@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/settings/histograms.xml b/tools/metrics/histograms/metadata/settings/histograms.xml
index a3e6082..9ab33d3 100644
--- a/tools/metrics/histograms/metadata/settings/histograms.xml
+++ b/tools/metrics/histograms/metadata/settings/histograms.xml
@@ -53,7 +53,7 @@
 </variants>
 
 <histogram name="Settings.AdvancedSpellcheck.OnStartup2" enum="BooleanEnabled"
-    expires_after="2024-02-01">
+    expires_after="2024-06-09">
   <owner>harrisonsean@chromium.org</owner>
   <owner>chrome-privacy-controls@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml
index 1f26d70..dd110110 100644
--- a/tools/metrics/histograms/metadata/signin/histograms.xml
+++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -44,7 +44,7 @@
 
 <histogram
     name="Signin.AccountCapabilities.GetFromSystemLibraryDuration{Caller}"
-    units="ms" expires_after="2024-04-10">
+    units="ms" expires_after="2024-06-09">
   <owner>fernandex@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <owner>triploblastic@chromium.org</owner>
@@ -123,7 +123,7 @@
 </histogram>
 
 <histogram name="Signin.AccountCapabilities.{Priority}.FetchDuration.{Result}"
-    units="ms" expires_after="2024-04-10">
+    units="ms" expires_after="2024-06-09">
   <owner>alexilin@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -148,7 +148,7 @@
 </histogram>
 
 <histogram name="Signin.AccountCapabilities.{Priority}.FetchResult"
-    enum="AccountCapabilitiesFetchResult" expires_after="2024-04-10">
+    enum="AccountCapabilitiesFetchResult" expires_after="2024-06-09">
   <owner>alexilin@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -814,7 +814,7 @@
 </histogram>
 
 <histogram name="Signin.HadPreviousSyncAccount.SignedOutOnProfileLoad"
-    enum="BooleanHadSyncAccount" expires_after="2024-04-10">
+    enum="BooleanHadSyncAccount" expires_after="2024-06-09">
   <owner>mastiz@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
@@ -827,7 +827,7 @@
 </histogram>
 
 <histogram name="Signin.HadPreviousSyncAccount.SyncOffOnProfileLoad"
-    enum="BooleanHadSyncAccount" expires_after="2024-04-10">
+    enum="BooleanHadSyncAccount" expires_after="2024-06-09">
   <owner>mastiz@chromium.org</owner>
   <owner>msarda@chromium.org</owner>
   <owner>chrome-signin-team@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml
index 4ad12fd..d7aa7ca 100644
--- a/tools/metrics/histograms/metadata/storage/histograms.xml
+++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -1011,7 +1011,7 @@
 </histogram>
 
 <histogram name="Storage.SharedStorage.Worklet.Timing.Delete" units="ms"
-    expires_after="2024-01-31">
+    expires_after="2024-06-09">
   <owner>cammie@chromium.org</owner>
   <owner>yaoxia@chromium.org</owner>
   <owner>chrome-ads-histograms@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/sync/enums.xml b/tools/metrics/histograms/metadata/sync/enums.xml
index 93c118e..97915c6a 100644
--- a/tools/metrics/histograms/metadata/sync/enums.xml
+++ b/tools/metrics/histograms/metadata/sync/enums.xml
@@ -53,6 +53,13 @@
   <int value="1" label="Signed in"/>
 </enum>
 
+<enum name="CrossUserSharingDecryptionResult">
+  <int value="0" label="Succeeded"/>
+  <int value="1" label="Invitation missing required fields"/>
+  <int value="2" label="Failed to decrypt invitation"/>
+  <int value="3" label="Failed to parse decrypted invitation"/>
+</enum>
+
 <enum name="FaviconAvailabilityStatus">
   <int value="0" label="Favicon available locally"/>
   <int value="1" label="Favicon available via sync"/>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml
index b3ab780..5d9abc18 100644
--- a/tools/metrics/histograms/metadata/sync/histograms.xml
+++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -357,6 +357,17 @@
   </token>
 </histogram>
 
+<histogram name="Sync.CrossUserSharingDecryptionResult"
+    enum="CrossUserSharingDecryptionResult" expires_after="2024-11-12">
+  <owner>rushans@google.com</owner>
+  <owner>mmoskvitin@google.com</owner>
+  <component>Services&gt;Sync</component>
+  <summary>
+    Records the result of decryption of incoming password sharing invitations.
+    Recorded for each incoming invitation received from the server.
+  </summary>
+</histogram>
+
 <histogram name="Sync.CrossUserSharingPublicPrivateKeyInitializedOnStartup"
     enum="Boolean" expires_after="2024-05-19">
   <owner>rushans@google.com</owner>
@@ -1933,7 +1944,7 @@
 </histogram>
 
 <histogram name="Sync.TrustedVaultLocalDataDecryptionIsSuccessful"
-    enum="BooleanSuccess" expires_after="2024-04-08">
+    enum="BooleanSuccess" expires_after="2024-06-09">
   <owner>mmoskvitin@google.com</owner>
   <owner>mastiz@chromium.org</owner>
   <component>Services&gt;Sync</component>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml
index e107b6b..be39b76 100644
--- a/tools/metrics/histograms/metadata/tab/histograms.xml
+++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -384,7 +384,7 @@
 </histogram>
 
 <histogram name="Tab.SwitchedToForegroundAge" units="ms"
-    expires_after="2024-03-18">
+    expires_after="2024-06-09">
   <owner>dtrainor@chromium.org</owner>
   <owner>ckitagawa@chroimum.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/web_rtc/histograms.xml b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
index 3a69b190..242860e2 100644
--- a/tools/metrics/histograms/metadata/web_rtc/histograms.xml
+++ b/tools/metrics/histograms/metadata/web_rtc/histograms.xml
@@ -1413,7 +1413,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.RtcpMuxPolicy"
-    enum="PeerConnectionRtcpMux" expires_after="2023-12-11">
+    enum="PeerConnectionRtcpMux" expires_after="2024-12-01">
   <owner>hta@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <owner>phancke@microsoft.com</owner>
@@ -1497,7 +1497,7 @@
 </histogram>
 
 <histogram name="WebRTC.PeerConnection.ThermalState" enum="ThermalState"
-    expires_after="2024-03-17">
+    expires_after="2024-06-09">
   <owner>eshr@google.com</owner>
   <owner>hbos@chromium.org</owner>
   <summary>
@@ -1693,7 +1693,7 @@
 </histogram>
 
 <histogram name="WebRTC.Stun.Integrity.{StunPacketType}"
-    enum="WebRtcStunIntegrityOutcome" expires_after="2024-04-07">
+    enum="WebRtcStunIntegrityOutcome" expires_after="2024-06-09">
   <owner>hta@chromium.org</owner>
   <owner>webrtc-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/webapps/histograms.xml b/tools/metrics/histograms/metadata/webapps/histograms.xml
index af26f56..35f79477 100644
--- a/tools/metrics/histograms/metadata/webapps/histograms.xml
+++ b/tools/metrics/histograms/metadata/webapps/histograms.xml
@@ -1374,7 +1374,7 @@
 </histogram>
 
 <histogram name="WebApp.ShortcutsMenu.Win.Results"
-    enum="ShortcutsMenuWinRegistrationResult" expires_after="2024-04-10">
+    enum="ShortcutsMenuWinRegistrationResult" expires_after="2024-06-09">
   <owner>dibyapal@chromium.org</owner>
   <owner>desktop-pwas-team@google.com</owner>
   <summary>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index a35848c..1b2a0cc 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -1,28 +1,28 @@
 {
     "trace_processor_shell": {
         "linux_arm64": {
-            "hash": "6ae14fec0f7987c856a1a0b5f630a76ebe3b1a71",
-            "full_remote_path": "perfetto-luci-artifacts/v40.0/linux-arm64/trace_processor_shell"
+            "hash": "483fb260863332fd37514bdff03fed3221abba85",
+            "full_remote_path": "perfetto-luci-artifacts/3e53e144bee271ec558363df2e561a77d7e0b789/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "c7c2a61353e8d20d3046959bd1b9532f4733b1b8",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/fa59d7989d624785db9b505e1832854bb7ff7431/trace_processor_shell.exe"
+            "hash": "594ae17bc084dbff01fa2beb6605d323aa82496d",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/7c24b00c696462d5b8f1bbc2901be8f825f831d0/trace_processor_shell.exe"
         },
         "linux_arm": {
-            "hash": "4f3fa8b6898b85d5bd2d36187996300aa24737ef",
-            "full_remote_path": "perfetto-luci-artifacts/v40.0/linux-arm/trace_processor_shell"
+            "hash": "8aa911491cd365131216862ae495e18424ebe1b2",
+            "full_remote_path": "perfetto-luci-artifacts/3e53e144bee271ec558363df2e561a77d7e0b789/linux-arm/trace_processor_shell"
         },
         "mac": {
-            "hash": "0937f074a9c0144a5ccb4d48cf3a2bf4021b5fb8",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/fa59d7989d624785db9b505e1832854bb7ff7431/trace_processor_shell"
+            "hash": "7a47174c223846955ee7acb6e776e4c33a50798b",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/7c24b00c696462d5b8f1bbc2901be8f825f831d0/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "0420c906651068ea3e381219467f160cdfb6d21a",
             "full_remote_path": "perfetto-luci-artifacts/v40.0/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "b434a619fccbe6dbfc414c6f59c26f639d7fb75e",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/fa59d7989d624785db9b505e1832854bb7ff7431/trace_processor_shell"
+            "hash": "c46ffb0ecf749e9898cab237abd8de80b5cf685c",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/7c24b00c696462d5b8f1bbc2901be8f825f831d0/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/chromeos/file_manager_strings.grdp b/ui/chromeos/file_manager_strings.grdp
index 53a45cd..58d927b5 100644
--- a/ui/chromeos/file_manager_strings.grdp
+++ b/ui/chromeos/file_manager_strings.grdp
@@ -858,8 +858,11 @@
   <message name="IDS_FILE_BROWSER_PENDING_LABEL" desc="Pending label.">
     Pending
   </message>
-  <message name="IDS_FILE_BROWSER_SCANNING_LABEL" desc="Scanning label.">
-    Scanning
+  <message name="IDS_FILE_BROWSER_SCANNING_LABEL" desc="Scanning label for single file.">
+    Checking file against your organization's security policies...
+  </message>
+  <message name="IDS_FILE_BROWSER_SCANNING_LABEL_PLURAL" desc="Scanning label for multiple files.">
+    Checking files against your organization's security policies...
   </message>
   <message name="IDS_FILE_BROWSER_SEARCH_TEXT_LABEL" desc="Search text field label.">
     Search
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SCANNING_LABEL.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SCANNING_LABEL.png.sha1
index f18c1c2..a728254 100644
--- a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SCANNING_LABEL.png.sha1
+++ b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SCANNING_LABEL.png.sha1
@@ -1 +1 @@
-c7ebe32d7cff58f139451810d55efbbe2429bdc0
\ No newline at end of file
+ea34e78ed0846d299b572497ea8c7fd2c2904b53
\ No newline at end of file
diff --git a/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SCANNING_LABEL_PLURAL.png.sha1 b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SCANNING_LABEL_PLURAL.png.sha1
new file mode 100644
index 0000000..0f6a6dc
--- /dev/null
+++ b/ui/chromeos/file_manager_strings_grdp/IDS_FILE_BROWSER_SCANNING_LABEL_PLURAL.png.sha1
@@ -0,0 +1 @@
+51152eb9d46f82d7ccbf9d488a24f2773cdc3112
\ No newline at end of file
diff --git a/ui/events/ash/event_rewriter_ash.cc b/ui/events/ash/event_rewriter_ash.cc
index b334669..78eaa2b 100644
--- a/ui/events/ash/event_rewriter_ash.cc
+++ b/ui/events/ash/event_rewriter_ash.cc
@@ -436,6 +436,21 @@
   return code;
 }
 
+KeyboardCode RelocateKeyboardCode(KeyboardCode key_code,
+                                  DomKeyLocation location) {
+  // Note: currently, we're using SHIFT/CONTROL, instead of
+  // LSFHIT,RSHIFT/LCONTROL,RCONTROL, so {L,R}WIN are only candidate to be
+  // replaced.
+  switch (key_code) {
+    case VKEY_LWIN:
+    case VKEY_RWIN:
+      return location == DomKeyLocation::RIGHT ? VKEY_RWIN : VKEY_LWIN;
+    default:
+      break;
+  }
+  return key_code;
+}
+
 // Returns true if |mouse_event| was generated from a touchpad device.
 bool IsFromTouchpadDevice(const MouseEvent& mouse_event) {
   for (const InputDevice& touchpad :
@@ -1177,8 +1192,9 @@
     if (remapped_key->remap_to == ui::mojom::ModifierKey::kCapsLock) {
       characteristic_flag |= EF_CAPS_LOCK_ON;
     }
-    state->code = RelocateModifier(
-        state->code, KeycodeConverter::DomCodeToLocation(incoming.code));
+    auto original_location = KeycodeConverter::DomCodeToLocation(incoming.code);
+    state->code = RelocateModifier(state->code, original_location);
+    state->key_code = RelocateKeyboardCode(state->key_code, original_location);
   }
 
   // Next, remap modifier bits.
diff --git a/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.js b/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.ts
similarity index 72%
rename from ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.js
rename to ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.ts
index dc1a1a8..da82a5f 100644
--- a/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.js
+++ b/ui/file_manager/file_manager/foreground/js/file_manager_commands_unittest.ts
@@ -11,23 +11,52 @@
 import {MockDirectoryEntry, MockEntry, MockFileSystem} from '../../common/js/mock_entry.js';
 import {waitUntil} from '../../common/js/test_error_reporting.js';
 import {RootType, VolumeType} from '../../common/js/volume_manager_types.js';
+import type {CommandHandlerDeps} from '../../externs/command_handler_deps.js';
+import type {VolumeInfo} from '../../externs/volume_info.js';
 import {addVolume, convertVolumeInfoAndMetadataToVolume, updateIsInteractiveVolume} from '../../state/ducks/volumes.js';
 import {createMyFilesDataWithVolumeEntry} from '../../state/ducks/volumes_unittest.js';
 import {createFakeVolumeMetadata, setUpFileManagerOnWindow, setupStore, waitDeepEquals} from '../../state/for_tests.js';
 
 import {CommandHandler, ValidMenuCommandsForUma} from './command_handler.js';
+import type {FilesCommandId} from './command_handler.js';
+import {CanExecuteEvent, Command} from './ui/command.js';
 
-/** @type {!MockMetrics} */
-let mockMetrics;
+let mockMetrics: MockMetrics;
 
-/**
- * @param {number} metricIndex
- * @returns {string|undefined}
- */
-function getMetricName(metricIndex) {
+function getMetricName(metricIndex: number): string|undefined {
   return ValidMenuCommandsForUma[metricIndex];
 }
 
+interface ExtraCanExecuteCommandProperties {
+  target: {entry?: DirectoryEntry, parentElement?: {contextElement: null}};
+}
+
+interface CurrentSelection {
+  entries: MockEntry[];
+  iconType: string;
+  totalCount: number;
+}
+
+function createMockEvent(
+    commandId?: string,
+    properties?: ExtraCanExecuteCommandProperties): CanExecuteEvent {
+  const command = {
+    hidden: false,
+    setHidden: (hidden: boolean) => {
+      event.command.hidden = hidden;
+    },
+  } as unknown as Command;
+  if (commandId) {
+    command.id = commandId;
+  }
+  let event = new CanExecuteEvent(command);
+  event.canExecute = true;
+  if (properties) {
+    event = Object.assign(properties, event);
+  }
+  return event;
+}
+
 /**
  * Checks that the `toggle-holding-space` command is appropriately enabled/
  * disabled given the current selection state and executes as expected.
@@ -41,19 +70,18 @@
 
   /**
    * Mock chrome APIs.
-   * @type {!Object}
    */
-  let itemUrls = [];
+  let itemUrls: string[] = [];
   mockMetrics = new MockMetrics();
   const mockChrome = {
     metricsPrivate: mockMetrics,
     fileManagerPrivate: {
-      // @ts-ignore: error TS7006: Parameter 'callback' implicitly has an 'any'
-      // type.
-      getHoldingSpaceState: (callback) => {
-        callback({itemUrls});
-        getHoldingSpaceStateCalled = true;
-      },
+      getHoldingSpaceState:
+          (callback: (state: chrome.fileManagerPrivate.HoldingSpaceState) =>
+               void) => {
+            callback({itemUrls});
+            getHoldingSpaceStateCalled = true;
+          },
     },
 
     runtime: {},
@@ -66,14 +94,12 @@
   // Create `DOWNLOADS` volume.
   const downloadsVolumeInfo = volumeManager.createVolumeInfo(
       VolumeType.DOWNLOADS, 'downloadsVolumeId', 'Downloads volume');
-  const downloadsFileSystem =
-      /** @type{MockFileSystem} */ (downloadsVolumeInfo.fileSystem);
+  const downloadsFileSystem = downloadsVolumeInfo.fileSystem as MockFileSystem;
 
   // Create `REMOVABLE` volume.
   const removableVolumeInfo = volumeManager.createVolumeInfo(
       VolumeType.REMOVABLE, 'removableVolumeId', 'Removable volume');
-  const removableFileSystem =
-      /** @type{MockFileSystem} */ (removableVolumeInfo.fileSystem);
+  const removableFileSystem = removableVolumeInfo.fileSystem as MockFileSystem;
 
   // Mock file/folder entries.
   const audioFileEntry = new MockEntry(downloadsFileSystem, '/audio.mp3');
@@ -192,17 +218,7 @@
     console.log('Starting test case... ' + testCase.description);
 
     // Mock `Event`.
-    const event = {
-      canExecute: true,
-      command: {
-        hidden: false,
-        // @ts-ignore: error TS7006: Parameter 'hidden' implicitly has an 'any'
-        // type.
-        setHidden: (hidden) => {
-          event.command.hidden = hidden;
-        },
-      },
-    };
+    const event = createMockEvent();
 
     // Mock `FileManager`.
     const fileManager = {
@@ -214,16 +230,13 @@
         selection: {entries: testCase.selection},
       },
       volumeManager: volumeManager,
-    };
+    } as unknown as CommandHandlerDeps;
 
     // Mock `chrome.fileManagerPrivate.getHoldingSpaceState()` response.
     itemUrls = testCase.itemUrls;
 
     // Verify `command.canExecute()` results in expected `event` state.
     getHoldingSpaceStateCalled = false;
-    // @ts-ignore: error TS2345: Argument of type '{ canExecute: boolean;
-    // command: { hidden: boolean; setHidden: (hidden: any) => void; }; }' is
-    // not assignable to parameter of type 'Event'.
     command.canExecute(event, fileManager);
     if (testCase.expect.canExecute) {
       await waitUntil(() => getHoldingSpaceStateCalled);
@@ -240,23 +253,29 @@
 
     // Mock private API.
     let didInteractWithMockPrivateApi = false;
-    chrome.fileManagerPrivate.toggleAddedToHoldingSpace = (entries, isAdd) => {
-      didInteractWithMockPrivateApi = true;
-      // @ts-ignore: error TS2345: Argument of type 'MockEntry[] |
-      // FileSystemDirectoryEntry[] | undefined' is not assignable to parameter
-      // of type 'any[]'.
-      assertArrayEquals(entries, testCase.expect.entries);
-      assertEquals(isAdd, testCase.expect.isAdd);
-    };
+    chrome.fileManagerPrivate.toggleAddedToHoldingSpace =
+        (entries: Entry[], isAdd: boolean) => {
+          didInteractWithMockPrivateApi = true;
+          assertArrayEquals(entries, testCase.expect.entries as Entry[]);
+          assertEquals(isAdd, testCase.expect.isAdd);
+        };
 
     // Reset cache of metrics recorded.
     mockMetrics.metricCalls['FileBrowser.MenuItemSelected'] = [];
 
+    const commandEvent = new CustomEvent('command', {
+      detail: {
+        command: {
+          hidden: false,
+          setHidden: (hidden: boolean) => {
+            event.command.hidden = hidden;
+          },
+        } as unknown as Command,
+      },
+    });
+
     // Verify `command.execute()` results in expected mock API interactions.
-    // @ts-ignore: error TS2345: Argument of type '{ canExecute: boolean;
-    // command: { hidden: boolean; setHidden: (hidden: any) => void; }; }' is
-    // not assignable to parameter of type 'Event'.
-    command.execute(event, fileManager);
+    command.execute(commandEvent, fileManager);
     assertTrue(didInteractWithMockPrivateApi);
 
     // Verify metrics recorded.
@@ -280,21 +299,13 @@
   const command = CommandHandler.getCommand('extract-all');
   assertNotEquals(command, undefined);
 
-  // @ts-ignore: error TS6133: 'startIOTaskCalled' is declared but its value is
-  // never read.
-  let startIOTaskCalled = false;
-
   /**
    * Mock chrome startIOTask API.
-   * @type {!Object}
    */
   const mockChrome = {
     fileManagerPrivate: {
-      startIOTask: () => {
-        startIOTaskCalled = true;
-      },
+      startIOTask: () => {},
     },
-
     runtime: {},
   };
   installMockChrome(mockChrome);
@@ -305,8 +316,7 @@
   // Create `DOWNLOADS` volume.
   const downloadsVolumeInfo = volumeManager.createVolumeInfo(
       VolumeType.DOWNLOADS, 'downloadsVolumeId', 'Downloads volume');
-  const downloadsFileSystem =
-      /** @type{MockFileSystem} */ (downloadsVolumeInfo.fileSystem);
+  const downloadsFileSystem = downloadsVolumeInfo.fileSystem as MockFileSystem;
 
   // Mock file entries.
   const folderEntry = MockDirectoryEntry.create(downloadsFileSystem, '/folder');
@@ -315,20 +325,10 @@
   const imageFileEntry = new MockEntry(downloadsFileSystem, '/image.jpg');
 
   // Mock `Event`.
-  const event = {
-    canExecute: true,
-    command: {
-      hidden: false,
-      // @ts-ignore: error TS7006: Parameter 'hidden' implicitly has an 'any'
-      // type.
-      setHidden: (hidden) => {
-        event.command.hidden = hidden;
-      },
-    },
-  };
+  const event = createMockEvent();
 
   // The current selection for testing.
-  const currentSelection = {
+  const currentSelection: CurrentSelection = {
     entries: [],
     iconType: 'none',
     totalCount: 0,
@@ -347,25 +347,17 @@
     getCurrentDirectoryEntry: () => folderEntry,
     getSelection: () => currentSelection,
     volumeManager: volumeManager,
-  };
+  } as unknown as CommandHandlerDeps;
 
   // Check: canExecute is false and command is hidden with no selection.
-  // @ts-ignore: error TS2345: Argument of type '{ canExecute: boolean;
-  // command: { hidden: boolean; setHidden: (hidden: any) => void; }; }' is not
-  // assignable to parameter of type 'Event'.
   command.canExecute(event, fileManager);
   assertFalse(event.canExecute);
   assertTrue(event.command.hidden);
 
   // Check: canExecute is true and command is visible with a single ZIP file.
-  // @ts-ignore: error TS2322: Type 'MockEntry' is not assignable to type
-  // 'never'.
   currentSelection.entries = [zipFileEntry];
   currentSelection.iconType = 'archive';
   currentSelection.totalCount = 1;
-  // @ts-ignore: error TS2345: Argument of type '{ canExecute: boolean;
-  // command: { hidden: boolean; setHidden: (hidden: any) => void; }; }' is not
-  // assignable to parameter of type 'Event'.
   command.canExecute(event, fileManager);
   assertTrue(event.canExecute);
   assertFalse(event.command.hidden);
@@ -375,41 +367,25 @@
   assertNotEquals(command, undefined);
 
   // Check: ZIP canExecute is false and command hidden with a single ZIP file.
-  // @ts-ignore: error TS2345: Argument of type '{ canExecute: boolean;
-  // command: { hidden: boolean; setHidden: (hidden: any) => void; }; }' is not
-  // assignable to parameter of type 'Event'.
   zipCommand.canExecute(event, fileManager);
   assertFalse(event.canExecute);
   assertTrue(event.command.hidden);
 
   // Check: canExecute is false and command hidden for no ZIP multi-selection.
-  // @ts-ignore: error TS2322: Type 'MockEntry' is not assignable to type
-  // 'never'.
   currentSelection.entries = [imageFileEntry, textFileEntry];
   currentSelection.totalCount = 2;
-  // @ts-ignore: error TS2345: Argument of type '{ canExecute: boolean;
-  // command: { hidden: boolean; setHidden: (hidden: any) => void; }; }' is not
-  // assignable to parameter of type 'Event'.
   command.canExecute(event, fileManager);
   assertFalse(event.canExecute);
   assertTrue(event.command.hidden);
 
   // Check: canExecute is true and command visible for ZIP multiple selection.
-  // @ts-ignore: error TS2322: Type 'MockEntry' is not assignable to type
-  // 'never'.
   currentSelection.entries = [zipFileEntry, textFileEntry];
   currentSelection.totalCount = 2;
-  // @ts-ignore: error TS2345: Argument of type '{ canExecute: boolean;
-  // command: { hidden: boolean; setHidden: (hidden: any) => void; }; }' is not
-  // assignable to parameter of type 'Event'.
   command.canExecute(event, fileManager);
   assertTrue(event.canExecute);
   assertFalse(event.command.hidden);
 
   // Check: ZIP canExecute is true and command visible for multiple selection.
-  // @ts-ignore: error TS2345: Argument of type '{ canExecute: boolean;
-  // command: { hidden: boolean; setHidden: (hidden: any) => void; }; }' is not
-  // assignable to parameter of type 'Event'.
   zipCommand.canExecute(event, fileManager);
   assertTrue(event.canExecute);
   assertFalse(event.command.hidden);
@@ -434,24 +410,11 @@
   // Mock file entries.
   const recentEntry = new FakeEntryImpl('Recent', RootType.RECENT);
   const pdfEntry = MockDirectoryEntry.create(
-      /** @type{MockFileSystem} */ (documentsRootVolumeInfo.fileSystem),
+      documentsRootVolumeInfo.fileSystem as MockFileSystem,
       'Documents/abc.pdf');
 
   // Mock `Event`.
-  const event = {
-    canExecute: true,
-    target: {
-      entry: pdfEntry,
-    },
-    command: {
-      hidden: false,
-      // @ts-ignore: error TS7006: Parameter 'hidden' implicitly has an 'any'
-      // type.
-      setHidden: (hidden) => {
-        event.command.hidden = hidden;
-      },
-    },
-  };
+  const event = createMockEvent(undefined, {target: {entry: pdfEntry}});
 
   // The current selection for testing.
   const currentSelection = {
@@ -470,13 +433,9 @@
     getCurrentDirectoryEntry: () => recentEntry,
     getSelection: () => currentSelection,
     volumeManager: volumeManager,
-  };
+  } as unknown as CommandHandlerDeps;
 
   // Check: canExecute is false and command is disabled.
-  // @ts-ignore: error TS2345: Argument of type '{ canExecute: boolean;
-  // target: { entry: FileSystemDirectoryEntry; }; command: { hidden: boolean;
-  // setHidden: (hidden: any) => void; }; }' is not assignable to parameter of
-  // type 'Event'.
   command.canExecute(event, fileManager);
   assertFalse(event.canExecute);
   assertFalse(event.command.hidden);
@@ -485,9 +444,9 @@
 /**
  * Create and add a Downloads volume to the store. Update the volume as
  * non-interactive.
- * @return {!Promise<import("../../externs/volume_info.js").VolumeInfo>}
  */
-async function createAndAddNonInteractiveDownloadsVolume() {
+async function createAndAddNonInteractiveDownloadsVolume():
+    Promise<VolumeInfo> {
   setUpFileManagerOnWindow();
   // Dispatch an action to add MyFiles volume.
   const store = setupStore();
@@ -545,7 +504,7 @@
   const nonInteractiveVolumeInfo =
       await createAndAddNonInteractiveDownloadsVolume();
 
-  const currentSelection = {
+  const currentSelection: CurrentSelection = {
     entries: [],
     iconType: 'none',
     totalCount: 0,
@@ -577,44 +536,28 @@
         contains: () => false,
       },
     },
-  };
+  } as unknown as CommandHandlerDeps;
 
   // Check each command is disabled and hidden.
-  const commandNames =
-      /** @type {import('./command_handler.js').FilesCommandId[]} */ ([
-        'paste',
-        'cut',
-        'copy',
-        'new-folder',
-      ]);
+  const commandNames: FilesCommandId[] = [
+    'paste',
+    'cut',
+    'copy',
+    'new-folder',
+  ];
   for (const commandName of commandNames) {
     // Check: command exists.
     const command = CommandHandler.getCommand(commandName);
     assertNotEquals(command, undefined);
 
     // Mock `Event`.
-    const event = {
-      canExecute: true,
+    const event = createMockEvent(commandName, {
       target: {
         parentElement: {
           contextElement: null,
         },
       },
-      command: {
-        hidden: false,
-        // @ts-ignore: error TS7006: Parameter 'hidden' implicitly has an 'any'
-        // type.
-        setHidden: (hidden) => {
-          event.command.hidden = hidden;
-        },
-        id: commandName,
-      },
-    };
-
-    // @ts-ignore: error TS2345: Argument of type '{ canExecute: boolean;
-    // target: { parentElement: { contextElement: null; }; }; command: { hidden:
-    // boolean; setHidden: (hidden: any) => void; id: string; }; }' is not
-    // assignable to parameter of type 'Event'.
+    });
     command.canExecute(event, fileManager);
     assertFalse(event.canExecute);
     assertTrue(event.command.hidden);
@@ -636,8 +579,7 @@
 
   // Create file entry on non-interactive volume.
   const nonInteractiveVolumeEntry = MockDirectoryEntry.create(
-      /** @type{MockFileSystem} */ (nonInteractiveVolumeInfo.fileSystem),
-      'abc.pdf');
+      nonInteractiveVolumeInfo.fileSystem as MockFileSystem, 'abc.pdf');
   const currentSelection = {
     entries: [nonInteractiveVolumeEntry],
     iconType: 'none',
@@ -669,48 +611,33 @@
       },
     },
     volumeManager: volumeManager,
-  };
+  } as unknown as CommandHandlerDeps;
 
   // Check each command is disabled and hidden.
-  const commandNames =
-      /** @type {import('./command_handler.js').FilesCommandId[]} */ ([
-        'paste',
-        'cut',
-        'copy',
-        'new-folder',
-        'delete',
-        'move-to-trash',
-        'paste-into-folder',
-        'rename',
-        'extract-all',
-        'zip-selection',
-      ]);
+  const commandNames: FilesCommandId[] = [
+    'paste',
+    'cut',
+    'copy',
+    'new-folder',
+    'delete',
+    'move-to-trash',
+    'paste-into-folder',
+    'rename',
+    'extract-all',
+    'zip-selection',
+  ];
   for (const commandName of commandNames) {
     // Check: command exists.
     const command = CommandHandler.getCommand(commandName);
     assertNotEquals(command, undefined);
 
     // Mock `Event`.
-    const event = {
-      canExecute: true,
+    const event = createMockEvent(commandName, {
       target: {
         entry: nonInteractiveVolumeEntry,
       },
-      command: {
-        hidden: false,
-        // @ts-ignore: error TS7006: Parameter 'hidden' implicitly has an 'any'
-        // type.
-        setHidden: (hidden) => {
-          event.command.hidden = hidden;
-        },
-        id: commandName,
-      },
-    };
+    });
 
-    // @ts-ignore: error TS2345: Argument of type '{ canExecute: boolean;
-    // target: { entry: FileSystemDirectoryEntry; }; command: { hidden: boolean;
-    // setHidden: (hidden: any) => void; id: string; }; }' is not assignable to
-    // parameter of type 'Event'.
     command.canExecute(event, fileManager);
     assertFalse(event.canExecute);
     assertTrue(event.command.hidden);
diff --git a/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.ts b/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.ts
index 53962e1..90de1e9 100644
--- a/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.ts
+++ b/ui/file_manager/file_manager/foreground/js/ui/progress_center_panel.ts
@@ -443,7 +443,11 @@
     }
 
     if (item.state === ProgressItemState.SCANNING) {
-      return str('SCANNING_LABEL');
+      if (item.itemCount === 1) {
+        return str('SCANNING_LABEL');
+      } else {
+        return str('SCANNING_LABEL_PLURAL');
+      }
     }
 
     // Check if remaining time is valid (ie finite and positive).
diff --git a/ui/file_manager/file_names.gni b/ui/file_manager/file_names.gni
index ec2c76b..1272238a 100644
--- a/ui/file_manager/file_names.gni
+++ b/ui/file_manager/file_names.gni
@@ -517,6 +517,7 @@
   "file_manager/foreground/js/directory_model_unittest.ts",
   "file_manager/foreground/js/empty_folder_controller_unittest.ts",
   "file_manager/foreground/js/file_list_model_unittest.ts",
+  "file_manager/foreground/js/file_manager_commands_unittest.ts",
   "file_manager/foreground/js/file_tasks_unittest.ts",
   "file_manager/foreground/js/file_transfer_controller_unittest.ts",
   "file_manager/foreground/js/file_type_filters_controller_unittest.ts",
@@ -624,7 +625,6 @@
 # Test files:
 unittest_files = [
   # Foreground:
-  "file_manager/foreground/js/file_manager_commands_unittest.js",
   "file_manager/foreground/js/ui/file_manager_dialog_base_unittest.js",
   "file_manager/foreground/js/ui/actions_submenu_unittest.js",
   "file_manager/foreground/js/ui/context_menu_handler_unittest.js",
diff --git a/ui/file_manager/integration_tests/file_manager/dlp_enterprise_connectors.js b/ui/file_manager/integration_tests/file_manager/dlp_enterprise_connectors.js
index 59c1e02..2c0390c2 100644
--- a/ui/file_manager/integration_tests/file_manager/dlp_enterprise_connectors.js
+++ b/ui/file_manager/integration_tests/file_manager/dlp_enterprise_connectors.js
@@ -131,7 +131,9 @@
 
   // Scanning Label.
   await remoteCall.waitForFeedbackPanelItem(
-      appId, new RegExp('^Copying.*$'), new RegExp('^Scanning$'));
+      appId, new RegExp('^Copying.*$'),
+      new RegExp(
+          '^Checking files against your organization\'s security policies…$'));
 
   // Issue the responses, s.t., the transfer can continue.
   await sendTestMessage({name: 'issueFileTransferResponses'});
@@ -227,7 +229,9 @@
 
   // Scanning Label.
   await remoteCall.waitForFeedbackPanelItem(
-      appId, new RegExp('^Copying.*$'), new RegExp('^Scanning$'));
+      appId, new RegExp('^Copying.*$'),
+      new RegExp(
+          '^Checking files against your organization\'s security policies…$'));
 
   // Issue the responses, s.t., the transfer can continue.
   await sendTestMessage({name: 'issueFileTransferResponses'});
diff --git a/ui/file_manager/integration_tests/file_manager/file_transfer_connector.js b/ui/file_manager/integration_tests/file_manager/file_transfer_connector.js
index 8a0290a..2a76ec47 100644
--- a/ui/file_manager/integration_tests/file_manager/file_transfer_connector.js
+++ b/ui/file_manager/integration_tests/file_manager/file_transfer_connector.js
@@ -690,7 +690,7 @@
       appId,
       transferInfo.isMove ? new RegExp('^Moving.*$') :
                             new RegExp('^Copying.*$'),
-      new RegExp('^Scanning$'));
+      new RegExp('^Checking.*$'));
 
   // After the scanning label is shown, we resume the transfer.
   // Issue the responses, s.t., the transfer can continue.
diff --git a/v8 b/v8
index 7cf5e4a..a7b74e0 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 7cf5e4a343da8afd4f89d546262bace90837b7d7
+Subproject commit a7b74e0cfb1b4f57a04daafddc4b99ee65ac6925