diff --git a/DEPS b/DEPS
index 3e162f37..b1fca74 100644
--- a/DEPS
+++ b/DEPS
@@ -295,15 +295,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': '768ace3fd14422db1cb326e1abc69f51efe2d74a',
+  'skia_revision': 'c15b236c12edeb2ad43d650d6e0df5a4fec068ab',
   # 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': '6f17f338ff1df4623bfdca257fe911442c35f60f',
+  'v8_revision': '5d83ccf80ddd9959325fde53ce0b9869e76505b8',
   # 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': 'e4007fff3335258e97e5e8b9569d8d698df820c9',
+  'angle_revision': 'c8209fec9a5f8d4eef073fb21a8db0c7d51c531d',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -359,7 +359,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling catapult
   # and whatever else without interference from each other.
-  'catapult_revision': '5b2aa8309e962decb237aefa7e3c39df5f38dfcf',
+  'catapult_revision': '1addc95539476f179b854ae82c1ae6aa7bdffcbc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -403,7 +403,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': 'fb4d36177feeea4831be2d0ba5d845149ac4f105',
+  'dawn_revision': '564c7c94378c0ef081277fe57ca14a2d9dc35476',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -507,7 +507,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling llvm-libc
   # and whatever else without interference from each other.
-  'llvm_libc_revision':    '73cbf2b1662754e29ac2698830b7952c80f22b62',
+  'llvm_libc_revision':    'ebfb379c5464568cd3961cdf60e55dee9f512098',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling llvm-libc
   # and whatever else without interference from each other.
@@ -515,7 +515,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       'ed0f32ee7a8d9481bfd26cfa6f5940b9f296f371',
+  'libcxx_revision':       'be9dd89ffbfdf2b6cf6b9c5ec076d6adbc5d25a6',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:4cfb717bbd5ecfcf63af3cb4487da5ea4777ef67',
@@ -1178,7 +1178,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm',
-              'version': 'EFizASCPlMxxxhGvPKjNC1G8Msaeeg-DXCe40KTY04MC',
+              'version': '8TrZckM-d0znyn0yuKDz95mtv2k95nCIxNTDUpXoUZ4C',
           },
       ],
       'condition': 'checkout_android',
@@ -1189,7 +1189,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm64',
-              'version': 'Dx9VhIMwnCX73bAra_KPdZVE6Gd6-m062Max3kwfRQsC',
+              'version': 'Q0o8xJ0FZgassGCKpJVAvW_gvHPG5QLi3_ZX38kZGt0C',
           },
       ],
       'condition': 'checkout_android',
@@ -1592,12 +1592,12 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    'e1012395eec3db1f82de8817f9f439253fe87155',
+    'dccbc9a6d7146b71f54ed6f3bc739c3c3a5098b5',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + 'a96616b68569bc8dc258cb570fd1b2f9122ce85e',
+    'url': Var('chromium_git') + '/website.git' + '@' + '1906b0bbaa142dc87acd171137d5a234aeba74c8',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -1742,7 +1742,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'gemT-xzcoRzj_jJb3kOedn9ppuIIqXw8nDxbFMlLfrIC',
+          'version': 'KfW884hqD9iK8mAo1aUw4nHlSXkFtVZCTBlo8NsUq38C',
       },
     ],
     'condition': 'checkout_android and non_git_source',
@@ -2612,7 +2612,7 @@
     Var('pdfium_git') + '/pdfium.git' + '@' +  Var('pdfium_revision'),
 
   'src/third_party/perfetto':
-    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '9231d0a42f8fc75aa3ba973269f3ee9a0c195b95',
+    Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '83bcbbbf67ed17934ddd3b667ed19c120c9ed504',
 
   'src/base/tracing/test/data': {
     'bucket': 'perfetto',
@@ -3680,7 +3680,7 @@
 
   'src/components/optimization_guide/internal': {
       'url': Var('chrome_git') + '/chrome/components/optimization_guide.git' + '@' +
-        '0a8ac7a60d6948d9a88faf17024a73657cb8a8b0',
+        'c66de765dcd2a1b6a180828665edf21f1403a832',
       'condition': 'checkout_src_internal',
   },
 
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index b8a59b2..a8fdd96 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -4894,7 +4894,8 @@
         else:
             # Report non cr Log function calls in changed lines
             for line_num, line in f.ChangedContents():
-                if log_call_pattern.search(line):
+                if (log_call_pattern.search(line)
+                        or has_some_log_import_pattern.search(line)):
                     util_log_errors.append("%s:%d" % (f.LocalPath(), line_num))
 
         # Per file checks
diff --git a/PRESUBMIT_test.py b/PRESUBMIT_test.py
index 72bee12..d193f208 100755
--- a/PRESUBMIT_test.py
+++ b/PRESUBMIT_test.py
@@ -1777,9 +1777,11 @@
         # Util Log usage
         nb = len(msgs[3].items)
         self.assertEqual(
-            3, nb, 'Expected %d items, found %d: %s' % (3, nb, msgs[3].items))
+            5, nb, 'Expected %d items, found %d: %s' % (3, nb, msgs[3].items))
+        self.assertTrue('HasAndroidLog.java:1' in msgs[3].items)
         self.assertTrue('HasAndroidLog.java:3' in msgs[3].items)
         self.assertTrue('HasExplicitUtilLog.java:2' in msgs[3].items)
+        self.assertTrue('IsInBasePackageButImportsLog.java:2' in msgs[3].items)
         self.assertTrue('IsInBasePackageButImportsLog.java:4' in msgs[3].items)
 
         # Tag must not contain
diff --git a/android_webview/browser/aw_settings.cc b/android_webview/browser/aw_settings.cc
index a2e9bdf..c2dbe2b 100644
--- a/android_webview/browser/aw_settings.cc
+++ b/android_webview/browser/aw_settings.cc
@@ -615,7 +615,8 @@
   PopulateFixedWebPreferences(web_prefs);
 
   web_prefs->text_autosizing_enabled =
-      Java_AwSettings_getTextAutosizingEnabledLocked(env, obj);
+      Java_AwSettings_getTextAutosizingEnabledLocked(env, obj) &&
+      !base::FeatureList::IsEnabled(blink::features::kForceOffTextAutosizing);
 
   int text_size_percent = Java_AwSettings_getTextSizePercentLocked(env, obj);
   if (web_prefs->text_autosizing_enabled) {
diff --git a/android_webview/common/DEPS b/android_webview/common/DEPS
index fbc7acc..87c0747 100644
--- a/android_webview/common/DEPS
+++ b/android_webview/common/DEPS
@@ -15,5 +15,6 @@
     "+components/safe_browsing/core/common/features.h",
     "+components/sensitive_content/features.h",
     "+components/viz/common/features.h",
+    "+third_party/blink/public/common/features.h",
   ]
 }
diff --git a/android_webview/common/aw_feature_map.cc b/android_webview/common/aw_feature_map.cc
index 0cfaf75..750fc7f 100644
--- a/android_webview/common/aw_feature_map.cc
+++ b/android_webview/common/aw_feature_map.cc
@@ -13,6 +13,7 @@
 #include "components/sensitive_content/features.h"
 #include "components/viz/common/features.h"
 #include "content/public/common/content_features.h"
+#include "third_party/blink/public/common/features.h"
 
 // Must come after all headers that specialize FromJniType() / ToJniType().
 #include "android_webview/common_jni/AwFeatureMap_jni.h"
@@ -29,6 +30,7 @@
     // keep-sorted start allow_yaml_lists=yes by_regex=['\w+,']
     &features::kAndroidMetricsAsyncMetricLogging,
     &base::features::kCollectAndroidFrameTimelineMetrics,
+    &blink::features::kForceOffTextAutosizing,
     &safe_browsing::kHashPrefixRealTimeLookups,
     &base::features::kPostGetMyMemoryStateToBackground,
     &::features::kPrefetchBrowserInitiatedTriggers,
diff --git a/android_webview/common/crash_reporter/crash_keys.cc b/android_webview/common/crash_reporter/crash_keys.cc
index ab3f481f..c639a44f 100644
--- a/android_webview/common/crash_reporter/crash_keys.cc
+++ b/android_webview/common/crash_reporter/crash_keys.cc
@@ -170,6 +170,7 @@
 
     // sandbox/linux
     "seccomp-sigsys",
+    "seccomp-sigsys-ioctl",
 
     kWeblayerWebViewCompatMode,
 
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
index 72cde92..2084704 100644
--- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
+++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java
@@ -48,8 +48,11 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
+import org.chromium.base.test.util.Features.DisableFeatures;
+import org.chromium.base.test.util.Features.EnableFeatures;
 import org.chromium.base.test.util.TestFileUtil;
 import org.chromium.base.test.util.UrlUtils;
+import org.chromium.blink_public.common.BlinkFeatures;
 import org.chromium.components.embedder_support.util.WebResourceResponseInfo;
 import org.chromium.content_public.browser.ContentFeatureList;
 import org.chromium.content_public.browser.ContentFeatureMap;
@@ -917,10 +920,13 @@
         protected static final float PARAGRAPH_FONT_SIZE = 14.0f;
 
         AwSettingsTextAutosizingTestHelper(
-                AwTestContainerView containerView, TestAwContentsClient contentViewClient)
+                AwTestContainerView containerView,
+                TestAwContentsClient contentViewClient,
+                boolean isAutosizingEnabled)
                 throws Throwable {
             super(containerView, contentViewClient, true);
             mNeedToWaitForFontSizeChange = false;
+            mAutosizingEnabled = isAutosizingEnabled;
             loadDataSync(getData());
         }
 
@@ -982,15 +988,18 @@
             return sb.toString();
         }
 
-        private boolean mNeedToWaitForFontSizeChange;
+        protected boolean mNeedToWaitForFontSizeChange;
+        protected boolean mAutosizingEnabled;
         private float mOldFontSize;
     }
 
     class AwSettingsLayoutAlgorithmTestHelper extends AwSettingsTextAutosizingTestHelper<Integer> {
         AwSettingsLayoutAlgorithmTestHelper(
-                AwTestContainerView containerView, TestAwContentsClient contentViewClient)
+                AwTestContainerView containerView,
+                TestAwContentsClient contentViewClient,
+                boolean isAutosizingEnabled)
                 throws Throwable {
-            super(containerView, contentViewClient);
+            super(containerView, contentViewClient, isAutosizingEnabled);
             // Font autosizing doesn't step in for narrow layout widths.
             mAwSettings.setUseWideViewPort(true);
         }
@@ -1017,19 +1026,26 @@
         protected void setCurrentValue(@LayoutAlgorithm Integer value) throws Throwable {
             super.setCurrentValue(value);
             mAwSettings.setLayoutAlgorithm(value);
+            if (!mAutosizingEnabled) {
+                mNeedToWaitForFontSizeChange = false;
+            }
         }
 
         @Override
         protected void doEnsureSettingHasValue(@LayoutAlgorithm Integer value) throws Throwable {
             final float actualFontSize = getActualFontSize();
-            if (value == AwSettings.LAYOUT_ALGORITHM_TEXT_AUTOSIZING) {
-                Assert.assertFalse(
+            if (value == AwSettings.LAYOUT_ALGORITHM_TEXT_AUTOSIZING && mAutosizingEnabled) {
+                Assert.assertNotEquals(
                         "Actual font size: " + actualFontSize,
-                        actualFontSize == PARAGRAPH_FONT_SIZE);
+                        actualFontSize,
+                        PARAGRAPH_FONT_SIZE,
+                        0.1);
             } else {
-                Assert.assertTrue(
+                Assert.assertEquals(
                         "Actual font size: " + actualFontSize,
-                        actualFontSize == PARAGRAPH_FONT_SIZE);
+                        actualFontSize,
+                        PARAGRAPH_FONT_SIZE,
+                        0.1);
             }
         }
     }
@@ -1039,9 +1055,11 @@
         private final float mInitialActualFontSize;
 
         AwSettingsTextZoomTestHelper(
-                AwTestContainerView containerView, TestAwContentsClient contentViewClient)
+                AwTestContainerView containerView,
+                TestAwContentsClient contentViewClient,
+                boolean isAutosizingEnabled)
                 throws Throwable {
-            super(containerView, contentViewClient);
+            super(containerView, contentViewClient, isAutosizingEnabled);
             mInitialActualFontSize = getActualFontSize();
         }
 
@@ -1096,9 +1114,11 @@
         private final float mInitialActualFontSize;
 
         AwSettingsTextZoomAutosizingTestHelper(
-                AwTestContainerView containerView, TestAwContentsClient contentViewClient)
+                AwTestContainerView containerView,
+                TestAwContentsClient contentViewClient,
+                boolean isAutosizingEnabled)
                 throws Throwable {
-            super(containerView, contentViewClient);
+            super(containerView, contentViewClient, isAutosizingEnabled);
             mAwSettings.setLayoutAlgorithm(AwSettings.LAYOUT_ALGORITHM_TEXT_AUTOSIZING);
             // The initial font size can be adjusted by font autosizer depending on the page's
             // viewport width.
@@ -2896,34 +2916,76 @@
 
     @Test
     @SmallTest
+    @EnableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING)
     @Feature({"AndroidWebView", "Preferences"})
-    public void testLayoutAlgorithmWithTwoViews() throws Throwable {
+    public void testLayoutAlgorithmWithTwoViewsWithTextAutosizingDisabled() throws Throwable {
         ViewPair views = createViews();
         runPerViewSettingsTest(
-                new AwSettingsLayoutAlgorithmTestHelper(views.getContainer0(), views.getClient0()),
-                new AwSettingsLayoutAlgorithmTestHelper(views.getContainer1(), views.getClient1()));
+                new AwSettingsLayoutAlgorithmTestHelper(
+                        views.getContainer0(), views.getClient0(), false),
+                new AwSettingsLayoutAlgorithmTestHelper(
+                        views.getContainer1(), views.getClient1(), false));
     }
 
     @Test
     @SmallTest
+    @DisableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING)
     @Feature({"AndroidWebView", "Preferences"})
-    public void testTextZoomWithTwoViews() throws Throwable {
+    public void testLayoutAlgorithmWithTwoViewsWithTextAutosizingEnabled() throws Throwable {
         ViewPair views = createViews();
         runPerViewSettingsTest(
-                new AwSettingsTextZoomTestHelper(views.getContainer0(), views.getClient0()),
-                new AwSettingsTextZoomTestHelper(views.getContainer1(), views.getClient1()));
+                new AwSettingsLayoutAlgorithmTestHelper(
+                        views.getContainer0(), views.getClient0(), true),
+                new AwSettingsLayoutAlgorithmTestHelper(
+                        views.getContainer1(), views.getClient1(), true));
     }
 
     @Test
     @SmallTest
+    @EnableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING)
     @Feature({"AndroidWebView", "Preferences"})
-    public void testTextZoomAutosizingWithTwoViews() throws Throwable {
+    public void testTextZoomWithTwoViewsWithTextAutosizingDisabled() throws Throwable {
+        ViewPair views = createViews();
+        runPerViewSettingsTest(
+                new AwSettingsTextZoomTestHelper(views.getContainer0(), views.getClient0(), false),
+                new AwSettingsTextZoomTestHelper(views.getContainer1(), views.getClient1(), false));
+    }
+
+    @Test
+    @SmallTest
+    @DisableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING)
+    @Feature({"AndroidWebView", "Preferences"})
+    public void testTextZoomWithTwoViewsWithTextAutosizingEnabled() throws Throwable {
+        ViewPair views = createViews();
+        runPerViewSettingsTest(
+                new AwSettingsTextZoomTestHelper(views.getContainer0(), views.getClient0(), true),
+                new AwSettingsTextZoomTestHelper(views.getContainer1(), views.getClient1(), true));
+    }
+
+    @Test
+    @SmallTest
+    @EnableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING)
+    @Feature({"AndroidWebView", "Preferences"})
+    public void testTextZoomAutosizingWithTwoViewsWithTextAutosizingDisabled() throws Throwable {
         ViewPair views = createViews();
         runPerViewSettingsTest(
                 new AwSettingsTextZoomAutosizingTestHelper(
-                        views.getContainer0(), views.getClient0()),
+                        views.getContainer0(), views.getClient0(), false),
                 new AwSettingsTextZoomAutosizingTestHelper(
-                        views.getContainer1(), views.getClient1()));
+                        views.getContainer1(), views.getClient1(), false));
+    }
+
+    @Test
+    @SmallTest
+    @DisableFeatures(BlinkFeatures.FORCE_OFF_TEXT_AUTOSIZING)
+    @Feature({"AndroidWebView", "Preferences"})
+    public void testTextZoomAutosizingWithTwoViewsWithTextAutosizingEnabled() throws Throwable {
+        ViewPair views = createViews();
+        runPerViewSettingsTest(
+                new AwSettingsTextZoomAutosizingTestHelper(
+                        views.getContainer0(), views.getClient0(), true),
+                new AwSettingsTextZoomAutosizingTestHelper(
+                        views.getContainer1(), views.getClient1(), true));
     }
 
     @Test
@@ -3948,17 +4010,18 @@
 
     /**
      * Verifies the following statements about a setting:
-     * 
+     *
      * <pre>
      *  - initially, the setting has a default value;
      *  - the setting can be switched to an alternate value and back;
      *  - switching a setting in the first WebView doesn't affect the setting
      *    state in the second WebView and vice versa.
      * </pre>
+     *
      * @param helper0 Test helper for the first ContentView
      * @param helper1 Test helper for the second ContentView
      */
-     private void runPerViewSettingsTest(
+    private void runPerViewSettingsTest(
             AwSettingsTestHelper<?> helper0, AwSettingsTestHelper<?> helper1) throws Throwable {
         helper0.ensureSettingHasInitialValue();
         helper1.ensureSettingHasInitialValue();
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index c691869..2be6871 100644
--- a/buildtools/deps_revisions.gni
+++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision var in //DEPS.
-  libcxx_revision = "ed0f32ee7a8d9481bfd26cfa6f5940b9f296f371"
+  libcxx_revision = "be9dd89ffbfdf2b6cf6b9c5ec076d6adbc5d25a6"
 }
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn
index cfdf421..84fea80c 100644
--- a/chrome/BUILD.gn
+++ b/chrome/BUILD.gn
@@ -1422,7 +1422,7 @@
     "//components/memory_system",
     "//components/startup_metric_utils",
     "//components/sync",
-    "//components/upload_list:upload_list",
+    "//components/upload_list",
     "//components/webui/about",
     "//content/public/child",
     "//pdf",
@@ -1505,7 +1505,7 @@
 group("extra_resources") {
   # Deps should be same as those in chrome_extra_paks() within chrome_paks.gni.
   public_deps = [
-    "//chrome/browser/resources:resources",
+    "//chrome/browser/resources",
     "//components/autofill/core/browser:autofill_address_rewriter_resources",
   ]
 }
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn
index d2da90f..d12956f 100644
--- a/chrome/android/BUILD.gn
+++ b/chrome/android/BUILD.gn
@@ -518,6 +518,8 @@
       "//chrome/browser/ui/android/edge_to_edge:java",
       "//chrome/browser/ui/android/ephemeraltab:java",
       "//chrome/browser/ui/android/extensions:java",
+      "//chrome/browser/ui/android/extensions/windowing:factory_java",
+      "//chrome/browser/ui/android/extensions/windowing:java",
       "//chrome/browser/ui/android/fast_checkout:java",
       "//chrome/browser/ui/android/favicon:java",
       "//chrome/browser/ui/android/google_bottom_bar:java",
@@ -545,6 +547,8 @@
       "//chrome/browser/ui/android/toolbar:java",
       "//chrome/browser/ui/android/web_app_header:java",
       "//chrome/browser/ui/android/whats_new:java",
+      "//chrome/browser/ui/browser_window:factory_java",
+      "//chrome/browser/ui/browser_window:java",
       "//chrome/browser/ui/messages/android:java",
       "//chrome/browser/ui/plus_addresses/android:java",
       "//chrome/browser/uid/android:java",
@@ -943,6 +947,12 @@
         "//chrome/browser/ui/android/extensions/windowing/internal:java",
         "//chrome/browser/ui/browser_window/internal:java",
       ]
+    } else {
+      # TODO(crbug.com/434123514): see if we can remove these stub targets.
+      deps += [
+        "//chrome/browser/ui/android/extensions/windowing/stub:java",
+        "//chrome/browser/ui/browser_window/stub:java",
+      ]
     }
   }
 
@@ -2405,6 +2415,13 @@
       "//components/ip_protection/android/android_auth_client_lib/javatests:ip_protection_auth_javatests",
     ]
 
+    if (is_desktop_android) {
+      deps += [
+        "//chrome/browser/ui/android/extensions/windowing/internal:javatests",
+        "//chrome/browser/ui/browser_window/internal:javatests",
+      ]
+    }
+
     data_deps = [ "//testing/buildbot/filters:chrome_public_test_apk_filters" ]
 
     if (enable_chrome_android_internal) {
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn
index eaf4c9b..3c65c16 100644
--- a/chrome/android/features/tab_ui/BUILD.gn
+++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -189,7 +189,7 @@
     "//third_party/hamcrest:hamcrest_core_java",
     "//third_party/hamcrest:hamcrest_library_java",
     "//third_party/jni_zero:jni_zero_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/accessibility:ax_base_java",
     "//ui/android:ui_java_test_support",
@@ -234,7 +234,7 @@
     "//third_party/androidx:androidx_test_monitor_java",
     "//third_party/hamcrest:hamcrest_java",
     "//third_party/hamcrest:hamcrest_library_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//ui/android:ui_no_recycler_view_java",
   ]
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
index 8b4fe0b..de61fdd8 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -273,8 +273,10 @@
 import org.chromium.chrome.browser.ui.IncognitoRestoreAppLaunchDrawBlockerFactory;
 import org.chromium.chrome.browser.ui.RootUiCoordinator;
 import org.chromium.chrome.browser.ui.appmenu.AppMenuPropertiesDelegate;
+import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTaskTrackerFactory;
 import org.chromium.chrome.browser.ui.desktop_windowing.AppHeaderUtils;
 import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils;
+import org.chromium.chrome.browser.ui.extensions.windowing.ExtensionWindowControllerBridgeFactory;
 import org.chromium.chrome.browser.ui.searchactivityutils.SearchActivityClient;
 import org.chromium.chrome.browser.ui.searchactivityutils.SearchActivityExtras.IntentOrigin;
 import org.chromium.chrome.browser.ui.signin.BottomSheetSigninAndHistorySyncConfig;
@@ -1232,6 +1234,30 @@
         }
     }
 
+    private void initializeExtensionWindowControllerBridge() {
+        try (TraceEvent e =
+                TraceEvent.scoped(
+                        "ChromeTabbedActivity.initializeExtensionWindowControllerBridge")) {
+            var chromeAndroidTaskTracker = ChromeAndroidTaskTrackerFactory.getInstance();
+            if (chromeAndroidTaskTracker == null) {
+                return;
+            }
+
+            var activityWindowAndroid = getWindowAndroid();
+            assert activityWindowAndroid != null;
+
+            var chromeAndroidTask = chromeAndroidTaskTracker.obtainTask(activityWindowAndroid);
+
+            var extensionWindowControllerBridge =
+                    ExtensionWindowControllerBridgeFactory.create(chromeAndroidTask);
+            if (extensionWindowControllerBridge == null) {
+                return;
+            }
+
+            chromeAndroidTask.addFeature(extensionWindowControllerBridge);
+        }
+    }
+
     private void maybeCreateIncognitoTabSnapshotController() {
         try (TraceEvent e =
                 TraceEvent.scoped(
@@ -1352,6 +1378,10 @@
             PostTask.postTask(
                     TaskTraits.UI_DEFAULT,
                     mCallbackController.makeCancelable(
+                            this::initializeExtensionWindowControllerBridge));
+            PostTask.postTask(
+                    TaskTraits.UI_DEFAULT,
+                    mCallbackController.makeCancelable(
                             this::maybeCreateIncognitoTabSnapshotController));
             // Always call into this function, even if BackPressManager is disabled to initialize
             // back press managers which reduce code duplication in this class.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java
index 189bfbb..279a87cb 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeWindow.java
@@ -13,6 +13,8 @@
 import org.chromium.base.supplier.Supplier;
 import org.chromium.chrome.browser.compositor.CompositorViewHolder;
 import org.chromium.chrome.browser.keyboard_accessory.ManualFillingComponent;
+import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask;
+import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTaskTrackerFactory;
 import org.chromium.ui.base.ActivityKeyboardVisibilityDelegate;
 import org.chromium.ui.base.ActivityWindowAndroid;
 import org.chromium.ui.base.IntentRequestTracker;
@@ -98,6 +100,24 @@
     }
 
     @Override
+    public void destroy() {
+        clearActivityWindowAndroidFromChromeAndroidTask();
+
+        // It's not 100% correct to destroy the ChromeAndroidTask here as a ChromeAndroidTask
+        // is meant to track an Android Task, but a ChromeWindow is associated with a
+        // ChromeActivity.
+        //
+        // However, as of July 22, 2025, Android framework doesn't provide an API that listens for
+        // Task removal, so we need to destroy the ChromeAndroidTask here as a workaround.
+        //
+        // In the future, we can register a Task listener when a ChromeAndroidTask is created, then
+        // destroy it when notified of the Task removal.
+        destroyChromeAndroidTask();
+
+        super.destroy();
+    }
+
+    @Override
     public View getReadbackView() {
         return mCompositorViewHolderSupplier.get() == null
                 ? null
@@ -120,4 +140,31 @@
     public static void resetKeyboardVisibilityDelegateFactory() {
         setKeyboardVisibilityDelegateFactory(ChromeKeyboardVisibilityDelegate::new);
     }
+
+    /** See {@link ChromeAndroidTask#clearActivityWindowAndroid()}. */
+    private void clearActivityWindowAndroidFromChromeAndroidTask() {
+        var chromeAndroidTaskTracker = ChromeAndroidTaskTrackerFactory.getInstance();
+        if (chromeAndroidTaskTracker == null) {
+            return;
+        }
+
+        var chromeAndroidTask = chromeAndroidTaskTracker.get(getTaskId());
+        if (chromeAndroidTask != null) {
+            chromeAndroidTask.clearActivityWindowAndroid();
+        }
+    }
+
+    private void destroyChromeAndroidTask() {
+        var chromeAndroidTaskTracker = ChromeAndroidTaskTrackerFactory.getInstance();
+        if (chromeAndroidTaskTracker != null) {
+            chromeAndroidTaskTracker.remove(getTaskId());
+        }
+    }
+
+    private int getTaskId() {
+        Activity activity = getActivity().get();
+        assert activity != null;
+
+        return activity.getTaskId();
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
index b513dc56..cdaa64d 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
@@ -6,7 +6,6 @@
 
 import static org.chromium.build.NullUtil.assertNonNull;
 import static org.chromium.build.NullUtil.assumeNonNull;
-import static org.chromium.ui.listmenu.ListItemType.MENU_ITEM;
 import static org.chromium.ui.listmenu.ListMenuItemProperties.CLICK_LISTENER;
 import static org.chromium.ui.listmenu.ListMenuItemProperties.MENU_ITEM_ID;
 
@@ -62,8 +61,6 @@
 @NullMarked
 public class ContextMenuCoordinator implements ContextMenuUi {
 
-    private static final int INVALID_ITEM_ID = -1;
-
     @Retention(RetentionPolicy.SOURCE)
     @IntDef({ContextMenuItemType.HEADER, ContextMenuItemType.CONTEXT_MENU_ITEM_WITH_ICON_BUTTON})
     public @interface ContextMenuItemType {
@@ -362,17 +359,6 @@
         mListView = menu.findViewById(R.id.context_menu_list_view);
         mListView.setAdapter(adapter);
 
-        // TODO(crbug.com/427797271): Clean up click handling and remove this.
-        mListView.setOnItemClickListener(
-                (p, v, pos, id) -> {
-                    if (id == INVALID_ITEM_ID) return;
-                    @Nullable ListItem item = findItem((int) id);
-                    if (item == null) return;
-                    if (item.model.containsKey(CLICK_LISTENER) && item.type == MENU_ITEM) {
-                        item.model.get(CLICK_LISTENER).onClick(v);
-                    }
-                });
-
         mListView.setItemsCanFocus(true);
         // Set the fading edge for context menu. This is guarded by drag and drop feature flag, but
         // ideally this could be enabled for all forms of context menu.
@@ -555,7 +541,8 @@
     @VisibleForTesting
     /* package */ static ModelListAdapter createAdapter(ModelList listItems) {
         ModelListAdapter adapter =
-                ListMenuUtils.createAdapter(listItems, Set.of(ContextMenuItemType.HEADER));
+                ListMenuUtils.createAdapter(
+                        listItems, Set.of(ContextMenuItemType.HEADER), /* delegate= */ null);
         // Register types / view binders not covered by the default adapter
         adapter.registerType(
                 ContextMenuItemType.HEADER,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ViewTransitionPixelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ViewTransitionPixelTest.java
index 2e4431a..9ab894f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ViewTransitionPixelTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ViewTransitionPixelTest.java
@@ -148,7 +148,7 @@
 
         assertWaitForKeyboardStatus(true);
 
-        double keyboardHeight = getKeyboardHeightDp();
+        int keyboardHeight = getKeyboardHeightPx();
 
         if (mVirtualKeyboardMode == VirtualKeyboardMode.RESIZES_VISUAL) {
             mViewportTestUtils.waitForExpectedVisualViewportHeight(
@@ -178,17 +178,11 @@
         }
     }
 
-    private double getKeyboardHeightDp() {
-        double keyboardHeightPx =
-                mActivityTestRule
-                        .getKeyboardDelegate()
-                        .calculateTotalKeyboardHeight(
-                                mActivityTestRule
-                                        .getActivity()
-                                        .getWindow()
-                                        .getDecorView()
-                                        .getRootView());
-        return keyboardHeightPx / mViewportTestUtils.getDeviceScaleFactor();
+    private int getKeyboardHeightPx() {
+        return mActivityTestRule
+                .getKeyboardDelegate()
+                .calculateTotalKeyboardHeight(
+                        mActivityTestRule.getActivity().getWindow().getDecorView().getRootView());
     }
 
     private void setLocationAndWaitForLoad(String url) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ViewportTestUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ViewportTestUtils.java
index 0842cd1..a1b2b15 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/ViewportTestUtils.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ViewportTestUtils.java
@@ -4,6 +4,8 @@
 
 package org.chromium.chrome.browser;
 
+import androidx.annotation.Px;
+
 import org.hamcrest.Matchers;
 import org.junit.Assert;
 
@@ -15,7 +17,6 @@
 import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider;
 import org.chromium.chrome.browser.fullscreen.FullscreenManagerTestUtils;
 import org.chromium.chrome.browser.tab.TabStateBrowserControlsVisibilityDelegate;
-import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeController;
 import org.chromium.chrome.test.transit.BaseCtaTransitTestRule;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.content_public.browser.test.util.Coordinates;
@@ -71,12 +72,12 @@
                 mActivityTestRule.getActivity().getActivityTab());
         waitForFramePresented();
         int initialPageHeight = getPageInnerHeightPx();
-        int initialBottomInset = getBottomInsetHeightDp();
+        int initialBottomMargin = getBottomMargins();
         FullscreenManagerTestUtils.waitForBrowserControlsToBeMoveable(
                 mActivityTestRule.getActivity(), /* showControls= */ false);
 
         // Also wait for the browser controls to resize Blink before returning.
-        int finalHeight = initialPageHeight + getTopControlsHeightDp() + initialBottomInset;
+        int finalHeight = initialPageHeight + getTopControlsHeightPx() + initialBottomMargin;
         waitForExpectedPageHeight(finalHeight);
     }
 
@@ -155,23 +156,29 @@
         return (int) Math.floor(getTopControlsHeightPx() / getDeviceScaleFactor());
     }
 
-    public int getBottomInsetHeightDp() {
-        EdgeToEdgeController e2eController =
-                mActivityTestRule.getActivity().getEdgeToEdgeControllerSupplierForTesting().get();
-        // Returns zero if the inset is not scrollable.
-        return e2eController != null ? e2eController.getBottomInset() : 0;
+    public @Px int getBottomMargins() {
+        BrowserControlsStateProvider browserControlsStateProvider =
+                mActivityTestRule.getActivity().getBrowserControlsManager();
+        return browserControlsStateProvider.getBottomControlsHeight()
+                - browserControlsStateProvider.getBottomControlOffset();
     }
 
     public int getPageInnerHeightPx() throws Throwable {
-        return Integer.parseInt(
-                JavaScriptUtils.executeJavaScriptAndWaitForResult(
-                        getWebContents(), "window.innerHeight"));
+        return (int)
+                Math.round(
+                        getDeviceScaleFactor()
+                                * Integer.parseInt(
+                                        JavaScriptUtils.executeJavaScriptAndWaitForResult(
+                                                getWebContents(), "window.innerHeight")));
     }
 
-    public double getVisualViewportHeightPx() throws Throwable {
-        return Float.parseFloat(
-                JavaScriptUtils.executeJavaScriptAndWaitForResult(
-                        getWebContents(), "window.visualViewport.height"));
+    public int getVisualViewportHeightPx() throws Throwable {
+        return (int)
+                Math.round(
+                        getDeviceScaleFactor()
+                                * Float.parseFloat(
+                                        JavaScriptUtils.executeJavaScriptAndWaitForResult(
+                                                getWebContents(), "window.visualViewport.height")));
     }
 
     private WebContents getWebContents() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java
index db805b9..d78f0ec 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java
@@ -687,7 +687,6 @@
      */
     @Test
     @MediumTest
-    @DisabledTest(message = "https://crbug.com/431044324")
     public void startBackNavWithTopControlHidden() throws Throwable {
         if (mTestNavigationMode == NAVIGATION_MODE_GESTURAL
                 && VERSION.SDK_INT < VERSION_CODES.UPSIDE_DOWN_CAKE) return;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java
index a4fe46c..6f58f19 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/input/SelectPopupOtherContentViewTest.java
@@ -15,7 +15,6 @@
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.CriteriaHelper;
-import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.UrlUtils;
 import org.chromium.chrome.browser.app.ChromeActivity;
@@ -69,7 +68,6 @@
     @Test
     @LargeTest
     @Feature({"Browser"})
-    @DisabledTest(message = "Flaky, crbug.com/407059641")
     public void testPopupNotClosedByOtherContentView() throws Exception, Throwable {
         // Load the test page.
         WebPageStation page = mActivityTestRule.startOnUrl(SELECT_URL);
diff --git a/chrome/android/modules/readaloud/public/BUILD.gn b/chrome/android/modules/readaloud/public/BUILD.gn
index 29d2601..4bb43f6 100644
--- a/chrome/android/modules/readaloud/public/BUILD.gn
+++ b/chrome/android/modules/readaloud/public/BUILD.gn
@@ -29,8 +29,8 @@
     "//components/browser_ui/styles/android:java",
     "//components/prefs/android:java",
     "//content/public/android:content_java",
-    "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/android_deps:guava_android_java",
+    "//third_party/androidx:androidx_annotation_annotation_java",
     "//ui/android:ui_no_recycler_view_java",
   ]
 }
diff --git a/chrome/app/BUILD.gn b/chrome/app/BUILD.gn
index 2f7ac35f..f64530c 100644
--- a/chrome/app/BUILD.gn
+++ b/chrome/app/BUILD.gn
@@ -60,7 +60,7 @@
       "exit_code_watcher_win.cc",
       "exit_code_watcher_win.h",
     ]
-    public_deps = [ "//base:base" ]
+    public_deps = [ "//base" ]
   }
 
   source_set("win_unit_tests") {
@@ -71,10 +71,10 @@
     ]
     deps = [
       ":exit_code_watcher",
-      "//base:base",
+      "//base",
       "//base/test:test_support",
       "//chrome/chrome_elf:crash",
-      "//testing/gtest:gtest",
+      "//testing/gtest",
     ]
   }
 }
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 7c72081..5803510 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -8506,7 +8506,7 @@
         Dismiss
       </message>
       <message name="IDS_NTP_COMPOSE_CANCEL_BUTTON_A11Y_LABEL_INPUT" desc="The accessibility label for the cancel button on the compose box when there is input." translateable="false">
-        Dismiss entry
+        Clear
       </message>
       <message name="IDS_NTP_COMPOSE_IMAGE_UPLOAD_BUTTON_A11Y_LABEL" desc="The accessibility label for the image upload button on the compose box.">
         Upload an image
diff --git a/chrome/app/generated_resources_grd/IDS_NTP_COMPOSE_CANCEL_BUTTON_A11Y_LABEL_INPUT.png.sha1 b/chrome/app/generated_resources_grd/IDS_NTP_COMPOSE_CANCEL_BUTTON_A11Y_LABEL_INPUT.png.sha1
index d9ea28b2..8d24424 100644
--- a/chrome/app/generated_resources_grd/IDS_NTP_COMPOSE_CANCEL_BUTTON_A11Y_LABEL_INPUT.png.sha1
+++ b/chrome/app/generated_resources_grd/IDS_NTP_COMPOSE_CANCEL_BUTTON_A11Y_LABEL_INPUT.png.sha1
@@ -1 +1 @@
-6042018b0a8cd8b03e6ca5d67bd4bec463aa70ac
\ No newline at end of file
+cd9e862e12165dbbf9afa65a2c0e072552795dc0
\ No newline at end of file
diff --git a/chrome/app/glic_strings.grdp b/chrome/app/glic_strings.grdp
index e729a28..511fae3 100644
--- a/chrome/app/glic_strings.grdp
+++ b/chrome/app/glic_strings.grdp
@@ -30,16 +30,6 @@
       Customize Keyboard Shortcut...
     </message>
   </if>
-  <if expr="is_macosx">
-    <message name="IDS_GLIC_STATUS_ICON_MENU_REMOVE_ICON" translateable="false" desc="This is the menu item for removing the Gemini status icon from the menu bar.">
-      Don't show Gemini in menu bar
-    </message>
-  </if>
-  <if expr="is_win or is_linux">
-    <message name="IDS_GLIC_STATUS_ICON_MENU_REMOVE_ICON" translateable="false" desc="This is the menu item for removing the Gemini status icon from the notifications area.">
-      Don't show Gemini in notifications area
-    </message>
-  </if>
   <if expr="is_win or is_linux">
     <message name="IDS_GLIC_STATUS_ICON_MENU_EXIT" translateable="false" desc="This is the menu item for exiting Chrome.">
       Exit
@@ -199,6 +189,12 @@
   <message name="IDS_SETTINGS_GLIC_PERMISSIONS_ACTIVITY_BUTTON_URL" translateable="false" desc="URL to navigate when clicking the 'manage your activity' button.">
     https://myactivity.google.com/product/gemini?utm_source=gemini
   </message>
+  <message name="IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON" translateable="false" desc="Name of the Gemini Extensions link out.">
+    Manage connected apps
+  </message>
+  <message name="IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON_SUBLABEL" translateable="false" desc="Sublabel describing that this link allows the user to manage Gemini connected apps.">
+    Manage which apps Gemini connects to
+  </message>
   <message name="IDS_SETTINGS_GLIC_PERMISSIONS_TAB_ACCESS_WHEN_ON_1" translateable="false" desc="First point in the 'when on' column of the 'tab access' expando">
     You’ll get more relevant answers related to the page content you’re sharing
   </message>
diff --git a/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON.png.sha1 b/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON.png.sha1
new file mode 100644
index 0000000..5bee7a64
--- /dev/null
+++ b/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON.png.sha1
@@ -0,0 +1 @@
+710affa08e389c3cf70ae58540faa997ab34b371
\ No newline at end of file
diff --git a/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON_SUBLABEL.png.sha1 b/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON_SUBLABEL.png.sha1
new file mode 100644
index 0000000..1b97197
--- /dev/null
+++ b/chrome/app/glic_strings_grdp/IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON_SUBLABEL.png.sha1
@@ -0,0 +1 @@
+38e3c95ab29a0811b441346ed784494b21254dd9
\ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index 7ca4b26..aa76b0c6 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -6887,10 +6887,6 @@
      flag_descriptions::kOmniboxShowPopupOnMouseReleasedDescription, kOsDesktop,
      FEATURE_VALUE_TYPE(omnibox::kShowPopupOnMouseReleased)},
 
-    {"omnibox-site-search", flag_descriptions::kOmniboxSiteSearchName,
-     flag_descriptions::kOmniboxSiteSearchDescription, kOsAndroid,
-     FEATURE_VALUE_TYPE(omnibox::kOmniboxSiteSearch)},
-
     {"omnibox-hide-suggestion-group-headers",
      flag_descriptions::kOmniboxHideSuggestionGroupHeadersName,
      flag_descriptions::kOmniboxHideSuggestionGroupHeadersDescription,
@@ -6954,6 +6950,10 @@
      flag_descriptions::kOmniboxMultilineEditFieldDescription, kOsAndroid,
      FEATURE_VALUE_TYPE(omnibox::kMultilineEditField)},
 
+    {"omnibox-site-search", flag_descriptions::kOmniboxSiteSearchName,
+     flag_descriptions::kOmniboxSiteSearchDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(omnibox::kOmniboxSiteSearch)},
+
     {"omnibox-diagnostics", flag_descriptions::kOmniboxDiagnosticsName,
      flag_descriptions::kOmniboxDiagnosticsDescription, kOsAndroid,
      FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kDiagnostics,
diff --git a/chrome/browser/android/historical_tab_saver.cc b/chrome/browser/android/historical_tab_saver.cc
index b57a924..c2922958 100644
--- a/chrome/browser/android/historical_tab_saver.cc
+++ b/chrome/browser/android/historical_tab_saver.cc
@@ -72,13 +72,10 @@
     JNIEnv* env,
     const JavaParamRef<jobjectArray>& jtab_group_ids) {
   std::vector<std::optional<tab_groups::TabGroupId>> tab_group_ids;
-  size_t array_length = env->GetArrayLength(jtab_group_ids.obj());
-  tab_group_ids.reserve(array_length);
-  for (size_t i = 0; i < array_length; ++i) {
-    auto jtab_group_id = env->GetObjectArrayElement(jtab_group_ids.obj(), i);
-    std::optional<tab_groups::TabGroupId> tab_group_id = JavaTokenToTabGroupId(
-        env, ScopedJavaLocalRef<jobject>::Adopt(env, jtab_group_id));
-    tab_group_ids.push_back(std::move(tab_group_id));
+  auto array_reader = jtab_group_ids.ReadElements();
+  tab_group_ids.reserve(array_reader.size());
+  for (auto element : array_reader) {
+    tab_group_ids.push_back(JavaTokenToTabGroupId(env, element));
   }
   return tab_group_ids;
 }
@@ -325,10 +322,9 @@
       AllTabsWebContentsStateByteBuffer(env, jbyte_buffers,
                                         std::move(saved_state_versions));
   CreateHistoricalGroup(
-      TabModelList::FindNativeTabModelForJavaObject(
-          ScopedJavaLocalRef<jobject>::Adopt(env, jtab_model.obj())),
-      tab_group_id, saved_tab_group_id, title, (int)jcolor,
-      std::move(tabs_android), std::move(web_contents_states));
+      TabModelList::FindNativeTabModelForJavaObject(jtab_model), tab_group_id,
+      saved_tab_group_id, title, (int)jcolor, std::move(tabs_android),
+      std::move(web_contents_states));
 }
 
 static void JNI_HistoricalTabSaverImpl_CreateHistoricalBulkClosure(
@@ -357,8 +353,7 @@
       AllTabsWebContentsStateByteBuffer(env, jbyte_buffers,
                                         std::move(saved_state_versions));
   CreateHistoricalBulkClosure(
-      TabModelList::FindNativeTabModelForJavaObject(
-          ScopedJavaLocalRef<jobject>::Adopt(env, jtab_model.obj())),
+      TabModelList::FindNativeTabModelForJavaObject(jtab_model),
       std::move(tab_group_ids), std::move(saved_tab_group_ids),
       std::move(group_titles), std::move(group_colors),
       std::move(per_tab_optional_tab_group_ids),
diff --git a/chrome/browser/android/recently_closed_tabs_bridge.cc b/chrome/browser/android/recently_closed_tabs_bridge.cc
index 705bb255..d4db0bb 100644
--- a/chrome/browser/android/recently_closed_tabs_bridge.cc
+++ b/chrome/browser/android/recently_closed_tabs_bridge.cc
@@ -304,8 +304,7 @@
     return false;
   }
 
-  auto* model = TabModelList::FindNativeTabModelForJavaObject(
-      ScopedJavaLocalRef<jobject>::Adopt(env, jtab_model.obj()));
+  auto* model = TabModelList::FindNativeTabModelForJavaObject(jtab_model);
   if (model == nullptr) {
     return false;
   }
@@ -328,8 +327,7 @@
     return false;
   }
 
-  auto* model = TabModelList::FindNativeTabModelForJavaObject(
-      ScopedJavaLocalRef<jobject>::Adopt(env, jtab_model.obj()));
+  auto* model = TabModelList::FindNativeTabModelForJavaObject(jtab_model);
   if (model == nullptr) {
     return false;
   }
@@ -351,8 +349,7 @@
     return false;
   }
 
-  auto* model = TabModelList::FindNativeTabModelForJavaObject(
-      ScopedJavaLocalRef<jobject>::Adopt(env, jtab_model.obj()));
+  auto* model = TabModelList::FindNativeTabModelForJavaObject(jtab_model);
   if (model == nullptr) {
     return false;
   }
diff --git a/chrome/browser/ash/accessibility/BUILD.gn b/chrome/browser/ash/accessibility/BUILD.gn
index be000bf..0c15767 100644
--- a/chrome/browser/ash/accessibility/BUILD.gn
+++ b/chrome/browser/ash/accessibility/BUILD.gn
@@ -215,8 +215,8 @@
     "//chrome/browser/ui/aura/accessibility",
     "//chrome/test:test_support",
     "//chromeos/ash/components/browser_context_helper",
+    "//components/live_caption",
     "//components/live_caption:constants",
-    "//components/live_caption:live_caption",
     "//ui/base/mojom:ui_base_types",
     "//ui/events:test_support",
 
diff --git a/chrome/browser/ash/app_list/search/BUILD.gn b/chrome/browser/ash/app_list/search/BUILD.gn
index a2d2950d..723577c 100644
--- a/chrome/browser/ash/app_list/search/BUILD.gn
+++ b/chrome/browser/ash/app_list/search/BUILD.gn
@@ -126,7 +126,7 @@
   ]
 
   if (is_chrome_branded) {
-    deps += [ "//chromeos/ash/resources/internal/strings:strings" ]
+    deps += [ "//chromeos/ash/resources/internal/strings" ]
   }
 
   allow_circular_includes_from = [
diff --git a/chrome/browser/ash/app_mode/BUILD.gn b/chrome/browser/ash/app_mode/BUILD.gn
index e11a590..94f22d50 100644
--- a/chrome/browser/ash/app_mode/BUILD.gn
+++ b/chrome/browser/ash/app_mode/BUILD.gn
@@ -239,7 +239,7 @@
     "//content/test:test_support",
     "//extensions:test_support",
     "//extensions/browser/updater",
-    "//extensions/common:common",
+    "//extensions/common",
     "//google_apis",
     "//services/data_decoder/public/cpp:test_support",
     "//testing/gmock",
@@ -285,7 +285,7 @@
     "//chrome/browser/ash/system_web_apps/test_support",
     "//chrome/browser/chromeos/app_mode",
     "//chrome/browser/devtools:test_support",
-    "//chrome/browser/extensions:extensions",
+    "//chrome/browser/extensions",
     "//chrome/browser/lifetime:termination_notification",
     "//chrome/browser/ui",
     "//chrome/browser/ui/ash/system_web_apps",
@@ -295,7 +295,7 @@
     "//chromeos/ash/components/cryptohome",
     "//chromeos/ash/components/dbus/session_manager",
     "//chromeos/ash/components/dbus/shill",
-    "//chromeos/ash/components/dbus/update_engine:update_engine",
+    "//chromeos/ash/components/dbus/update_engine",
     "//chromeos/ash/components/policy/device_local_account",
     "//chromeos/ash/components/policy/device_policy:test_support",
     "//components/crx_file",
diff --git a/chrome/browser/ash/app_mode/isolated_web_app/BUILD.gn b/chrome/browser/ash/app_mode/isolated_web_app/BUILD.gn
index cad19c1..2dc62080 100644
--- a/chrome/browser/ash/app_mode/isolated_web_app/BUILD.gn
+++ b/chrome/browser/ash/app_mode/isolated_web_app/BUILD.gn
@@ -25,7 +25,7 @@
     "//chromeos/ash/components/settings",
     "//components/prefs",
     "//components/web_package",
-    "//components/webapps/isolated_web_apps:isolated_web_apps",
+    "//components/webapps/isolated_web_apps",
     "//url",
   ]
 }
@@ -47,7 +47,7 @@
     "//components/prefs",
     "//components/user_manager",
     "//components/web_package",
-    "//components/webapps/isolated_web_apps:isolated_web_apps",
+    "//components/webapps/isolated_web_apps",
   ]
 }
 
@@ -66,7 +66,7 @@
     "//chromeos/ash/components/policy/device_local_account",
     "//chromeos/ash/components/settings",
     "//components/policy/core/common",
-    "//components/webapps/isolated_web_apps:isolated_web_apps",
+    "//components/webapps/isolated_web_apps",
     "//testing/gtest",
     "//url",
   ]
diff --git a/chrome/browser/ash/app_mode/test/BUILD.gn b/chrome/browser/ash/app_mode/test/BUILD.gn
index 38653cb..71cdcbda 100644
--- a/chrome/browser/ash/app_mode/test/BUILD.gn
+++ b/chrome/browser/ash/app_mode/test/BUILD.gn
@@ -42,7 +42,7 @@
     ":test_support",
     "//ash/constants",
     "//chrome/browser",
-    "//chrome/browser/apps/app_service:app_service",
+    "//chrome/browser/apps/app_service",
     "//chrome/browser/ash/app_mode/arcvm_app",
     "//chrome/browser/ash/app_mode/isolated_web_app",
     "//chrome/browser/ash/app_mode/web_app",
@@ -62,7 +62,7 @@
     "//components/services/app_service/public/cpp:app_types",
     "//components/web_package",
     "//components/web_package/test_support",
-    "//components/webapps/isolated_web_apps:isolated_web_apps",
+    "//components/webapps/isolated_web_apps",
     "//content/test:test_support",
     "//extensions/components/native_app_window",
     "//testing/gtest",
diff --git a/chrome/browser/ash/app_restore/BUILD.gn b/chrome/browser/ash/app_restore/BUILD.gn
index 92df21f..3ac2159 100644
--- a/chrome/browser/ash/app_restore/BUILD.gn
+++ b/chrome/browser/ash/app_restore/BUILD.gn
@@ -207,7 +207,7 @@
     "//chrome/browser/ui/ash/desks",
     "//chrome/browser/ui/ash/device_scheduled_reboot",
     "//chrome/browser/ui/ash/system_web_apps",
-    "//chrome/browser/ui/webui/ash/settings:settings",
+    "//chrome/browser/ui/webui/ash/settings",
     "//chrome/browser/web_applications",
     "//chrome/browser/web_applications:web_applications_test_support",
     "//chrome/common",
diff --git a/chrome/browser/ash/arc/fileapi/BUILD.gn b/chrome/browser/ash/arc/fileapi/BUILD.gn
index 9447e3f..38aecc9 100644
--- a/chrome/browser/ash/arc/fileapi/BUILD.gn
+++ b/chrome/browser/ash/arc/fileapi/BUILD.gn
@@ -83,7 +83,7 @@
     "//mojo/public/cpp/bindings",
     "//net",
     "//third_party/re2",
-    "//ui/shell_dialogs:shell_dialogs",
+    "//ui/shell_dialogs",
     "//url",
 
     # TODO(crbug.com/353449539): Use //chrome/browser/ui instead after cyclic dependency from
diff --git a/chrome/browser/ash/arc/session/BUILD.gn b/chrome/browser/ash/arc/session/BUILD.gn
index c3c6410..947c1f4a 100644
--- a/chrome/browser/ash/arc/session/BUILD.gn
+++ b/chrome/browser/ash/arc/session/BUILD.gn
@@ -188,7 +188,7 @@
     "//chrome/browser/ui/ash/login:test_support",
     "//chrome/browser/ui/ash/multi_user",
     "//chrome/test:test_support",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//chromeos/ash/components/dbus/arc",
     "//chromeos/ash/components/dbus/concierge",
     "//chromeos/ash/components/dbus/resourced",
@@ -230,7 +230,7 @@
     "//components/account_id",
     "//components/policy/core/common",
     "//components/policy/core/common:test_support",
-    "//components/policy/test_support:test_support",
+    "//components/policy/test_support",
     "//components/prefs",
     "//components/signin/public/base",
     "//components/user_manager",
diff --git a/chrome/browser/ash/boca/BUILD.gn b/chrome/browser/ash/boca/BUILD.gn
index c988e51..80eef2a 100644
--- a/chrome/browser/ash/boca/BUILD.gn
+++ b/chrome/browser/ash/boca/BUILD.gn
@@ -46,7 +46,7 @@
     "//components/soda:constants",
     "//components/user_manager",
     "//extensions/browser",
-    "//google_apis:google_apis",
+    "//google_apis",
     "//services/network/public/cpp",
   ]
 }
diff --git a/chrome/browser/ash/cert_provisioning/BUILD.gn b/chrome/browser/ash/cert_provisioning/BUILD.gn
index 9d3cbef22..f484879 100644
--- a/chrome/browser/ash/cert_provisioning/BUILD.gn
+++ b/chrome/browser/ash/cert_provisioning/BUILD.gn
@@ -57,12 +57,12 @@
     "//chromeos/dbus/common",
     "//chromeos/dbus/tpm_manager",
     "//chromeos/dbus/tpm_manager:tpm_manager_proto",
-    "//components/invalidation:invalidation",
+    "//components/invalidation",
     "//components/policy/core/common",
     "//components/policy/core/common:common_constants",
     "//components/policy/proto",
     "//components/prefs",
-    "//components/user_manager:user_manager",
+    "//components/user_manager",
     "//content/public/browser",
   ]
 
diff --git a/chrome/browser/ash/child_accounts/BUILD.gn b/chrome/browser/ash/child_accounts/BUILD.gn
index 52266348..6855e88 100644
--- a/chrome/browser/ash/child_accounts/BUILD.gn
+++ b/chrome/browser/ash/child_accounts/BUILD.gn
@@ -81,8 +81,8 @@
     "//chrome/browser/ash/policy/uploading",
     "//chrome/browser/ash/profiles",
     "//chrome/browser/ash/settings",
+    "//chrome/browser/profiles",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/profiles:profiles",
     "//chrome/common:constants",  # included for chrome/common/pref_names.h
     "//chromeos/ash/components/dbus",
     "//chromeos/ash/components/dbus/session_manager",
diff --git a/chrome/browser/ash/chromebox_for_meetings/artemis/BUILD.gn b/chrome/browser/ash/chromebox_for_meetings/artemis/BUILD.gn
index ecba9f7..f99ecc7 100644
--- a/chrome/browser/ash/chromebox_for_meetings/artemis/BUILD.gn
+++ b/chrome/browser/ash/chromebox_for_meetings/artemis/BUILD.gn
@@ -36,7 +36,7 @@
     "//chromeos/services/chromebox_for_meetings/public/proto",
     "//components/feedback/redaction_tool",
     "//mojo/public/cpp/bindings",
-    "//net:net",
+    "//net",
     "//third_party/re2",
   ]
 
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn
index d74f8d33..47b0087 100644
--- a/chrome/browser/ash/crosapi/BUILD.gn
+++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -195,14 +195,14 @@
     "//components/language/core/browser",
     "//components/live_caption:utils",
     "//components/metrics",
-    "//components/metrics_services_manager:metrics_services_manager",
+    "//components/metrics_services_manager",
     "//components/payments/core:error_strings",
     "//components/policy/core/common:common_constants",
     "//components/prefs",
     "//components/printing/browser",
     "//components/services/app_service/public/cpp:instance_update",
     "//components/session_manager/core",
-    "//components/ukm:ukm",
+    "//components/ukm",
     "//components/update_client",
     "//components/user_prefs",
     "//components/variations",
@@ -373,7 +373,7 @@
     "//components/session_manager/core",
     "//printing/backend",
     "//printing/backend:test_support",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
     "//ui/display:test_support",
   ]
 
diff --git a/chrome/browser/ash/crostini/BUILD.gn b/chrome/browser/ash/crostini/BUILD.gn
index 91d3092e..242f375f 100644
--- a/chrome/browser/ash/crostini/BUILD.gn
+++ b/chrome/browser/ash/crostini/BUILD.gn
@@ -343,7 +343,7 @@
     ":browser_test_support",
     ":crostini",
     ":test_support",
-    "//base:base",
+    "//base",
     "//base/test:test_support",
     "//chrome/browser",
     "//chrome/browser:browser_process",
diff --git a/chrome/browser/ash/display/BUILD.gn b/chrome/browser/ash/display/BUILD.gn
index 8b30c47..108da24 100644
--- a/chrome/browser/ash/display/BUILD.gn
+++ b/chrome/browser/ash/display/BUILD.gn
@@ -23,8 +23,8 @@
     "//base",
     "//base/test:test_support",
     "//chrome/browser:browser_process",
+    "//chrome/browser/ui",
     "//chrome/browser/ui:browser_navigator_params_headers",
-    "//chrome/browser/ui:ui",
     "//chrome/test:test_support_ui",
     "//components/prefs",
     "//components/quirks",
diff --git a/chrome/browser/ash/file_manager/BUILD.gn b/chrome/browser/ash/file_manager/BUILD.gn
index de48161..475a30c1 100644
--- a/chrome/browser/ash/file_manager/BUILD.gn
+++ b/chrome/browser/ash/file_manager/BUILD.gn
@@ -470,7 +470,7 @@
     "//chrome/browser/policy:test_support",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/signin",
-    "//chrome/browser/sync:sync",
+    "//chrome/browser/sync",
     "//chrome/browser/ui",
     "//chrome/browser/ui/ash/cast_config",
     "//chrome/browser/ui/ash/sharesheet",
diff --git a/chrome/browser/ash/fileapi/BUILD.gn b/chrome/browser/ash/fileapi/BUILD.gn
index 37db6f36..5a3673b 100644
--- a/chrome/browser/ash/fileapi/BUILD.gn
+++ b/chrome/browser/ash/fileapi/BUILD.gn
@@ -96,7 +96,7 @@
     "//chrome/browser/ash/profiles",
     "//chrome/browser/extensions",
     "//chrome/browser/file_system_access",
-    "//chrome/common:common",
+    "//chrome/common",
     "//chrome/common/extensions/api",
     "//chromeos/ash/components/dbus/cros_disks",
     "//chromeos/ash/components/drivefs",
diff --git a/chrome/browser/ash/floating_sso/BUILD.gn b/chrome/browser/ash/floating_sso/BUILD.gn
index 2bfe57d..789bfbd 100644
--- a/chrome/browser/ash/floating_sso/BUILD.gn
+++ b/chrome/browser/ash/floating_sso/BUILD.gn
@@ -21,20 +21,20 @@
   ]
 
   deps = [
-    "//ash/constants:constants",
+    "//ash/constants",
     "//base",
     "//chrome/browser/ash/floating_workspace:utils",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/sync:factories",
     "//chrome/common",
     "//chrome/common:channel_info",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//components/google/core/common",
     "//components/keyed_service/core",
     "//components/prefs",
     "//components/sync/service",
     "//components/url_matcher",
-    "//components/user_manager:user_manager",
+    "//components/user_manager",
     "//content/public/browser",
     "//net",
   ]
@@ -54,7 +54,7 @@
   deps = [
     ":floating_sso",
     "//base",
-    "//components/sync/protocol:protocol",
+    "//components/sync/protocol",
     "//components/sync/protocol:util",
   ]
 
@@ -97,7 +97,7 @@
     "//chrome/browser/ash/floating_workspace:utils",
     "//chrome/browser/policy:test_support",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/sync:sync",
+    "//chrome/browser/sync",
     "//chrome/browser/ui",
     "//chrome/test:test_support",
     "//chromeos/constants",
diff --git a/chrome/browser/ash/floating_workspace/BUILD.gn b/chrome/browser/ash/floating_workspace/BUILD.gn
index 87d9c990..fe081ddf 100644
--- a/chrome/browser/ash/floating_workspace/BUILD.gn
+++ b/chrome/browser/ash/floating_workspace/BUILD.gn
@@ -35,7 +35,7 @@
     "//chrome/browser/sync",
     "//chrome/browser/ui/ash/desks",
     "//chrome/browser/ui/ash/multi_user",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//chromeos/ash/components/network",
     "//chromeos/ash/services/device_sync/public/cpp/",
     "//chromeos/dbus/power",
@@ -94,7 +94,7 @@
     "//chrome/browser/ui/ash/multi_user",
     "//chrome/browser/ui/ash/session",
     "//chrome/browser/ui/ash/session:test_support",
-    "//chrome/browser/ui/webui/ash/floating_workspace:floating_workspace",
+    "//chrome/browser/ui/webui/ash/floating_workspace",
     "//chrome/test:test_support",
     "//chromeos/ash/components/login/session",
     "//chromeos/ash/components/network",
diff --git a/chrome/browser/ash/lobster/BUILD.gn b/chrome/browser/ash/lobster/BUILD.gn
index db11f49..7b69ed1 100644
--- a/chrome/browser/ash/lobster/BUILD.gn
+++ b/chrome/browser/ash/lobster/BUILD.gn
@@ -53,20 +53,20 @@
     "//chrome/browser/profiles:profile",
     "//chrome/browser/resources/chromeos/mako:resources",
     "//chrome/browser/signin",
-    "//chrome/browser/ui/webui/ash/lobster:lobster",
+    "//chrome/browser/ui/webui/ash/lobster",
     "//chromeos/ash/components/browser_context_helper",
-    "//chromeos/ash/components/demo_mode:demo_mode",
+    "//chromeos/ash/components/demo_mode",
     "//chromeos/ash/components/editor_menu/public/cpp",
-    "//chromeos/ash/components/specialized_features:specialized_features",
-    "//chromeos/components/magic_boost/public/cpp:cpp",
+    "//chromeos/ash/components/specialized_features",
+    "//chromeos/components/magic_boost/public/cpp",
     "//components/keyed_service/core",
     "//components/manta",
     "//components/signin/public/identity_manager",
     "//components/variations/service",
     "//content/public/browser",
     "//net",
-    "//net/traffic_annotation:traffic_annotation",
-    "//services/data_decoder/public/cpp:cpp",
+    "//net/traffic_annotation",
+    "//services/data_decoder/public/cpp",
     "//ui/base/ime/ash",
     "//ui/chromeos/strings:strings_grit",
     "//ui/display",
@@ -85,12 +85,12 @@
 
   deps = [
     ":lobster",
-    "//ash/public/cpp:cpp",
+    "//ash/public/cpp",
     "//base",
     "//base/test:test_support",
     "//components/manta",
     "//components/manta/proto",
-    "//net/traffic_annotation:traffic_annotation",
+    "//net/traffic_annotation",
     "//services/data_decoder/public/cpp:test_support",
     "//testing/gmock",
     "//testing/gtest",
@@ -121,8 +121,8 @@
     "//chrome/browser/signin",
     "//chrome/test:test_support",
     "//chrome/test:test_support_unit",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
-    "//chromeos/ash/components/editor_menu/public/cpp:cpp",
+    "//chromeos/ash/components/browser_context_helper",
+    "//chromeos/ash/components/editor_menu/public/cpp",
     "//chromeos/ash/components/specialized_features",
     "//components/feedback/proto",
     "//components/signin/public/identity_manager",
diff --git a/chrome/browser/ash/lobster/mock/BUILD.gn b/chrome/browser/ash/lobster/mock/BUILD.gn
index 135c534..816f8cf 100644
--- a/chrome/browser/ash/lobster/mock/BUILD.gn
+++ b/chrome/browser/ash/lobster/mock/BUILD.gn
@@ -18,7 +18,7 @@
     "//base",
     "//base/test:test_support",
     "//components/manta",
-    "//net/traffic_annotation:traffic_annotation",
+    "//net/traffic_annotation",
     "//services/data_decoder/public/cpp:test_support",
     "//testing/gmock",
     "//ui/gfx:test_support",
diff --git a/chrome/browser/ash/login/BUILD.gn b/chrome/browser/ash/login/BUILD.gn
index 99cf086..7fb35c76 100644
--- a/chrome/browser/ash/login/BUILD.gn
+++ b/chrome/browser/ash/login/BUILD.gn
@@ -494,7 +494,7 @@
     "//components/language/core/browser",
     "//components/metrics/structured:structured_events",
     "//components/metrics/structured:test_support",
-    "//components/metrics_services_manager:metrics_services_manager",
+    "//components/metrics_services_manager",
     "//components/onc",
     "//components/policy:chrome_settings_proto_generated_compile",
     "//components/policy/core/browser",
diff --git a/chrome/browser/ash/login/app_mode/test/BUILD.gn b/chrome/browser/ash/login/app_mode/test/BUILD.gn
index 3d85668..e29dca5 100644
--- a/chrome/browser/ash/login/app_mode/test/BUILD.gn
+++ b/chrome/browser/ash/login/app_mode/test/BUILD.gn
@@ -124,7 +124,7 @@
     "//chrome/browser/ui",
     "//chrome/browser/ui:browser_navigator_params_headers",
     "//chrome/browser/ui/ash/login",
-    "//chrome/browser/ui/global_media_controls:global_media_controls",
+    "//chrome/browser/ui/global_media_controls",
     "//chrome/browser/ui/webui/ash/login",
     "//chrome/browser/web_applications",
     "//chrome/common:chrome_features",
diff --git a/chrome/browser/ash/login/oobe_apps_service/BUILD.gn b/chrome/browser/ash/login/oobe_apps_service/BUILD.gn
index f3f8713..ddfc8e7 100644
--- a/chrome/browser/ash/login/oobe_apps_service/BUILD.gn
+++ b/chrome/browser/ash/login/oobe_apps_service/BUILD.gn
@@ -19,7 +19,7 @@
   deps = [
     "//base",
     "//chrome/browser/apps/almanac_api_client",
-    "//chrome/browser/apps/app_service:app_service",
+    "//chrome/browser/apps/app_service",
     "//chrome/browser/apps/app_service/app_install",
     "//chrome/browser/ash/login/oobe_apps_service/proto",
     "//chrome/browser/profiles:profile",
diff --git a/chrome/browser/ash/login/oobe_quick_start/BUILD.gn b/chrome/browser/ash/login/oobe_quick_start/BUILD.gn
index 0fd1b481..30cfc69 100644
--- a/chrome/browser/ash/login/oobe_quick_start/BUILD.gn
+++ b/chrome/browser/ash/login/oobe_quick_start/BUILD.gn
@@ -75,6 +75,6 @@
     "//services/network/public/cpp",
     "//testing/gmock",
     "//testing/gtest",
-    "//ui/chromeos:chromeos",
+    "//ui/chromeos",
   ]
 }
diff --git a/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn b/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn
index 8e2375a..00f0573a 100644
--- a/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn
+++ b/chrome/browser/ash/login/oobe_quick_start/connectivity/BUILD.gn
@@ -11,14 +11,14 @@
     "//chrome/browser:browser_process",
     "//chrome/browser/ash/login/oobe_quick_start:oobe_quick_start_pref_names",
     "//chrome/browser/ash/nearby:quick_start_connectivity_service",
-    "//chromeos/ash/components/nearby/common/connections_manager:connections_manager",
+    "//chromeos/ash/components/nearby/common/connections_manager",
     "//chromeos/ash/components/quick_start",
     "//chromeos/ash/services/nearby/public/cpp",
     "//chromeos/ash/services/nearby/public/mojom",
-    "//chromeos/constants:constants",
+    "//chromeos/constants",
     "//components/cbor",
     "//components/prefs",
-    "//components/qr_code_generator:qr_code_generator",
+    "//components/qr_code_generator",
     "//crypto",
     "//device/bluetooth",
     "//ui/chromeos",
diff --git a/chrome/browser/ash/login/screens/BUILD.gn b/chrome/browser/ash/login/screens/BUILD.gn
index 476b68c..d483ed6 100644
--- a/chrome/browser/ash/login/screens/BUILD.gn
+++ b/chrome/browser/ash/login/screens/BUILD.gn
@@ -283,7 +283,7 @@
     "//chromeos/ash/components/dbus/debug_daemon",
     "//chromeos/ash/components/dbus/spaced",
     "//chromeos/ash/components/demo_mode",
-    "//chromeos/ash/components/growth:growth",
+    "//chromeos/ash/components/growth",
     "//chromeos/ash/components/install_attributes",
     "//chromeos/ash/components/network/portal_detector",
     "//chromeos/ash/components/osauth/public",
diff --git a/chrome/browser/ash/mahi/BUILD.gn b/chrome/browser/ash/mahi/BUILD.gn
index 51102e9..5755eae 100644
--- a/chrome/browser/ash/mahi/BUILD.gn
+++ b/chrome/browser/ash/mahi/BUILD.gn
@@ -22,7 +22,7 @@
     "//chromeos/constants",
     "//components/manta",
     "//components/user_manager",
-    "//components/variations/service:service",
+    "//components/variations/service",
   ]
 }
 
@@ -44,11 +44,11 @@
     "//base",
     "//chrome/browser/ash/magic_boost",
     "//chrome/browser/feedback",
-    "//chromeos/components/magic_boost/public/cpp:cpp",
+    "//chromeos/components/magic_boost/public/cpp",
     "//chromeos/components/mahi/public/cpp",
     "//chromeos/strings:strings_grit",
     "//components/feedback",
-    "//components/history/core/browser:browser",
+    "//components/history/core/browser",
     "//components/manta",
     "//ui/aura",
     "//ui/base",
@@ -74,11 +74,11 @@
     "//ash/constants",
     "//base",
     "//base/test:test_support",
-    "//chrome/browser/ash/magic_boost:magic_boost",
+    "//chrome/browser/ash/magic_boost",
     "//chrome/browser/ash/mahi/media_app:unit_tests",
     "//chrome/browser/ash/mahi/web_contents/test_support",
     "//chrome/browser/profiles:profile",
-    "//chromeos/components/magic_boost/public/cpp:cpp",
+    "//chromeos/components/magic_boost/public/cpp",
     "//chromeos/components/mahi/public/cpp",
     "//chromeos/constants",
     "//chromeos/crosapi/mojom",
@@ -144,7 +144,7 @@
     "//chrome/test:test_support_ui",
     "//chromeos/components/magic_boost/public/cpp",
     "//chromeos/crosapi/mojom",
-    "//components/manta:manta",
+    "//components/manta",
     "//testing/gtest",
     "//ui/events:test_support",
   ]
diff --git a/chrome/browser/ash/net/rollback_network_config/BUILD.gn b/chrome/browser/ash/net/rollback_network_config/BUILD.gn
index 5db3e1d6..63f89adf 100644
--- a/chrome/browser/ash/net/rollback_network_config/BUILD.gn
+++ b/chrome/browser/ash/net/rollback_network_config/BUILD.gn
@@ -67,7 +67,7 @@
     "//components/onc",
     "//components/ownership",
     "//components/prefs:test_support",
-    "//components/proxy_config:proxy_config",
+    "//components/proxy_config",
     "//components/sync_preferences:test_support",
     "//content/test:test_support",
     "//testing/gtest",
diff --git a/chrome/browser/ash/performance/BUILD.gn b/chrome/browser/ash/performance/BUILD.gn
index b681006..09124da5 100644
--- a/chrome/browser/ash/performance/BUILD.gn
+++ b/chrome/browser/ash/performance/BUILD.gn
@@ -22,7 +22,7 @@
     "//base",
     "//chrome/browser/ash/arc/session",
     "//chrome/browser/ash/profiles",
-    "//chromeos/ash/components/dbus/concierge:concierge",
+    "//chromeos/ash/components/dbus/concierge",
     "//chromeos/ash/experiences/arc",
     "//chromeos/dbus/power",
     "//chromeos/dbus/power:power_manager_proto",
diff --git a/chrome/browser/ash/platform_keys/BUILD.gn b/chrome/browser/ash/platform_keys/BUILD.gn
index 2e3c30b..835c33ab 100644
--- a/chrome/browser/ash/platform_keys/BUILD.gn
+++ b/chrome/browser/ash/platform_keys/BUILD.gn
@@ -18,7 +18,7 @@
   public_deps = [ "//chrome/browser:browser_public_dependencies" ]
 
   deps = [
-    "//ash/constants:constants",
+    "//ash/constants",
     "//base",
     "//chrome/browser/ash/kcer",
     "//chrome/browser/ash/profiles",
diff --git a/chrome/browser/ash/policy/core/BUILD.gn b/chrome/browser/ash/policy/core/BUILD.gn
index 4f6b2c3..6a98496 100644
--- a/chrome/browser/ash/policy/core/BUILD.gn
+++ b/chrome/browser/ash/policy/core/BUILD.gn
@@ -134,7 +134,7 @@
     "//google_apis",
     "//net",
     "//services/network/public/cpp",
-    "//third_party/re2:re2",
+    "//third_party/re2",
     "//ui/base",
     "//url",
 
diff --git a/chrome/browser/ash/policy/dlp/BUILD.gn b/chrome/browser/ash/policy/dlp/BUILD.gn
index a378d7bf..7ac07bf 100644
--- a/chrome/browser/ash/policy/dlp/BUILD.gn
+++ b/chrome/browser/ash/policy/dlp/BUILD.gn
@@ -80,10 +80,10 @@
     # TODO(b/354095042): Use targets having headers directly included from
     # chrome/browser/ash/policy/dlp/files_policy_notification_manager.cc
     # instead after fixing cyclic dependency.
-    "//chrome/app/vector_icons:vector_icons",
+    "//chrome/app/vector_icons",
     "//chromeos/ash/components/dbus:vm_applications_apps_proto",
     "//chromeos/ash/components/drivefs",
-    "//chromeos/ash/experiences/arc/mojom:mojom",
+    "//chromeos/ash/experiences/arc/mojom",
     "//components/paint_preview/buildflags",
 
     # TODO(b/354095042): Use targets having headers directly included from
diff --git a/chrome/browser/ash/policy/remote_commands/crd/BUILD.gn b/chrome/browser/ash/policy/remote_commands/crd/BUILD.gn
index ea43de66..7c75229 100644
--- a/chrome/browser/ash/policy/remote_commands/crd/BUILD.gn
+++ b/chrome/browser/ash/policy/remote_commands/crd/BUILD.gn
@@ -42,7 +42,7 @@
     "//chrome/browser/ash/policy/core",
     "//chrome/browser/ash/policy/remote_commands/crd/public:interface",
     "//chrome/common:constants",
-    "//chromeos/ash/components/dbus/userdataauth:userdataauth",
+    "//chromeos/ash/components/dbus/userdataauth",
     "//chromeos/ash/services/network_config:in_process_instance",
     "//components/policy/core/common",
     "//components/policy/proto:",
diff --git a/chrome/browser/ash/policy/reporting/event_based_logs/BUILD.gn b/chrome/browser/ash/policy/reporting/event_based_logs/BUILD.gn
index 84b11806..b145d7a 100644
--- a/chrome/browser/ash/policy/reporting/event_based_logs/BUILD.gn
+++ b/chrome/browser/ash/policy/reporting/event_based_logs/BUILD.gn
@@ -28,7 +28,7 @@
     "//chrome/browser/policy/messaging_layer/proto:log_upload_event_proto",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/support_tool:support_tool_proto",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//chromeos/ash/components/settings",
     "//components/prefs",
     "//components/reporting/client:report_queue",
@@ -87,18 +87,18 @@
 
   deps = [
     ":event_based_logs",
-    "//chrome/browser:browser",
+    "//chrome/browser",
     "//chrome/browser/ash/login/test:test_support",
     "//chrome/browser/ash/policy/core:test_support",
     "//chrome/browser/ash/policy/remote_commands:test_support",
-    "//chrome/browser/ash/policy/test_support:test_support",
+    "//chrome/browser/ash/policy/test_support",
     "//chrome/browser/ash/settings",
     "//chrome/browser/ash/settings:test_support",
     "//chrome/browser/policy/messaging_layer/proto:log_upload_event_proto",
     "//chrome/browser/support_tool:support_tool_proto",
     "//chrome/test:test_support",
     "//chromeos/ash/components/settings",
-    "//chromeos/ash/components/system:system",
+    "//chromeos/ash/components/system",
     "//components/reporting/storage:test_support",
     "//content/test:test_support",
     "//testing/gmock",
diff --git a/chrome/browser/ash/policy/reporting/user_session_activity/BUILD.gn b/chrome/browser/ash/policy/reporting/user_session_activity/BUILD.gn
index 7b89e251..4c9d335e 100644
--- a/chrome/browser/ash/policy/reporting/user_session_activity/BUILD.gn
+++ b/chrome/browser/ash/policy/reporting/user_session_activity/BUILD.gn
@@ -43,7 +43,7 @@
     ":user_session_activity",
     "//base/test:test_support",
     "//chrome/browser/ash/login/users:test_support",
-    "//chrome/browser/ash/policy/core:core",
+    "//chrome/browser/ash/policy/core",
     "//chrome/browser/ash/policy/reporting",
     "//chrome/browser/ash/policy/reporting:test_support",
     "//chrome/browser/ash/power/ml",
@@ -57,7 +57,7 @@
     "//components/reporting/proto:record_constants",
     "//components/user_manager",
     "//content/test:test_support",
-    "//testing/gmock:gmock",
+    "//testing/gmock",
   ]
 
   # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and
@@ -74,34 +74,34 @@
 
   deps = [
     ":user_session_activity",
-    "//ash:ash",
-    "//ash/public/cpp:cpp",
-    "//base:base",
+    "//ash",
+    "//ash/public/cpp",
+    "//base",
     "//base/test:test_support",
-    "//chrome/browser/ash/login:login",
+    "//chrome/browser/ash/login",
     "//chrome/browser/ash/login:test_support",
     "//chrome/browser/ash/login/lock:test_support",
     "//chrome/browser/ash/login/session:test_support",
     "//chrome/browser/ash/login/test:test_support",
-    "//chrome/browser/ash/policy/core:core",
+    "//chrome/browser/ash/policy/core",
     "//chrome/browser/ash/policy/core:test_support",
     "//chrome/browser/ash/policy/reporting:test_support",
-    "//chrome/browser/ash/profiles:profiles",
-    "//chrome/browser/ash/settings:settings",
+    "//chrome/browser/ash/profiles",
+    "//chrome/browser/ash/settings",
     "//chrome/browser/ash/settings:test_support",
     "//chrome/browser/policy/messaging_layer/proto:user_session_activity_proto",
-    "//chrome/browser/ui:ui",
+    "//chrome/browser/ui",
     "//chrome/test:test_support",
     "//chrome/test:test_support_ui",
-    "//chromeos/ash/components/dbus/session_manager:session_manager",
-    "//chromeos/ash/components/login/auth:auth",
+    "//chromeos/ash/components/dbus/session_manager",
+    "//chromeos/ash/components/login/auth",
     "//chromeos/ash/components/login/auth/public:authpublic",
     "//chromeos/dbus/missive:test_support",
     "//components/reporting/proto:record_constants",
     "//components/reporting/proto:record_proto",
-    "//components/user_manager:user_manager",
+    "//components/user_manager",
     "//content/test:test_support",
-    "//testing/gtest:gtest",
-    "//ui/base:base",
+    "//testing/gtest",
+    "//ui/base",
   ]
 }
diff --git a/chrome/browser/ash/printing/history/BUILD.gn b/chrome/browser/ash/printing/history/BUILD.gn
index 73203f6..4b54cd02 100644
--- a/chrome/browser/ash/printing/history/BUILD.gn
+++ b/chrome/browser/ash/printing/history/BUILD.gn
@@ -44,7 +44,7 @@
     "//components/reporting/util:status",
     "//components/user_manager",
     "//content/public/browser",
-    "//printing/mojom:mojom",
+    "//printing/mojom",
   ]
 
   if (use_cups) {
diff --git a/chrome/browser/ash/sanitize/BUILD.gn b/chrome/browser/ash/sanitize/BUILD.gn
index d959d80..565a4ab 100644
--- a/chrome/browser/ash/sanitize/BUILD.gn
+++ b/chrome/browser/ash/sanitize/BUILD.gn
@@ -19,7 +19,7 @@
     "//ash/webui/sanitize_ui/mojom",
     "//base",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/ui/webui/ash/settings:settings",
+    "//chrome/browser/ui/webui/ash/settings",
   ]
 }
 
@@ -31,7 +31,7 @@
     "//chrome/browser/ash/sanitize",
     "//chrome/browser/profile_resetter:fake_profile_resetter",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/ui/webui/ash/settings:settings",
+    "//chrome/browser/ui/webui/ash/settings",
     "//chrome/test:test_support",
     "//content/public/browser",
     "//testing/gtest",
diff --git a/chrome/browser/ash/settings/BUILD.gn b/chrome/browser/ash/settings/BUILD.gn
index 1170a1d..0300538d 100644
--- a/chrome/browser/ash/settings/BUILD.gn
+++ b/chrome/browser/ash/settings/BUILD.gn
@@ -61,7 +61,7 @@
     "//content/public/browser",
     "//crypto",
     "//net",
-    "//third_party/re2:re2",
+    "//third_party/re2",
 
     # Work around of stub_cros_settings_provider injection.
     # TODO(hidehiko): Move the test support code to test_support target.
diff --git a/chrome/browser/ash/system_logs/BUILD.gn b/chrome/browser/ash/system_logs/BUILD.gn
index 7e8a1f9c0..1937fe1 100644
--- a/chrome/browser/ash/system_logs/BUILD.gn
+++ b/chrome/browser/ash/system_logs/BUILD.gn
@@ -64,7 +64,7 @@
     "//chrome/browser/feedback",
     "//chrome/browser/profiles:profile",
     "//chrome/common",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//chromeos/ash/components/cryptohome",
     "//chromeos/ash/components/dbus/debug_daemon",
     "//chromeos/ash/components/dbus/shill",
@@ -72,9 +72,9 @@
     "//chromeos/ash/components/network",
     "//chromeos/ash/services/cros_healthd/public/cpp",
     "//chromeos/components/onc",
-    "//components/user_manager:user_manager",
-    "//content/public/browser:browser",
-    "//device/bluetooth:bluetooth",
+    "//components/user_manager",
+    "//content/public/browser",
+    "//device/bluetooth",
     "//ui/display/manager",
     "//ui/events/ash",
     "//ui/ozone",
diff --git a/chrome/browser/ash/system_web_apps/apps/BUILD.gn b/chrome/browser/ash/system_web_apps/apps/BUILD.gn
index faa4f7b..40c711cb 100644
--- a/chrome/browser/ash/system_web_apps/apps/BUILD.gn
+++ b/chrome/browser/ash/system_web_apps/apps/BUILD.gn
@@ -101,7 +101,7 @@
     "//ash/webui/boca_ui:constants",
     "//ash/webui/boca_ui/resources",
     "//ash/webui/connectivity_diagnostics/resources",
-    "//ash/webui/demo_mode_app_ui/resources:resources",
+    "//ash/webui/demo_mode_app_ui/resources",
     "//ash/webui/diagnostics_ui:url_constants",
     "//ash/webui/diagnostics_ui/resources",
     "//ash/webui/eche_app_ui",
diff --git a/chrome/browser/ash/system_web_apps/apps/vc_background_ui/BUILD.gn b/chrome/browser/ash/system_web_apps/apps/vc_background_ui/BUILD.gn
index 58315cc..47b0318 100644
--- a/chrome/browser/ash/system_web_apps/apps/vc_background_ui/BUILD.gn
+++ b/chrome/browser/ash/system_web_apps/apps/vc_background_ui/BUILD.gn
@@ -66,7 +66,7 @@
     "//ash/webui/common/mojom:sea_pen",
     "//base",
     "//base/test:test_support",
-    "//chrome/browser:browser",
+    "//chrome/browser",
     "//chrome/browser/ash/system_web_apps/apps/personalization_app:test_support",
     "//chrome/browser/ash/wallpaper_handlers:test_support",
     "//chrome/browser/profiles:profile",
diff --git a/chrome/browser/ash/tpm/BUILD.gn b/chrome/browser/ash/tpm/BUILD.gn
index 96c2650..914bc12 100644
--- a/chrome/browser/ash/tpm/BUILD.gn
+++ b/chrome/browser/ash/tpm/BUILD.gn
@@ -41,7 +41,7 @@
     ":tpm",
     "//base",
     "//base/test:test_support",
-    "//chrome/browser/ash/policy/enrollment:enrollment",
+    "//chrome/browser/ash/policy/enrollment",
     "//chrome/browser/ash/settings:test_support",
     "//chrome/common",
     "//chromeos/ash/components/install_attributes:test_support",
diff --git a/chrome/browser/autocomplete/search_provider_unittest.cc b/chrome/browser/autocomplete/search_provider_unittest.cc
index 834fa79..4013819 100644
--- a/chrome/browser/autocomplete/search_provider_unittest.cc
+++ b/chrome/browser/autocomplete/search_provider_unittest.cc
@@ -1103,6 +1103,9 @@
 // Verifies AutocompleteControllers return results (including keyword
 // results) in the right order and set descriptions for them correctly.
 TEST_F(SearchProviderTest, KeywordOrderingAndDescriptions) {
+  base::test::ScopedFeatureList feature_list;
+  feature_list.InitAndEnableFeature(omnibox::kOmniboxSiteSearch);
+
   // Add an entry that corresponds to a keyword search with 'term2'.
   AddSearchToHistory(keyword_t_url_, u"term2", 1);
   profile_->BlockUntilHistoryProcessesPendingRequests();
@@ -1130,15 +1133,7 @@
   EXPECT_EQ(u"k", result.match_at(0).keyword);
   EXPECT_EQ(u"k", result.match_at(1).keyword);
 
-#if !BUILDFLAG(IS_ANDROID)
-  // On non-android, the top result will always have a description. Whether the
-  // second result has one doesn't matter much.  (If it was missing, people
-  // would infer that it's the same search provider as the one above it.)
   EXPECT_FALSE(result.match_at(0).description.empty());
-#else
-  // On Android, the top result should not have a description.
-  EXPECT_TRUE(result.match_at(0).description.empty());
-#endif
 }
 
 TEST_F(SearchProviderTest, KeywordVerbatim) {
diff --git a/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc b/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc
index 3a03b68..7b710a4b 100644
--- a/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc
+++ b/chrome/browser/banners/app_banner_manager_desktop_browsertest.cc
@@ -21,6 +21,7 @@
 #include "chrome/browser/banners/app_banner_manager_browsertest_base.h"
 #include "chrome/browser/banners/test_app_banner_manager_desktop.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/actions/chrome_action_id.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_command_controller.h"
 #include "chrome/browser/ui/browser_window.h"
@@ -258,8 +259,13 @@
   }
 
   // Install the app via the menu instead of the banner.
-  browser()->window()->ExecutePageActionIconForTesting(
-      PageActionIconType::kPwaInstall);
+  if (IsPageActionMigrated(PageActionIconType::kPwaInstall)) {
+    actions::ActionManager::Get().FindAction(kActionInstallPwa)->InvokeAction();
+  } else {
+    browser()->window()->ExecutePageActionIconForTesting(
+        PageActionIconType::kPwaInstall);
+  }
+
   manager->AwaitAppInstall();
 
   EXPECT_FALSE(manager->IsPromptAvailableForTesting());
diff --git a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
index 8e16468d..0a59c83 100644
--- a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
+++ b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
@@ -1288,19 +1288,19 @@
         assertNotNull(menu);
 
         // Select.
-        menu.onItemClick(null, null, 0, 0);
+        clickChildAt(menu, 0);
         verify(mSelectionDelegate).toggleSelectionForItem(mBookmarkId21);
 
         // Edit.
         // TODO(crbug.com/40267749): This doesn't actually open the activity yet.
-        menu.onItemClick(null, null, 1, 0);
+        clickChildAt(menu, 1);
 
         // Move.
         // TODO(crbug.com/40267749): This doesn't actually open the activity yet.
-        menu.onItemClick(null, null, 2, 0);
+        clickChildAt(menu, 2);
 
         // Delete.
-        menu.onItemClick(null, null, 3, 0);
+        clickChildAt(menu, 3);
         verify(mBookmarkModel).deleteBookmarks(mBookmarkId21);
     }
 
@@ -1343,7 +1343,7 @@
         assertNotNull(menu);
 
         // Delete.
-        menu.onItemClick(null, null, 4, 0);
+        clickChildAt(menu, 4);
         verify(mPriceTrackingUtilsJniMock)
                 .setPriceTrackingStateForBookmark(
                         any(), anyLong(), anyBoolean(), any(), anyBoolean());
@@ -1903,7 +1903,7 @@
         assertFalse(mModelList.get(1).model.get(BookmarkManagerProperties.IS_HIGHLIGHTED));
 
         // Show in folder.
-        menu.onItemClick(null, null, 4, 0);
+        clickChildAt(menu, 4);
         assertTrue(mModelList.get(1).model.get(BookmarkManagerProperties.IS_HIGHLIGHTED));
     }
 
@@ -2461,4 +2461,8 @@
         assertEquals(ViewType.SEARCH_BOX, mModelList.get(0).type);
         assertEquals(ViewType.EMPTY_STATE, mModelList.get(1).type);
     }
+
+    private void clickChildAt(BasicListMenu menu, int i) {
+        menu.clickItemForTesting(i);
+    }
 }
diff --git a/chrome/browser/chromeos/cros_apps/BUILD.gn b/chrome/browser/chromeos/cros_apps/BUILD.gn
index 00bb102..1074020d 100644
--- a/chrome/browser/chromeos/cros_apps/BUILD.gn
+++ b/chrome/browser/chromeos/cros_apps/BUILD.gn
@@ -13,7 +13,7 @@
   deps = [
     "//chrome/browser/chromeos/cros_apps/api",
     "//chrome/browser/profiles:profile",
-    "//chromeos/constants:constants",
+    "//chromeos/constants",
     "//content/public/browser",
     "//content/public/common",
   ]
diff --git a/chrome/browser/chromeos/cros_apps/api/BUILD.gn b/chrome/browser/chromeos/cros_apps/api/BUILD.gn
index b186e22..1e92f77 100644
--- a/chrome/browser/chromeos/cros_apps/api/BUILD.gn
+++ b/chrome/browser/chromeos/cros_apps/api/BUILD.gn
@@ -15,7 +15,7 @@
   defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ]
 
   deps = [
-    "//chrome/browser:browser",
+    "//chrome/browser",
     "//chrome/browser/chromeos/cros_apps:test_support",
     "//chrome/browser/chromeos/cros_apps/api/test:apitest_support",
     "//chrome/browser/profiles:profile",
@@ -47,7 +47,7 @@
   deps = [
     "//chrome/browser/profiles:profile",
     "//chrome/common",
-    "//chromeos/constants:constants",
+    "//chromeos/constants",
     "//content/public/browser",
     "//content/public/common",
     "//services/network/public/cpp",
diff --git a/chrome/browser/chromeos/drivefs/BUILD.gn b/chrome/browser/chromeos/drivefs/BUILD.gn
index 81ae7b9..b828052b 100644
--- a/chrome/browser/chromeos/drivefs/BUILD.gn
+++ b/chrome/browser/chromeos/drivefs/BUILD.gn
@@ -15,7 +15,7 @@
     "//chrome/browser/profiles:profile",
     "//chromeos/components/drivefs/mojom",
     "//components/drive",
-    "//components/keep_alive_registry:keep_alive_registry",
+    "//components/keep_alive_registry",
     "//extensions/browser/api/messaging",
     "//extensions/browser/api/messaging:native_messaging",
     "//extensions/common",
diff --git a/chrome/browser/chromeos/extensions/component_extension_content_settings/BUILD.gn b/chrome/browser/chromeos/extensions/component_extension_content_settings/BUILD.gn
index ad4abf108..83ca332 100644
--- a/chrome/browser/chromeos/extensions/component_extension_content_settings/BUILD.gn
+++ b/chrome/browser/chromeos/extensions/component_extension_content_settings/BUILD.gn
@@ -23,7 +23,7 @@
     "//components/keyed_service/content",
     "//components/keyed_service/core",
     "//extensions/common",
-    "//url:url",
+    "//url",
   ]
 
   # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and
diff --git a/chrome/browser/chromeos/extensions/echo_private/BUILD.gn b/chrome/browser/chromeos/extensions/echo_private/BUILD.gn
index a506ab9b7..6191b98 100644
--- a/chrome/browser/chromeos/extensions/echo_private/BUILD.gn
+++ b/chrome/browser/chromeos/extensions/echo_private/BUILD.gn
@@ -23,7 +23,7 @@
     "//chrome/browser/ui:browser_navigator_params_headers",
     "//chrome/common",
     "//chrome/common:constants",
-    "//chrome/common/extensions/api:api",
+    "//chrome/common/extensions/api",
     "//chromeos/ash/components/report:utils",
     "//chromeos/ash/components/settings",
     "//chromeos/ash/components/system",
diff --git a/chrome/browser/chromeos/extensions/odfs_config_private/BUILD.gn b/chrome/browser/chromeos/extensions/odfs_config_private/BUILD.gn
index b8d2fefa..6c984e63 100644
--- a/chrome/browser/chromeos/extensions/odfs_config_private/BUILD.gn
+++ b/chrome/browser/chromeos/extensions/odfs_config_private/BUILD.gn
@@ -18,7 +18,7 @@
   deps = [
     "//chrome/browser/extensions",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/ui:ui",
+    "//chrome/browser/ui",
     "//chrome/browser/ui/webui/ash/cloud_upload",
     "//chrome/common/extensions/api",
     "//chromeos/constants",
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/common/BUILD.gn b/chrome/browser/chromeos/extensions/telemetry/api/common/BUILD.gn
index 09f74d345..0fc5f80 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/common/BUILD.gn
+++ b/chrome/browser/chromeos/extensions/telemetry/api/common/BUILD.gn
@@ -62,7 +62,7 @@
   ]
 
   deps = [
-    "//chrome/browser/ash/crosapi:crosapi",
+    "//chrome/browser/ash/crosapi",
     "//chromeos/ash/components/telemetry_extension/telemetry",
     "//chromeos/crosapi/mojom",
     "//mojo/public/cpp/bindings",
diff --git a/chrome/browser/chromeos/extensions/telemetry/api/events/BUILD.gn b/chrome/browser/chromeos/extensions/telemetry/api/events/BUILD.gn
index 53bc8e3..173e491d 100644
--- a/chrome/browser/chromeos/extensions/telemetry/api/events/BUILD.gn
+++ b/chrome/browser/chromeos/extensions/telemetry/api/events/BUILD.gn
@@ -144,7 +144,7 @@
     ":event_manager",
     ":event_router",
     ":test_support",
-    "//chrome/browser/chromeos/extensions/telemetry/api/common:common",
+    "//chrome/browser/chromeos/extensions/telemetry/api/common",
     "//chrome/browser/ui",
     "//chrome/browser/web_applications:web_applications_test_support",
     "//chrome/common",
diff --git a/chrome/browser/chromeos/office_web_app/BUILD.gn b/chrome/browser/chromeos/office_web_app/BUILD.gn
index 011d2da..58b5bf67 100644
--- a/chrome/browser/chromeos/office_web_app/BUILD.gn
+++ b/chrome/browser/chromeos/office_web_app/BUILD.gn
@@ -17,7 +17,7 @@
     "//chrome/browser/ui/webui/ash/cloud_upload",
     "//chrome/browser/web_applications",
     "//components/webapps/browser",
-    "//ui/base:base",
+    "//ui/base",
     "//url",
   ]
 
diff --git a/chrome/browser/commerce/shopping_service_factory.cc b/chrome/browser/commerce/shopping_service_factory.cc
index 9f09d5f8..e8ccddaa 100644
--- a/chrome/browser/commerce/shopping_service_factory.cc
+++ b/chrome/browser/commerce/shopping_service_factory.cc
@@ -21,6 +21,7 @@
 #include "components/commerce/core/commerce_feature_list.h"
 #include "components/commerce/core/product_specifications/product_specifications_service.h"
 #include "components/commerce/core/proto/commerce_subscription_db_content.pb.h"
+#include "components/commerce/core/proto/discount_infos_db_content.pb.h"  // nogncheck
 #include "components/commerce/core/proto/parcel_tracking_db_content.pb.h"
 #include "components/commerce/core/shopping_service.h"
 #include "components/prefs/pref_service.h"
@@ -31,7 +32,6 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "components/commerce/core/proto/cart_db_content.pb.h"  // nogncheck
-#include "components/commerce/core/proto/discount_infos_db_content.pb.h"  // nogncheck
 #include "components/commerce/core/proto/discounts_db_content.pb.h"  // nogncheck
 #endif
 
@@ -82,9 +82,9 @@
 #if !BUILDFLAG(IS_ANDROID)
   DependsOn(SessionProtoDBFactory<
             discounts_db::DiscountsContentProto>::GetInstance());
+#endif
   DependsOn(SessionProtoDBFactory<
             discount_infos_db::DiscountInfosContentProto>::GetInstance());
-#endif
   DependsOn(SyncServiceFactory::GetInstance());
   DependsOn(commerce::ProductSpecificationsServiceFactory::GetInstance());
   DependsOn(TabRestoreServiceFactory::GetInstance());
@@ -113,12 +113,12 @@
           ->GetForProfile(context),
       SessionProtoDBFactory<cart_db::ChromeCartContentProto>::GetInstance()
           ->GetForProfile(context),
+#else
+      nullptr, nullptr,
+#endif
       SessionProtoDBFactory<
           discount_infos_db::DiscountInfosContentProto>::GetInstance()
           ->GetForProfile(context),
-#else
-      nullptr, nullptr, nullptr,
-#endif
       SessionProtoDBFactory<
           parcel_tracking_db::ParcelTrackingContent>::GetInstance()
           ->GetForProfile(context),
diff --git a/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc b/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc
index 4808e59..11c29c0 100644
--- a/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc
+++ b/chrome/browser/component_updater/pki_metadata_component_installer_browsertest.cc
@@ -19,6 +19,7 @@
 #include "base/memory/raw_ptr.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/run_loop.h"
+#include "base/strings/string_util.h"
 #include "base/strings/string_view_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/threading/thread_restrictions.h"
@@ -1449,6 +1450,12 @@
                     CTEnforcement::kDisabledByProto,
                     CTEnforcement::kDisabledByFeature));
 
+std::string X509CertificateToString(scoped_refptr<net::X509Certificate> cert) {
+  std::vector<std::string> pem_encoded_chain;
+  EXPECT_TRUE(cert->GetPEMEncodedChain(&pem_encoded_chain));
+  return base::JoinString(pem_encoded_chain, "\n");
+}
+
 // Checks that navigation responses were served over a connection where the
 // server provided the given `expected_server_certificate_chain`. Note that this
 // checks the certificate chain that the server served, not the chain that the
@@ -1482,7 +1489,12 @@
     EXPECT_TRUE(navigation_handle()
                     ->GetSSLInfo()
                     ->unverified_cert->EqualsIncludingChain(
-                        expected_server_certificate_chain_.get()));
+                        expected_server_certificate_chain_.get()))
+        << "\n\nExpected server chain: "
+        << X509CertificateToString(expected_server_certificate_chain_)
+        << "\n\nObserved unverified server chain: "
+        << X509CertificateToString(
+               navigation_handle()->GetSSLInfo()->unverified_cert);
     ++num_responses_;
     return content::NavigationThrottle::PROCEED;
   }
@@ -1720,18 +1732,6 @@
     SystemNetworkContextManager::GetInstance()
         ->FlushSSLConfigManagerForTesting();
 
-    // TODO(https://crbug.com/431064813): this is a speculative attempt to fix a
-    // test flake. It isn't clear why this should be needed because updating the
-    // SSLConfig should close idle sockets and prevent socket reuse. If this
-    // fixes the flake, we should investigate further why this is needed.
-    base::RunLoop close_all_connections_loop;
-    chrome_test_utils::GetActiveWebContents(this)
-        ->GetBrowserContext()
-        ->GetDefaultStoragePartition()
-        ->GetNetworkContext()
-        ->CloseAllConnections(close_all_connections_loop.QuitClosure());
-    close_all_connections_loop.Run();
-
     // The server should now serve a single leaf, without any intermediates,
     // because the client should signal that it trusts the intermediate as a
     // trust anchor.
diff --git a/chrome/browser/controlled_frame/controlled_frame_wpt_browsertest.cc b/chrome/browser/controlled_frame/controlled_frame_wpt_browsertest.cc
index cda8bc8..8b0d3651 100644
--- a/chrome/browser/controlled_frame/controlled_frame_wpt_browsertest.cc
+++ b/chrome/browser/controlled_frame/controlled_frame_wpt_browsertest.cc
@@ -25,14 +25,16 @@
 
 namespace controlled_frame {
 
+#define IS_LINUX_OR_CROS BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX)
+
 namespace {
 
 // TODO(crbug.com/423697478): frame_event_handlers_part_1 and webrequest_auth
-// times out on win-asan bots
+// times out on win-asan bots and linux / chromeos bots.
 const auto kTestFiles = testing::Values("add_content_scripts.window.js",
                                         "camera.window.js",
                                         "client_hints_user_agent.window.js",
-#if !(BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER))
+#if !(BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER)) || IS_LINUX_OR_CROS
                                         "frame_event_handlers_part_1.window.js",
 #endif
                                         "frame_event_handlers_part_2.window.js",
@@ -42,7 +44,7 @@
                                         "no_callback.window.js",
                                         "scheme.window.js",
                                         "user_agent_override.window.js",
-#if !(BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER))
+#if !(BUILDFLAG(IS_WIN) && defined(ADDRESS_SANITIZER)) || IS_LINUX_OR_CROS
                                         "webrequest_auth.window.js",
 #endif
                                         "webrequest_core.window.js",
diff --git a/chrome/browser/extensions/api/developer_private/developer_private_api.cc b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
index 832dc0a..aaebeed2 100644
--- a/chrome/browser/extensions/api/developer_private/developer_private_api.cc
+++ b/chrome/browser/extensions/api/developer_private/developer_private_api.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/extensions/api/developer_private/developer_private_api.h"
 
+#include "base/lazy_instance.h"
 #include "chrome/browser/extensions/api/developer_private/extension_info_generator.h"
 #include "chrome/browser/extensions/commands/command_service.h"
 #include "chrome/browser/extensions/error_console/error_console_factory.h"
diff --git a/chrome/browser/extensions/chrome_extension_registrar_delegate.cc b/chrome/browser/extensions/chrome_extension_registrar_delegate.cc
index 402b57c..1b2c154 100644
--- a/chrome/browser/extensions/chrome_extension_registrar_delegate.cc
+++ b/chrome/browser/extensions/chrome_extension_registrar_delegate.cc
@@ -616,28 +616,19 @@
       extensions::profile_util::ProfileCanUseNonComponentExtensions(profile_);
 
   if (!registry_->GetInstalledExtension(extension->id())) {
-    UMA_HISTOGRAM_ENUMERATION("Extensions.InstallType", extension->GetType(),
-                              100);
     if (is_user_profile) {
       UMA_HISTOGRAM_ENUMERATION("Extensions.InstallType.User",
                                 extension->GetType(), 100);
+      UMA_HISTOGRAM_ENUMERATION("Extensions.InstallSource.User2",
+                                extension->location(), 100);
+      InstalledLoader::RecordPermissionMessagesHistogram(extension, "Install",
+                                                         profile_);
     } else {
       UMA_HISTOGRAM_ENUMERATION("Extensions.InstallType.NonUser",
                                 extension->GetType(), 100);
-    }
-    UMA_HISTOGRAM_ENUMERATION("Extensions.InstallSource",
-                              extension->location());
-    if (is_user_profile) {
-      UMA_HISTOGRAM_ENUMERATION("Extensions.InstallSource.User2",
-                                extension->location(), 100);
-    } else {
       UMA_HISTOGRAM_ENUMERATION("Extensions.InstallSource.NonUser2",
                                 extension->location(), 100);
     }
-    // TODO(crbug.com/40878021): Address Install metrics below in a follow-up
-    // CL.
-    InstalledLoader::RecordPermissionMessagesHistogram(extension, "Install",
-                                                       is_user_profile);
   }
 }
 
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index d2103ab..6c8e88c1 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -780,8 +780,6 @@
     loader.set_pack_extension(false);
     loader.LoadExtension(good_extension_dir.UnpackedPath());
 
-    histograms.ExpectTotalCount("Extensions.InstallType", 1);
-    histograms.ExpectTotalCount("Extensions.InstallSource", 1);
     histograms.ExpectTotalCount("Extensions.InstallType.NonUser",
                                 nonuser_expected_total_count);
     histograms.ExpectTotalCount("Extensions.InstallType.User",
diff --git a/chrome/browser/extensions/installed_loader.cc b/chrome/browser/extensions/installed_loader.cc
index 0300e927..899ac3c 100644
--- a/chrome/browser/extensions/installed_loader.cc
+++ b/chrome/browser/extensions/installed_loader.cc
@@ -233,50 +233,37 @@
   return HostPermissionsAccess::kOnClick;
 }
 
-void LogHostPermissionsAccess(const Extension& extension,
-                              bool should_record_incremented_metrics) {
+// Emits metrics for the host permissions access that an extension has. Meant to
+// be called only for profiles where users can install extensions, specifically
+// profiles that can have non-component extensions installed.
+void LogHostPermissionsAccess(const Extension& extension) {
   HostPermissionsAccess access_level =
       GetHostPermissionAccessLevelForExtension(extension);
-  // Extensions.HostPermissions.GrantedAccess is emitted for every
-  // extension.
-  base::UmaHistogramEnumeration("Extensions.HostPermissions.GrantedAccess",
+  // Extensions.HostPermissions.GrantedAccess is emitted for every extension.
+  base::UmaHistogramEnumeration("Extensions.HostPermissions.GrantedAccess2",
                                 access_level);
-  if (should_record_incremented_metrics) {
-    base::UmaHistogramEnumeration("Extensions.HostPermissions.GrantedAccess2",
-                                  access_level);
-  }
 
   const PermissionSet& active_permissions =
       extension.permissions_data()->active_permissions();
   const PermissionSet& withheld_permissions =
       extension.permissions_data()->withheld_permissions();
 
-  // Since we only care about host permissions here, we don't want to
-  // look at API permissions that might cause Chrome to warn about all hosts
-  // (like debugger or devtools).
+  // Since we only care about host permissions here, we don't want to look at
+  // API permissions that might cause Chrome to warn about all hosts (like
+  // debugger or devtools).
   static constexpr bool kIncludeApiPermissions = false;
   if (active_permissions.ShouldWarnAllHosts(kIncludeApiPermissions) ||
       withheld_permissions.ShouldWarnAllHosts(kIncludeApiPermissions)) {
     // Extension requests access to at least one eTLD.
     base::UmaHistogramEnumeration(
-        "Extensions.HostPermissions.GrantedAccessForBroadRequests",
+        "Extensions.HostPermissions.GrantedAccessForBroadRequests2",
         access_level);
-    if (should_record_incremented_metrics) {
-      base::UmaHistogramEnumeration(
-          "Extensions.HostPermissions.GrantedAccessForBroadRequests2",
-          access_level);
-    }
   } else if (!active_permissions.effective_hosts().is_empty() ||
              !withheld_permissions.effective_hosts().is_empty()) {
     // Extension requests access to hosts, but not eTLD.
     base::UmaHistogramEnumeration(
-        "Extensions.HostPermissions.GrantedAccessForTargetedRequests",
+        "Extensions.HostPermissions.GrantedAccessForTargetedRequests2",
         access_level);
-    if (should_record_incremented_metrics) {
-      base::UmaHistogramEnumeration(
-          "Extensions.HostPermissions.GrantedAccessForTargetedRequests2",
-          access_level);
-    }
   }
 }
 
@@ -418,24 +405,15 @@
     }
   }
 
-  UMA_HISTOGRAM_COUNTS_100("Extensions.LoadAll",
-                           extension_registry_->enabled_extensions().size());
-  UMA_HISTOGRAM_COUNTS_100("Extensions.Disabled",
-                           extension_registry_->disabled_extensions().size());
+  const base::TimeDelta load_all_time =
+      base::TimeTicks::Now() - load_start_time;
   if (is_user_profile) {
     UMA_HISTOGRAM_COUNTS_100("Extensions.LoadAll2",
                              extension_registry_->enabled_extensions().size());
     UMA_HISTOGRAM_COUNTS_100("Extensions.Disabled2",
                              extension_registry_->disabled_extensions().size());
-  }
-
-  RecordExtensionsMetrics(profile, is_user_profile);
-
-  const base::TimeDelta load_all_time =
-      base::TimeTicks::Now() - load_start_time;
-  UMA_HISTOGRAM_TIMES("Extensions.LoadAllTime2", load_all_time);
-  if (is_user_profile) {
     UMA_HISTOGRAM_TIMES("Extensions.LoadAllTime2.User", load_all_time);
+    RecordExtensionsMetrics(profile);
   } else {
     UMA_HISTOGRAM_TIMES("Extensions.LoadAllTime2.NonUser", load_all_time);
   }
@@ -445,38 +423,28 @@
 void InstalledLoader::RecordPermissionMessagesHistogram(
     const Extension* extension,
     const char* histogram_basename,
-    bool log_user_profile_histograms) {
+    Profile* profile) {
+  DCHECK(profile_util::ProfileCanUseNonComponentExtensions(profile));
+
   PermissionIDSet permissions =
       PermissionMessageProvider::Get()->GetAllPermissionIDs(
           extension->permissions_data()->active_permissions(),
           extension->GetType());
+
   base::UmaHistogramBoolean(
-      base::StringPrintf("Extensions.HasPermissions_%s3", histogram_basename),
+      base::StringPrintf("Extensions.HasPermissions_%s4", histogram_basename),
       !permissions.empty());
 
-  std::string permissions_histogram_name =
-      base::StringPrintf("Extensions.Permissions_%s3", histogram_basename);
+  std::string permissions_histogram_name_incremented =
+      base::StringPrintf("Extensions.Permissions_%s4", histogram_basename);
   for (const PermissionID& id : permissions) {
-    base::UmaHistogramEnumeration(permissions_histogram_name, id.id());
-  }
-
-  if (log_user_profile_histograms) {
-    base::UmaHistogramBoolean(
-        base::StringPrintf("Extensions.HasPermissions_%s4", histogram_basename),
-        !permissions.empty());
-
-    std::string permissions_histogram_name_incremented =
-        base::StringPrintf("Extensions.Permissions_%s4", histogram_basename);
-    for (const PermissionID& id : permissions) {
-      base::UmaHistogramEnumeration(permissions_histogram_name_incremented,
-                                    id.id());
-    }
+    base::UmaHistogramEnumeration(permissions_histogram_name_incremented,
+                                  id.id());
   }
 }
 
 void InstalledLoader::RecordExtensionsMetricsForTesting() {
-  RecordExtensionsMetrics(profile_,
-                          /*is_user_profile=*/false);
+  RecordExtensionsMetrics(profile_);
 }
 
 void InstalledLoader::RecordExtensionsIncrementedMetricsForTesting(
@@ -485,8 +453,9 @@
 }
 
 // TODO(crbug.com/40739895): Separate out Webstore/Offstore metrics.
-void InstalledLoader::RecordExtensionsMetrics(Profile* profile,
-                                              bool is_user_profile) {
+void InstalledLoader::RecordExtensionsMetrics(Profile* profile) {
+  DCHECK(profile_util::ProfileCanUseNonComponentExtensions(profile));
+
   int app_user_count = 0;
   int app_external_count = 0;
   int hosted_app_count = 0;
@@ -525,7 +494,6 @@
   ManifestVersion2And3Counts component_manifest_version_counts;
   ManifestVersion2And3Counts unpacked_manifest_version_counts;
 
-  bool should_record_incremented_metrics = is_user_profile;
   bool dev_mode_enabled =
       GetCurrentDeveloperMode(util::GetBrowserContextId(profile));
 
@@ -542,19 +510,14 @@
     // muck up any of the stats. Later, though, we want to omit component and
     // unpacked, as they are less interesting.
 
-    if (extension->is_app() && should_record_incremented_metrics) {
+    if (extension->is_app()) {
       UMA_HISTOGRAM_ENUMERATION("Extensions.AppLocation2", location);
     } else if (extension->is_extension()) {
-      UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionLocation", location);
-      if (should_record_incremented_metrics) {
-        UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionLocation2", location);
-      }
+      UMA_HISTOGRAM_ENUMERATION("Extensions.ExtensionLocation2", location);
     }
+
     if (!UpdatesFromWebstore(*extension)) {
-      UMA_HISTOGRAM_ENUMERATION("Extensions.NonWebstoreLocation", location);
-      if (should_record_incremented_metrics) {
-        UMA_HISTOGRAM_ENUMERATION("Extensions.NonWebstoreLocation2", location);
-      }
+      UMA_HISTOGRAM_ENUMERATION("Extensions.NonWebstoreLocation2", location);
 
       // Check for inconsistencies if the extension was supposedly installed
       // from the webstore.
@@ -565,13 +528,9 @@
         kDeprecatedIsExternal = 1,
       };
       if (extension->from_webstore()) {
-        UMA_HISTOGRAM_ENUMERATION("Extensions.FromWebstoreInconsistency",
+        UMA_HISTOGRAM_ENUMERATION("Extensions.FromWebstoreInconsistency2",
                                   kBadUpdateUrl, 2);
-        if (should_record_incremented_metrics) {
-          UMA_HISTOGRAM_ENUMERATION("Extensions.FromWebstoreInconsistency2",
-                                    kBadUpdateUrl, 2);
-        }
-      } else if (is_user_profile) {
+      } else {
         // Record enabled non-webstore extensions based on developer mode
         // status.
         if (dev_mode_enabled) {
@@ -586,27 +545,17 @@
       }
     }
 
-    if (is_user_profile) {
-      base::UmaHistogramBoolean("Extensions.DeveloperModeEnabled",
-                                dev_mode_enabled);
-    }
+    base::UmaHistogramBoolean("Extensions.DeveloperModeEnabled",
+                              dev_mode_enabled);
 
     if (Manifest::IsExternalLocation(location)) {
       // See loop below for DISABLED.
       if (UpdatesFromWebstore(*extension)) {
-        base::UmaHistogramEnumeration("Extensions.ExternalItemState",
+        base::UmaHistogramEnumeration("Extensions.ExternalItemState2",
                                       ExternalItemState::kWebstoreEnabled);
-        if (should_record_incremented_metrics) {
-          base::UmaHistogramEnumeration("Extensions.ExternalItemState2",
-                                        ExternalItemState::kWebstoreEnabled);
-        }
       } else {
-        base::UmaHistogramEnumeration("Extensions.ExternalItemState",
+        base::UmaHistogramEnumeration("Extensions.ExternalItemState2",
                                       ExternalItemState::kNonwebstoreEnabled);
-        if (should_record_incremented_metrics) {
-          base::UmaHistogramEnumeration("Extensions.ExternalItemState2",
-                                        ExternalItemState::kNonwebstoreEnabled);
-        }
       }
     }
 
@@ -626,7 +575,7 @@
     // Manifest::TYPE_EXTENSION. An ungrouped histogram is below, includes all
     // extension-y types (such as platform apps and hosted apps), and doesn't
     // include unpacked or component locations.
-    if (extension->is_extension() && is_user_profile) {
+    if (extension->is_extension()) {
       const char* location_histogram_name = nullptr;
       ManifestVersion2And3Counts* manifest_version_counts = nullptr;
       switch (extension->location()) {
@@ -726,22 +675,16 @@
       continue;
     }
 
-    if (should_record_incremented_metrics) {
-      UMA_HISTOGRAM_ENUMERATION("Extensions.ManifestVersion2",
-                                extension->manifest_version(),
-                                kMaxManifestVersion);
-    }
+    UMA_HISTOGRAM_ENUMERATION("Extensions.ManifestVersion2",
+                              extension->manifest_version(),
+                              kMaxManifestVersion);
 
     // We might have wanted to count legacy packaged apps here, too, since they
     // are effectively extensions. Unfortunately, it's too late, as we don't
     // want to mess up the existing stats.
     if (type == Manifest::TYPE_EXTENSION) {
-      base::UmaHistogramEnumeration("Extensions.BackgroundPageType",
+      base::UmaHistogramEnumeration("Extensions.BackgroundPageType2",
                                     GetBackgroundPageType(extension));
-      if (should_record_incremented_metrics) {
-        base::UmaHistogramEnumeration("Extensions.BackgroundPageType2",
-                                      GetBackgroundPageType(extension));
-      }
 
       if (GetBackgroundPageType(extension) == BackgroundPageType::kEventPage) {
         // Count extension event pages with no registered events. Either the
@@ -758,12 +701,8 @@
     // Using an enumeration shows us the total installed ratio across all users.
     // Using the totals per user at each startup tells us the distribution of
     // usage for each user (e.g. 40% of users have at least one app installed).
-    UMA_HISTOGRAM_ENUMERATION(
-        "Extensions.LoadType", type, Manifest::NUM_LOAD_TYPES);
-    if (should_record_incremented_metrics) {
-      UMA_HISTOGRAM_ENUMERATION("Extensions.LoadType2", type,
-                                Manifest::NUM_LOAD_TYPES);
-    }
+    UMA_HISTOGRAM_ENUMERATION("Extensions.LoadType2", type,
+                              Manifest::NUM_LOAD_TYPES);
     switch (type) {
       case Manifest::TYPE_THEME:
         ++theme_count;
@@ -819,8 +758,7 @@
       ++no_action_count;
     }
 
-    RecordPermissionMessagesHistogram(extension, "Load",
-                                      should_record_incremented_metrics);
+    RecordPermissionMessagesHistogram(extension, "Load", profile);
 
     // For incognito and file access, skip anything that doesn't appear in
     // settings. Also, policy-installed (and unpacked of course, checked above)
@@ -854,13 +792,8 @@
       bool extension_has_withheld_hosts =
           permissions_manager->HasWithheldHostPermissions(*extension);
       UMA_HISTOGRAM_BOOLEAN(
-          "Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts",
+          "Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts2",
           extension_has_withheld_hosts);
-      if (should_record_incremented_metrics) {
-        UMA_HISTOGRAM_BOOLEAN(
-            "Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts2",
-            extension_has_withheld_hosts);
-      }
       if (extension_has_withheld_hosts) {
         // Record the number of granted hosts if and only if the extension
         // has withheld host permissions. This lets us equate "0" granted
@@ -880,18 +813,12 @@
         // permissions). We could potentially also record the granted hosts that
         // were explicitly not requested.
         UMA_HISTOGRAM_COUNTS_100(
-            "Extensions.RuntimeHostPermissions.GrantedHostCount",
+            "Extensions.RuntimeHostPermissions.GrantedHostCount2",
             num_granted_hosts);
-        if (should_record_incremented_metrics) {
-          UMA_HISTOGRAM_COUNTS_100(
-              "Extensions.RuntimeHostPermissions.GrantedHostCount2",
-              num_granted_hosts);
-        }
       }
     }
 
-    LogHostPermissionsAccess(*extension, should_record_incremented_metrics);
-
+    LogHostPermissionsAccess(*extension);
     if (ExtensionAllowlist::Get(profile)->GetExtensionAllowlistState(
             extension->id()) == ALLOWLIST_NOT_ALLOWLISTED) {
       // Record the number of not allowlisted enabled extensions.
@@ -901,49 +828,34 @@
 
   const ExtensionSet& disabled_extensions =
       extension_registry_->disabled_extensions();
-
   for (const scoped_refptr<const Extension>& disabled_extension :
        disabled_extensions) {
-    mojom::ManifestLocation location = disabled_extension->location();
+    mojom::ManifestLocation disabled_location = disabled_extension->location();
     if (extension_prefs_->DidExtensionEscalatePermissions(
             disabled_extension->id())) {
       ++disabled_for_permissions_count;
     }
-    if (should_record_incremented_metrics) {
-      RecordDisableReasons(
-          extension_prefs_->GetDisableReasons(disabled_extension->id()));
-    }
-    if (Manifest::IsExternalLocation(location)) {
+    RecordDisableReasons(
+        extension_prefs_->GetDisableReasons(disabled_extension->id()));
+    if (Manifest::IsExternalLocation(disabled_location)) {
       // See loop above for ENABLED.
-      if (UpdatesFromWebstore(*disabled_extension)) {
-        base::UmaHistogramEnumeration("Extensions.ExternalItemState",
-                                      ExternalItemState::kWebstoreDisabled);
-        if (should_record_incremented_metrics) {
-          base::UmaHistogramEnumeration("Extensions.ExternalItemState2",
-                                        ExternalItemState::kWebstoreDisabled);
-        }
-      } else {
-        base::UmaHistogramEnumeration("Extensions.ExternalItemState",
-                                      ExternalItemState::kNonwebstoreDisabled);
-        if (should_record_incremented_metrics) {
-          base::UmaHistogramEnumeration(
-              "Extensions.ExternalItemState2",
-              ExternalItemState::kNonwebstoreDisabled);
-        }
-      }
+      ExternalItemState state = UpdatesFromWebstore(*disabled_extension)
+                                    ? ExternalItemState::kWebstoreDisabled
+                                    : ExternalItemState::kNonwebstoreDisabled;
+      base::UmaHistogramEnumeration("Extensions.ExternalItemState2", state);
     }
 
     // Record disabled non-webstore extensions based on developer mode status.
-    if (is_user_profile && !UpdatesFromWebstore(*disabled_extension) &&
+    if (!UpdatesFromWebstore(*disabled_extension) &&
         !disabled_extension->from_webstore()) {
       if (dev_mode_enabled) {
         base::UmaHistogramEnumeration(
             "Extensions.NonWebstoreLocationWithDeveloperModeOn.Disabled3",
-            location);
+            disabled_location);
       } else {
         base::UmaHistogramEnumeration(
             "Extensions.NonWebstoreLocationWithDeveloperModeOff.Disabled3",
-            location);
+            disabled_location);
       }
     }
 
@@ -954,203 +866,131 @@
     }
   }
 
-  if (is_user_profile) {
-    base::UmaHistogramCounts100(
-        "Extensions.ManifestVersion2Count.Internal",
-        internal_manifest_version_counts.version_2_count);
-    base::UmaHistogramCounts100(
-        "Extensions.ManifestVersion3Count.Internal",
-        internal_manifest_version_counts.version_3_count);
-    base::UmaHistogramCounts100(
-        "Extensions.ManifestVersion2Count.External",
-        external_manifest_version_counts.version_2_count);
-    base::UmaHistogramCounts100(
-        "Extensions.ManifestVersion3Count.External",
-        external_manifest_version_counts.version_3_count);
-    base::UmaHistogramCounts100(
-        "Extensions.ManifestVersion2Count.Component",
-        component_manifest_version_counts.version_2_count);
-    base::UmaHistogramCounts100(
-        "Extensions.ManifestVersion3Count.Component",
-        component_manifest_version_counts.version_3_count);
-    base::UmaHistogramCounts100("Extensions.ManifestVersion2Count.Policy",
-                                policy_manifest_version_counts.version_2_count);
-    base::UmaHistogramCounts100("Extensions.ManifestVersion3Count.Policy",
-                                policy_manifest_version_counts.version_3_count);
-    base::UmaHistogramCounts100(
-        "Extensions.ManifestVersion2Count.Unpacked",
-        unpacked_manifest_version_counts.version_2_count);
-    base::UmaHistogramCounts100(
-        "Extensions.ManifestVersion3Count.Unpacked",
-        unpacked_manifest_version_counts.version_3_count);
+  base::UmaHistogramCounts100("Extensions.ManifestVersion2Count.Internal",
+                              internal_manifest_version_counts.version_2_count);
+  base::UmaHistogramCounts100("Extensions.ManifestVersion3Count.Internal",
+                              internal_manifest_version_counts.version_3_count);
+  base::UmaHistogramCounts100("Extensions.ManifestVersion2Count.External",
+                              external_manifest_version_counts.version_2_count);
+  base::UmaHistogramCounts100("Extensions.ManifestVersion3Count.External",
+                              external_manifest_version_counts.version_3_count);
+  base::UmaHistogramCounts100(
+      "Extensions.ManifestVersion2Count.Component",
+      component_manifest_version_counts.version_2_count);
+  base::UmaHistogramCounts100(
+      "Extensions.ManifestVersion3Count.Component",
+      component_manifest_version_counts.version_3_count);
+  base::UmaHistogramCounts100("Extensions.ManifestVersion2Count.Policy",
+                              policy_manifest_version_counts.version_2_count);
+  base::UmaHistogramCounts100("Extensions.ManifestVersion3Count.Policy",
+                              policy_manifest_version_counts.version_3_count);
+  base::UmaHistogramCounts100("Extensions.ManifestVersion2Count.Unpacked",
+                              unpacked_manifest_version_counts.version_2_count);
+  base::UmaHistogramCounts100("Extensions.ManifestVersion3Count.Unpacked",
+                              unpacked_manifest_version_counts.version_3_count);
 
-    auto get_manifest_version_population_split =
-        [](const ManifestVersion2And3Counts& counts) {
-          if (counts.version_2_count == 0 && counts.version_3_count == 0) {
-            return ManifestVersionPopulationSplit::kNoExtensions;
-          }
-          if (counts.version_2_count > 0 && counts.version_3_count == 0) {
-            return ManifestVersionPopulationSplit::kMv2ExtensionsOnly;
-          }
-          if (counts.version_3_count > 0 && counts.version_2_count == 0) {
-            return ManifestVersionPopulationSplit::kMv3ExtensionsOnly;
-          }
-          return ManifestVersionPopulationSplit::kMv2AndMv3Extensions;
-        };
-    base::UmaHistogramEnumeration(
-        "Extensions.ManifestVersionPopulationSplit.Internal",
-        get_manifest_version_population_split(
-            internal_manifest_version_counts));
-    base::UmaHistogramEnumeration(
-        "Extensions.ManifestVersionPopulationSplit.External",
-        get_manifest_version_population_split(
-            external_manifest_version_counts));
-    base::UmaHistogramEnumeration(
-        "Extensions.ManifestVersionPopulationSplit.Component",
-        get_manifest_version_population_split(
-            component_manifest_version_counts));
-    base::UmaHistogramEnumeration(
-        "Extensions.ManifestVersionPopulationSplit.Unpacked",
-        get_manifest_version_population_split(
-            unpacked_manifest_version_counts));
-    ManifestVersion2And3Counts internal_and_external_counts;
-    internal_and_external_counts.version_2_count =
-        internal_manifest_version_counts.version_2_count +
-        external_manifest_version_counts.version_2_count;
-    internal_and_external_counts.version_3_count =
-        internal_manifest_version_counts.version_3_count +
-        external_manifest_version_counts.version_3_count;
-    // We log an additional one for the combination of internal and external
-    // since these are both "user controlled" and not unpacked.
-    base::UmaHistogramEnumeration(
-        "Extensions.ManifestVersionPopulationSplit.InternalAndExternal",
-        get_manifest_version_population_split(
-            internal_manifest_version_counts));
-  }
+  auto get_manifest_version_population_split =
+      [](const ManifestVersion2And3Counts& counts) {
+        if (counts.version_2_count == 0 && counts.version_3_count == 0) {
+          return ManifestVersionPopulationSplit::kNoExtensions;
+        }
+        if (counts.version_2_count > 0 && counts.version_3_count == 0) {
+          return ManifestVersionPopulationSplit::kMv2ExtensionsOnly;
+        }
+        if (counts.version_3_count > 0 && counts.version_2_count == 0) {
+          return ManifestVersionPopulationSplit::kMv3ExtensionsOnly;
+        }
+        return ManifestVersionPopulationSplit::kMv2AndMv3Extensions;
+      };
+  base::UmaHistogramEnumeration(
+      "Extensions.ManifestVersionPopulationSplit.Internal",
+      get_manifest_version_population_split(internal_manifest_version_counts));
+  base::UmaHistogramEnumeration(
+      "Extensions.ManifestVersionPopulationSplit.External",
+      get_manifest_version_population_split(external_manifest_version_counts));
+  base::UmaHistogramEnumeration(
+      "Extensions.ManifestVersionPopulationSplit.Component",
+      get_manifest_version_population_split(component_manifest_version_counts));
+  base::UmaHistogramEnumeration(
+      "Extensions.ManifestVersionPopulationSplit.Unpacked",
+      get_manifest_version_population_split(unpacked_manifest_version_counts));
+  ManifestVersion2And3Counts internal_and_external_counts;
+  internal_and_external_counts.version_2_count =
+      internal_manifest_version_counts.version_2_count +
+      external_manifest_version_counts.version_2_count;
+  internal_and_external_counts.version_3_count =
+      internal_manifest_version_counts.version_3_count +
+      external_manifest_version_counts.version_3_count;
+  // We log an additional one for the combination of internal and external
+  // since these are both "user controlled" and not unpacked.
+  base::UmaHistogramEnumeration(
+      "Extensions.ManifestVersionPopulationSplit.InternalAndExternal",
+      get_manifest_version_population_split(internal_manifest_version_counts));
 
-  base::UmaHistogramCounts100("Extensions.LoadApp",
+  base::UmaHistogramCounts100("Extensions.LoadApp2",
                               app_user_count + app_external_count);
-  base::UmaHistogramCounts100("Extensions.LoadAppUser", app_user_count);
-  base::UmaHistogramCounts100("Extensions.LoadAppExternal", app_external_count);
-  base::UmaHistogramCounts100("Extensions.LoadHostedApp", hosted_app_count);
-  base::UmaHistogramCounts100("Extensions.LoadPackagedApp",
+  base::UmaHistogramCounts100("Extensions.LoadAppUser2", app_user_count);
+  base::UmaHistogramCounts100("Extensions.LoadAppExternal2",
+                              app_external_count);
+  base::UmaHistogramCounts100("Extensions.LoadHostedApp2", hosted_app_count);
+  base::UmaHistogramCounts100("Extensions.LoadPackagedApp2",
                               legacy_packaged_app_count);
-  base::UmaHistogramCounts100("Extensions.LoadPlatformApp", platform_app_count);
-  base::UmaHistogramCounts100("Extensions.LoadExtension",
+  base::UmaHistogramCounts100("Extensions.LoadPlatformApp2",
+                              platform_app_count);
+  base::UmaHistogramCounts100("Extensions.LoadExtension2",
                               extension_user_count + extension_external_count);
-  base::UmaHistogramCounts100("Extensions.LoadExtensionExternal",
+  base::UmaHistogramCounts100("Extensions.LoadExtensionUser2",
+                              extension_user_count);
+  base::UmaHistogramCounts100("Extensions.LoadExtensionExternal2",
                               extension_external_count);
-  base::UmaHistogramCounts100("Extensions.LoadTheme", theme_count);
-  base::UmaHistogramCounts100("Extensions.LoadBrowserAction",
+  base::UmaHistogramCounts100("Extensions.LoadTheme2", theme_count);
+  base::UmaHistogramCounts100("Extensions.LoadBrowserAction2",
                               browser_action_count);
-  base::UmaHistogramCounts100("Extensions.LoadNoExtensionAction",
+  base::UmaHistogramCounts100("Extensions.LoadNoExtensionAction2",
                               no_action_count);
-  base::UmaHistogramCounts100("Extensions.DisabledForPermissions",
+  base::UmaHistogramCounts100("Extensions.DisabledForPermissions2",
                               disabled_for_permissions_count);
-  base::UmaHistogramCounts100("Extensions.NonWebStoreNewTabPageOverrides",
+  base::UmaHistogramCounts100("Extensions.NonWebStoreNewTabPageOverrides2",
                               non_webstore_ntp_override_count);
-  base::UmaHistogramCounts100("Extensions.NewTabPageOverrides",
+  base::UmaHistogramCounts100("Extensions.NewTabPageOverrides2",
                               ntp_override_count);
-  base::UmaHistogramCounts100("Extensions.SearchEngineOverrides",
+  base::UmaHistogramCounts100("Extensions.SearchEngineOverrides2",
                               search_engine_override_count);
-  base::UmaHistogramCounts100("Extensions.StartupPagesOverrides",
+  base::UmaHistogramCounts100("Extensions.StartupPagesOverrides2",
                               startup_pages_override_count);
-  base::UmaHistogramCounts100("Extensions.HomepageOverrides",
+  base::UmaHistogramCounts100("Extensions.HomepageOverrides2",
                               homepage_override_count);
-  if (should_record_incremented_metrics) {
-    base::UmaHistogramCounts100("Extensions.LoadApp2",
-                                app_user_count + app_external_count);
-    base::UmaHistogramCounts100("Extensions.LoadAppUser2", app_user_count);
-    base::UmaHistogramCounts100("Extensions.LoadAppExternal2",
-                                app_external_count);
-    base::UmaHistogramCounts100("Extensions.LoadHostedApp2", hosted_app_count);
-    base::UmaHistogramCounts100("Extensions.LoadPackagedApp2",
-                                legacy_packaged_app_count);
-    base::UmaHistogramCounts100("Extensions.LoadPlatformApp2",
-                                platform_app_count);
-    base::UmaHistogramCounts100(
-        "Extensions.LoadExtension2",
-        extension_user_count + extension_external_count);
-    base::UmaHistogramCounts100("Extensions.LoadExtensionUser2",
-                                extension_user_count);
-    base::UmaHistogramCounts100("Extensions.LoadExtensionExternal2",
-                                extension_external_count);
-    base::UmaHistogramCounts100("Extensions.LoadTheme2", theme_count);
-    base::UmaHistogramCounts100("Extensions.LoadBrowserAction2",
-                                browser_action_count);
-    base::UmaHistogramCounts100("Extensions.LoadNoExtensionAction2",
-                                no_action_count);
-    base::UmaHistogramCounts100("Extensions.DisabledForPermissions2",
-                                disabled_for_permissions_count);
-    base::UmaHistogramCounts100("Extensions.NonWebStoreNewTabPageOverrides2",
-                                non_webstore_ntp_override_count);
-    base::UmaHistogramCounts100("Extensions.NewTabPageOverrides2",
-                                ntp_override_count);
-    base::UmaHistogramCounts100("Extensions.SearchEngineOverrides2",
-                                search_engine_override_count);
-    base::UmaHistogramCounts100("Extensions.StartupPagesOverrides2",
-                                startup_pages_override_count);
-    base::UmaHistogramCounts100("Extensions.HomepageOverrides2",
-                                homepage_override_count);
-  }
 
   if (incognito_allowed_count + incognito_not_allowed_count > 0) {
-    base::UmaHistogramCounts100("Extensions.IncognitoAllowed",
+    base::UmaHistogramCounts100("Extensions.IncognitoAllowed2",
                                 incognito_allowed_count);
-    if (should_record_incremented_metrics) {
-      base::UmaHistogramCounts100("Extensions.IncognitoAllowed2",
-                                  incognito_allowed_count);
-    }
   }
-  if (file_access_allowed_count + file_access_not_allowed_count > 0 &&
-      should_record_incremented_metrics) {
+  if (file_access_allowed_count + file_access_not_allowed_count > 0) {
     base::UmaHistogramCounts100("Extensions.FileAccessAllowed2",
                                 file_access_allowed_count);
     base::UmaHistogramCounts100("Extensions.FileAccessNotAllowed2",
                                 file_access_not_allowed_count);
   }
-  base::UmaHistogramCounts100(
-      "Extensions.CorruptExtensionTotalDisables",
-      extension_prefs_->GetPrefAsInteger(kCorruptedDisableCount));
-  base::UmaHistogramCounts100("Extensions.LoadOffStoreItems",
-                              off_store_item_count);
-  base::UmaHistogramCounts100("Extensions.WebRequestBlockingCount",
-                              web_request_blocking_count);
-  base::UmaHistogramCounts100("Extensions.WebRequestCount", web_request_count);
-  base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabled",
-                              enabled_not_allowlisted_count);
-  base::UmaHistogramCounts100("Extensions.NotAllowlistedDisabled",
-                              disabled_not_allowlisted_count);
 
-  if (should_record_incremented_metrics) {
-    base::UmaHistogramCounts100(
-        "Extensions.CorruptExtensionTotalDisables2",
-        extension_prefs_->GetPrefAsInteger(kCorruptedDisableCount));
-    base::UmaHistogramCounts100("Extensions.EventlessEventPages2",
-                                eventless_event_pages_count);
-    base::UmaHistogramCounts100("Extensions.LoadOffStoreItems2",
-                                off_store_item_count);
-    base::UmaHistogramCounts100("Extensions.WebRequestBlockingCount2",
-                                web_request_blocking_count);
-    base::UmaHistogramCounts100("Extensions.WebRequestCount2",
-                                web_request_count);
-    base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabled2",
-                                enabled_not_allowlisted_count);
-    base::UmaHistogramCounts100("Extensions.NotAllowlistedDisabled2",
-                                disabled_not_allowlisted_count);
-  }
+  base::UmaHistogramCounts100(
+      "Extensions.CorruptExtensionTotalDisables2",
+      extension_prefs_->GetPrefAsInteger(kCorruptedDisableCount));
+  base::UmaHistogramCounts100("Extensions.EventlessEventPages2",
+                              eventless_event_pages_count);
+  base::UmaHistogramCounts100("Extensions.LoadOffStoreItems2",
+                              off_store_item_count);
+  base::UmaHistogramCounts100("Extensions.WebRequestBlockingCount2",
+                              web_request_blocking_count);
+  base::UmaHistogramCounts100("Extensions.WebRequestCount2", web_request_count);
+  base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabled2",
+                              enabled_not_allowlisted_count);
+  base::UmaHistogramCounts100("Extensions.NotAllowlistedDisabled2",
+                              disabled_not_allowlisted_count);
   if (safe_browsing::IsEnhancedProtectionEnabled(*profile->GetPrefs())) {
-    base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabledAndEsbUser",
+    base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabledAndEsbUser2",
                                 enabled_not_allowlisted_count);
-    base::UmaHistogramCounts100("Extensions.NotAllowlistedDisabledAndEsbUser",
+    base::UmaHistogramCounts100("Extensions.NotAllowlistedDisabledAndEsbUser2",
                                 disabled_not_allowlisted_count);
-    if (should_record_incremented_metrics) {
-      base::UmaHistogramCounts100("Extensions.NotAllowlistedEnabledAndEsbUser2",
-                                  enabled_not_allowlisted_count);
-      base::UmaHistogramCounts100(
-          "Extensions.NotAllowlistedDisabledAndEsbUser2",
-          disabled_not_allowlisted_count);
-    }
   }
 }
 
diff --git a/chrome/browser/extensions/installed_loader.h b/chrome/browser/extensions/installed_loader.h
index 0cbdb28..deb9aac 100644
--- a/chrome/browser/extensions/installed_loader.h
+++ b/chrome/browser/extensions/installed_loader.h
@@ -56,13 +56,14 @@
   void LoadAllExtensions(Profile* profile);
 
   // Record a histogram using the PermissionMessage enum values for each
-  // permission in `extension`.
+  // permission in `extension`. Meant to be called only for profiles where users
+  // can install extensions, specifically profiles that can have non-component
+  // extensions installed.
   // NOTE: If this is ever called with high frequency, the implementation may
   // need to be made more efficient.
-  static void RecordPermissionMessagesHistogram(
-      const Extension* extension,
-      const char* histogram,
-      bool log_user_profile_histograms);
+  static void RecordPermissionMessagesHistogram(const Extension* extension,
+                                                const char* histogram,
+                                                Profile* profile);
 
   // Allows tests to verify metrics without needing to go through
   // LoadAllExtensions().
@@ -76,11 +77,10 @@
   // extension that is already installed.
   int GetCreationFlags(const ExtensionInfo* info);
 
-  // Records metrics related to the loaded extensions.
-  // `is_user_profile` indicates that this is a profile where users can install
-  // extensions, specifically profiles that can have non-component extensions
-  // installed. This causes incremented histograms to emit.
-  void RecordExtensionsMetrics(Profile* profile, bool is_user_profile);
+  // Records metrics related to the loaded extensions. Meant to be called only
+  // for profiles where users can install extensions, specifically profiles that
+  // can have non-component extensions installed.
+  void RecordExtensionsMetrics(Profile* profile);
 
   // Handles a load request for a corrupted extension.
   void HandleCorruptExtension(const Extension& extension,
diff --git a/chrome/browser/extensions/installed_loader_unittest.cc b/chrome/browser/extensions/installed_loader_unittest.cc
index f568219..2fc092d 100644
--- a/chrome/browser/extensions/installed_loader_unittest.cc
+++ b/chrome/browser/extensions/installed_loader_unittest.cc
@@ -29,15 +29,15 @@
 namespace {
 
 constexpr const char kHasWithheldHostsHistogram[] =
-    "Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts";
+    "Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts2";
 constexpr const char kGrantedHostCountHistogram[] =
-    "Extensions.RuntimeHostPermissions.GrantedHostCount";
+    "Extensions.RuntimeHostPermissions.GrantedHostCount2";
 constexpr const char kGrantedAccessHistogram[] =
-    "Extensions.HostPermissions.GrantedAccess";
+    "Extensions.HostPermissions.GrantedAccess2";
 constexpr const char kGrantedAccessForBroadRequestsHistogram[] =
-    "Extensions.HostPermissions.GrantedAccessForBroadRequests";
+    "Extensions.HostPermissions.GrantedAccessForBroadRequests2";
 constexpr const char kGrantedAccessForTargetedRequestsHistogram[] =
-    "Extensions.HostPermissions.GrantedAccessForTargetedRequests";
+    "Extensions.HostPermissions.GrantedAccessForTargetedRequests2";
 // Use an internal location for extensions since metrics aren't recorded for
 // unpacked extensions.
 constexpr mojom::ManifestLocation kManifestInternal =
@@ -171,9 +171,6 @@
   InstalledLoader loader(profile());
   loader.RecordExtensionsIncrementedMetricsForTesting(profile());
 
-  histograms.ExpectTotalCount("Extensions.LoadAllTime2", 1);
-  histograms.ExpectTotalCount("Extensions.LoadAll", 1);
-  histograms.ExpectTotalCount("Extensions.Disabled", 1);
   histograms.ExpectTotalCount("Extensions.LoadAllTime2.NonUser",
                               nonuser_expected_total_count);
   histograms.ExpectTotalCount("Extensions.LoadAllTime2.User",
@@ -185,7 +182,48 @@
                               user_expected_total_count);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+// Tests that some histograms that only emit for profiles that can use
+// non-component extensions do not emit as expected.
+TEST_F(InstalledLoaderUnitTest, UserMetrics_UserMetricsDoNotEmitForGuestUser) {
+  ASSERT_TRUE(AddExtension({"<all_urls>"}, kManifestInternal));
+  ASSERT_NO_FATAL_FAILURE(MaybeSetUpTestUser(/*is_guest=*/true));
+
+  RunEmitUserHistogramsTest(
+      /*nonuser_expected_total_count=*/1,
+      /*user_expected_total_count=*/0);
+}
+
+// This only differs from the parent class in that it explicitly logs-in a
+// "regular" user profile so the metrics record as expected.
+class InstalledLoaderUnitTestWithRegularUser : public InstalledLoaderUnitTest {
+ public:
+  InstalledLoaderUnitTestWithRegularUser() = default;
+
+  InstalledLoaderUnitTestWithRegularUser(
+      const InstalledLoaderUnitTestWithRegularUser&) = delete;
+  InstalledLoaderUnitTestWithRegularUser& operator=(
+      const InstalledLoaderUnitTestWithRegularUser&) = delete;
+
+  ~InstalledLoaderUnitTestWithRegularUser() override = default;
+
+  void SetUp() override {
+    InstalledLoaderUnitTest::SetUp();
+    ASSERT_NO_FATAL_FAILURE(MaybeSetUpTestUser(/*is_guest=*/false));
+  }
+};
+
+// Tests that some histograms that only emit for profiles that can use
+// non-component extensions emit as expected.
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
+       UserMetrics_UserMetricsEmitForRegularUser) {
+  ASSERT_TRUE(AddExtension({"<all_urls>"}, kManifestInternal));
+
+  RunEmitUserHistogramsTest(
+      /*nonuser_expected_total_count=*/0,
+      /*user_expected_total_count=*/1);
+}
+
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        RuntimeHostPermissions_Metrics_HasWithheldHosts_False) {
   AddExtension({"<all_urls>"}, kManifestInternal);
 
@@ -201,7 +239,7 @@
   histograms.ExpectTotalCount(kGrantedHostCountHistogram, 0);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        RuntimeHostPermissions_Metrics_HasWithheldHosts_True) {
   const Extension* extension = AddExtension({"<all_urls>"}, kManifestInternal);
   ScriptingPermissionsModifier(profile(), extension)
@@ -221,7 +259,7 @@
                                 kEmitCount);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        RuntimeHostPermissions_Metrics_GrantedHostCount) {
   const Extension* extension = AddExtension({"<all_urls>"}, kManifestInternal);
   ScriptingPermissionsModifier modifier(profile(), extension);
@@ -241,7 +279,7 @@
                                 kEmitCount);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_CannotAffect) {
   HostPermissionsMetricsTestParams params;
   // The extension is loaded from an external policy, so the user cannot
@@ -255,7 +293,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_CannotAffect_Broad_AllUrls) {
   HostPermissionsMetricsTestParams params;
   // The extension with host permissions is loaded from an external policy, so
@@ -268,7 +306,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_CannotAffect_Broad_Patterns) {
   HostPermissionsMetricsTestParams params;
   // The extension with host permissions is loaded from an external policy, so
@@ -281,7 +319,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_CannotAffect_Targeted) {
   HostPermissionsMetricsTestParams params;
   // The extension with host permissions is loaded from an external policy, so
@@ -295,7 +333,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_NotRequested) {
   HostPermissionsMetricsTestParams params;
   params.manifest_location = kManifestInternal;
@@ -307,7 +345,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_OnClick_Broad_AllUrls) {
   HostPermissionsMetricsTestParams params;
   params.manifest_location = kManifestInternal;
@@ -319,7 +357,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_OnClick_Broad_Pattern) {
   HostPermissionsMetricsTestParams params;
   params.manifest_location = kManifestInternal;
@@ -331,7 +369,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_OnClick_Targeted) {
   HostPermissionsMetricsTestParams params;
   params.manifest_location = kManifestInternal;
@@ -344,7 +382,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_OnSpecificSites_Broad_AllUrls) {
   HostPermissionsMetricsTestParams params;
   params.manifest_location = kManifestInternal;
@@ -357,7 +395,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_OnSpecificSites_Broad_Pattern) {
   HostPermissionsMetricsTestParams params;
   params.manifest_location = kManifestInternal;
@@ -370,7 +408,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_OnSpecificSites_Targeted) {
   HostPermissionsMetricsTestParams params;
   params.manifest_location = kManifestInternal;
@@ -386,7 +424,7 @@
 }
 
 TEST_F(
-    InstalledLoaderUnitTest,
+    InstalledLoaderUnitTestWithRegularUser,
     HostPermissions_Metrics_GrantedAccess_OnAllRequestedSites_Broad_AllUrls) {
   HostPermissionsMetricsTestParams params;
   params.manifest_location = kManifestInternal;
@@ -398,7 +436,7 @@
 }
 
 TEST_F(
-    InstalledLoaderUnitTest,
+    InstalledLoaderUnitTestWithRegularUser,
     HostPermissions_Metrics_GrantedAccess_OnAllRequestedSites_Broad_Pattern) {
   HostPermissionsMetricsTestParams params;
   params.manifest_location = kManifestInternal;
@@ -409,7 +447,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_OnAllRequestedSites_Targeted) {
   HostPermissionsMetricsTestParams params;
   params.manifest_location = kManifestInternal;
@@ -423,7 +461,7 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-TEST_F(InstalledLoaderUnitTest,
+TEST_F(InstalledLoaderUnitTestWithRegularUser,
        HostPermissions_Metrics_GrantedAccess_OnActiveTabOnly) {
   HostPermissionsMetricsTestParams params;
   params.manifest_location = kManifestInternal;
@@ -436,29 +474,4 @@
   RunHostPermissionsMetricsTest(params);
 }
 
-// TODO(crbug.com/40878021): After deleting the deprecated unincremented
-// histograms, consider modifying these to becomes less of change detectors in
-// metrics being modified.
-// Tests that some histograms that only emit for profiles that can use
-// non-component extensions emit as expected.
-TEST_F(InstalledLoaderUnitTest, UserMetrics_UserMetricsEmitForRegularUser) {
-  ASSERT_TRUE(AddExtension({"<all_urls>"}, kManifestInternal));
-  ASSERT_NO_FATAL_FAILURE(MaybeSetUpTestUser(/*is_guest=*/false));
-
-  RunEmitUserHistogramsTest(
-      /*nonuser_expected_total_count=*/0,
-      /*user_expected_total_count=*/1);
-}
-
-// Tests that some histograms that only emit for profiles that can use
-// non-component extensions do not emit as expected.
-TEST_F(InstalledLoaderUnitTest, UserMetrics_UserMetricsDoNotEmitForGuestUser) {
-  ASSERT_TRUE(AddExtension({"<all_urls>"}, kManifestInternal));
-  ASSERT_NO_FATAL_FAILURE(MaybeSetUpTestUser(/*is_guest=*/true));
-
-  RunEmitUserHistogramsTest(
-      /*nonuser_expected_total_count=*/1,
-      /*user_expected_total_count=*/0);
-}
-
 }  // namespace extensions
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 5a1e204..a077b54 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -2087,6 +2087,11 @@
     "expiry_milestone": 120
   },
   {
+    "name": "default-browser-off-cycle-promo",
+    "owners": [ "gujen@google.com", "bling-mony-pod@google.com", "bling-flags@google.com" ],
+    "expiry_milestone": 143
+  },
+  {
     "name": "default-browser-promo-trigger-criteria-experiment",
     "owners": [ "gayane@google.com", "bling-flags@google.com" ],
     "expiry_milestone": 140
diff --git a/chrome/browser/gesturenav/android/BUILD.gn b/chrome/browser/gesturenav/android/BUILD.gn
index df2ba55..fdb6334 100644
--- a/chrome/browser/gesturenav/android/BUILD.gn
+++ b/chrome/browser/gesturenav/android/BUILD.gn
@@ -44,7 +44,7 @@
     "//components/embedder_support/android:util_java",
     "//content/public/test/android:content_java_test_support",
     "//third_party/androidx:androidx_test_runner_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
   ]
 }
 
diff --git a/chrome/browser/glic/BUILD.gn b/chrome/browser/glic/BUILD.gn
index 2f90d5d2..0e4f966 100644
--- a/chrome/browser/glic/BUILD.gn
+++ b/chrome/browser/glic/BUILD.gn
@@ -66,18 +66,18 @@
     "//chrome/browser/permissions/system",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui:browser_list",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/tabs:tab_strip_model_observer",
     "//components/content_extraction/content/browser",
     "//components/favicon/core",
-    "//components/metrics:metrics",
+    "//components/metrics",
     "//components/optimization_guide/content/browser",
     "//components/prefs",
     "//components/signin/public/identity_manager",
     "//components/variations",
     "//content/public/browser",
-    "//google_apis/common:common",
-    "//ui/views:views",
+    "//google_apis/common",
+    "//ui/views",
     "//ui/views/controls/webview",
     "//ui/webui",
   ]
@@ -164,7 +164,7 @@
     "//chrome/browser/actor/ui",
     "//chrome/browser/background/glic",
     "//chrome/browser/contextual_cueing",
-    "//chrome/browser/feedback:feedback",
+    "//chrome/browser/feedback",
     "//chrome/browser/glic/browser_ui",
     "//chrome/browser/glic/fre",
     "//chrome/browser/glic/media",
@@ -177,30 +177,30 @@
     "//chrome/browser/resources/glic:resources",
     "//chrome/browser/resources/glic/fre:resources",
     "//chrome/browser/signin",
-    "//chrome/browser/themes:themes",
+    "//chrome/browser/themes",
     "//chrome/browser/ui:browser_element_identifiers",
     "//chrome/browser/ui:browser_list",
     "//chrome/browser/ui:browser_navigator_params_headers",
     "//chrome/browser/ui:browser_tab_strip",
     "//chrome/browser/ui:ui_features",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/profiles",
     "//chrome/browser/ui/tabs:tab_strip",
     "//chrome/browser/ui/user_education",
     "//chrome/browser/ui/views",
     "//chrome/common",
-    "//components/favicon/content:content",
+    "//components/favicon/content",
     "//components/feature_engagement/public:feature_constants",
-    "//components/feedback/content:content",
+    "//components/feedback/content",
     "//components/guest_view/browser",
     "//components/language/core/common",
     "//components/metrics",
-    "//components/metrics_services_manager:metrics_services_manager",
+    "//components/metrics_services_manager",
     "//components/pref_registry",
     "//components/prefs",
     "//components/sessions",
     "//components/variations/service",
-    "//extensions/browser:browser",
+    "//extensions/browser",
     "//third_party/metrics_proto",
     "//ui/webui",
     "//url",
@@ -240,9 +240,7 @@
     "//url/mojom:url_mojom_origin",
   ]
 
-  overridden_deps = [
-    "//third_party/blink/public/mojom:mojom_platform",
-  ]
+  overridden_deps = [ "//third_party/blink/public/mojom:mojom_platform" ]
 
   component_deps = [ "//content/public/common" ]
 }
@@ -264,20 +262,20 @@
     ":impl",
     "//base/test:test_support",
     "//chrome/browser:global_features",
-    "//chrome/browser/background:background",
+    "//chrome/browser/background",
     "//chrome/browser/background/glic",
     "//chrome/browser/glic/browser_ui:unit_tests",
     "//chrome/browser/glic/fre:unit_tests",
     "//chrome/browser/glic/media:unit_tests",
     "//chrome/browser/glic/test_support",
-    "//chrome/browser/prefs:prefs",
-    "//chrome/browser/status_icons:status_icons",
+    "//chrome/browser/prefs",
+    "//chrome/browser/status_icons",
     "//chrome/browser/ui",
     "//chrome/browser/ui:ui_features",
     "//chrome/common:chrome_features",
     "//chrome/test:test_support",
+    "//components/live_caption",
     "//components/live_caption:constants",
-    "//components/live_caption:live_caption",
     "//testing/gmock",
     "//testing/gtest",
   ]
@@ -311,12 +309,12 @@
     "//chrome/browser/actor/ui:test_support",
     "//chrome/browser/background/glic",
     "//chrome/browser/contextual_cueing:test_support",
-    "//chrome/browser/extensions:extensions",
+    "//chrome/browser/extensions",
     "//chrome/browser/glic/fre:browser_tests",
     "//chrome/browser/glic/test_support",
     "//chrome/browser/permissions:test_support",
     "//chrome/browser/policy:test_support",
-    "//chrome/browser/prefs:prefs",
+    "//chrome/browser/prefs",
     "//chrome/browser/ui",
     "//chrome/browser/ui:ui_features",
     "//chrome/browser/ui/profiles",
@@ -359,7 +357,7 @@
     ":impl",
     "//chrome/browser",
     "//chrome/browser:global_features",
-    "//chrome/browser/actor:actor",
+    "//chrome/browser/actor",
     "//chrome/browser/actor:test_support",
     "//chrome/browser/background/glic",
     "//chrome/browser/contextual_cueing",
diff --git a/chrome/browser/glic/browser_ui/BUILD.gn b/chrome/browser/glic/browser_ui/BUILD.gn
index 78e43ae0..48c0e5b4 100644
--- a/chrome/browser/glic/browser_ui/BUILD.gn
+++ b/chrome/browser/glic/browser_ui/BUILD.gn
@@ -19,10 +19,10 @@
     "theme_util.h",
   ]
   deps = [
-    "//chrome/browser/themes:themes",
+    "//chrome/browser/themes",
     "//chrome/browser/ui/tabs:tab_strip",
-    "//chrome/browser/ui/user_education:user_education",
-    "//components/feature_engagement/public:public",
+    "//chrome/browser/ui/user_education",
+    "//components/feature_engagement/public",
   ]
   public_deps = [ "//chrome/browser/glic" ]
 }
@@ -33,7 +33,7 @@
   deps = [
     ":browser_ui",
     "//base/test:test_support",
-    "//chrome/browser:browser",
+    "//chrome/browser",
     "//chrome/browser:global_features",
     "//chrome/browser/glic",
     "//chrome/browser/glic/test_support",
@@ -74,7 +74,7 @@
     "//testing/gtest",
     "//ui/base:ozone_buildflags",
     "//ui/base:test_support",
-    "//ui/compositor:compositor",
+    "//ui/compositor",
     "//ui/gfx",
     "//ui/gfx:gfx_switches",
     "//ui/views",
diff --git a/chrome/browser/glic/e2e_test/BUILD.gn b/chrome/browser/glic/e2e_test/BUILD.gn
index 2935b4bd..198bfa6b 100644
--- a/chrome/browser/glic/e2e_test/BUILD.gn
+++ b/chrome/browser/glic/e2e_test/BUILD.gn
@@ -80,7 +80,7 @@
 
     # TODO(crbug.com/399665693): Remove unneeded deps after refactoring.
     # Required for translate_bubble_test_utils_views.cc
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/translate:test_support",
     "//chrome/test:chrome_test_launcher",
     "//chrome/test:test_support",
diff --git a/chrome/browser/glic/fre/BUILD.gn b/chrome/browser/glic/fre/BUILD.gn
index ea00fb0..bae20d1 100644
--- a/chrome/browser/glic/fre/BUILD.gn
+++ b/chrome/browser/glic/fre/BUILD.gn
@@ -54,7 +54,7 @@
     "//chrome/test:test_support",
     "//components/signin/public/identity_manager:test_support",
     "//content/test:test_support",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
   ]
 }
 
@@ -67,12 +67,12 @@
     "//base/test:test_support",
     "//chrome/browser",
     "//chrome/browser/glic",
-    "//chrome/browser/glic/test_support:test_support",
-    "//chrome/browser/ui:ui",
+    "//chrome/browser/glic/test_support",
+    "//chrome/browser/ui",
     "//chrome/test:test_support",
     "//chrome/test:test_support_ui",
     "//content/test:test_support",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
   ]
 }
 
@@ -84,7 +84,7 @@
     ":fre",
     "//chrome/browser",
     "//chrome/browser/glic",
-    "//chrome/browser/glic/test_support:test_support",
+    "//chrome/browser/glic/test_support",
     "//chrome/browser/ui:browser_element_identifiers",
     "//chrome/test:test_support_ui",
     "//content/test:test_support",
diff --git a/chrome/browser/glic/host/context/glic_sharing_manager_impl.cc b/chrome/browser/glic/host/context/glic_sharing_manager_impl.cc
index 710367d..cde4e48b 100644
--- a/chrome/browser/glic/host/context/glic_sharing_manager_impl.cc
+++ b/chrome/browser/glic/host/context/glic_sharing_manager_impl.cc
@@ -112,26 +112,30 @@
   auto* tab = tab_handle.Get();
   if (!tab) {
     std::move(callback).Run(
-        mojom::GetContextResult::NewErrorReason(std::string("tab not found")));
+        mojom::GetContextResult::NewErrorReason("tab not found"));
     return;
   }
 
   const bool is_pinned = pinned_tab_manager_.IsTabPinned(tab_handle);
 
-  if ((!profile_->GetPrefs()->GetBoolean(prefs::kGlicTabContextEnabled) ||
-      !window_controller_->IsShowing()) && !is_pinned) {
-    std::move(callback).Run(mojom::GetContextResult::NewErrorReason(
-        std::string("permission denied")));
-    return;
+  if (!is_pinned) {
+    if (!window_controller_->IsShowing()) {
+      std::move(callback).Run(mojom::GetContextResult::NewErrorReason(
+          "permission denied: window not showing"));
+      return;
+    }
+    if (!profile_->GetPrefs()->GetBoolean(prefs::kGlicTabContextEnabled)) {
+      std::move(callback).Run(mojom::GetContextResult::NewErrorReason(
+          "permission denied: context permission not enabled"));
+      return;
+    }
   }
 
-
-
   const bool is_focused = focused_tab_manager_.IsTabFocused(tab_handle);
   const bool is_shared = is_focused || is_pinned;
   if (!is_shared || !IsValidCandidateForSharing(tab->GetContents())) {
-    std::move(callback).Run(mojom::GetContextResult::NewErrorReason(
-        std::string("permission denied")));
+    std::move(callback).Run(
+        mojom::GetContextResult::NewErrorReason("permission denied"));
     return;
   }
   if (is_focused) {
diff --git a/chrome/browser/glic/host/glic_api_browsertest.cc b/chrome/browser/glic/host/glic_api_browsertest.cc
index 9bc2f643..717e8fe9 100644
--- a/chrome/browser/glic/host/glic_api_browsertest.cc
+++ b/chrome/browser/glic/host/glic_api_browsertest.cc
@@ -189,6 +189,7 @@
             {features::kGlicScrollTo, {}},
             {features::kGlicClosedCaptioning, {}},
             {features::kGlicApiActivationGating, {}},
+            {mojom::features::kGlicMultiTab, {}},
             {features::kGlicUserStatusCheck,
              {{features::kGlicUserStatusRefreshApi.name, "true"},
               {features::kGlicUserStatusThrottleInterval.name, "2s"}}},
@@ -1521,6 +1522,49 @@
       GlicRequestEvent::kRequestReceivedWhileHidden, 1);
 }
 
+IN_PROC_BROWSER_TEST_F(GlicApiTestWithOneTab, testPinTabs) {
+  ExecuteJsTest();
+}
+
+// TODO(b/431837630): Make this work on mac.
+#if BUILDFLAG(IS_MAC)
+#define MAYBE_testFetchInactiveTabScreenshot \
+  DISABLED_testFetchInactiveTabScreenshot
+#else
+#define MAYBE_testFetchInactiveTabScreenshot testFetchInactiveTabScreenshot
+#endif
+IN_PROC_BROWSER_TEST_F(GlicApiTestWithOneTab,
+                       MAYBE_testFetchInactiveTabScreenshot) {
+  RunTestSequence(AddInstrumentedTab(kSecondTab, page_url()));
+
+  ExecuteJsTest();
+
+  browser()->tab_strip_model()->SelectPreviousTab();
+
+  ContinueJsTest();
+}
+
+// TODO(b/431837630): Make this work on mac.
+#if BUILDFLAG(IS_MAC)
+#define MAYBE_testFetchInactiveTabScreenshotWhileMinimized \
+  DISABLED_testFetchInactiveTabScreenshotWhileMinimized
+#else
+#define MAYBE_testFetchInactiveTabScreenshotWhileMinimized \
+  testFetchInactiveTabScreenshotWhileMinimized
+#endif
+IN_PROC_BROWSER_TEST_F(GlicApiTestWithOneTab,
+                       MAYBE_testFetchInactiveTabScreenshotWhileMinimized) {
+  RunTestSequence(AddInstrumentedTab(kSecondTab, page_url()));
+  bool can_fetch_screenshot = BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC);
+
+  ExecuteJsTest({.params = base::Value(can_fetch_screenshot)});
+
+  browser()->tab_strip_model()->SelectPreviousTab();
+  browser()->window()->Minimize();
+
+  ContinueJsTest();
+}
+
 class GlicApiTestUserStatusCheckTest : public GlicApiTestWithOneTab {
  protected:
   void SetUpOnMainThread() override {
diff --git a/chrome/browser/glic/host/glic_permission_enforcement_interactive_uitest.cc b/chrome/browser/glic/host/glic_permission_enforcement_interactive_uitest.cc
index 5d9d8c9..8163710f 100644
--- a/chrome/browser/glic/host/glic_permission_enforcement_interactive_uitest.cc
+++ b/chrome/browser/glic/host/glic_permission_enforcement_interactive_uitest.cc
@@ -92,7 +92,7 @@
           test::kGlicContentsElementId,
           "() => document.querySelector('#getPageContextStatus').innerText",
           "Error getting page context: Error: tabContext failed: permission "
-          "denied"));
+          "denied: context permission not enabled"));
 }
 
 IN_PROC_BROWSER_TEST_F(GlicPermissionEnforcementUiTest,
diff --git a/chrome/browser/glic/media/BUILD.gn b/chrome/browser/glic/media/BUILD.gn
index 351592c19..b340c164 100644
--- a/chrome/browser/glic/media/BUILD.gn
+++ b/chrome/browser/glic/media/BUILD.gn
@@ -19,16 +19,16 @@
   ]
   deps = [
     "//base",
-    "//chrome/browser/glic:glic",
-    "//chrome/browser/media/webrtc:webrtc",
+    "//chrome/browser/glic",
+    "//chrome/browser/media/webrtc",
     "//chrome/browser/profiles:profile",
     "//components/live_caption:utils",
     "//content/public/browser",
   ]
   public_deps = [
     "//chrome/browser:browser_public_dependencies",
+    "//components/live_caption",
     "//components/live_caption:constants",
-    "//components/live_caption:live_caption",
   ]
 }
 
@@ -44,9 +44,9 @@
     ":media",
     "//base/test:test_support",
     "//chrome/browser/glic/test_support",
-    "//chrome/browser/prefs:prefs",
+    "//chrome/browser/prefs",
     "//chrome/test:test_support",
-    "//components/optimization_guide/content/browser:browser",
+    "//components/optimization_guide/content/browser",
     "//testing/gmock",
     "//testing/gtest",
   ]
diff --git a/chrome/browser/google/BUILD.gn b/chrome/browser/google/BUILD.gn
index 8e7a23d..fb4fc8c 100644
--- a/chrome/browser/google/BUILD.gn
+++ b/chrome/browser/google/BUILD.gn
@@ -17,7 +17,7 @@
   deps = [
     "//base",
     "//chrome/common:constants",
-    "//components/prefs:prefs",
+    "//components/prefs",
     "//content/public/browser",
   ]
 
@@ -32,7 +32,7 @@
     deps += [
       "//chrome/browser:browser_process",
       "//chrome/browser/ash/policy/core",
-      "//chromeos/ash/components/system:system",
+      "//chromeos/ash/components/system",
       "//components/policy/core/common:common_constants",
     ]
   }
@@ -96,7 +96,7 @@
     "//chrome/common:constants",
     "//chrome/installer/util:with_no_strings",
     "//content/test:test_support",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
   ]
 
   if (is_chromeos) {
diff --git a/chrome/browser/hub/BUILD.gn b/chrome/browser/hub/BUILD.gn
index 0cfae06a..e4f5f1a4 100644
--- a/chrome/browser/hub/BUILD.gn
+++ b/chrome/browser/hub/BUILD.gn
@@ -146,7 +146,7 @@
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/hamcrest:hamcrest_core_java",
     "//third_party/hamcrest:hamcrest_library_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java_test_support",
     "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/hub/internal/BUILD.gn b/chrome/browser/hub/internal/BUILD.gn
index 556dcb1..6357075 100644
--- a/chrome/browser/hub/internal/BUILD.gn
+++ b/chrome/browser/hub/internal/BUILD.gn
@@ -156,7 +156,7 @@
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/hamcrest:hamcrest_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_full_java",
     "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/image_editor/BUILD.gn b/chrome/browser/image_editor/BUILD.gn
index 0ca8249..eb9ecb29c 100644
--- a/chrome/browser/image_editor/BUILD.gn
+++ b/chrome/browser/image_editor/BUILD.gn
@@ -24,7 +24,7 @@
 
   deps = [
     "//base",
-    "//components/lens:lens",
+    "//components/lens",
     "//content/public/browser",
     "//ui/base/cursor",
     "//ui/snapshot",
diff --git a/chrome/browser/incognito/BUILD.gn b/chrome/browser/incognito/BUILD.gn
index 3585bd8..27da8cf1 100644
--- a/chrome/browser/incognito/BUILD.gn
+++ b/chrome/browser/incognito/BUILD.gn
@@ -128,7 +128,7 @@
     "//third_party/androidx:androidx_test_monitor_java",
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/hamcrest:hamcrest_core_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java_test_support",
     "//ui/android:ui_no_recycler_view_java",
@@ -174,7 +174,7 @@
     "//third_party/androidx:androidx_activity_activity_java",
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/jni_zero:jni_zero_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java_test_support",
     "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ip_protection/BUILD.gn b/chrome/browser/ip_protection/BUILD.gn
index d8a1062..2534f10 100644
--- a/chrome/browser/ip_protection/BUILD.gn
+++ b/chrome/browser/ip_protection/BUILD.gn
@@ -36,20 +36,20 @@
     "//components/ip_protection/common:ip_protection_telemetry",
     "//components/ip_protection/common:ip_protection_telemetry_uma",
     "//components/ip_protection/common:ip_protection_token_direct_fetcher",
-    "//components/prefs:prefs",
+    "//components/prefs",
     "//components/privacy_sandbox:features",
     "//components/privacy_sandbox:tracking_protection_prefs",
     "//components/privacy_sandbox:tracking_protection_settings",
-    "//components/signin/public/identity_manager:identity_manager",
-    "//components/variations/service:service",
+    "//components/signin/public/identity_manager",
+    "//components/variations/service",
     "//content/public/browser",
-    "//google_apis:google_apis",
+    "//google_apis",
     "//google_apis/common:request_util",
-    "//mojo/public/cpp/bindings:bindings",
-    "//net:net",
+    "//mojo/public/cpp/bindings",
+    "//net",
     "//net/third_party/quiche:blind_sign_auth",
-    "//services/network/public/cpp:cpp",
-    "//services/network/public/mojom:mojom",
+    "//services/network/public/cpp",
+    "//services/network/public/mojom",
     "//services/network/public/mojom:url_loader_base",
     "//third_party/anonymous_tokens:anonymous_tokens_cc_proto",
   ]
@@ -75,14 +75,14 @@
     "//components/privacy_sandbox:features",
     "//components/privacy_sandbox:privacy_sandbox_prefs",
     "//components/privacy_sandbox:tracking_protection_settings",
-    "//components/signin/public/identity_manager:identity_manager",
+    "//components/signin/public/identity_manager",
     "//components/signin/public/identity_manager:test_support",
-    "//components/variations/service:service",
+    "//components/variations/service",
     "//content/test:test_support",
     "//net/third_party/quiche:blind_sign_auth",
     "//net/traffic_annotation:test_support",
     "//services/network:test_support",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
     "//third_party/anonymous_tokens:anonymous_tokens_cc_proto",
   ]
 }
@@ -103,9 +103,9 @@
     "//chrome/test:test_support",
     "//components/ip_protection/common:ip_protection_data_types",
     "//components/privacy_sandbox:features",
-    "//components/signin/public/identity_manager:identity_manager",
+    "//components/signin/public/identity_manager",
     "//components/signin/public/identity_manager:test_support",
-    "//components/variations/service:service",
+    "//components/variations/service",
     "//third_party/anonymous_tokens:anonymous_tokens_cc_proto",
   ]
 
diff --git a/chrome/browser/lens/region_search/BUILD.gn b/chrome/browser/lens/region_search/BUILD.gn
index 2b66ac27..639d2c7 100644
--- a/chrome/browser/lens/region_search/BUILD.gn
+++ b/chrome/browser/lens/region_search/BUILD.gn
@@ -25,7 +25,7 @@
     "//components/lens:buildflags",
     "//components/lens:lens_mojo",
     "//components/prefs",
-    "//components/search_engines:search_engines",
+    "//components/search_engines",
     "//content/public/browser",
     "//ui/views",
 
diff --git a/chrome/browser/loading_modal/android/BUILD.gn b/chrome/browser/loading_modal/android/BUILD.gn
index ec4639c..4662c5fa 100644
--- a/chrome/browser/loading_modal/android/BUILD.gn
+++ b/chrome/browser/loading_modal/android/BUILD.gn
@@ -62,7 +62,7 @@
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/hamcrest:hamcrest_java",
     "//third_party/hamcrest:hamcrest_library_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java_test_support",
     "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/long_screenshots/BUILD.gn b/chrome/browser/long_screenshots/BUILD.gn
index dc877100..0ac0f1d739 100644
--- a/chrome/browser/long_screenshots/BUILD.gn
+++ b/chrome/browser/long_screenshots/BUILD.gn
@@ -13,7 +13,7 @@
 
   deps = [
     "//chrome/android:chrome_jni_headers",
-    "//components/google/core/common:common",
+    "//components/google/core/common",
     "//components/keyed_service/core",
     "//components/paint_preview/browser",
     "//components/paint_preview/common",
diff --git a/chrome/browser/magic_stack/android/BUILD.gn b/chrome/browser/magic_stack/android/BUILD.gn
index f5bd8f9f..241684c1 100644
--- a/chrome/browser/magic_stack/android/BUILD.gn
+++ b/chrome/browser/magic_stack/android/BUILD.gn
@@ -122,7 +122,7 @@
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/jni_zero:jni_zero_java",
     "//third_party/junit",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java_test_support",
     "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java b/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java
index b330345..d51d5c8 100644
--- a/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java
+++ b/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesContextMenuManagerUnitTest.java
@@ -130,7 +130,7 @@
                                 MODULE_TYPE)
                         .build();
 
-        mMenu.onItemClick(null, null, 0, 0);
+        mMenu.clickItemForTesting(0);
 
         histogramWatcher.assertExpected();
         verify(mModuleDelegate).removeModuleAndDisable(eq(MODULE_TYPE));
@@ -146,7 +146,7 @@
                                 MODULE_TYPE)
                         .build();
 
-        mMenu.onItemClick(null, null, 1, 0);
+        mMenu.clickItemForTesting(1);
 
         histogramWatcher.assertExpected();
         verify(mModuleDelegate).customizeSettings();
diff --git a/chrome/browser/media/router/BUILD.gn b/chrome/browser/media/router/BUILD.gn
index a1801a6..2cda09a 100644
--- a/chrome/browser/media/router/BUILD.gn
+++ b/chrome/browser/media/router/BUILD.gn
@@ -53,7 +53,7 @@
     "//chrome/browser/profiles",
     "//chrome/browser/profiles:profile",
     "//chrome/common:constants",
-    "//components/media_router/common:common",
+    "//components/media_router/common",
     "//components/prefs",
     "//components/user_prefs",
     "//content/public/browser",
@@ -174,8 +174,8 @@
       "//components/access_code_cast/common:metrics",
       "//components/embedder_support:user_agent",
       "//components/mirroring/mojom:service",
-      "//components/ukm/content:content",
-      "//components/version_info:version_info",
+      "//components/ukm/content",
+      "//components/version_info",
       "//media/cast:common",
       "//media/remoting:remoting_device_capability",
       "//mojo/public/cpp/bindings",
@@ -229,7 +229,7 @@
       ":media_router_feature",
       ":router",
       "//chrome/browser:browser_process",
-      "//chrome/browser/media/router/discovery:discovery",
+      "//chrome/browser/media/router/discovery",
       "//chrome/browser/media/router/discovery/access_code:access_code_cast_feature",
       "//chrome/browser/media/webrtc",
       "//components/media_router/common/providers/cast/channel",
diff --git a/chrome/browser/media/router/discovery/access_code/BUILD.gn b/chrome/browser/media/router/discovery/access_code/BUILD.gn
index b0ede0e..843126f 100644
--- a/chrome/browser/media/router/discovery/access_code/BUILD.gn
+++ b/chrome/browser/media/router/discovery/access_code/BUILD.gn
@@ -22,7 +22,7 @@
     "//chrome/browser/media/router:media_router_feature",
     "//chrome/browser/profiles:profile",
     "//chrome/common:channel_info",
-    "//components/pref_registry:pref_registry",
+    "//components/pref_registry",
     "//components/prefs",
     "//components/user_prefs",
     "//components/version_info:channel",
@@ -59,7 +59,7 @@
     deps = [
       ":access_code_cast_feature",
       ":discovery_resources_proto",
-      "//chrome/browser/media/router:router",
+      "//chrome/browser/media/router",
       "//chrome/browser/media/router/discovery",
       "//chrome/browser/profiles:profile",
       "//chrome/browser/signin",
@@ -67,8 +67,8 @@
       "//chrome/browser/ui/webui/access_code_cast:mojo_bindings",
       "//components/access_code_cast/common:metrics",
       "//components/endpoint_fetcher",
-      "//components/keyed_service/content:content",
-      "//components/leveldb_proto:leveldb_proto",
+      "//components/keyed_service/content",
+      "//components/leveldb_proto",
       "//components/media_router/common/providers/cast/channel",
       "//components/pref_registry",
       "//components/prefs",
diff --git a/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc b/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc
index d2f7e95..078d546 100644
--- a/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc
+++ b/chrome/browser/metrics/tab_stats/tab_stats_tracker.cc
@@ -44,6 +44,8 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/gfx/geometry/size.h"
 
+// We add nognchecks on some includes so that Android bots do not fail
+// dependency checks.
 #if BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/android/tab_android.h"
 #include "chrome/browser/ui/android/tab_model/tab_model.h"
@@ -59,7 +61,7 @@
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_list_observer.h"
 #include "chrome/browser/ui/browser_window.h"
-#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"  // nogncheck
 #include "chrome/browser/ui/tabs/tab_enums.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
diff --git a/chrome/browser/metrics/variations/BUILD.gn b/chrome/browser/metrics/variations/BUILD.gn
index b65df37..7396fe8d 100644
--- a/chrome/browser/metrics/variations/BUILD.gn
+++ b/chrome/browser/metrics/variations/BUILD.gn
@@ -16,7 +16,7 @@
     "//chrome/app:generated_resources",
     "//components/strings:components_branded_strings",
     "//components/strings:components_strings",
-    "//components/variations:variations",
+    "//components/variations",
   ]
   namespace = "chrome_variations"
   header_filename = "ui_string_overrider_factory.h"
diff --git a/chrome/browser/navigation_predictor/BUILD.gn b/chrome/browser/navigation_predictor/BUILD.gn
index 1ae414e..79600d2 100644
--- a/chrome/browser/navigation_predictor/BUILD.gn
+++ b/chrome/browser/navigation_predictor/BUILD.gn
@@ -12,7 +12,7 @@
   public_deps = [
     "//base",
     "//chrome/browser:browser_public_dependencies",
-    "//components/keyed_service/core:core",
+    "//components/keyed_service/core",
     "//url",
   ]
 }
diff --git a/chrome/browser/nearby_sharing/certificates/BUILD.gn b/chrome/browser/nearby_sharing/certificates/BUILD.gn
index be0b85b..bfa0269 100644
--- a/chrome/browser/nearby_sharing/certificates/BUILD.gn
+++ b/chrome/browser/nearby_sharing/certificates/BUILD.gn
@@ -40,7 +40,7 @@
     "//chromeos/ash/components/nearby/common/proto",
     "//chromeos/ash/components/nearby/common/scheduling",
     "//chromeos/ash/services/nearby/public/mojom",
-    "//components/cross_device/logging:logging",
+    "//components/cross_device/logging",
     "//components/leveldb_proto",
     "//components/prefs",
     "//crypto",
diff --git a/chrome/browser/nearby_sharing/client/BUILD.gn b/chrome/browser/nearby_sharing/client/BUILD.gn
index dc4f6e1..340fd061 100644
--- a/chrome/browser/nearby_sharing/client/BUILD.gn
+++ b/chrome/browser/nearby_sharing/client/BUILD.gn
@@ -17,7 +17,7 @@
     "//base",
     "//chrome/browser/nearby_sharing/common",
     "//chromeos/ash/components/nearby/common/client",
-    "//components/cross_device/logging:logging",
+    "//components/cross_device/logging",
     "//components/signin/public/identity_manager",
     "//net",
     "//net/traffic_annotation",
diff --git a/chrome/browser/nearby_sharing/contacts/BUILD.gn b/chrome/browser/nearby_sharing/contacts/BUILD.gn
index df3493bf..c3a59331 100644
--- a/chrome/browser/nearby_sharing/contacts/BUILD.gn
+++ b/chrome/browser/nearby_sharing/contacts/BUILD.gn
@@ -31,7 +31,7 @@
     "//chromeos/ash/components/nearby/common/client",
     "//chromeos/ash/components/nearby/common/scheduling",
     "//chromeos/ash/services/nearby/public/mojom",
-    "//components/cross_device/logging:logging",
+    "//components/cross_device/logging",
     "//components/prefs",
     "//crypto",
     "//third_party/nearby:device_rpc_proto",
diff --git a/chrome/browser/nearby_sharing/local_device_data/BUILD.gn b/chrome/browser/nearby_sharing/local_device_data/BUILD.gn
index ac0edd4a..8f3e82d 100644
--- a/chrome/browser/nearby_sharing/local_device_data/BUILD.gn
+++ b/chrome/browser/nearby_sharing/local_device_data/BUILD.gn
@@ -26,7 +26,7 @@
     "//chrome/browser/nearby_sharing/common",
     "//chromeos/ash/components/nearby/common/client",
     "//chromeos/ash/components/nearby/common/scheduling",
-    "//components/cross_device/logging:logging",
+    "//components/cross_device/logging",
     "//components/prefs",
     "//components/user_manager",
     "//third_party/nearby:device_rpc_proto",
diff --git a/chrome/browser/ntp_customization/BUILD.gn b/chrome/browser/ntp_customization/BUILD.gn
index 5c804cb..8a95d59a 100644
--- a/chrome/browser/ntp_customization/BUILD.gn
+++ b/chrome/browser/ntp_customization/BUILD.gn
@@ -172,7 +172,7 @@
     "//third_party/androidx:androidx_recyclerview_recyclerview_java",
     "//third_party/androidx:androidx_test_core_java",
     "//third_party/androidx:androidx_test_runner_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_no_recycler_view_java",
   ]
diff --git a/chrome/browser/on_device_translation/BUILD.gn b/chrome/browser/on_device_translation/BUILD.gn
index 815704d..541df757a 100644
--- a/chrome/browser/on_device_translation/BUILD.gn
+++ b/chrome/browser/on_device_translation/BUILD.gn
@@ -43,14 +43,14 @@
     "//chrome/browser/content_settings",
     "//chrome/browser/content_settings:content_settings_factory",
     "//chrome/browser/profiles:profile",
-    "//components/component_updater:component_updater",
+    "//components/component_updater",
     "//components/content_settings/core/browser",
-    "//components/crx_file:crx_file",
+    "//components/crx_file",
     "//components/keyed_service/content",
     "//components/language/core/browser",
     "//components/prefs",
     "//components/services/on_device_translation:on_device_translation_service",
-    "//components/update_client:update_client",
+    "//components/update_client",
     "//content/public/browser",
   ]
   configs += [ "//build/config/compiler:wexit_time_destructors" ]
diff --git a/chrome/browser/optimization_guide/BUILD.gn b/chrome/browser/optimization_guide/BUILD.gn
index 95bb820b..91b8b8d 100644
--- a/chrome/browser/optimization_guide/BUILD.gn
+++ b/chrome/browser/optimization_guide/BUILD.gn
@@ -28,11 +28,11 @@
     "//chrome/browser/navigation_predictor",
     "//chrome/browser/profiles:profile",
     "//components/keyed_service/core",
-    "//components/optimization_guide/core:core",
+    "//components/optimization_guide/core",
     "//components/optimization_guide/core:prediction",
     "//components/optimization_guide/optimization_guide_internals/webui",
     "//components/optimization_guide/public/mojom",
-    "//components/services/unzip/content:content",
+    "//components/services/unzip/content",
     "//components/signin/public/identity_manager",
     "//content/public/browser",
     "//mojo/public/cpp/bindings",
@@ -66,13 +66,13 @@
     "//chrome/browser:browser_process",
     "//chrome/browser/profiles",
     "//chrome/browser/signin",
-    "//chrome/browser/sync:sync",
-    "//chrome/browser/ui:ui",
-    "//components/metrics_services_manager:metrics_services_manager",
-    "//components/no_state_prefetch/browser:browser",
-    "//components/user_prefs:user_prefs",
-    "//components/variations/service:service",
-    "//components/version_info:version_info",
+    "//chrome/browser/sync",
+    "//chrome/browser/ui",
+    "//components/metrics_services_manager",
+    "//components/no_state_prefetch/browser",
+    "//components/user_prefs",
+    "//components/variations/service",
+    "//components/version_info",
     "//ui/webui",
   ]
   if (is_android) {
@@ -96,7 +96,7 @@
   deps = [
     ":optimization_guide",
     "//base",
-    "//chrome/browser/prefs:prefs",
+    "//chrome/browser/prefs",
     "//chrome/browser/signin",
     "//chrome/common",
     "//chrome/test:test_support",
@@ -162,7 +162,7 @@
     "//chrome/test:test_support",
     "//components/optimization_guide/core:test_support",
     "//components/prefs:test_support",
-    "//components/unified_consent:unified_consent",
+    "//components/unified_consent",
     "//components/variations:test_support",
   ]
   if (!is_android) {
diff --git a/chrome/browser/optimization_guide/android/BUILD.gn b/chrome/browser/optimization_guide/android/BUILD.gn
index 3bec401..cb19ad5 100644
--- a/chrome/browser/optimization_guide/android/BUILD.gn
+++ b/chrome/browser/optimization_guide/android/BUILD.gn
@@ -91,7 +91,7 @@
     "//third_party/androidx:androidx_test_rules_java",
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/jni_zero:jni_zero_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//url:gurl_java",
   ]
diff --git a/chrome/browser/os_crypt/BUILD.gn b/chrome/browser/os_crypt/BUILD.gn
index e4879e7d..844870ed 100644
--- a/chrome/browser/os_crypt/BUILD.gn
+++ b/chrome/browser/os_crypt/BUILD.gn
@@ -15,7 +15,7 @@
     "//chrome/common:channel_info",
     "//chrome/install_static:install_static_util",
     "//components/os_crypt/async/browser:key_provider_interface",
-    "//components/prefs:prefs",
+    "//components/prefs",
     "//content/public/browser",
   ]
 
@@ -36,7 +36,7 @@
     "//chrome/common:constants",
     "//chrome/elevation_service:public_headers",
     "//chrome/install_static:install_static_util",
-    "//components/prefs:prefs",
+    "//components/prefs",
     "//components/sync/base",
   ]
 }
diff --git a/chrome/browser/page_content_annotations/multi_source_page_context_fetcher.cc b/chrome/browser/page_content_annotations/multi_source_page_context_fetcher.cc
index fc7c6b0f..6406360 100644
--- a/chrome/browser/page_content_annotations/multi_source_page_context_fetcher.cc
+++ b/chrome/browser/page_content_annotations/multi_source_page_context_fetcher.cc
@@ -15,10 +15,12 @@
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/thread_pool.h"
 #include "base/time/time.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
 #include "components/content_extraction/content/browser/inner_text.h"
 #include "components/optimization_guide/content/browser/page_content_proto_provider.h"
 #include "components/pdf/browser/pdf_document_helper.h"
 #include "components/pdf/common/constants.h"
+#include "components/tabs/public/tab_interface.h"
 #include "content/public/browser/render_widget_host_view.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
@@ -26,6 +28,7 @@
 #include "pdf/mojom/pdf.mojom.h"
 #include "third_party/blink/public/mojom/content_extraction/ai_page_content.mojom.h"
 #include "third_party/skia/include/core/SkBitmap.h"
+#include "ui/base/base_window.h"
 #include "ui/gfx/codec/jpeg_codec.h"
 #include "ui/gfx/geometry/skia_conversions.h"
 #include "url/origin.h"
@@ -48,6 +51,9 @@
 const base::FeatureParam<int> kScreenshotJpegQuality{
     &kGlicTabScreenshotExperiment, "screenshot_jpeg_quality", 40};
 
+const base::FeatureParam<base::TimeDelta> kScreenshotTimeout{
+    &kGlicTabScreenshotExperiment, "screenshot_timeout_ms", base::Seconds(1)};
+
 gfx::Size GetScreenshotSize(content::RenderWidgetHostView* view) {
   // By default, no scaling.
   if (!base::FeatureList::IsEnabled(kGlicTabScreenshotExperiment)) {
@@ -215,17 +221,26 @@
   }
 
   void GetTabScreenshot(content::WebContents& web_contents) {
-    // TODO(crbug.com/378937313): Finish this provisional implementation.
     auto* view = web_contents.GetRenderWidgetHostView();
-    auto callback = base::BindOnce(&PageContextFetcher::RecievedJpegScreenshot,
-                                   GetWeakPtr());
+    auto finish_error_callback =
+        base::BindOnce(&PageContextFetcher::RecievedJpegScreenshot,
+                       GetWeakPtr(), std::nullopt);
 
     if (!view || !view->IsSurfaceAvailableForCopy()) {
-      std::move(callback).Run({});
       DLOG(WARNING) << "Could not retrieve RenderWidgetHostView.";
+      std::move(finish_error_callback).Run();
       return;
     }
 
+    capture_count_lock_ = web_contents.IncrementCapturerCount(
+        gfx::Size(), /*stay_hidden=*/false, /*stay_awake=*/false,
+        /*is_activity=*/false);
+
+    // Fetching the screenshot sometimes hangs. Quit early if it's taking too
+    // long. b/431837630.
+    base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
+        FROM_HERE, std::move(finish_error_callback), kScreenshotTimeout.Get());
+
     view->CopyFromSurface(
         gfx::Rect(),  // Copy entire surface area.
         GetScreenshotSize(view),
@@ -234,6 +249,10 @@
   }
 
   void ReceivedViewportBitmap(const SkBitmap& bitmap) {
+    // Early exit if the timeout has fired.
+    if (screenshot_done_) {
+      return;
+    }
     pending_result_->screenshot_result.emplace(
         gfx::SkISizeToSize(bitmap.dimensions()));
     base::UmaHistogramTimes("Glic.PageContextFetcher.GetScreenshot",
@@ -244,7 +263,7 @@
             [](const SkBitmap& bitmap) {
               return gfx::JPEGCodec::Encode(bitmap, GetScreenshotJpegQuality());
             },
-            std::move(bitmap)),
+            bitmap),
         base::BindOnce(&PageContextFetcher::RecievedJpegScreenshot,
                        GetWeakPtr()));
   }
@@ -257,13 +276,23 @@
 
   void RecievedJpegScreenshot(
       std::optional<std::vector<uint8_t>> screenshot_jpeg_data) {
+    // This function can be called multiple times, for timeout behavior. Early
+    // exit if it's already been called.
+    if (screenshot_done_) {
+      return;
+    }
+    auto elapsed = base::TimeTicks::Now() - start_time_;
+    screenshot_done_ = true;
+    capture_count_lock_ = {};
     if (screenshot_jpeg_data) {
       pending_result_->screenshot_result.value().jpeg_data =
           std::move(*screenshot_jpeg_data);
+      base::UmaHistogramTimes("Glic.PageContextFetcher.GetEncodedScreenshot",
+                              elapsed);
+    } else {
+      base::UmaHistogramTimes(
+          "Glic.PageContextFetcher.GetEncodedScreenshot.Failure", elapsed);
     }
-    screenshot_done_ = true;
-    base::UmaHistogramTimes("Glic.PageContextFetcher.GetEncodedScreenshot",
-                            base::TimeTicks::Now() - start_time_);
     RunCallbackIfComplete();
   }
 
@@ -343,6 +372,7 @@
   bool primary_page_changed_ = false;
   std::unique_ptr<FetchPageContextResult> pending_result_;
   base::TimeTicks start_time_;
+  base::ScopedClosureRunner capture_count_lock_;
 
   base::WeakPtrFactory<PageContextFetcher> weak_ptr_factory_{this};
 };
diff --git a/chrome/browser/persisted_state_db/BUILD.gn b/chrome/browser/persisted_state_db/BUILD.gn
index be91991d..4728c476 100644
--- a/chrome/browser/persisted_state_db/BUILD.gn
+++ b/chrome/browser/persisted_state_db/BUILD.gn
@@ -19,16 +19,17 @@
   }
 
   deps = [
-    "//base:base",
+    "//base",
     "//chrome/browser/profiles:profile",
     "//components/commerce/core:cart_db_content_proto",
     "//components/commerce/core:commerce_subscription_db_content_proto",
+    "//components/commerce/core:discount_infos_db_content_proto",
     "//components/commerce/core:parcel_tracking_db_content_proto",
     "//components/commerce/core:persisted_state_db_content_proto",
     "//components/keyed_service/content",
     "//components/leveldb_proto",
-    "//components/session_proto_db:session_proto_db",
-    "//content/public/browser:browser",
+    "//components/session_proto_db",
+    "//content/public/browser",
     "//third_party/leveldatabase",
   ]
   if (is_android) {
@@ -39,7 +40,6 @@
   } else {
     deps += [
       "//components/commerce/core:coupon_db_content_proto",
-      "//components/commerce/core:discount_infos_db_content_proto",
       "//components/commerce/core:discounts_db_content_proto",
     ]
   }
diff --git a/chrome/browser/persisted_state_db/session_proto_db_factory.cc b/chrome/browser/persisted_state_db/session_proto_db_factory.cc
index 704fbc0..71c1429 100644
--- a/chrome/browser/persisted_state_db/session_proto_db_factory.cc
+++ b/chrome/browser/persisted_state_db/session_proto_db_factory.cc
@@ -55,6 +55,21 @@
   return GetParcelTrackingSessionProtoDBFactory();
 }
 
+SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>*
+GetDiscountInfosSessionProtoDBFactory() {
+  static base::NoDestructor<
+      SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>>
+      instance;
+  return instance.get();
+}
+
+template <>
+SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>*
+SessionProtoDBFactory<
+    discount_infos_db::DiscountInfosContentProto>::GetInstance() {
+  return GetDiscountInfosSessionProtoDBFactory();
+}
+
 #if !BUILDFLAG(IS_ANDROID)
 SessionProtoDBFactory<cart_db::ChromeCartContentProto>*
 GetChromeCartSessionProtoDBFactory() {
@@ -98,21 +113,6 @@
   return GetDiscountsSessionProtoDBFactory();
 }
 
-SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>*
-GetDiscountInfosSessionProtoDBFactory() {
-  static base::NoDestructor<
-      SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>>
-      instance;
-  return instance.get();
-}
-
-template <>
-SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>*
-SessionProtoDBFactory<
-    discount_infos_db::DiscountInfosContentProto>::GetInstance() {
-  return GetDiscountInfosSessionProtoDBFactory();
-}
-
 #else
 SessionProtoDBFactory<merchant_signal_db::MerchantSignalContentProto>*
 GetMerchantSignalSessionProtoDBFactory() {
diff --git a/chrome/browser/persisted_state_db/session_proto_db_factory.h b/chrome/browser/persisted_state_db/session_proto_db_factory.h
index 899a1927..936d7573 100644
--- a/chrome/browser/persisted_state_db/session_proto_db_factory.h
+++ b/chrome/browser/persisted_state_db/session_proto_db_factory.h
@@ -9,6 +9,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile_keyed_service_factory.h"
 #include "components/commerce/core/proto/commerce_subscription_db_content.pb.h"
+#include "components/commerce/core/proto/discount_infos_db_content.pb.h"  // nogncheck
 #include "components/commerce/core/proto/parcel_tracking_db_content.pb.h"
 #include "components/session_proto_db/session_proto_db.h"
 #include "content/public/browser/browser_context.h"
@@ -19,7 +20,6 @@
 #if !BUILDFLAG(IS_ANDROID)
 #include "components/commerce/core/proto/cart_db_content.pb.h"
 #include "components/commerce/core/proto/coupon_db_content.pb.h"
-#include "components/commerce/core/proto/discount_infos_db_content.pb.h"  // nogncheck
 #include "components/commerce/core/proto/discounts_db_content.pb.h"  // nogncheck
 #else
 #include "components/commerce/core/proto/merchant_signal_db_content.pb.h"
@@ -39,6 +39,9 @@
 SessionProtoDBFactory<persisted_state_db::PersistedStateContentProto>*
 GetPersistedStateSessionProtoDBFactory();
 
+SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>*
+GetDiscountInfosSessionProtoDBFactory();
+
 #if !BUILDFLAG(IS_ANDROID)
 SessionProtoDBFactory<cart_db::ChromeCartContentProto>*
 GetChromeCartSessionProtoDBFactory();
@@ -46,8 +49,6 @@
 GetCouponSessionProtoDBFactory();
 SessionProtoDBFactory<discounts_db::DiscountsContentProto>*
 GetDiscountsSessionProtoDBFactory();
-SessionProtoDBFactory<discount_infos_db::DiscountInfosContentProto>*
-GetDiscountInfosSessionProtoDBFactory();
 #else
 SessionProtoDBFactory<merchant_signal_db::MerchantSignalContentProto>*
 GetMerchantSignalSessionProtoDBFactory();
@@ -150,6 +151,13 @@
         context->GetPath().AppendASCII(kParcelTrackingDBFolder),
         leveldb_proto::ProtoDbType::COMMERCE_PARCEL_TRACKING_DATABASE,
         content::GetUIThreadTaskRunner({}));
+  } else if (std::is_base_of<discount_infos_db::DiscountInfosContentProto,
+                             T>::value) {
+    return std::make_unique<SessionProtoDB<T>>(
+        proto_database_provider,
+        context->GetPath().AppendASCII(kDiscountInfosDBFolder),
+        leveldb_proto::ProtoDbType::DISCOUNT_INFOS_DATABASE,
+        content::GetUIThreadTaskRunner({}));
 #if !BUILDFLAG(IS_ANDROID)
   } else if (std::is_base_of<cart_db::ChromeCartContentProto, T>::value) {
     return std::make_unique<SessionProtoDB<T>>(
@@ -169,13 +177,6 @@
         context->GetPath().AppendASCII(kDiscountsDBFolder),
         leveldb_proto::ProtoDbType::DISCOUNTS_DATABASE,
         content::GetUIThreadTaskRunner({}));
-  } else if (std::is_base_of<discount_infos_db::DiscountInfosContentProto,
-                             T>::value) {
-    return std::make_unique<SessionProtoDB<T>>(
-        proto_database_provider,
-        context->GetPath().AppendASCII(kDiscountInfosDBFolder),
-        leveldb_proto::ProtoDbType::DISCOUNT_INFOS_DATABASE,
-        content::GetUIThreadTaskRunner({}));
 #else
   } else if (std::is_base_of<merchant_signal_db::MerchantSignalContentProto,
                              T>::value) {
diff --git a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc
index b9b6a45a..b65429e 100644
--- a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc
+++ b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_helper_browsertest.cc
@@ -514,7 +514,7 @@
 
     WasRecentlyAudibleWaiter audible_waiter;
     base::CallbackListSubscription subscription =
-        audible_helper->RegisterCallbackForTesting(
+        audible_helper->RegisterRecentlyAudibleChangedCallback(
             audible_waiter.GetRecentlyAudibleCallback());
     audible_waiter.WaitUntilDone();
     DCHECK_EQ(expected_recently_audible, audible_waiter.WasRecentlyAudible());
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
index d392e91..85509d8 100644
--- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
+++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -303,6 +303,7 @@
 #include "chrome/browser/signin/signin_manager_android_factory.h"
 #include "chrome/browser/tab/tab_state_storage_service_factory.h"
 #include "components/commerce/core/commerce_feature_list.h"
+#include "components/commerce/core/proto/discount_infos_db_content.pb.h"  // nogncheck
 #include "components/commerce/core/proto/merchant_signal_db_content.pb.h"
 
 #if BUILDFLAG(ENABLE_OFFLINE_PAGES)
@@ -358,7 +359,6 @@
 #include "chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service_factory.h"
 #include "components/commerce/core/proto/cart_db_content.pb.h"
 #include "components/commerce/core/proto/coupon_db_content.pb.h"
-#include "components/commerce/core/proto/discount_infos_db_content.pb.h"  // nogncheck
 #include "components/commerce/core/proto/discounts_db_content.pb.h"  // nogncheck
 #include "components/optimization_guide/core/model_execution/model_execution_features.h"
 #include "ui/accessibility/accessibility_features.h"
@@ -1316,9 +1316,9 @@
 #if !BUILDFLAG(IS_ANDROID)
   SessionProtoDBFactory<coupon_db::CouponContentProto>::GetInstance();
   SessionProtoDBFactory<discounts_db::DiscountsContentProto>::GetInstance();
+#endif
   SessionProtoDBFactory<
       discount_infos_db::DiscountInfosContentProto>::GetInstance();
-#endif
 #if BUILDFLAG(IS_ANDROID)
   SessionProtoDBFactory<
       merchant_signal_db::MerchantSignalContentProto>::GetInstance();
diff --git a/chrome/browser/renderer_context_menu/spelling_menu_observer_browsertest.cc b/chrome/browser/renderer_context_menu/spelling_menu_observer_browsertest.cc
index 60eabd22..d0ed451 100644
--- a/chrome/browser/renderer_context_menu/spelling_menu_observer_browsertest.cc
+++ b/chrome/browser/renderer_context_menu/spelling_menu_observer_browsertest.cc
@@ -447,8 +447,15 @@
 
 // Test that we don't show "No more suggestions from Google" if the spelling
 // service is enabled and that there is only one suggestion.
+// TODO(crbug.com/434222699): Fix flakiness and re-enable on Windows.
+#if BUILDFLAG(IS_WIN)
+#define MAYBE_NoMoreSuggestionsNotDisplayed \
+  DISABLED_NoMoreSuggestionsNotDisplayed
+#else
+#define MAYBE_NoMoreSuggestionsNotDisplayed NoMoreSuggestionsNotDisplayed
+#endif
 IN_PROC_BROWSER_TEST_F(SpellingMenuObserverTest,
-                       NoMoreSuggestionsNotDisplayed) {
+                       MAYBE_NoMoreSuggestionsNotDisplayed) {
   menu()->GetPrefs()->SetBoolean(
       spellcheck::prefs::kSpellCheckUseSpellingService, true);
 
diff --git a/chrome/browser/resources/glic/glic_api/glic_api.ts b/chrome/browser/resources/glic/glic_api/glic_api.ts
index b0e7a32..bfd18ff8 100644
--- a/chrome/browser/resources/glic/glic_api/glic_api.ts
+++ b/chrome/browser/resources/glic/glic_api/glic_api.ts
@@ -94,15 +94,6 @@
   notifyPanelWasClosed?(): Promise<void>;
 
   /**
-   * Called when the browser wants the web client to change its view to match
-   * a requested change (e.g., because the user clicked a UI element to toggle
-   * to a different view).
-   *
-   * The web client should update its view to match the requested change.
-   */
-  requestViewChange?(viewChangeRequest: ViewChangeRequest): void;
-
-  /**
    * The web client should resolve the promise after verifying the app is
    * responsive.
    *
@@ -638,6 +629,15 @@
   getHostCapabilities?(): Set<HostCapability>;
 
   /**
+   * Emits when the browser wants the web client to change its view to match
+   * a requested change (e.g., because the user clicked a UI element to toggle
+   * to a different view).
+   *
+   * The web client should update its view to match the requested change.
+   */
+  getViewChangeRequests?(): Observable<ViewChangeRequest>;
+
+  /**
    * Notifies the browser that the web client has changed the view shown to the
    * user. This is used to trigger updates to browser UI which shows the current
    * state of the web client, such as toggle controls.
diff --git a/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts b/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts
index 6ffd18d..45aa749 100644
--- a/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts
+++ b/chrome/browser/resources/glic/glic_api_impl/glic_api_client.ts
@@ -2,9 +2,9 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import type {ActInFocusedTabParams, ActInFocusedTabResult, AnnotatedPageData, ChromeVersion, CreateTabOptions, DraggableArea, FocusedTabData, GetPinCandidatesOptions, GlicBrowserHost, GlicBrowserHostJournal, GlicBrowserHostMetrics, GlicHostRegistry, GlicWebClient, HostCapability, Journal, ObservableValue, OpenPanelInfo, OpenSettingsOptions, PanelOpeningData, PanelState, PdfDocumentData, PinCandidate, ResizeWindowOptions, Screenshot, ScrollToParams, TabContextOptions, TabContextResult, TabData, UserProfileInfo, ViewChangedNotification, ViewChangeRequest, ZeroStateSuggestions, ZeroStateSuggestionsOptions, ZeroStateSuggestionsV2} from '../glic_api/glic_api.js';
+import type {ActInFocusedTabParams, ActInFocusedTabResult, AnnotatedPageData, ChromeVersion, CreateTabOptions, DraggableArea, FocusedTabData, GetPinCandidatesOptions, GlicBrowserHost, GlicBrowserHostJournal, GlicBrowserHostMetrics, GlicHostRegistry, GlicWebClient, HostCapability, Journal, Observable, ObservableValue, OpenPanelInfo, OpenSettingsOptions, PanelOpeningData, PanelState, PdfDocumentData, PinCandidate, ResizeWindowOptions, Screenshot, ScrollToParams, TabContextOptions, TabContextResult, TabData, UserProfileInfo, ViewChangedNotification, ViewChangeRequest, ZeroStateSuggestions, ZeroStateSuggestionsOptions, ZeroStateSuggestionsV2} from '../glic_api/glic_api.js';
 import {ActorTaskState} from '../glic_api/glic_api.js';
-import {ObservableValue as ObservableValueImpl} from '../observable.js';
+import {ObservableValue as ObservableValueImpl, Subject} from '../observable.js';
 
 import {replaceProperties} from './conversions.js';
 import {newSenderId, PostMessageRequestReceiver, PostMessageRequestSender} from './post_message_transport.js';
@@ -88,7 +88,7 @@
   }
 
   glicWebClientRequestViewChange(payload: {request: ViewChangeRequest}): void {
-    this.webClient.requestViewChange?.(payload.request);
+    this.host.viewChangeRequestsSubject.next(payload.request);
   }
 
   glicWebClientZeroStateSuggestionsChanged(payload: {
@@ -234,6 +234,7 @@
   private hostCapabilities: Set<HostCapability> = new Set();
   private actorTaskState =
       new Map<number, ObservableValueImpl<ActorTaskState>>();
+  readonly viewChangeRequestsSubject = new Subject<ViewChangeRequest>();
 
   constructor(public webClient: GlicWebClient, windowProxy: WindowProxy) {
     // TODO(harringtond): Ideally, we could ensure we only process requests from
@@ -747,6 +748,10 @@
     return this.hostCapabilities;
   }
 
+  getViewChangeRequests(): Observable<ViewChangeRequest> {
+    return this.viewChangeRequestsSubject;
+  }
+
   onViewChanged(notification: ViewChangedNotification) {
     this.sender.requestNoResponse('glicBrowserOnViewChanged', {notification});
   }
diff --git a/chrome/browser/resources/glic/observable.ts b/chrome/browser/resources/glic/observable.ts
index 16cb739..14c88a9f 100644
--- a/chrome/browser/resources/glic/observable.ts
+++ b/chrome/browser/resources/glic/observable.ts
@@ -132,3 +132,34 @@
     return resultValue;
   }
 }
+
+/**
+ * A simple observable with no memory of previous values.
+ */
+export class Subject<T> {
+  private subscribers: Set<ObservableSubscription<T>> = new Set();
+
+  subscribe(change: (newValue: T) => void): Subscriber {
+    const newSub =
+        new ObservableSubscription(change, this.onUnsubscribe.bind(this));
+    this.subscribers.add(newSub);
+    return newSub;
+  }
+
+  next(v: T) {
+    this.subscribers.forEach((sub) => {
+      // Ignore if removed since forEach was called.
+      if (this.subscribers.has(sub)) {
+        try {
+          sub.onChange(v);
+        } catch (e) {
+          console.warn(e);
+        }
+      }
+    });
+  }
+
+  private onUnsubscribe(sub: ObservableSubscription<T>) {
+    this.subscribers.delete(sub);
+  }
+}
diff --git a/chrome/browser/resources/new_tab_page/composebox/composebox.ts b/chrome/browser/resources/new_tab_page/composebox/composebox.ts
index 0b6b8e5..e97351cc 100644
--- a/chrome/browser/resources/new_tab_page/composebox/composebox.ts
+++ b/chrome/browser/resources/new_tab_page/composebox/composebox.ts
@@ -51,6 +51,17 @@
   ],
 ]);
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+const enum ComposeboxFileValidationError {
+  NONE = 0,
+  TOO_MANY_FILES = 1,
+  FILE_EMPTY = 2,
+  FILE_SIZE_TOO_LARGE = 3,
+  MAX_VALUE = FILE_SIZE_TOO_LARGE,
+}
+
+
 export class ComposeboxElement extends I18nMixinLit
 (CrLitElement) {
   static get is() {
@@ -206,6 +217,8 @@
     if ((changedProperties as Map<PropertyKey, unknown>)
             .has('showErrorScrim_') &&
         this.showErrorScrim_) {
+      const announcer = getAnnouncerInstance();
+      announcer.announce(this.errorMessage_);
       const dismissErrorButton =
           this.shadowRoot.querySelector<HTMLElement>('#dismissErrorButton');
       if (dismissErrorButton) {
@@ -249,16 +262,23 @@
     const files = input.files;
     if (!files || files.length === 0 ||
         this.files_.size >= this.maxFileCount_) {
+      this.recordFileValidationMetric_(
+          ComposeboxFileValidationError.TOO_MANY_FILES);
       return;
     }
 
     for (const file of files) {
       if (file.size === 0 || file.size > this.maxFileSize_) {
         this.showErrorScrim_ = true;
-        this.errorMessage_ = file.size === 0 ?
+        const fileIsEmpty = file.size === 0;
+        this.errorMessage_ = fileIsEmpty ?
             this.i18n('composeboxFileUploadInvalidEmptySize') :
             this.i18n('composeboxFileUploadInvalidTooLarge');
         input.value = '';
+        fileIsEmpty ? this.recordFileValidationMetric_(
+                          ComposeboxFileValidationError.FILE_EMPTY) :
+                      this.recordFileValidationMetric_(
+                          ComposeboxFileValidationError.FILE_SIZE_TOO_LARGE);
         return;
       } else {
         const fileBuffer = await file.arrayBuffer();
@@ -288,6 +308,7 @@
 
         const announcer = getAnnouncerInstance();
         announcer.announce(this.i18n('composeboxFileUploadStartedText'));
+        this.recordFileValidationMetric_(ComposeboxFileValidationError.NONE);
       }
     }
     // Clear the file input.
@@ -306,6 +327,7 @@
   protected onCancelClick_() {
     if (this.$.input.value.trim().length > 0 || this.files_.size > 0) {
       this.$.input.value = '';
+      this.input_ = '';
       this.files_ = new Map();
       this.submitEnabled_ = false;
       this.pageHandler_.clearFiles();
@@ -345,6 +367,13 @@
         e.ctrlKey, e.metaKey, e.shiftKey);
     this.submitting_ = true;
   }
+
+  private recordFileValidationMetric_(
+      enumValue: ComposeboxFileValidationError) {
+    chrome.metricsPrivate.recordEnumerationValue(
+        'NewTabPage.Composebox.File.WebUI.UploadAttemptFailure', enumValue,
+        ComposeboxFileValidationError.MAX_VALUE + 1);
+  }
 }
 
 declare global {
diff --git a/chrome/browser/resources/settings/glic_page/glic_subpage.html b/chrome/browser/resources/settings/glic_page/glic_subpage.html
index ffd1672..76ca1aa 100644
--- a/chrome/browser/resources/settings/glic_page/glic_subpage.html
+++ b/chrome/browser/resources/settings/glic_page/glic_subpage.html
@@ -244,6 +244,12 @@
           label="$i18n{glicActivityButton}"
           sub-label="$i18n{glicActivityButtonSublabel}" external>
       </cr-link-row>
+      <cr-link-row id="extensionsButton"
+          hidden="[[!glicExtensionsFeatureEnabled_]]"
+          on-click="onExtensionsRowClick_"
+          label="$i18n{glicExtensionsButton}"
+          sub-label="$i18n{glicExtensionsButtonSublabel}" external>
+      </cr-link-row>
     </template>
   </div>
 </settings-subpage>
diff --git a/chrome/browser/resources/settings/glic_page/glic_subpage.ts b/chrome/browser/resources/settings/glic_page/glic_subpage.ts
index 7c718b78..bf63bbaf 100644
--- a/chrome/browser/resources/settings/glic_page/glic_subpage.ts
+++ b/chrome/browser/resources/settings/glic_page/glic_subpage.ts
@@ -110,6 +110,13 @@
         },
       },
 
+      glicExtensionsFeatureEnabled_: {
+        type: Boolean,
+        value: () => {
+          return loadTimeData.getBoolean('glicExtensionsFeatureEnabled');
+        },
+      },
+
       glicUserStatusCheckFeatureEnabled_: {
         type: Boolean,
         value: () =>
@@ -172,6 +179,7 @@
       MetricsBrowserProxyImpl.getInstance();
   declare private tabAccessToggleExpanded_: boolean;
   declare private closedCaptionsFeatureEnabled_: boolean;
+  declare private glicExtensionsFeatureEnabled_: boolean;
   declare private glicUserStatusCheckFeatureEnabled_: boolean;
   declare private locationSubLabel_: string;
   declare private locationLearnMoreUrl_: string;
@@ -305,6 +313,12 @@
         this.i18n('glicActivityButtonUrl'));
   }
 
+  private onExtensionsRowClick_() {
+    // TODO(crbug.com/434213151): Append url param when ready.
+    const url = new URL(this.i18n('glicExtensionsManagementUrl'));
+    OpenWindowProxyImpl.getInstance().openUrl(url.toString());
+  }
+
   private onShortcutsLearnMoreClick_() {
     this.metricsBrowserProxy_.recordAction(
         AiPageActions.GLIC_SHORTCUTS_LEARN_MORE_CLICKED);
diff --git a/chrome/browser/resources/settings/people_page/people_page.html b/chrome/browser/resources/settings/people_page/people_page.html
index 6ce7391..649c15f 100644
--- a/chrome/browser/resources/settings/people_page/people_page.html
+++ b/chrome/browser/resources/settings/people_page/people_page.html
@@ -69,7 +69,7 @@
       <div>
 <if expr="not is_chromeos">
         <template is="dom-if" if="[[shouldShowSyncAccountControl_(
-            syncStatus.syncSystemEnabled, syncStatus.signedInStatus)]]" restamp>
+            syncStatus.syncSystemEnabled)]]">
           <settings-sync-account-control
               sync-status="[[syncStatus]]"
               prefs="{{prefs}}"
@@ -81,72 +81,45 @@
                   "$i18n{peopleSignInPromptSecondaryWithNoAccount}">
           </settings-sync-account-control>
         </template>
+</if>
         <template is="dom-if" if="[[!shouldShowSyncAccountControl_(
             syncStatus.syncSystemEnabled, signinAllowed_)]]" restamp>
-          <template is="dom-if" if="[[!shouldLinkToAccountSettingsPage_(
-              syncStatus.signedInState)]]" restamp>
-            <div id="profile-row" class="cr-row first two-line"
-                actionable$="[[isProfileActionable_]]"
-                on-click="onProfileClick_">
-              <template is="dom-if" if="[[syncStatus]]">
-                <div id="profile-icon"
-                    style="background-image: [[getIconImageSet_(
-                        profileIconUrl_)]]">
-                </div>
-                <div class="flex cr-row-gap cr-padded-text text-elide">
-                  <span id="profile-name">[[profileName_]]</span>
-                </div>
-                <cr-icon-button class="subpage-arrow"
-                    aria-label="$i18n{editPerson}"
-                    aria-describedby="profile-name"
-                    aria-roledescription="$i18n{subpageArrowRoleDescription}">
-                </cr-icon-button>
-              </template>
-            </div>
-          </template>
-          <template is="dom-if" if="[[shouldLinkToAccountSettingsPage_(
-              syncStatus.signedInState)]]" restamp>
-            <cr-link-row id="account-subpage-row" on-click="onAccountClick_">
+          <div id="profile-row" class="cr-row first two-line"
+                  actionable$="[[isProfileActionable_]]"
+                  on-click="onProfileClick_">
+            <template is="dom-if" if="[[syncStatus]]">
               <div id="profile-icon"
                   style="background-image: [[getIconImageSet_(
-                      primaryAccountIconUrl_)]]">
+                      profileIconUrl_)]]">
               </div>
-              <div class="cr-row-gap cr-padded-text flex no-min-width">
-                <div id="account-name" class="text-elide">
-                  [[primaryAccountName_]]
-                </div>
-                <div id="account-email" class="secondary text-elide">
-                  [[primaryAccountEmail_]]
-                </div>
-              </div>
-            </cr-link-row>
-          </template>
-        </template> <!-- if="[[!shouldShowSyncAccountControl_()]]" -->
-</if>
-
+              <div class="flex cr-row-gap cr-padded-text text-elide">
+                <span id="profile-name">[[profileName_]]</span>
+<!-- When the user is signed-in, the settings-sync-account-control is always
+shown on non-ChromeOS platforms -->
 <if expr="is_chromeos">
-        <div id="profile-row" class="cr-row first two-line"
-            actionable$="[[isProfileActionable_]]" on-click="onProfileClick_">
-          <template is="dom-if" if="[[syncStatus]]">
-            <div id="profile-icon"
-                style="background-image: [[getIconImageSet_(
-                    profileIconUrl_)]]">
-            </div>
-            <div class="flex cr-row-gap cr-padded-text text-elide">
-              <span id="profile-name">[[profileName_]]</span>
-              <div class="secondary" hidden="[[!isSyncing_(
-                    syncStatus.signedInState)]]">
-                [[syncStatus.signedInUsername]]
-              </div>
-            </div>
-            <cr-icon-button class="icon-external"
-                id="profile-subpage-arrow"
-                hidden="[[!isProfileActionable_]]"
-                aria-label="$i18n{accountManagerSubMenuLabel}"
-                aria-describedby="profile-name"></cr-icon-button>
-          </template>
-        </div>
+                <div class="secondary" hidden="[[!isSyncing_(
+                      syncStatus.signedInState)]]">
+                  [[syncStatus.signedInUsername]]
+                </div>
 </if>
+              </div>
+<if expr="not is_chromeos">
+              <cr-icon-button class="subpage-arrow"
+                  aria-label="$i18n{editPerson}"
+                  aria-describedby="profile-name"
+                  aria-roledescription="$i18n{subpageArrowRoleDescription}">
+              </cr-icon-button>
+</if>
+<if expr="is_chromeos">
+              <cr-icon-button class="icon-external"
+                  id="profile-subpage-arrow"
+                  hidden="[[!isProfileActionable_]]"
+                  aria-label="$i18n{accountManagerSubMenuLabel}"
+                  aria-describedby="profile-name"></cr-icon-button>
+</if>
+            </template>
+          </div>
+        </template> <!-- if="[[!shouldShowSyncAccountControl_()]]" -->
 
         <cr-link-row id="sync-setup"
             label="$i18n{syncAndNonPersonalizedServices}"
@@ -165,11 +138,15 @@
               label="$i18n{profileNameAndPicture}"
               on-click="onProfileClick_" ></cr-link-row>
         </template>
+</if>
 
+<if expr="not is_chromeos">
         <cr-link-row id="importDataDialogTrigger"
             label="$i18n{importTitle}"
             on-click="onImportDataClick_"></cr-link-row>
+</if>
 
+<if expr="not is_chromeos">
         <template is="dom-if" if="[[isDasherlessProfile_]]">
           <div id="sync-not-allowed" class="cr-row continuation">
             <cr-icon id="info-icon" icon="cr:info-outline"></cr-icon>
diff --git a/chrome/browser/resources/settings/people_page/people_page.ts b/chrome/browser/resources/settings/people_page/people_page.ts
index 487d59c2..1297174 100644
--- a/chrome/browser/resources/settings/people_page/people_page.ts
+++ b/chrome/browser/resources/settings/people_page/people_page.ts
@@ -185,9 +185,6 @@
       },
 
       showSignoutDialog_: Boolean,
-      primaryAccountName_: String,
-      primaryAccountEmail_: String,
-      primaryAccountIconUrl_: String,
       // </if>
     };
   }
@@ -207,9 +204,6 @@
   declare private shouldShowAccountSettingsPage_: boolean;
   declare private showImportDataDialog_: boolean;
   declare private showSignoutDialog_: boolean;
-  declare private primaryAccountName_: string;
-  declare private primaryAccountEmail_: string;
-  declare private primaryAccountIconUrl_: string;
   // </if>
 
   private syncBrowserProxy_: SyncBrowserProxy =
@@ -242,10 +236,11 @@
         'sync-status-changed', this.handleSyncStatus_.bind(this));
 
     // <if expr="not is_chromeos">
-    this.syncBrowserProxy_.getStoredAccounts().then(
-        this.handleStoredAccounts_.bind(this));
-    this.addWebUiListener(
-        'stored-accounts-updated', this.handleStoredAccounts_.bind(this));
+    const handleStoredAccounts = (accounts: StoredAccount[]) => {
+      this.storedAccounts = accounts;
+    };
+    this.syncBrowserProxy_.getStoredAccounts().then(handleStoredAccounts);
+    this.addWebUiListener('stored-accounts-updated', handleStoredAccounts);
 
     this.addWebUiListener('sync-settings-saved', () => {
       this.$.toast.show();
@@ -311,10 +306,6 @@
    * Handler for when the sync state is pushed from the browser.
    */
   private handleSyncStatus_(syncStatus: SyncStatus) {
-    // <if expr="is_chromeos">
-    this.syncStatus = syncStatus;
-    // </if>
-    // <if expr="not is_chromeos">
     // Sign-in impressions should be recorded only if the sign-in promo is
     // shown. They should be recorder only once, the first time
     // |this.syncStatus| is set.
@@ -327,7 +318,6 @@
       // SyncAccountControl records the impressions user actions.
       chrome.metricsPrivate.recordUserAction('Signin_Impression_FromSettings');
     }
-    // </if>
   }
 
   // <if expr="not is_chromeos">
@@ -370,10 +360,6 @@
   }
 
   // <if expr="not is_chromeos">
-  private onAccountClick_() {
-    Router.getInstance().navigateTo(routes.ACCOUNT);
-  }
-
   private onImportDataClick_() {
     Router.getInstance().navigateTo(routes.IMPORT_DATA);
   }
@@ -382,33 +368,6 @@
     Router.getInstance().navigateToPreviousRoute();
     focusWithoutInk(this.$.importDataDialogTrigger);
   }
-
-  private shouldLinkToAccountSettingsPage_(): boolean {
-    return this.shouldShowAccountSettingsPage_ && !!this.syncStatus &&
-        this.syncStatus.signedInState === SignedInState.SIGNED_IN;
-  }
-
-  private shouldShowSyncAccountControl_(): boolean {
-    if (this.syncStatus === undefined) {
-      return false;
-    }
-    return !!this.syncStatus!.syncSystemEnabled && this.signinAllowed_ &&
-        !this.shouldLinkToAccountSettingsPage_();
-  }
-
-  private handleStoredAccounts_(accounts: StoredAccount[]) {
-    this.storedAccounts = accounts;
-
-    // The user might not have any GAIA accounts (e.g. signed out). In this case
-    // the link row to the account settings page does not exist, so there's
-    // nothing to do.
-    if (accounts.length === 0) {
-      return;
-    }
-    this.primaryAccountName_ = accounts[0].fullName!;
-    this.primaryAccountEmail_ = accounts[0].email;
-    this.primaryAccountIconUrl_ = accounts[0].avatarImage!;
-  }
   // </if>
 
   /**
@@ -420,6 +379,18 @@
     chrome.metricsPrivate.recordUserAction('ManageGoogleAccount_Clicked');
   }
 
+  private shouldShowSyncAccountControl_(): boolean {
+    // <if expr="is_chromeos">
+    return false;
+    // </if>
+    // <if expr="not is_chromeos">
+    if (this.syncStatus === undefined) {
+      return false;
+    }
+    return !!this.syncStatus!.syncSystemEnabled && this.signinAllowed_;
+    // </if>
+  }
+
   /**
    * @return A CSS image-set for multiple scale factors.
    */
@@ -446,9 +417,6 @@
               '#edit-profile' :
               '#profile-row .subpage-arrow');
     }
-    if (routes.ACCOUNT) {
-      map.set(routes.ACCOUNT.path, '#account-subpage-row');
-    }
     // </if>
     return map;
   }
@@ -475,7 +443,9 @@
         break;
       case 'account':
         assert(loadTimeData.getBoolean('replaceSyncPromosWithSignInPromos'));
-        triggerId = 'account-subpage-row';
+        // TODO(crbug.com/429139804): Replace with actual entry point once
+        // implemented.
+        triggerId = 'sync-setup';
         break;
         // </if>
     }
diff --git a/chrome/browser/smart_card/smart_card_reader_tracker_impl_unittest.cc b/chrome/browser/smart_card/smart_card_reader_tracker_impl_unittest.cc
index 797633c..cded7e3 100644
--- a/chrome/browser/smart_card/smart_card_reader_tracker_impl_unittest.cc
+++ b/chrome/browser/smart_card/smart_card_reader_tracker_impl_unittest.cc
@@ -4,14 +4,15 @@
 
 #include "chrome/browser/smart_card/smart_card_reader_tracker_impl.h"
 
+#include "base/run_loop.h"
 #include "base/test/task_environment.h"
 #include "base/test/test_future.h"
+#include "base/time/time_override.h"
 #include "content/browser/smart_card/mock_smart_card_context_factory.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/mojom/smart_card/smart_card.mojom.h"
 
-using base::test::InvokeFuture;
 using base::test::TestFuture;
 using content::MockSmartCardContextFactory;
 using device::mojom::SmartCardContext;
@@ -24,12 +25,11 @@
 using device::mojom::SmartCardStatusChangeResult;
 using device::mojom::SmartCardSuccess;
 
+using testing::_;
 using testing::ElementsAre;
 using testing::InSequence;
 using testing::StrictMock;
 using testing::UnorderedElementsAre;
-using testing::WithArg;
-using testing::WithArgs;
 
 // Used by Google Test to print human-readable error messages involving
 // ReaderInfo comparisons.
@@ -82,9 +82,6 @@
 
 namespace {
 
-using OptionalReaderList =
-    std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>;
-
 void ExpectUnaware(const SmartCardReaderStateIn& state_in) {
   // This is the only field expected to be set/true.
   EXPECT_TRUE(state_in.current_state->unaware);
@@ -140,30 +137,37 @@
   EXPECT_FALSE(state_flags.unpowered);
 }
 
-enum class ReaderState { kEmpty, kInUse, kUnknown };
+enum class StateFlags {
+  kEmpty,
+  kNowEmpty,
+  kInUse,
+  kNowUnknown,
+};
 
-enum class ReaderInfoState {
+enum class ReaderState {
   kEmpty,
   kInUse,
 };
 
 SmartCardReaderStateOutPtr CreateStateOut(std::string name,
-                                          ReaderState state,
-                                          bool changed = false,
+                                          StateFlags state,
                                           uint16_t event_count = 0,
                                           std::vector<uint8_t> atr = {}) {
   auto state_flags = SmartCardReaderStateFlags::New();
-  state_flags->changed = changed;
-
   switch (state) {
-    case ReaderState::kEmpty:
+    case StateFlags::kEmpty:
       state_flags->empty = true;
       break;
-    case ReaderState::kInUse:
+    case StateFlags::kNowEmpty:
+      state_flags->changed = true;
+      state_flags->empty = true;
+      break;
+    case StateFlags::kInUse:
       state_flags->present = true;
       state_flags->inuse = true;
       break;
-    case ReaderState::kUnknown:
+    case StateFlags::kNowUnknown:
+      state_flags->changed = true;
       state_flags->unknown = true;
       break;
   }
@@ -174,7 +178,7 @@
 
 SmartCardReaderTracker::ReaderInfo CreateReaderInfo(
     std::string name,
-    ReaderInfoState state,
+    ReaderState state,
     uint16_t event_count = 0,
     std::vector<uint8_t> atr = {}) {
   SmartCardReaderTracker::ReaderInfo info;
@@ -183,10 +187,10 @@
   info.answer_to_reset = std::move(atr);
 
   switch (state) {
-    case ReaderInfoState::kEmpty:
+    case ReaderState::kEmpty:
       info.empty = true;
       break;
-    case ReaderInfoState::kInUse:
+    case ReaderState::kInUse:
       info.present = true;
       info.inuse = true;
       break;
@@ -195,11 +199,10 @@
   return info;
 }
 
-template <typename... T>
 void ReportStateOut(SmartCardContext::GetStatusChangeCallback callback,
-                    T... states) {
+                    SmartCardReaderStateOutPtr s) {
   std::vector<SmartCardReaderStateOutPtr> states_out;
-  (states_out.push_back(std::move(states)), ...);
+  states_out.push_back(std::move(s));
 
   auto result =
       SmartCardStatusChangeResult::NewReaderStates(std::move(states_out));
@@ -207,6 +210,24 @@
   std::move(callback).Run(std::move(result));
 }
 
+void ReportStateOut(SmartCardContext::GetStatusChangeCallback callback,
+                    SmartCardReaderStateOutPtr s1,
+                    SmartCardReaderStateOutPtr s2) {
+  std::vector<SmartCardReaderStateOutPtr> states_out;
+  states_out.push_back(std::move(s1));
+  states_out.push_back(std::move(s2));
+
+  auto result =
+      SmartCardStatusChangeResult::NewReaderStates(std::move(states_out));
+
+  std::move(callback).Run(std::move(result));
+}
+
+class SmartCardReaderTrackerImplTest : public testing::Test {
+ protected:
+  base::test::TaskEnvironment task_environment_;
+};
+
 class MockTrackerObserver : public SmartCardReaderTracker::Observer {
  public:
   MOCK_METHOD(void,
@@ -222,126 +243,82 @@
   MOCK_METHOD(void, OnError, (SmartCardError error), (override));
 };
 
-class SmartCardReaderTrackerImplTest : public testing::Test {
- protected:
-  SmartCardReaderTrackerImplTest()
-      : tracker_(mock_context_factory_.GetRemote()) {}
-
-  base::test::TaskEnvironment task_environment_{
-      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
-  StrictMock<MockSmartCardContextFactory> mock_context_factory_;
-  SmartCardReaderTrackerImpl tracker_;
-  StrictMock<MockTrackerObserver> observer_;
-  TestFuture<void> context_disconnected_;
-};
-
-TEST_F(SmartCardReaderTrackerImplTest, CreateContextError) {
-  {
-    InSequence s;
-
-    mock_context_factory_.ExpectCreateContextError(SmartCardError::kNoService);
-
-    EXPECT_CALL(observer_, OnError(SmartCardError::kNoService));
-  }
-
-  TestFuture<OptionalReaderList> start_future;
-  tracker_.Start(&observer_, start_future.GetCallback());
-
-  OptionalReaderList readers = start_future.Take();
-  // This is treated as an error, no value should appear.
-  ASSERT_FALSE(readers.has_value());
-}
-
 TEST_F(SmartCardReaderTrackerImplTest, ListReadersError) {
+  StrictMock<MockSmartCardContextFactory> mock_context_factory;
+  SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote());
+  StrictMock<MockTrackerObserver> observer;
+  TestFuture<void> context_disconnected;
+
   {
     InSequence s;
 
-    EXPECT_CALL(mock_context_factory_, CreateContext);
-    mock_context_factory_.ExpectListReadersError(
-        SmartCardError::kInternalError);
+    mock_context_factory.ExpectListReadersError(SmartCardError::kInternalError);
 
-    EXPECT_CALL(observer_, OnError(SmartCardError::kInternalError));
+    EXPECT_CALL(observer, OnError(SmartCardError::kInternalError));
 
-    EXPECT_CALL(mock_context_factory_, ContextDisconnected())
-        .WillOnce(InvokeFuture(context_disconnected_));
-  }
-
-  TestFuture<OptionalReaderList> start_future;
-  tracker_.Start(&observer_, start_future.GetCallback());
-
-  OptionalReaderList readers = start_future.Take();
-  // This is treated as an error, no value should appear.
-  ASSERT_FALSE(readers.has_value());
-
-  ASSERT_TRUE(context_disconnected_.Wait());
-}
-
-TEST_F(SmartCardReaderTrackerImplTest,
-       GetStatusChangeErrorInWaitInitialReaderStatus) {
-  {
-    InSequence s;
-
-    EXPECT_CALL(mock_context_factory_, CreateContext);
-    mock_context_factory_.ExpectListReaders({"Reader A"});
-
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
+    EXPECT_CALL(mock_context_factory, ContextDisconnected())
         .WillOnce(
-            WithArg<2>([](SmartCardContext::GetStatusChangeCallback callback) {
-              std::move(callback).Run(SmartCardStatusChangeResult::NewError(
-                  SmartCardError::kNoService));
-            }));
-
-    EXPECT_CALL(observer_, OnError(SmartCardError::kNoService));
-
-    EXPECT_CALL(mock_context_factory_, ContextDisconnected)
-        .WillOnce(InvokeFuture(context_disconnected_));
+            [&context_disconnected]() { context_disconnected.SetValue(); });
   }
 
-  TestFuture<OptionalReaderList> start_future;
-  tracker_.Start(&observer_, start_future.GetCallback());
+  TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>>
+      start_future;
+  tracker.Start(&observer, start_future.GetCallback());
 
-  OptionalReaderList readers = start_future.Take();
+  std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>> readers =
+      start_future.Take();
   // This is treated as an error, no value should appear.
   ASSERT_FALSE(readers.has_value());
 
-  ASSERT_TRUE(context_disconnected_.Wait());
+  ASSERT_TRUE(context_disconnected.Wait());
 }
 
 TEST_F(SmartCardReaderTrackerImplTest, NoReaders) {
+  StrictMock<MockSmartCardContextFactory> mock_context_factory;
+  SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote());
+  StrictMock<MockTrackerObserver> observer;
+  TestFuture<void> context_disconnected;
+
   {
     InSequence s;
 
-    EXPECT_CALL(mock_context_factory_, CreateContext);
-    mock_context_factory_.ExpectListReadersError(
+    mock_context_factory.ExpectListReadersError(
         SmartCardError::kNoReadersAvailable);
 
-    EXPECT_CALL(mock_context_factory_, ContextDisconnected())
-        .WillOnce(InvokeFuture(context_disconnected_));
+    EXPECT_CALL(mock_context_factory, ContextDisconnected())
+        .WillOnce(
+            [&context_disconnected]() { context_disconnected.SetValue(); });
   }
 
-  TestFuture<OptionalReaderList> start_future;
-  tracker_.Start(&observer_, start_future.GetCallback());
+  TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>>
+      start_future;
+  tracker.Start(&observer, start_future.GetCallback());
 
-  OptionalReaderList readers = start_future.Take();
+  std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>> readers =
+      start_future.Take();
   // This is not treated as an error, should yield empty list.
   ASSERT_TRUE(readers.has_value());
   EXPECT_TRUE(readers->empty());
 
-  ASSERT_TRUE(context_disconnected_.Wait());
+  ASSERT_TRUE(context_disconnected.Wait());
 }
 
 TEST_F(SmartCardReaderTrackerImplTest, ReaderChanged) {
+  MockSmartCardContextFactory mock_context_factory;
+  SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote());
+  StrictMock<MockTrackerObserver> observer;
+
   {
     InSequence s;
 
-    EXPECT_CALL(mock_context_factory_, CreateContext);
     // Request what readers are currently available.
-    mock_context_factory_.ExpectListReaders({"Reader A", "Reader B"});
+    mock_context_factory.ExpectListReaders({"Reader A", "Reader B"});
 
     // Request the state of each of those readers.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
-            [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
+    EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _))
+        .WillOnce(
+            [](base::TimeDelta timeout,
+               std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
                SmartCardContext::GetStatusChangeCallback callback) {
               ASSERT_EQ(states_in.size(), 2U);
 
@@ -353,19 +330,19 @@
 
               ReportStateOut(
                   std::move(callback),
-                  CreateStateOut("Reader A", ReaderState::kEmpty),
-                  CreateStateOut("Reader B", ReaderState::kInUse,
-                                 /*changed=*/false,
+                  CreateStateOut("Reader A", StateFlags::kEmpty),
+                  CreateStateOut("Reader B", StateFlags::kInUse,
                                  /*event_count=*/1,
                                  std::vector<uint8_t>({1u, 2u, 3u, 4u})));
-            }));
+            });
 
     // Request to be notified of state changes on those readers.
     // SmartCardContext reports that "Reader B" has changed (card was removed,
     // thus it's now empty).
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
-            [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
+    EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _))
+        .WillOnce(
+            [](base::TimeDelta timeout,
+               std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
                SmartCardContext::GetStatusChangeCallback callback) {
               ASSERT_EQ(states_in.size(), 2U);
 
@@ -378,29 +355,29 @@
               EXPECT_EQ(states_in[1]->current_count, 1);
 
               ReportStateOut(std::move(callback),
-                             CreateStateOut("Reader A", ReaderState::kEmpty),
+                             CreateStateOut("Reader A", StateFlags::kEmpty),
                              // Reader B has changed. It's now empty as well.
-                             CreateStateOut("Reader B", ReaderState::kEmpty,
-                                            /*changed=*/true,
+                             CreateStateOut("Reader B", StateFlags::kNowEmpty,
                                             /*event_count=*/2));
-            }));
+            });
 
-    EXPECT_CALL(observer_, OnReaderChanged(CreateReaderInfo(
-                               "Reader B", ReaderInfoState::kEmpty,
-                               /*event_count=*/2, {})));
+    EXPECT_CALL(observer, OnReaderChanged(
+                              CreateReaderInfo("Reader B", ReaderState::kEmpty,
+                                               /*event_count=*/2, {})));
 
     ////
     // Now rinse and repeat
 
     // Request what readers are currently available.
     // Still the same readers.
-    mock_context_factory_.ExpectListReaders({"Reader A", "Reader B"});
+    mock_context_factory.ExpectListReaders({"Reader A", "Reader B"});
 
     // Since ListReaders did not return any reader unknown to the tracker,
     // it will now skip to waiting to be notified on any changes.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
-            [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
+    EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _))
+        .WillOnce(
+            [](base::TimeDelta timeout,
+               std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
                SmartCardContext::GetStatusChangeCallback callback) {
               ASSERT_EQ(states_in.size(), 2U);
 
@@ -421,155 +398,55 @@
               // this test.
               std::move(callback).Run(SmartCardStatusChangeResult::NewError(
                   SmartCardError::kNoService));
-            }));
+            });
 
-    EXPECT_CALL(observer_, OnError(SmartCardError::kNoService));
+    EXPECT_CALL(observer, OnError(SmartCardError::kNoService));
 
     // This unrecoverable failure should cause the tracker to drop its smart
     // card context and stop tracking.
-    EXPECT_CALL(mock_context_factory_, ContextDisconnected())
-        .WillOnce(InvokeFuture(context_disconnected_));
+    EXPECT_CALL(mock_context_factory, ContextDisconnected());
   }
 
-  TestFuture<OptionalReaderList> start_future;
-  tracker_.Start(&observer_, start_future.GetCallback());
+  TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>>
+      start_future;
+  tracker.Start(&observer, start_future.GetCallback());
 
-  OptionalReaderList readers = start_future.Take();
+  std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>> readers =
+      start_future.Take();
   ASSERT_TRUE(readers.has_value());
 
   EXPECT_THAT(*readers,
               UnorderedElementsAre(
-                  CreateReaderInfo("Reader A", ReaderInfoState::kEmpty),
-                  CreateReaderInfo("Reader B", ReaderInfoState::kInUse,
+                  CreateReaderInfo("Reader A", ReaderState::kEmpty),
+                  CreateReaderInfo("Reader B", ReaderState::kInUse,
                                    /*event_count=*/1,
                                    std::vector<uint8_t>({1u, 2u, 3u, 4u}))));
 
-  ASSERT_TRUE(context_disconnected_.Wait());
-}
-
-// Test that if Start() is called while tracking is already taking place,
-// and kMinRefreshInterval has NOT elapsed since tracking has started,
-// the tracker just fulfills the request from the cache without
-// restarting the tracking.
-TEST_F(SmartCardReaderTrackerImplTest, DontRestart) {
-  TestFuture<SmartCardContext::GetStatusChangeCallback>
-      tracking_get_status_callback;
-
-  {
-    InSequence s;
-
-    EXPECT_CALL(mock_context_factory_, CreateContext);
-    // Request what readers are currently available.
-    mock_context_factory_.ExpectListReaders({"Reader A", "Reader B"});
-
-    // Request the state of each of those readers.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
-            [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
-               SmartCardContext::GetStatusChangeCallback callback) {
-              ASSERT_EQ(states_in.size(), 2U);
-              ASSERT_EQ(states_in[0]->reader, "Reader A");
-              ExpectUnaware(*states_in[0]);
-
-              ASSERT_EQ(states_in[1]->reader, "Reader B");
-              ExpectUnaware(*states_in[1]);
-
-              ReportStateOut(
-                  std::move(callback),
-                  CreateStateOut("Reader A", ReaderState::kEmpty),
-                  CreateStateOut("Reader B", ReaderState::kInUse,
-                                 /*changed=*/false,
-                                 /*event_count=*/1,
-                                 std::vector<uint8_t>({1u, 2u, 3u, 4u})));
-            }));
-
-    // Request to be notified of state changes on those readers.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
-            [&tracking_get_status_callback](
-                std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
-                SmartCardContext::GetStatusChangeCallback callback) {
-              ASSERT_EQ(states_in.size(), 2U);
-
-              EXPECT_EQ(states_in[0]->reader, "Reader A");
-              ExpectEmpty(*states_in[0]->current_state);
-              EXPECT_EQ(states_in[0]->current_count, 0);
-
-              EXPECT_EQ(states_in[1]->reader, "Reader B");
-              ExpectInUse(*states_in[1]->current_state);
-              EXPECT_EQ(states_in[1]->current_count, 1);
-
-              tracking_get_status_callback.SetValue(std::move(callback));
-            }));
-
-    // The error given to the GetStatusChange() call at the end of the test to
-    // finish it.
-    EXPECT_CALL(observer_, OnError(SmartCardError::kNoService));
-
-    // This unrecoverable failure should cause the tracker to drop its smart
-    // card context and stop tracking.
-    EXPECT_CALL(mock_context_factory_, ContextDisconnected())
-        .WillOnce(InvokeFuture(context_disconnected_));
-  }
-
-  TestFuture<OptionalReaderList> start_future;
-  // The first start() call, at t0.
-  tracker_.Start(&observer_, start_future.GetCallback());
-
-  OptionalReaderList readers = start_future.Take();
-  ASSERT_TRUE(readers.has_value());
-  EXPECT_THAT(*readers,
-              UnorderedElementsAre(
-                  CreateReaderInfo("Reader A", ReaderInfoState::kEmpty),
-                  CreateReaderInfo("Reader B", ReaderInfoState::kInUse,
-                                   /*event_count=*/1,
-                                   std::vector<uint8_t>({1u, 2u, 3u, 4u}))));
-
-  // Wait until SmartCardReaderTracerImpl is in the Tracking state, waiting
-  // for the GetStatusChange() call result.
-  ASSERT_TRUE(tracking_get_status_callback.Wait());
-
-  start_future.Clear();
-  readers.reset();
-
-  // The second start() call seemingly without progress in time.
-  // Will just fulfill the request from the cache without restarting tracking.
-  tracker_.Start(&observer_, start_future.GetCallback());
-
-  readers = start_future.Take();
-  ASSERT_TRUE(readers.has_value());
-  EXPECT_THAT(*readers,
-              UnorderedElementsAre(
-                  CreateReaderInfo("Reader A", ReaderInfoState::kEmpty),
-                  CreateReaderInfo("Reader B", ReaderInfoState::kInUse,
-                                   /*event_count=*/1,
-                                   std::vector<uint8_t>({1u, 2u, 3u, 4u}))));
-
-  // End the test by simulating an error on the outstanding GetStatusChange.
-  tracking_get_status_callback.Take().Run(
-      SmartCardStatusChangeResult::NewError(SmartCardError::kNoService));
-
-  ASSERT_TRUE(context_disconnected_.Wait());
+  base::RunLoop run_loop;
+  run_loop.RunUntilIdle();
 }
 
 // If Start() is called while tracking is already taking place and
 // kMinRefreshInterval has elapsed since tracking has started, it should cause
 // tracking to be restarted. ie, a new list of readers being fetched, etc.
 TEST_F(SmartCardReaderTrackerImplTest, Restart) {
+  MockSmartCardContextFactory mock_context_factory;
+  SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote());
   TestFuture<SmartCardContext::GetStatusChangeCallback>
       tracking_get_status_callback;
+  StrictMock<MockTrackerObserver> observer;
 
   {
     InSequence s;
 
-    EXPECT_CALL(mock_context_factory_, CreateContext);
     // Request what readers are currently available.
-    mock_context_factory_.ExpectListReaders({"Reader A", "Reader B"});
+    mock_context_factory.ExpectListReaders({"Reader A", "Reader B"});
 
     // Request the state of each of those readers.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
-            [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
+    EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _))
+        .WillOnce(
+            [](base::TimeDelta timeout,
+               std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
                SmartCardContext::GetStatusChangeCallback callback) {
               ASSERT_EQ(states_in.size(), 2U);
               ASSERT_EQ(states_in[0]->reader, "Reader A");
@@ -580,17 +457,17 @@
 
               ReportStateOut(
                   std::move(callback),
-                  CreateStateOut("Reader A", ReaderState::kEmpty),
-                  CreateStateOut("Reader B", ReaderState::kInUse,
-                                 /*changed=*/false,
+                  CreateStateOut("Reader A", StateFlags::kEmpty),
+                  CreateStateOut("Reader B", StateFlags::kInUse,
                                  /*event_count=*/1,
                                  std::vector<uint8_t>({1u, 2u, 3u, 4u})));
-            }));
+            });
 
     // Request to be notified of state changes on those readers.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
+    EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _))
+        .WillOnce(
             [&tracking_get_status_callback](
+                base::TimeDelta timeout,
                 std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
                 SmartCardContext::GetStatusChangeCallback callback) {
               ASSERT_EQ(states_in.size(), 2U);
@@ -605,9 +482,9 @@
 
               // Handle that in the upcoming Cancel() call.
               tracking_get_status_callback.SetValue(std::move(callback));
-            }));
+            });
 
-    EXPECT_CALL(mock_context_factory_, Cancel)
+    EXPECT_CALL(mock_context_factory, Cancel(_))
         .WillOnce([&tracking_get_status_callback](
                       SmartCardContext::CancelCallback callback) {
           // The cancel call succeeded.
@@ -626,13 +503,14 @@
 
     // Request what readers are currently available.
     // Still the same readers.
-    mock_context_factory_.ExpectListReaders({"Reader A", "Reader B"});
+    mock_context_factory.ExpectListReaders({"Reader A", "Reader B"});
 
     // Since ListReaders did not return any reader unknown to the tracker,
     // it will now skip to waiting to be notified on any changes.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
-            [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
+    EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _))
+        .WillOnce(
+            [](base::TimeDelta timeout,
+               std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
                SmartCardContext::GetStatusChangeCallback callback) {
               ASSERT_EQ(states_in.size(), 2U);
 
@@ -652,85 +530,105 @@
               std::move(callback).Run(
                   device::mojom::SmartCardStatusChangeResult::NewError(
                       SmartCardError::kNoService));
-            }));
+            });
 
     // The error given by the last GetStatusChange() call.
-    EXPECT_CALL(observer_, OnError(SmartCardError::kNoService));
+    EXPECT_CALL(observer, OnError(SmartCardError::kNoService));
 
     // This unrecoverable failure should cause the tracker to drop its smart
     // card context and stop tracking.
-    EXPECT_CALL(mock_context_factory_, ContextDisconnected())
-        .WillOnce(InvokeFuture(context_disconnected_));
+    EXPECT_CALL(mock_context_factory, ContextDisconnected());
   }
 
-  TestFuture<OptionalReaderList> start_future;
-  // The first start() call, at t0.
-  tracker_.Start(&observer_, start_future.GetCallback());
+  {
+    base::subtle::ScopedTimeClockOverrides time_override(
+        []() { return base::Time::FromSecondsSinceUnixEpoch(0); }, nullptr,
+        nullptr);
 
-  OptionalReaderList readers = start_future.Take();
-  ASSERT_TRUE(readers.has_value());
-  EXPECT_THAT(*readers,
-              UnorderedElementsAre(
-                  CreateReaderInfo("Reader A", ReaderInfoState::kEmpty),
-                  CreateReaderInfo("Reader B", ReaderInfoState::kInUse,
-                                   /*event_count=*/1,
-                                   std::vector<uint8_t>({1u, 2u, 3u, 4u}))));
+    TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>>
+        start_future;
+    // The first start() call, at t0.
+    tracker.Start(&observer, start_future.GetCallback());
+
+    std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>> readers =
+        start_future.Take();
+    ASSERT_TRUE(readers.has_value());
+    EXPECT_THAT(*readers,
+                UnorderedElementsAre(
+                    CreateReaderInfo("Reader A", ReaderState::kEmpty),
+                    CreateReaderInfo("Reader B", ReaderState::kInUse,
+                                     /*event_count=*/1,
+                                     std::vector<uint8_t>({1u, 2u, 3u, 4u}))));
+  }
 
   // Wait until SmartCardReaderTracerImpl is in the Tracking state, waiting
   // for the GetStatusChange() call result.
   ASSERT_TRUE(tracking_get_status_callback.Wait());
-  task_environment_.FastForwardBy(
-      SmartCardReaderTrackerImpl::kMinRefreshInterval);
 
-  start_future.Clear();
-  readers.reset();
-  // The second start() call at t0 + kMinRefreshInterval.
-  // Will make the tracker cancel the currently outstanding GetStatusChange()
-  // request and restart from the ListReaders() call.
-  tracker_.Start(&observer_, start_future.GetCallback());
+  {
+    base::subtle::ScopedTimeClockOverrides time_override(
+        []() {
+          return base::Time::FromSecondsSinceUnixEpoch(
+              SmartCardReaderTrackerImpl::kMinRefreshInterval.InSecondsF() * 2);
+        },
+        nullptr, nullptr);
 
-  readers = start_future.Take();
-  ASSERT_TRUE(readers.has_value());
-  EXPECT_THAT(*readers,
-              UnorderedElementsAre(
-                  CreateReaderInfo("Reader A", ReaderInfoState::kEmpty),
-                  CreateReaderInfo("Reader B", ReaderInfoState::kInUse,
-                                   /*event_count=*/1,
-                                   std::vector<uint8_t>({1u, 2u, 3u, 4u}))));
+    TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>>
+        start_future;
+    // The second start() call at t0 + (kMinRefreshInterval*2).
+    // Will make the tracker cancel the currently outstanding GetStatusChange()
+    // request and restart from the ListReaders() call.
+    tracker.Start(&observer, start_future.GetCallback());
 
-  ASSERT_TRUE(context_disconnected_.Wait());
+    std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>> readers =
+        start_future.Take();
+    ASSERT_TRUE(readers.has_value());
+    EXPECT_THAT(*readers,
+                UnorderedElementsAre(
+                    CreateReaderInfo("Reader A", ReaderState::kEmpty),
+                    CreateReaderInfo("Reader B", ReaderState::kInUse,
+                                     /*event_count=*/1,
+                                     std::vector<uint8_t>({1u, 2u, 3u, 4u}))));
+  }
+
+  base::RunLoop run_loop;
+  run_loop.RunUntilIdle();
 }
 
 // Test that tracker will cancel its outstanding GetStatusChange() request and
 // stop tracking when the last observer leaves.
 TEST_F(SmartCardReaderTrackerImplTest, StopWhenTracking) {
+  MockSmartCardContextFactory mock_context_factory;
+  SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote());
   TestFuture<SmartCardContext::GetStatusChangeCallback>
       tracking_get_status_callback;
+  StrictMock<MockTrackerObserver> observer;
 
   {
     InSequence s;
 
-    EXPECT_CALL(mock_context_factory_, CreateContext);
     // Request what readers are currently available.
-    mock_context_factory_.ExpectListReaders({"Reader A"});
+    mock_context_factory.ExpectListReaders({"Reader A"});
 
     // Request the state of each of those readers.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
-            [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
+    EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _))
+        .WillOnce(
+            [](base::TimeDelta timeout,
+               std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
                SmartCardContext::GetStatusChangeCallback callback) {
               ASSERT_EQ(states_in.size(), 1U);
               ASSERT_EQ(states_in[0]->reader, "Reader A");
               ExpectUnaware(*states_in[0]);
 
               ReportStateOut(std::move(callback),
-                             CreateStateOut("Reader A", ReaderState::kEmpty));
-            }));
+                             CreateStateOut("Reader A", StateFlags::kEmpty));
+            });
 
     // Request to be notified of state changes on those readers.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
+    EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _))
+        .WillOnce(
             [&tracking_get_status_callback](
+                base::TimeDelta timeout,
                 std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
                 SmartCardContext::GetStatusChangeCallback callback) {
               ASSERT_EQ(states_in.size(), 1U);
@@ -741,11 +639,11 @@
 
               // Handle that in the upcoming Cancel() call.
               tracking_get_status_callback.SetValue(std::move(callback));
-            }));
+            });
 
     // When tracker.Stop() is called, the tracker should cancel the outstanding
     // GetStatusChange() request.
-    EXPECT_CALL(mock_context_factory_, Cancel)
+    EXPECT_CALL(mock_context_factory, Cancel(_))
         .WillOnce([&tracking_get_status_callback](
                       SmartCardContext::CancelCallback callback) {
           // The cancel call succeeded.
@@ -761,14 +659,14 @@
 
     // Tracker should then drop its smart card context as it will no longer
     // track readers.
-    EXPECT_CALL(mock_context_factory_, ContextDisconnected())
-        .WillOnce(InvokeFuture(context_disconnected_));
+    EXPECT_CALL(mock_context_factory, ContextDisconnected());
   }
 
   // Start()
   {
-    TestFuture<OptionalReaderList> start_future;
-    tracker_.Start(&observer_, start_future.GetCallback());
+    TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>>
+        start_future;
+    tracker.Start(&observer, start_future.GetCallback());
     ASSERT_TRUE(start_future.Wait());
   }
 
@@ -777,36 +675,42 @@
   ASSERT_TRUE(tracking_get_status_callback.Wait());
 
   // Then Stop()
-  tracker_.Stop(&observer_);
+  tracker.Stop(&observer);
 
-  ASSERT_TRUE(context_disconnected_.Wait());
+  base::RunLoop run_loop;
+  run_loop.RunUntilIdle();
 }
 
 TEST_F(SmartCardReaderTrackerImplTest, ReaderRemoved) {
+  MockSmartCardContextFactory mock_context_factory;
+  SmartCardReaderTrackerImpl tracker(mock_context_factory.GetRemote());
+  StrictMock<MockTrackerObserver> observer;
+
   {
     InSequence s;
 
-    EXPECT_CALL(mock_context_factory_, CreateContext);
     // Request what readers are currently available.
-    mock_context_factory_.ExpectListReaders({"Reader A"});
+    mock_context_factory.ExpectListReaders({"Reader A"});
 
     // Request the state of each of those readers.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
-            [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
+    EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _))
+        .WillOnce(
+            [](base::TimeDelta timeout,
+               std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
                SmartCardContext::GetStatusChangeCallback callback) {
               ASSERT_EQ(states_in.size(), 1U);
               ASSERT_EQ(states_in[0]->reader, "Reader A");
               ExpectUnaware(*states_in[0]);
 
               ReportStateOut(std::move(callback),
-                             CreateStateOut("Reader A", ReaderState::kEmpty));
-            }));
+                             CreateStateOut("Reader A", StateFlags::kEmpty));
+            });
 
     // Request to be notified of state changes on those readers.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(WithArgs<1, 2>(
-            [](std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
+    EXPECT_CALL(mock_context_factory, GetStatusChange(_, _, _))
+        .WillOnce(
+            [](base::TimeDelta timeout,
+               std::vector<device::mojom::SmartCardReaderStateInPtr> states_in,
                SmartCardContext::GetStatusChangeCallback callback) {
               ASSERT_EQ(states_in.size(), 1U);
 
@@ -815,134 +719,29 @@
               EXPECT_EQ(states_in[0]->current_count, 0);
 
               // Reader A has been removed. It's now unknown.
-              ReportStateOut(std::move(callback),
-                             CreateStateOut("Reader A", ReaderState::kUnknown,
-                                            /*changed=*/true));
-            }));
+              ReportStateOut(
+                  std::move(callback),
+                  CreateStateOut("Reader A", StateFlags::kNowUnknown));
+            });
 
     // Tracker will notify observers about this removal.
-    EXPECT_CALL(observer_, OnReaderRemoved("Reader A"));
+    EXPECT_CALL(observer, OnReaderRemoved("Reader A"));
 
     // As there are no readers left, tracker should stop on its own and drop its
     // smart card context.
-    EXPECT_CALL(mock_context_factory_, ContextDisconnected())
-        .WillOnce(InvokeFuture(context_disconnected_));
+    EXPECT_CALL(mock_context_factory, ContextDisconnected());
   }
 
   // Start()
   {
-    TestFuture<OptionalReaderList> start_future;
-    tracker_.Start(&observer_, start_future.GetCallback());
+    TestFuture<std::optional<std::vector<SmartCardReaderTracker::ReaderInfo>>>
+        start_future;
+    tracker.Start(&observer, start_future.GetCallback());
     ASSERT_TRUE(start_future.Wait());
   }
 
-  ASSERT_TRUE(context_disconnected_.Wait());
-}
-
-TEST_F(SmartCardReaderTrackerImplTest, GetStatusChangeTimeoutInTracking) {
-  {
-    InSequence s;
-
-    EXPECT_CALL(mock_context_factory_, CreateContext);
-    // Initial setup
-    mock_context_factory_.ExpectListReaders({"Reader A"});
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(
-            WithArg<2>([](SmartCardContext::GetStatusChangeCallback callback) {
-              ReportStateOut(std::move(callback),
-                             CreateStateOut("Reader A", ReaderState::kEmpty));
-            }));
-
-    // In Tracking state, GetStatusChange times out.
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(
-            WithArg<2>([](SmartCardContext::GetStatusChangeCallback callback) {
-              std::move(callback).Run(SmartCardStatusChangeResult::NewError(
-                  SmartCardError::kTimeout));
-            }));
-
-    // After timeout, tracker should try to ListReaders again.
-    // This time we return an error to end the test.
-    mock_context_factory_.ExpectListReadersError(SmartCardError::kNoService);
-
-    EXPECT_CALL(observer_, OnError(SmartCardError::kNoService));
-
-    EXPECT_CALL(mock_context_factory_, ContextDisconnected())
-        .WillOnce(InvokeFuture(context_disconnected_));
-  }
-
-  TestFuture<OptionalReaderList> start_future;
-  tracker_.Start(&observer_, start_future.GetCallback());
-
-  ASSERT_TRUE(start_future.Wait());
-  ASSERT_TRUE(context_disconnected_.Wait());
-}
-
-TEST_F(SmartCardReaderTrackerImplTest, CancelFailedInTracking) {
-  TestFuture<SmartCardContext::GetStatusChangeCallback>
-      tracking_get_status_callback;
-
-  {
-    InSequence s;
-
-    EXPECT_CALL(mock_context_factory_, CreateContext);
-    // Initial setup
-    mock_context_factory_.ExpectListReaders({"Reader A"});
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(
-            WithArg<2>([](SmartCardContext::GetStatusChangeCallback callback) {
-              ReportStateOut(std::move(callback),
-                             CreateStateOut("Reader A", ReaderState::kEmpty));
-            }));
-
-    // In Tracking state
-    EXPECT_CALL(mock_context_factory_, GetStatusChange)
-        .WillOnce(
-            WithArg<2>([&tracking_get_status_callback](
-                           SmartCardContext::GetStatusChangeCallback callback) {
-              tracking_get_status_callback.SetValue(std::move(callback));
-            }));
-
-    // Cancel fails
-    EXPECT_CALL(mock_context_factory_, Cancel)
-        .WillOnce([](SmartCardContext::CancelCallback callback) {
-          std::move(callback).Run(
-              SmartCardResult::NewError(SmartCardError::kInternalError));
-        });
-
-    // GetStatusChange finally returns with an error to end the test.
-    EXPECT_CALL(observer_, OnError(SmartCardError::kNoService));
-    EXPECT_CALL(mock_context_factory_, ContextDisconnected())
-        .WillOnce(InvokeFuture(context_disconnected_));
-  }
-
-  TestFuture<OptionalReaderList> start_future;
-  tracker_.Start(&observer_, start_future.GetCallback());
-  OptionalReaderList readers = start_future.Take();
-  ASSERT_TRUE(readers.has_value());
-  EXPECT_THAT(*readers, ElementsAre(CreateReaderInfo("Reader A",
-                                                     ReaderInfoState::kEmpty)));
-
-  // Tracking state
-  ASSERT_TRUE(tracking_get_status_callback.Wait());
-  task_environment_.FastForwardBy(
-      SmartCardReaderTrackerImpl::kMinRefreshInterval);
-
-  start_future.Clear();
-  readers.reset();
-
-  tracker_.Start(&observer_, start_future.GetCallback());
-  // Should be fulfilled from cache
-  readers = start_future.Take();
-  ASSERT_TRUE(readers.has_value());
-  EXPECT_THAT(*readers, ElementsAre(CreateReaderInfo("Reader A",
-                                                     ReaderInfoState::kEmpty)));
-
-  // End test by forcing error.
-  tracking_get_status_callback.Take().Run(
-      SmartCardStatusChangeResult::NewError(SmartCardError::kNoService));
-
-  ASSERT_TRUE(context_disconnected_.Wait());
+  base::RunLoop run_loop;
+  run_loop.RunUntilIdle();
 }
 
 }  // namespace
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java
index fca988e..8097daa 100644
--- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java
+++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java
@@ -1267,6 +1267,18 @@
     }
 
     @Override
+    public void willChangePinState(Tab tab) {
+        assert !(tab.getIsPinned() && isTabInTabGroup(tab))
+                : "A pinned tab should not be in a group";
+
+        // If tab is about to get pinned state and it is in a tab group
+        if (!tab.getIsPinned() && isTabInTabGroup(tab)) {
+            mTabUngrouper.ungroupTabs(
+                    Collections.singletonList(tab), /* trailing= */ false, /* allowDialog= */ true);
+        }
+    }
+
+    @Override
     public Set<Token> getAllTabGroupIds() {
         Set<Token> uniqueTabGroupIds = new ArraySet<>();
         TabList tabList = getTabModel();
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java
index 886a0628..ff55e17 100644
--- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java
+++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java
@@ -2695,6 +2695,25 @@
         assertFalse(mTabGroupModelFilter.willMergingCreateNewGroup(tabsToMerge));
     }
 
+    @Test
+    public void testWillChangePinState_TabWillPin_TabInExistingGroup() {
+        doReturn(false).when(mTab3).getIsPinned();
+
+        mTabGroupModelFilter.willChangePinState(mTab3);
+
+        verify(mTabUngrouper)
+                .ungroupTabs(List.of(mTab3), /* trailing= */ false, /* allowDialog= */ true);
+    }
+
+    @Test
+    public void testWillChangePinState_TabWillUnPin_TabNotIngroup_NoOp() {
+        doReturn(true).when(mTab1).getIsPinned();
+
+        mTabGroupModelFilter.willChangePinState(mTab1);
+
+        verify(mTabUngrouper, never()).ungroupTabs(any(), anyBoolean(), anyBoolean());
+    }
+
     private void verifyGroupCreationDialogShouldShow(VerificationMode mode) {
         mTabGroupModelFilter.mergeTabsToGroup(mTab1.getId(), mTab4.getId());
 
diff --git a/chrome/browser/ui/android/autofill/internal/BUILD.gn b/chrome/browser/ui/android/autofill/internal/BUILD.gn
index 717b40f..3b1f8ab 100644
--- a/chrome/browser/ui/android/autofill/internal/BUILD.gn
+++ b/chrome/browser/ui/android/autofill/internal/BUILD.gn
@@ -48,7 +48,7 @@
 generate_jni("jni_headers") {
   visibility = [
     ":*",
-    "//chrome/browser/ui:ui",
+    "//chrome/browser/ui",
   ]
   sources = [
     "java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridge.java",
@@ -85,7 +85,7 @@
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/google-truth:google_truth_java",
     "//third_party/jni_zero:jni_zero_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_full_java",
     "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/ui/android/desktop_windowing/BUILD.gn b/chrome/browser/ui/android/desktop_windowing/BUILD.gn
index ff94227f8..df2e70c 100644
--- a/chrome/browser/ui/android/desktop_windowing/BUILD.gn
+++ b/chrome/browser/ui/android/desktop_windowing/BUILD.gn
@@ -42,7 +42,7 @@
     "//third_party/androidx:androidx_core_core_java",
     "//third_party/androidx:androidx_test_core_java",
     "//third_party/androidx:androidx_test_ext_junit_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java",
     "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/ui/android/device_lock/BUILD.gn b/chrome/browser/ui/android/device_lock/BUILD.gn
index cc30232..976f0a4f 100644
--- a/chrome/browser/ui/android/device_lock/BUILD.gn
+++ b/chrome/browser/ui/android/device_lock/BUILD.gn
@@ -110,7 +110,7 @@
     "//third_party/androidx:androidx_test_ext_junit_java",
     "//third_party/androidx:androidx_test_monitor_java",
     "//third_party/androidx:androidx_test_runner_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java_test_support",
     "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/BUILD.gn b/chrome/browser/ui/android/extensions/windowing/internal/BUILD.gn
index 433510a3..b8374db 100644
--- a/chrome/browser/ui/android/extensions/windowing/internal/BUILD.gn
+++ b/chrome/browser/ui/android/extensions/windowing/internal/BUILD.gn
@@ -13,6 +13,7 @@
   deps = [
     ":jni",
     "//base",
+    "//chrome/browser/ui/browser_window",
   ]
 }
 
@@ -47,6 +48,24 @@
     "//base",
     "//chrome/browser/ui/android/extensions/windowing/test:native_unit_test_support_java",
     "//chrome/browser/ui/android/extensions/windowing/test:native_unit_test_support_jni",
+    "//chrome/browser/ui/browser_window",
     "//testing/gtest",
   ]
 }
+
+android_library("javatests") {
+  testonly = true
+  sources = [ "java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeIntegrationTest.java" ]
+  deps = [
+    ":java",
+    "//base:base_java_test_support",
+    "//chrome/android:chrome_java",
+    "//chrome/browser/flags:java",
+    "//chrome/browser/ui/android/extensions/windowing:java",
+    "//chrome/browser/ui/browser_window:java",
+    "//chrome/browser/ui/browser_window/internal:java",
+    "//chrome/test/android:chrome_java_transit",
+    "//third_party/androidx:androidx_test_runner_java",
+    "//third_party/junit",
+  ]
+}
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.cc b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.cc
index 798860a..74801e4 100644
--- a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.cc
+++ b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.cc
@@ -9,6 +9,7 @@
 #include "base/android/jni_android.h"
 #include "base/android/scoped_java_ref.h"
 #include "chrome/browser/ui/android/extensions/windowing/internal/jni/ExtensionWindowControllerBridgeImpl_jni.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
 
 namespace {
 using base::android::AttachCurrentThread;
@@ -18,15 +19,21 @@
 // Implements Java |ExtensionWindowControllerBridgeImpl.Natives#create|
 static jlong JNI_ExtensionWindowControllerBridgeImpl_Create(
     JNIEnv* env,
-    const JavaParamRef<jobject>& caller) {
+    const JavaParamRef<jobject>& caller,
+    jlong native_browser_window_ptr) {
+  BrowserWindowInterface* browser_window =
+      reinterpret_cast<BrowserWindowInterface*>(native_browser_window_ptr);
+
   return reinterpret_cast<intptr_t>(
-      new ExtensionWindowControllerBridge(env, caller));
+      new ExtensionWindowControllerBridge(env, caller, browser_window));
 }
 
 ExtensionWindowControllerBridge::ExtensionWindowControllerBridge(
     JNIEnv* env,
     const base::android::JavaParamRef<jobject>&
-        java_extension_window_controller_bridge) {
+        java_extension_window_controller_bridge,
+    BrowserWindowInterface* browser_window)
+    : browser_window_(browser_window) {
   java_extension_window_controller_bridge_.Reset(
       env, java_extension_window_controller_bridge);
 }
@@ -39,3 +46,8 @@
 void ExtensionWindowControllerBridge::Destroy(JNIEnv* env) {
   delete this;
 }
+
+BrowserWindowInterface*
+ExtensionWindowControllerBridge::GetBrowserWindowForTesting() const {
+  return browser_window_;
+}
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.h b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.h
index 409e211..33fac17 100644
--- a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.h
+++ b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge.h
@@ -9,6 +9,8 @@
 
 #include "base/android/scoped_java_ref.h"
 
+class BrowserWindowInterface;
+
 // Native class for the Java |ExtensionWindowControllerBridge|.
 //
 // The primary purpose of this class is to own a cross-platform
@@ -18,7 +20,8 @@
  public:
   ExtensionWindowControllerBridge(JNIEnv* env,
                                   const base::android::JavaParamRef<jobject>&
-                                      java_extension_window_controller_bridge);
+                                      java_extension_window_controller_bridge,
+                                  BrowserWindowInterface* browser_window);
   ExtensionWindowControllerBridge(const ExtensionWindowControllerBridge&) =
       delete;
   ExtensionWindowControllerBridge& operator=(
@@ -28,9 +31,16 @@
   // Implements Java |ExtensionWindowControllerBridgeImpl.Natives#destroy|.
   void Destroy(JNIEnv* env);
 
+  // TODO(crbug.com/424856725): replace with a test-only function that returns
+  // the |extensions::WindowController|.
+  BrowserWindowInterface* GetBrowserWindowForTesting() const;
+
  private:
   base::android::ScopedJavaGlobalRef<jobject>
       java_extension_window_controller_bridge_;
+
+  // TODO(crbug.com/424856725): replace with an |extensions::WindowController|.
+  BrowserWindowInterface* browser_window_;
 };
 
 #endif  // CHROME_BROWSER_UI_ANDROID_EXTENSIONS_WINDOWING_INTERNAL_EXTENSION_WINDOW_CONTROLLER_BRIDGE_H_
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge_unittest.cc b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge_unittest.cc
index 0b8d1eb..f9ea2db 100644
--- a/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge_unittest.cc
+++ b/chrome/browser/ui/android/extensions/windowing/internal/extension_window_controller_bridge_unittest.cc
@@ -8,6 +8,7 @@
 #include "base/android/jni_android.h"
 #include "base/android/scoped_java_ref.h"
 #include "chrome/browser/ui/android/extensions/windowing/test/native_unit_test_support_jni/ExtensionWindowControllerBridgeNativeUnitTestSupport_jni.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace {
@@ -26,7 +27,10 @@
             AttachCurrentThread()));
   }
 
-  void TearDown() override { InvokeJavaOnTaskRemoved(); }
+  void TearDown() override {
+    Java_ExtensionWindowControllerBridgeNativeUnitTestSupport_tearDown(
+        AttachCurrentThread(), java_test_support_);
+  }
 
   void InvokeJavaOnAddedToTask() const {
     Java_ExtensionWindowControllerBridgeNativeUnitTestSupport_invokeOnAddedToTask(
@@ -49,14 +53,17 @@
 };
 
 TEST_F(ExtensionWindowControllerBridgeUnitTest,
-       JavaOnAddedToTaskCreatesNativeObj) {
+       JavaOnAddedToTaskCreatesNativeObjects) {
   // Act.
   InvokeJavaOnAddedToTask();
 
   // Assert.
-  ExtensionWindowControllerBridge* native_ptr =
+  ExtensionWindowControllerBridge* extension_window_controller_bridge =
       InvokeJavaGetNativePtrForTesting();
-  EXPECT_NE(nullptr, native_ptr);
+  BrowserWindowInterface* browser_window =
+      extension_window_controller_bridge->GetBrowserWindowForTesting();
+  EXPECT_NE(nullptr, extension_window_controller_bridge);
+  EXPECT_NE(nullptr, browser_window);
 }
 
 TEST_F(ExtensionWindowControllerBridgeUnitTest,
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java
index c04f481..82227280 100644
--- a/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java
+++ b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java
@@ -13,13 +13,8 @@
 public final class ExtensionWindowControllerBridgeFactory {
     private ExtensionWindowControllerBridgeFactory() {}
 
-    /**
-     * Creates an {@link ExtensionWindowControllerBridge} for the given {@link ChromeAndroidTask}.
-     *
-     * <p>Note: this class is compiled using the {@code android_library_factory} GN template, so
-     * this method will return null if {@link ExtensionWindowControllerBridgeImpl} isn't compiled
-     * into the build.
-     */
+    // Mark as nullable to be consistent with the stub factory in
+    // //chrome/browser/ui/android/extensions/windowing/stub.
     @Nullable
     public static ExtensionWindowControllerBridge create(ChromeAndroidTask chromeAndroidTask) {
         return new ExtensionWindowControllerBridgeImpl(chromeAndroidTask);
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeImpl.java b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeImpl.java
index 82f1fa19..629eddf 100644
--- a/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeImpl.java
+++ b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeImpl.java
@@ -14,7 +14,6 @@
 @NullMarked
 final class ExtensionWindowControllerBridgeImpl implements ExtensionWindowControllerBridge {
 
-    @SuppressWarnings("UnusedVariable")
     private final ChromeAndroidTask mChromeAndroidTask;
 
     private long mNativeExtensionWindowControllerBridge;
@@ -29,7 +28,10 @@
                 : "ExtensionWindowControllerBridge is already added to a task.";
 
         mNativeExtensionWindowControllerBridge =
-                ExtensionWindowControllerBridgeImplJni.get().create(this);
+                ExtensionWindowControllerBridgeImplJni.get()
+                        .create(
+                                /* caller= */ this,
+                                mChromeAndroidTask.getOrCreateNativeBrowserWindowPtr());
     }
 
     @Override
@@ -51,7 +53,15 @@
 
     @NativeMethods
     interface Natives {
-        long create(ExtensionWindowControllerBridgeImpl caller);
+        /**
+         * Creates a native {@code ExtensionWindowControllerBridge}.
+         *
+         * @param caller The Java object calling this method.
+         * @param nativeBrowserWindowPtr The address of a native {@code BrowserWindowInterface}.
+         *     It's the caller's responsibility to ensure the validity of the address. Failure to do
+         *     so will result in undefined behavior on the native side.
+         */
+        long create(ExtensionWindowControllerBridgeImpl caller, long nativeBrowserWindowPtr);
 
         void destroy(long nativeExtensionWindowControllerBridge);
     }
diff --git a/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeIntegrationTest.java b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeIntegrationTest.java
new file mode 100644
index 0000000..880471d
--- /dev/null
+++ b/chrome/browser/ui/android/extensions/windowing/internal/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeIntegrationTest.java
@@ -0,0 +1,111 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+package org.chromium.chrome.browser.ui.extensions.windowing;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import androidx.test.filters.MediumTest;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask;
+import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTaskFeature;
+import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTaskTrackerFactory;
+import org.chromium.chrome.test.transit.ChromeTransitTestRules;
+import org.chromium.chrome.test.transit.FreshCtaTransitTestRule;
+
+import java.util.List;
+
+@RunWith(BaseJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Batch(value = Batch.PER_CLASS)
+@NullMarked
+public class ExtensionWindowControllerBridgeIntegrationTest {
+
+    @Rule
+    public FreshCtaTransitTestRule mFreshCtaTransitTestRule =
+            ChromeTransitTestRules.freshChromeTabbedActivityRule();
+
+    @Test
+    @MediumTest
+    public void startChromeTabbedActivity_addsExtensionWindowControllerBridgeToChromeAndroidTask() {
+        // Arrange & Act.
+        mFreshCtaTransitTestRule.startOnBlankPage();
+        int taskId = mFreshCtaTransitTestRule.getActivity().getTaskId();
+
+        // Assert.
+        var extensionWindowControllerBridge = getExtensionWindowControllerBridge(taskId);
+        assertNotNull(extensionWindowControllerBridge);
+    }
+
+    /**
+     * Verifies that an {@link ExtensionWindowControllerBridge} is destroyed with its {@code
+     * Activity}.
+     *
+     * <p>This is the right behavior when {@link ChromeAndroidTask} tracks an {@code Activity},
+     * which is a workaround to track a Task (window).
+     *
+     * <p>If {@link ChromeAndroidTask} tracks a Task, {@link ExtensionWindowControllerBridge} should
+     * continue to exist as long as the Task is alive.
+     *
+     * <p>Please see the documentation of {@link ChromeAndroidTask} for details.
+     */
+    @Test
+    @MediumTest
+    public void destroyChromeTabbedActivity_destroysExtensionWindowControllerBridge() {
+        // Arrange.
+        mFreshCtaTransitTestRule.startOnBlankPage();
+        int taskId = mFreshCtaTransitTestRule.getActivity().getTaskId();
+        var extensionWindowControllerBridge = getExtensionWindowControllerBridge(taskId);
+        assertNotNull(extensionWindowControllerBridge);
+        assertNotEquals(0, extensionWindowControllerBridge.getNativePtrForTesting());
+
+        // Act.
+        mFreshCtaTransitTestRule.finishActivity();
+
+        // Assert.
+        assertEquals(0, extensionWindowControllerBridge.getNativePtrForTesting());
+    }
+
+    private @Nullable ExtensionWindowControllerBridgeImpl getExtensionWindowControllerBridge(
+            int taskId) {
+        var chromeAndroidTaskTracker = ChromeAndroidTaskTrackerFactory.getInstance();
+        assertNotNull(chromeAndroidTaskTracker);
+
+        var chromeAndroidTask = chromeAndroidTaskTracker.get(taskId);
+        assertNotNull(chromeAndroidTask);
+
+        List<ChromeAndroidTaskFeature> features = chromeAndroidTask.getAllFeaturesForTesting();
+        if (features.isEmpty()) {
+            return null;
+        }
+
+        // Note:
+        //
+        // As of July 24, 2025, ExtensionWindowControllerBridge is the only
+        // ChromeAndroidTaskFeature, so if the feature list is not empty, it must contain
+        // exactly one ExtensionWindowControllerBridge instance.
+        //
+        // TODO(crbug.com/434055958): use the new feature lookup API in ChromeAndroidTask to
+        // retrieve ExtensionWindowControllerBridge.
+        assertTrue(features.size() == 1);
+        var chromeAndroidTaskFeature = features.get(0);
+        if (!(chromeAndroidTaskFeature instanceof ExtensionWindowControllerBridgeImpl)) {
+            return null;
+        }
+
+        return (ExtensionWindowControllerBridgeImpl) chromeAndroidTaskFeature;
+    }
+}
diff --git a/chrome/browser/ui/android/extensions/windowing/stub/BUILD.gn b/chrome/browser/ui/android/extensions/windowing/stub/BUILD.gn
new file mode 100644
index 0000000..110bfbde
--- /dev/null
+++ b/chrome/browser/ui/android/extensions/windowing/stub/BUILD.gn
@@ -0,0 +1,20 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import("//build/config/android/rules.gni")
+
+# Stub target to replace
+# "//chrome/browser/ui/android/extensions/windowing/internal:java" when the
+# "internal" target isn't compiled into the build.
+#
+# TODO(crbug.com/434123514): see if we can remove this stub target.
+android_library("java") {
+  visibility = [ "//chrome/android:chrome_all_java" ]
+  sources = [ "java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java" ]
+  deps = [
+    "//build/android:build_java",
+    "//chrome/browser/ui/android/extensions/windowing:java",
+    "//chrome/browser/ui/browser_window:java",
+  ]
+}
diff --git a/chrome/browser/ui/android/extensions/windowing/stub/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java b/chrome/browser/ui/android/extensions/windowing/stub/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java
new file mode 100644
index 0000000..f39940b3
--- /dev/null
+++ b/chrome/browser/ui/android/extensions/windowing/stub/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeFactory.java
@@ -0,0 +1,24 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.ui.extensions.windowing;
+
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask;
+
+/**
+ * Stub factory for when {@link ExtensionWindowControllerBridge} isn't compiled into the build.
+ *
+ * <p>TODO(crbug.com/434123514): see if we can remove this stub factory.
+ */
+@NullMarked
+public final class ExtensionWindowControllerBridgeFactory {
+    private ExtensionWindowControllerBridgeFactory() {}
+
+    @Nullable
+    public static ExtensionWindowControllerBridge create(ChromeAndroidTask chromeAndroidTask) {
+        return null;
+    }
+}
diff --git a/chrome/browser/ui/android/extensions/windowing/test/BUILD.gn b/chrome/browser/ui/android/extensions/windowing/test/BUILD.gn
index fd60b550..a2275cc6 100644
--- a/chrome/browser/ui/android/extensions/windowing/test/BUILD.gn
+++ b/chrome/browser/ui/android/extensions/windowing/test/BUILD.gn
@@ -12,8 +12,8 @@
     "//build/android:build_java",
     "//chrome/browser/ui/android/extensions/windowing/internal:java",
     "//chrome/browser/ui/browser_window:java",
+    "//chrome/browser/ui/browser_window/test:junit_test_support",
     "//third_party/jni_zero:jni_zero_java",
-    "//third_party/mockito:mockito_java",
   ]
   srcjar_deps = [ ":native_unit_test_support_jni" ]
 }
diff --git a/chrome/browser/ui/android/extensions/windowing/test/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeNativeUnitTestSupport.java b/chrome/browser/ui/android/extensions/windowing/test/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeNativeUnitTestSupport.java
index 2e7e2b3..b866dd3 100644
--- a/chrome/browser/ui/android/extensions/windowing/test/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeNativeUnitTestSupport.java
+++ b/chrome/browser/ui/android/extensions/windowing/test/java/src/org/chromium/chrome/browser/ui/extensions/windowing/ExtensionWindowControllerBridgeNativeUnitTestSupport.java
@@ -4,12 +4,11 @@
 
 package org.chromium.chrome.browser.ui.extensions.windowing;
 
-import static org.mockito.Mockito.mock;
-
 import org.jni_zero.CalledByNative;
 
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTask;
+import org.chromium.chrome.browser.ui.browser_window.ChromeAndroidTaskUnitTestSupport;
 
 /**
  * Supports {@code extension_window_controller_bridge_unittest.cc}.
@@ -24,17 +23,31 @@
  */
 @NullMarked
 final class ExtensionWindowControllerBridgeNativeUnitTestSupport {
+    private static final int FAKE_CHROME_ANDROID_TASK_ID = 0;
+
     private final ChromeAndroidTask mChromeAndroidTask;
     private final ExtensionWindowControllerBridgeImpl mExtensionWindowControllerBridge;
 
     @CalledByNative
     private ExtensionWindowControllerBridgeNativeUnitTestSupport() {
-        mChromeAndroidTask = mock(ChromeAndroidTask.class);
+        // Create a real ChromeAndroidTask with mock dependencies so that we can have real
+        // ChromeAndroidTask internals, such as the native BrowserWindowInterface pointer that
+        // ExtensionWindowControllerBridge depends on.
+        mChromeAndroidTask =
+                ChromeAndroidTaskUnitTestSupport.createChromeAndroidTaskWithMockDeps(
+                        FAKE_CHROME_ANDROID_TASK_ID);
+
         mExtensionWindowControllerBridge =
                 new ExtensionWindowControllerBridgeImpl(mChromeAndroidTask);
     }
 
     @CalledByNative
+    private void tearDown() {
+        mExtensionWindowControllerBridge.onTaskRemoved();
+        mChromeAndroidTask.destroy();
+    }
+
+    @CalledByNative
     private void invokeOnAddedToTask() {
         mExtensionWindowControllerBridge.onAddedToTask();
     }
diff --git a/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn b/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn
index 53f0378a..2e05a6a 100644
--- a/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn
+++ b/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn
@@ -142,7 +142,7 @@
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/hamcrest:hamcrest_java",
     "//third_party/hamcrest:hamcrest_library_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java_test_support",
     "//ui/android:ui_no_recycler_view_java",
@@ -178,7 +178,7 @@
     "//third_party/android_deps:espresso_java",
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/hamcrest:hamcrest_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_full_java",
     "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/ui/android/hats/test/BUILD.gn b/chrome/browser/ui/android/hats/test/BUILD.gn
index efc5720b..fa5b165 100644
--- a/chrome/browser/ui/android/hats/test/BUILD.gn
+++ b/chrome/browser/ui/android/hats/test/BUILD.gn
@@ -26,7 +26,7 @@
     "//content/public/test/android:content_java_test_support",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/jni_zero:jni_zero_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
   ]
 }
 
@@ -38,7 +38,7 @@
   ]
   deps = [
     ":jni_headers",
-    "//base:base",
+    "//base",
   ]
 }
 
diff --git a/chrome/browser/ui/android/layouts/test/BUILD.gn b/chrome/browser/ui/android/layouts/test/BUILD.gn
index e66d757..eea347c 100644
--- a/chrome/browser/ui/android/layouts/test/BUILD.gn
+++ b/chrome/browser/ui/android/layouts/test/BUILD.gn
@@ -15,6 +15,6 @@
     "//base:base_java",
     "//base:base_java_test_support",
     "//content/public/test/android:content_java_test_support",
-    "//third_party/junit:junit",
+    "//third_party/junit",
   ]
 }
diff --git a/chrome/browser/ui/android/logo/BUILD.gn b/chrome/browser/ui/android/logo/BUILD.gn
index c3e5df8..feb52ed 100644
--- a/chrome/browser/ui/android/logo/BUILD.gn
+++ b/chrome/browser/ui/android/logo/BUILD.gn
@@ -95,7 +95,7 @@
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/gif_player:gif_player_java",
     "//third_party/jni_zero:jni_zero_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java_test_support",
     "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_item_v2.xml b/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_item_v2.xml
index ae9bbd9..5b1e7d2 100644
--- a/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_item_v2.xml
+++ b/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_item_v2.xml
@@ -30,7 +30,7 @@
         android:orientation="horizontal"
         android:weightSum="8"
         android:layout_toEndOf="@id/favicon"
-        android:layout_toStartOf="@id/close_button"
+        android:layout_toStartOf="@id/more"
         android:layout_centerVertical="true">
 
         <androidx.constraintlayout.widget.ConstraintLayout
@@ -76,15 +76,15 @@
             app:leading="@dimen/text_size_medium_leading" />
     </LinearLayout>
 
-    <ImageView
-        android:id="@+id/close_button"
-        android:src="@drawable/material_ic_close_24dp"
-        android:contentDescription="@string/close"
-        android:layout_width="24dp"
-        android:layout_height="24dp"
-        android:layout_alignParentEnd="true"
+     <org.chromium.ui.listmenu.ListMenuButton
+        android:id="@+id/more"
+        android:src="@drawable/ic_more_vert_24dp"
+        android:layout_width="@dimen/min_touch_target_size"
+        android:layout_height="@dimen/min_touch_target_size"
         android:layout_centerVertical="true"
-        android:layout_marginEnd="16dp"
-        android:scaleType="fitCenter"
-        app:tint="@color/instance_switcher_item_foreground_color_list"/>
+        android:layout_marginEnd="12dp"
+        android:layout_alignParentEnd="true"
+        android:background="?attr/selectableItemBackgroundBorderless"
+        android:visibility="visible"
+        app:tint="@color/instance_switcher_item_foreground_color_list" />
 </RelativeLayout>
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java
index d823835..f92659f 100644
--- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java
+++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java
@@ -413,15 +413,13 @@
                 buildMoreMenu(builder, item);
             }
         } else {
+            buildMoreMenu(builder, item);
             String lastAccessedString =
                     isCurrentWindow
                             ? mContext.getString(R.string.instance_last_accessed_current)
                             : TimeTextResolver.resolveTimeAgoText(
                                     mContext.getResources(), item.lastAccessedTime);
-            builder.with(InstanceSwitcherItemProperties.LAST_ACCESSED, lastAccessedString)
-                    .with(
-                            InstanceSwitcherItemProperties.CLOSE_BUTTON_CLICK_LISTENER,
-                            v -> closeWindow(item));
+            builder.with(InstanceSwitcherItemProperties.LAST_ACCESSED, lastAccessedString);
             builder.with(InstanceSwitcherItemProperties.IS_SELECTED, false);
         }
         PropertyModel model = builder.build();
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java
index 09c48a3..8bb7b6c 100644
--- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java
+++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java
@@ -971,14 +971,16 @@
 
                                     @Override
                                     public void perform(UiController uiController, View view) {
-                                        View v = view.findViewById(R.id.close_button);
+                                        View v = view.findViewById(R.id.more);
                                         v.performClick();
                                     }
                                 }));
-        onView(withText(R.string.close))
-                .inRoot(isDialog())
-                .check(matches(isDisplayed()))
+        onView(withText(R.string.instance_switcher_close_window))
+                .inRoot(withDecorView(withClassName(containsString("Popup"))))
                 .perform(click());
+        onView(withText(R.string.instance_switcher_close_confirm_header))
+                .check(matches(isDisplayed()));
+        onView(withText(R.string.close)).perform(click());
         closeCallbackHelper.waitForCallback(closeCallbackCount);
     }
 
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemProperties.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemProperties.java
index 58d4727f..7406c097 100644
--- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemProperties.java
+++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemProperties.java
@@ -45,9 +45,6 @@
     public static final PropertyModel.WritableObjectPropertyKey<String> LAST_ACCESSED =
             new PropertyModel.WritableObjectPropertyKey<>();
 
-    public static final PropertyModel.WritableObjectPropertyKey<View.OnClickListener>
-            CLOSE_BUTTON_CLICK_LISTENER = new PropertyModel.WritableObjectPropertyKey<>();
-
     public static final PropertyModel.WritableBooleanPropertyKey IS_SELECTED =
             new PropertyModel.WritableBooleanPropertyKey();
 
@@ -63,7 +60,6 @@
                 CLICK_LISTENER,
                 MORE_MENU,
                 LAST_ACCESSED,
-                CLOSE_BUTTON_CLICK_LISTENER,
                 IS_SELECTED
             };
 }
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemViewBinder.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemViewBinder.java
index 70f8111..d856c09a 100644
--- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemViewBinder.java
+++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherItemViewBinder.java
@@ -33,7 +33,7 @@
             view.findViewById(R.id.title).setSelected(isSelected);
             view.findViewById(R.id.desc).setSelected(isSelected);
             view.findViewById(R.id.last_accessed).setSelected(isSelected);
-            view.findViewById(R.id.close_button).setSelected(isSelected);
+            view.findViewById(R.id.more).setSelected(isSelected);
 
             // Show check mark if selected, otherwise fallback to favicon.
             faviconView.setImageDrawable(
@@ -90,10 +90,6 @@
             TextView lastAccessedView = view.findViewById(R.id.last_accessed);
             String text = model.get(InstanceSwitcherItemProperties.LAST_ACCESSED);
             lastAccessedView.setText(text);
-        } else if (InstanceSwitcherItemProperties.CLOSE_BUTTON_CLICK_LISTENER == propertyKey) {
-            ImageView closeButton = view.findViewById(R.id.close_button);
-            closeButton.setOnClickListener(
-                    model.get(InstanceSwitcherItemProperties.CLOSE_BUTTON_CLICK_LISTENER));
         }
     }
 }
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java
index 6fa5b95c..305f797 100644
--- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java
+++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/TargetSelectorItemViewBinder.java
@@ -11,6 +11,7 @@
 import androidx.core.content.ContextCompat;
 
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.ui.listmenu.ListMenuButton;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
 
@@ -28,7 +29,7 @@
             view.findViewById(R.id.title).setSelected(isSelected);
             view.findViewById(R.id.desc).setSelected(isSelected);
             view.findViewById(R.id.last_accessed).setSelected(isSelected);
-            view.findViewById(R.id.close_button).setSelected(isSelected);
+            view.findViewById(R.id.more).setSelected(isSelected);
 
             // Show check mark if selected, otherwise fallback to favicon.
             faviconView.setImageDrawable(
@@ -57,8 +58,8 @@
             TextView lastAccessedView = view.findViewById(R.id.last_accessed);
             String text = model.get(TargetSelectorItemProperties.LAST_ACCESSED);
             lastAccessedView.setText(text);
-            ImageView closeButton = view.findViewById(R.id.close_button);
-            closeButton.setVisibility(View.GONE);
+            ListMenuButton moreButton = view.findViewById(R.id.more);
+            moreButton.setVisibility(View.GONE);
         }
     }
 }
diff --git a/chrome/browser/ui/android/omnibox/BUILD.gn b/chrome/browser/ui/android/omnibox/BUILD.gn
index c2936cc..323c969 100644
--- a/chrome/browser/ui/android/omnibox/BUILD.gn
+++ b/chrome/browser/ui/android/omnibox/BUILD.gn
@@ -389,7 +389,7 @@
     "//third_party/hamcrest:hamcrest_java",
     "//third_party/hamcrest:hamcrest_library_java",
     "//third_party/jni_zero:jni_zero_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java_test_support",
     "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
index bce0bcbf..b5e7e7aa 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBar.java
@@ -1267,6 +1267,14 @@
     @VisibleForTesting
     void enforceMaxTextHeight() {
         if (mUseSmallTextHeight) return;
+        // Our viewHeight calculation may not be correct if layout is requested, e.g. if our padding
+        // and height change simultaneously. The padding change will be reflected immediately, but
+        // the height change requires a layout cycle to be reflected.
+        if (isLayoutRequested()) {
+            post(mEnforceMaxTextHeight);
+            return;
+        }
+
         int viewHeight = getHeight() - getPaddingTop() - getPaddingBottom();
         // Don't touch the text size if the view has not measured and shown yet, or if it's a
         // subject to custom layout constraints (e.g. CCT) that might result with font size being
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java
index 59e312a..7222a3e 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java
@@ -987,6 +987,17 @@
     }
 
     @Test
+    public void layout_adjustFontSizeLayoutRequested() {
+        mUrlBar.setLayoutParams(new LayoutParams(123, 123));
+        mUrlBar.layout(0, 0, 123, 123);
+        verify(mUrlBar).post(mUrlBar.mEnforceMaxTextHeight);
+
+        mUrlBar.forceLayout();
+        mUrlBar.enforceMaxTextHeight();
+        verify(mUrlBar, times(2)).post(mUrlBar.mEnforceMaxTextHeight);
+    }
+
+    @Test
     public void layout_fixedFontSizeWithWrappingHeight() {
         mUrlBar.setLayoutParams(new LayoutParams(123, LayoutParams.WRAP_CONTENT));
         mUrlBar.layout(0, 0, 123, 123);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java
index 696dc0d..82802ad 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteController.java
@@ -21,6 +21,7 @@
 import org.chromium.components.omnibox.AutocompleteMatch;
 import org.chromium.components.omnibox.AutocompleteResult;
 import org.chromium.components.omnibox.AutocompleteResult.VerificationPoint;
+import org.chromium.components.omnibox.OmniboxFeatures;
 import org.chromium.content_public.browser.NavigationHandle;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.url.GURL;
@@ -120,8 +121,8 @@
                         url.getSpec(),
                         pageClassification,
                         preventInlineAutocomplete,
-                        false,
-                        false,
+                        OmniboxFeatures.sOmniboxSiteSearch.isEnabled(),
+                        OmniboxFeatures.sOmniboxSiteSearch.isEnabled(),
                         true);
     }
 
diff --git a/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn b/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn
index a956bbc..33f9b759 100644
--- a/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn
+++ b/chrome/browser/ui/android/quickactionsearchwidget/BUILD.gn
@@ -48,7 +48,7 @@
     "//third_party/androidx:androidx_test_monitor_java",
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/hamcrest:hamcrest_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//url:gurl_java",
   ]
diff --git a/chrome/browser/ui/android/tab_model/tab_model_list.cc b/chrome/browser/ui/android/tab_model/tab_model_list.cc
index 5d75db9..a87470b3 100644
--- a/chrome/browser/ui/android/tab_model/tab_model_list.cc
+++ b/chrome/browser/ui/android/tab_model/tab_model_list.cc
@@ -117,7 +117,7 @@
 }
 
 TabModel* TabModelList::FindNativeTabModelForJavaObject(
-    const base::android::ScopedJavaLocalRef<jobject>& jtab_model) {
+    const base::android::JavaRef<jobject>& jtab_model) {
   JNIEnv* env = base::android::AttachCurrentThread();
   for (TabModel* model : models()) {
     if (env->IsSameObject(jtab_model.obj(), model->GetJavaObject().obj())) {
diff --git a/chrome/browser/ui/android/tab_model/tab_model_list.h b/chrome/browser/ui/android/tab_model/tab_model_list.h
index 4f266b9..8485b29 100644
--- a/chrome/browser/ui/android/tab_model/tab_model_list.h
+++ b/chrome/browser/ui/android/tab_model/tab_model_list.h
@@ -51,7 +51,7 @@
   static TabModel* GetTabModelForTabAndroid(TabAndroid* tab_android);
   static TabModel* FindTabModelWithId(SessionID desired_id);
   static TabModel* FindNativeTabModelForJavaObject(
-      const base::android::ScopedJavaLocalRef<jobject>& jtab_model);
+      const base::android::JavaRef<jobject>& jtab_model);
   static bool IsOffTheRecordSessionActive();
 
   static const TabModelVector& models();
diff --git a/chrome/browser/ui/android/toolbar/BUILD.gn b/chrome/browser/ui/android/toolbar/BUILD.gn
index 2d7241e..fd471fa 100644
--- a/chrome/browser/ui/android/toolbar/BUILD.gn
+++ b/chrome/browser/ui/android/toolbar/BUILD.gn
@@ -155,7 +155,7 @@
     "//chrome/browser/fullscreen/android:java",
     "//chrome/browser/hub:java",
     "//chrome/browser/incognito:java",
-    "//chrome/browser/keyboard_accessory/android/java:java",
+    "//chrome/browser/keyboard_accessory/android/java",
     "//chrome/browser/language/android:java",
     "//chrome/browser/ntp_customization:java",
     "//chrome/browser/paint_preview/android:java",
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java
index d3df331..567e5bd 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java
@@ -410,13 +410,17 @@
                 return switch (miniOriginEvent) {
                     case MiniOriginEvent.ACCESSORY_SHEET_APPEARED -> MiniOriginState
                             .SHOWING_WITH_ACCESSORY_SHEET;
-                    case MiniOriginEvent.CONTROLS_POSITION_BECAME_TOP,
-                            MiniOriginEvent.FORM_FIELD_LOST_FOCUS -> MiniOriginState.NOT_READY;
+                    case MiniOriginEvent.FORM_FIELD_LOST_FOCUS -> isKeyboardShowing()
+                            ? MiniOriginState.SHOWING
+                            : MiniOriginState.NOT_READY;
+                    case MiniOriginEvent.CONTROLS_POSITION_BECAME_TOP -> MiniOriginState.NOT_READY;
                     case MiniOriginEvent.KEYBOARD_ANIMATION_PREPARED -> MiniOriginState.ANIMATING;
                     case MiniOriginEvent.KEYBOARD_DISAPPEARED ->
                     // Skip our animation if we get a keyboard disappearance event before the
                     // animation prepare signal.
-                    MiniOriginState.READY;
+                    mIsFormFieldFocusedSupplier.getAsBoolean()
+                            ? MiniOriginState.READY
+                            : MiniOriginState.NOT_READY;
                     default -> MiniOriginState.SHOWING;
                 };
             }
@@ -523,13 +527,20 @@
                 return;
             }
 
+            mAnimationInProgress = true;
             mMaxKeyboardHeight = bounds.getUpperBound().bottom;
+            // In some cases, e.g. a floating keyboard, we get a notification of an inset animation
+            // even though IME inset bottom will start and end at 0. There is a not a clean way to
+            // handle this, so we just bail out of the animation early.
+            if (mMaxKeyboardHeight == 0) {
+                onEnd(animation);
+                return;
+            }
             // Prevent clipping so that the mini origin bar can draw in bounds allocated for the
             // keyboard; we will prevent overlap by syncing our translation to its movement in
             // onProgress.
             ViewUtils.setAncestorsShouldClipChildren(mContainerView, false, View.NO_ID);
             ViewUtils.setAncestorsShouldClipToPadding(mContainerView, false, View.NO_ID);
-            mAnimationInProgress = true;
             mFinalKeyboardHeight =
                     mKeyboardVisibilityDelegate.isKeyboardShowing(mContext, mContainerView)
                             ? bounds.getUpperBound().bottom
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java
index c7b5ff12..451ceb7 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java
@@ -180,6 +180,10 @@
 
         mIsFormFieldFocused.onNodeAttributeUpdated(false, false);
         Assert.assertEquals(
+                MiniOriginState.SHOWING, mMiniOriginBarController.getCurrentStateForTesting());
+
+        mKeyboardVisibilityDelegate.setVisibilityForTests(false);
+        Assert.assertEquals(
                 MiniOriginState.NOT_READY, mMiniOriginBarController.getCurrentStateForTesting());
     }
 
@@ -456,6 +460,23 @@
     }
 
     @Test
+    public void testAnimateWithKeyboard_animationWithZeroMaxHeight() {
+        doReturn(ControlsPosition.BOTTOM).when(mBrowserControlsSizer).getControlsPosition();
+        mMiniOriginBarController.onControlsPositionChanged(ControlsPosition.BOTTOM);
+        final MiniOriginWindowInsetsAnimationListener animationListener =
+                mMiniOriginBarController.getAnimationListenerForTesting();
+
+        final BoundsCompat bounds = new BoundsCompat(Insets.NONE, Insets.of(0, 0, 0, 0));
+
+        mIsFormFieldFocused.onNodeAttributeUpdated(true, false);
+
+        animationListener.onPrepare(mImeAnimation);
+        animationListener.onStart(mImeAnimation, bounds);
+        Assert.assertEquals(
+                MiniOriginState.READY, mMiniOriginBarController.getCurrentStateForTesting());
+    }
+
+    @Test
     public void testAnimateWithKeyboard_animationFinishesInStartingState() {
         // Predictive back gestures can cause an IME hide animation to run but finish with the IME
         // still showing if the gesture is cancelled.
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator.java
index e83a507..eac0506 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinator.java
@@ -142,4 +142,8 @@
     public View getContentViewForTesting() {
         return assumeNonNull(mListMenu).getContentView();
     }
+
+    public @Nullable BasicListMenu getListMenuForTesting() {
+        return mListMenu;
+    }
 }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinatorTest.java
index f784cc2..a47809f 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinatorTest.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveButtonActionMenuCoordinatorTest.java
@@ -10,8 +10,6 @@
 import static org.mockito.Mockito.verify;
 
 import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ListView;
 
 import androidx.test.core.app.ApplicationProvider;
 import androidx.test.filters.SmallTest;
@@ -68,9 +66,7 @@
 
         listener.onLongClick(menuView);
 
-        ViewGroup menuContent = (ViewGroup) coordinator.getContentViewForTesting();
-        ListView menuListView = menuContent.findViewById(R.id.app_menu_list);
-        menuListView.performItemClick(null, 0, menuListView.getAdapter().getItemId(0));
+        coordinator.getListMenuForTesting().clickItemForTesting(0);
 
         verify(menuView).showMenu();
         verify(mCallback).onResult(R.id.customize_adaptive_button_menu_id);
diff --git a/chrome/browser/ui/android/web_app_header/BUILD.gn b/chrome/browser/ui/android/web_app_header/BUILD.gn
index 900775ab..59394333 100644
--- a/chrome/browser/ui/android/web_app_header/BUILD.gn
+++ b/chrome/browser/ui/android/web_app_header/BUILD.gn
@@ -81,7 +81,7 @@
     "//third_party/androidx:androidx_test_core_java",
     "//third_party/androidx:androidx_test_ext_junit_java",
     "//third_party/blink/public/mojom:mojom_platform_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java_test_support",
     "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ui/android/whats_new/BUILD.gn b/chrome/browser/ui/android/whats_new/BUILD.gn
index c286d54..7d91e92 100644
--- a/chrome/browser/ui/android/whats_new/BUILD.gn
+++ b/chrome/browser/ui/android/whats_new/BUILD.gn
@@ -85,7 +85,7 @@
     "//third_party/androidx:androidx_test_core_java",
     "//third_party/androidx:androidx_test_ext_junit_java",
     "//third_party/androidx:androidx_test_runner_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/android:ui_java",
     "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/ui/ash/app_list/BUILD.gn b/chrome/browser/ui/ash/app_list/BUILD.gn
index 547a41e..07e4722 100644
--- a/chrome/browser/ui/ash/app_list/BUILD.gn
+++ b/chrome/browser/ui/ash/app_list/BUILD.gn
@@ -27,7 +27,7 @@
     "//ash/webui/os_feedback_ui:url_constants",
     "//ash/webui/shortcut_customization_ui:url_constants",
     "//base",
-    "//chrome/browser/apps/app_service:app_service",
+    "//chrome/browser/apps/app_service",
     "//chrome/browser/ash/app_list/search",
     "//chrome/browser/ash/app_list/search/test:browser_test_support",
     "//chrome/browser/ash/app_list/search/test:test_support",
diff --git a/chrome/browser/ui/ash/editor_menu/BUILD.gn b/chrome/browser/ui/ash/editor_menu/BUILD.gn
index 8fbe661..9735599 100644
--- a/chrome/browser/ui/ash/editor_menu/BUILD.gn
+++ b/chrome/browser/ui/ash/editor_menu/BUILD.gn
@@ -57,16 +57,16 @@
     "//chrome/browser/ui/ash/read_write_cards",
     "//chromeos/ash/components/editor_menu/public/cpp",
     "//chromeos/components/magic_boost/public/cpp",
-    "//chromeos/constants:constants",
+    "//chromeos/constants",
     "//chromeos/crosapi/mojom",
-    "//content/public/browser:browser",
+    "//content/public/browser",
     "//ui/gfx",
     "//ui/views",
   ]
 
   if (is_chrome_branded) {
     deps += [
-      "//chromeos/ash/resources/internal/strings:strings",
+      "//chromeos/ash/resources/internal/strings",
       "//chromeos/ash/resources/internal/strings:strings_grit",
     ]
   }
@@ -94,7 +94,7 @@
     "//base",
     "//build:branding_buildflags",
     "//chromeos/ash/components/editor_menu/public/cpp",
-    "//chromeos/constants:constants",
+    "//chromeos/constants",
     "//chromeos/strings:strings_grit",
     "//chromeos/ui/vector_icons",
     "//components/application_locale_storage",
@@ -108,7 +108,7 @@
 
   if (is_chrome_branded) {
     deps += [
-      "//chromeos/ash/resources/internal/strings:strings",
+      "//chromeos/ash/resources/internal/strings",
       "//chromeos/ash/resources/internal/strings:strings_grit",
     ]
   }
diff --git a/chrome/browser/ui/ash/graduation/BUILD.gn b/chrome/browser/ui/ash/graduation/BUILD.gn
index f017f29f..42ee1bd 100644
--- a/chrome/browser/ui/ash/graduation/BUILD.gn
+++ b/chrome/browser/ui/ash/graduation/BUILD.gn
@@ -15,7 +15,7 @@
   deps = [
     "//ash",
     "//ash/constants",
-    "//ash/public/cpp:cpp",
+    "//ash/public/cpp",
     "//ash/webui/system_apps/public:system_web_app_type",
     "//base",
     "//chrome/browser/ash/browser_delegate",
diff --git a/chrome/browser/ui/ash/holding_space/BUILD.gn b/chrome/browser/ui/ash/holding_space/BUILD.gn
index 4aecffa6..9835bf52 100644
--- a/chrome/browser/ui/ash/holding_space/BUILD.gn
+++ b/chrome/browser/ui/ash/holding_space/BUILD.gn
@@ -151,7 +151,7 @@
     "//chrome/test:test_support_ui",
     "//chrome/test/base/ash/util:test_support",
     "//chromeos/ash/components/browser_context_helper",
-    "//chromeos/dbus/power:power",
+    "//chromeos/dbus/power",
     "//content/test:test_support",
     "//ui/aura",
     "//ui/base",
diff --git a/chrome/browser/ui/ash/magic_boost/BUILD.gn b/chrome/browser/ui/ash/magic_boost/BUILD.gn
index 39424dd1..eb0f1db9 100644
--- a/chrome/browser/ui/ash/magic_boost/BUILD.gn
+++ b/chrome/browser/ui/ash/magic_boost/BUILD.gn
@@ -23,7 +23,7 @@
     "//chrome/browser/resources:component_extension_resources",
     "//chrome/browser/ui/ash/editor_menu:utils",
     "//chrome/browser/ui/ash/read_write_cards",
-    "//chromeos/components/magic_boost/public/cpp:cpp",
+    "//chromeos/components/magic_boost/public/cpp",
     "//chromeos/components/mahi/public/cpp",
     "//chromeos/crosapi/mojom",
     "//chromeos/strings:strings_grit",
diff --git a/chrome/browser/ui/ash/main_extra_parts/BUILD.gn b/chrome/browser/ui/ash/main_extra_parts/BUILD.gn
index 8b9c75d1..9cab9c2 100644
--- a/chrome/browser/ui/ash/main_extra_parts/BUILD.gn
+++ b/chrome/browser/ui/ash/main_extra_parts/BUILD.gn
@@ -29,7 +29,7 @@
     "//chrome/browser:browser_public_dependencies",
     "//chrome/browser:global_features",
     "//chrome/browser/ash/app_list",
-    "//chrome/browser/ash/app_restore:app_restore",
+    "//chrome/browser/ash/app_restore",
     "//chrome/browser/ash/boca",
     "//chrome/browser/ash/geolocation",
     "//chrome/browser/ash/growth",
@@ -73,13 +73,13 @@
     "//chrome/browser/ui/ash/shell_delegate",
     "//chrome/browser/ui/ash/shell_init",
     "//chrome/browser/ui/ash/system",
-    "//chrome/browser/ui/ash/system_web_apps:system_web_apps",
+    "//chrome/browser/ui/ash/system_web_apps",
     "//chrome/browser/ui/ash/wallpaper",
     "//chrome/browser/ui/ash/web_view",
     "//chrome/browser/ui/ash/wm",
     "//chrome/browser/ui/chromeos/screen_orientation",
     "//chrome/browser/ui/views/select_file_dialog_extension",
-    "//chrome/browser/ui/webui/ash/settings:settings",
+    "//chrome/browser/ui/webui/ash/settings",
     "//chromeos/ash/components/boca",
     "//chromeos/ash/components/browser_context_helper",
     "//chromeos/ash/components/dbus",
diff --git a/chrome/browser/ui/ash/network/BUILD.gn b/chrome/browser/ui/ash/network/BUILD.gn
index f136459..ab1e653 100644
--- a/chrome/browser/ui/ash/network/BUILD.gn
+++ b/chrome/browser/ui/ash/network/BUILD.gn
@@ -39,7 +39,7 @@
     "//chrome/browser/ui:browser_navigator_params_headers",
     "//chrome/browser/ui/ash/system",
     "//chrome/browser/ui/webui/ash/cellular_setup",
-    "//chrome/browser/ui/webui/ash/floating_workspace:floating_workspace",
+    "//chrome/browser/ui/webui/ash/floating_workspace",
     "//chrome/common",
     "//chromeos/ash/components/carrier_lock",
     "//chromeos/ash/components/dbus/hermes",
@@ -54,7 +54,7 @@
     "//components/account_id",
     "//components/captive_portal/core",
     "//components/policy/core/common",
-    "//components/proxy_config:proxy_config",
+    "//components/proxy_config",
     "//components/session_manager/core",
     "//components/strings:components_strings_grit",
     "//extensions/browser",
@@ -90,7 +90,7 @@
     "//chrome/browser/ash/login/users:test_support",
     "//chrome/browser/ash/profiles",
     "//chrome/browser/prefs",
-    "//chrome/browser/ui/webui/ash/floating_workspace:floating_workspace",
+    "//chrome/browser/ui/webui/ash/floating_workspace",
     "//chrome/test:test_support",
     "//chromeos/ash/components/carrier_lock",
     "//chromeos/ash/components/dbus/hermes",
diff --git a/chrome/browser/ui/ash/quick_answers/BUILD.gn b/chrome/browser/ui/ash/quick_answers/BUILD.gn
index 760f367..1439ad71 100644
--- a/chrome/browser/ui/ash/quick_answers/BUILD.gn
+++ b/chrome/browser/ui/ash/quick_answers/BUILD.gn
@@ -40,7 +40,7 @@
 
   deps = [
     "//ash",
-    "//chrome/browser/ash/magic_boost:magic_boost",
+    "//chrome/browser/ash/magic_boost",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui/ash/editor_menu:utils",
     "//chrome/browser/ui/ash/quick_answers/ui:loading_view",
@@ -56,7 +56,7 @@
     "//chromeos/components/quick_answers/public/cpp",
     "//chromeos/components/quick_answers/public/cpp:constants",
     "//chromeos/components/quick_answers/public/cpp:prefs",
-    "//chromeos/constants:constants",
+    "//chromeos/constants",
     "//chromeos/strings:strings_grit",
     "//chromeos/ui/vector_icons",
     "//components/account_id",
diff --git a/chrome/browser/ui/ash/quick_insert/BUILD.gn b/chrome/browser/ui/ash/quick_insert/BUILD.gn
index e86e89b5..a68a010b 100644
--- a/chrome/browser/ui/ash/quick_insert/BUILD.gn
+++ b/chrome/browser/ui/ash/quick_insert/BUILD.gn
@@ -34,7 +34,7 @@
     "//chrome/browser/ash/input_method",
     "//chrome/browser/ash/lobster",
     "//chrome/browser/ash/login/session",
-    "//chrome/browser/favicon:favicon",
+    "//chrome/browser/favicon",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui/ash/thumbnail_loader",
     "//chrome/common",
@@ -42,7 +42,7 @@
     "//chromeos/ash/components/drivefs/mojom",
     "//chromeos/ash/components/editor_menu/public/cpp",
     "//chromeos/constants",
-    "//components/favicon/core:core",
+    "//components/favicon/core",
     "//components/optimization_guide/core",
     "//components/user_manager",
     "//content/public/browser",
diff --git a/chrome/browser/ui/ash/read_write_cards/BUILD.gn b/chrome/browser/ui/ash/read_write_cards/BUILD.gn
index 8137a0f..d991379f 100644
--- a/chrome/browser/ui/ash/read_write_cards/BUILD.gn
+++ b/chrome/browser/ui/ash/read_write_cards/BUILD.gn
@@ -38,12 +38,12 @@
     "//chrome/browser/ui/ash/magic_boost",
     "//chrome/browser/ui/ash/quick_answers",
     "//chrome/browser/ui/views/mahi",
-    "//chromeos/ash/components/editor_menu/public/cpp:cpp",
-    "//chromeos/components/magic_boost/public/cpp:cpp",
+    "//chromeos/ash/components/editor_menu/public/cpp",
+    "//chromeos/components/magic_boost/public/cpp",
     "//chromeos/components/quick_answers",
-    "//chromeos/components/quick_answers/public/cpp:cpp",
+    "//chromeos/components/quick_answers/public/cpp",
     "//chromeos/components/quick_answers/public/cpp:prefs",
-    "//chromeos/constants:constants",
+    "//chromeos/constants",
     "//chromeos/crosapi/mojom",
     "//content/public/browser",
   ]
@@ -74,7 +74,7 @@
     "//chrome/common:non_code_constants",
     "//chrome/test:test_support",
     "//chrome/test:test_support_unit",
-    "//chromeos/ash/components/editor_menu/public/cpp:cpp",
+    "//chromeos/ash/components/editor_menu/public/cpp",
     "//chromeos/ash/components/login/login_state",
     "//chromeos/components/magic_boost/public/cpp",
     "//chromeos/components/quick_answers/public/cpp",
diff --git a/chrome/browser/ui/ash/web_view/BUILD.gn b/chrome/browser/ui/ash/web_view/BUILD.gn
index aa564405..46ba6d2 100644
--- a/chrome/browser/ui/ash/web_view/BUILD.gn
+++ b/chrome/browser/ui/ash/web_view/BUILD.gn
@@ -19,7 +19,7 @@
     "//base",
     "//chrome/browser/media/webrtc",
     "//chrome/browser/profiles:profile",
-    "//chrome/browser/ui/ash/new_window:new_window",
+    "//chrome/browser/ui/ash/new_window",
     "//content/public/browser",
     "//ui/aura",
     "//ui/base",
diff --git a/chrome/browser/ui/autofill/BUILD.gn b/chrome/browser/ui/autofill/BUILD.gn
index 82d5a75..e4bbfdc 100644
--- a/chrome/browser/ui/autofill/BUILD.gn
+++ b/chrome/browser/ui/autofill/BUILD.gn
@@ -36,7 +36,7 @@
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui/autofill/payments",
     "//chrome/browser/ui/page_action:icon_type",
-    "//components/application_locale_storage:application_locale_storage",
+    "//components/application_locale_storage",
     "//components/autofill/content/browser",
     "//components/autofill/core/browser",
     "//components/autofill/core/common",
@@ -201,7 +201,7 @@
       "//chrome/browser/promos:utils",
       "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/promos:utils",
-      "//chrome/browser/ui/toasts:toasts",
+      "//chrome/browser/ui/toasts",
       "//chrome/browser/ui/toasts/api:toasts",
       "//chrome/browser/ui/user_education",
       "//chrome/browser/ui/webauthn",
@@ -360,7 +360,7 @@
       "//chrome/browser/sync:factories",
       "//chrome/browser/ui",
       "//chrome/browser/ui:ui_features",
-      "//chrome/browser/ui/browser_window:browser_window",
+      "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/user_education",
       "//chrome/common:constants",
       "//chrome/test:test_support",
diff --git a/chrome/browser/ui/autofill/payments/BUILD.gn b/chrome/browser/ui/autofill/payments/BUILD.gn
index d6e8e13..0fbdf1d 100644
--- a/chrome/browser/ui/autofill/payments/BUILD.gn
+++ b/chrome/browser/ui/autofill/payments/BUILD.gn
@@ -145,7 +145,7 @@
       "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/promos:utils",
       "//chrome/browser/ui/tabs:tab_strip",
-      "//chrome/browser/ui/views/page_action:page_action",
+      "//chrome/browser/ui/views/page_action",
       "//chrome/common",
       "//components/autofill/core/common:credit_card_number_validation",
       "//components/commerce/core:feature_list",
diff --git a/chrome/browser/ui/blocked_content/BUILD.gn b/chrome/browser/ui/blocked_content/BUILD.gn
index b26ca014..527752a 100644
--- a/chrome/browser/ui/blocked_content/BUILD.gn
+++ b/chrome/browser/ui/blocked_content/BUILD.gn
@@ -88,7 +88,7 @@
       ":blocked_content",
       "//chrome/browser/content_settings:content_settings_factory",
       "//chrome/test:test_support",
-      "//components/back_forward_cache:back_forward_cache",
+      "//components/back_forward_cache",
       "//components/content_settings/browser",
     ]
     if (use_ozone) {
@@ -105,13 +105,13 @@
     deps = [
       ":blocked_content",
       "//chrome/browser/content_settings:content_settings_factory",
-      "//chrome/browser/search_engines:search_engines",
+      "//chrome/browser/search_engines",
       "//chrome/browser/web_applications:web_applications_test_support",
       "//chrome/test:test_support",
-      "//components/back_forward_cache:back_forward_cache",
+      "//components/back_forward_cache",
       "//components/content_settings/browser",
-      "//components/embedder_support:embedder_support",
-      "//components/javascript_dialogs:javascript_dialogs",
+      "//components/embedder_support",
+      "//components/javascript_dialogs",
     ]
   }
 }
diff --git a/chrome/browser/ui/bookmarks/BUILD.gn b/chrome/browser/ui/bookmarks/BUILD.gn
index bc5b52d..f2d6be38 100644
--- a/chrome/browser/ui/bookmarks/BUILD.gn
+++ b/chrome/browser/ui/bookmarks/BUILD.gn
@@ -68,7 +68,7 @@
     "//chrome/browser/search",
     "//chrome/browser/ui:browser_navigator_params_headers",
     "//chrome/browser/ui:ui_features",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/tabs:tab_group",
     "//chrome/browser/ui/tabs:tab_strip",
     "//components/bookmarks/common",
@@ -102,7 +102,7 @@
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui",
     "//chrome/browser/ui:browser_list",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/tabs:tab_strip",
     "//chrome/common",
     "//chrome/test:test_support_ui",
@@ -141,7 +141,7 @@
     "//chrome/browser",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui:ui_features",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/common",
     "//chrome/test:test_support",
     "//components/bookmarks/browser",
diff --git a/chrome/browser/ui/browser_element_identifiers.cc b/chrome/browser/ui/browser_element_identifiers.cc
index 99e54d3b..2b89aff1 100644
--- a/chrome/browser/ui/browser_element_identifiers.cc
+++ b/chrome/browser/ui/browser_element_identifiers.cc
@@ -89,6 +89,7 @@
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupOverflowButtonElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupOverflowMenuId);
+DEFINE_ELEMENT_IDENTIFIER_VALUE(kSharedTabGroupCommentsActionElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kSharedTabGroupFeedbackElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kCollaborationMessagingPageActionIconElementId);
 DEFINE_ELEMENT_IDENTIFIER_VALUE(kSearchEngineChoiceDialogId);
diff --git a/chrome/browser/ui/browser_element_identifiers.h b/chrome/browser/ui/browser_element_identifiers.h
index 6efcf117..2883393 100644
--- a/chrome/browser/ui/browser_element_identifiers.h
+++ b/chrome/browser/ui/browser_element_identifiers.h
@@ -99,6 +99,7 @@
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupButtonElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupOverflowButtonElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kSavedTabGroupOverflowMenuId);
+DECLARE_ELEMENT_IDENTIFIER_VALUE(kSharedTabGroupCommentsActionElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(kSharedTabGroupFeedbackElementId);
 DECLARE_ELEMENT_IDENTIFIER_VALUE(
     kCollaborationMessagingPageActionIconElementId);
diff --git a/chrome/browser/ui/browser_window/BUILD.gn b/chrome/browser/ui/browser_window/BUILD.gn
index c387a95..8623781 100644
--- a/chrome/browser/ui/browser_window/BUILD.gn
+++ b/chrome/browser/ui/browser_window/BUILD.gn
@@ -4,7 +4,7 @@
 
 import("//chrome/common/features.gni")
 
-assert(is_win || is_mac || is_linux || is_chromeos || is_desktop_android)
+assert(is_win || is_mac || is_linux || is_chromeos || is_android)
 
 # This is the public interface for a browser window. Most features in
 # //chrome/browser depend on this interface, and thus to prevent circular
diff --git a/chrome/browser/ui/browser_window/internal/BUILD.gn b/chrome/browser/ui/browser_window/internal/BUILD.gn
index d763b69..91f20458 100644
--- a/chrome/browser/ui/browser_window/internal/BUILD.gn
+++ b/chrome/browser/ui/browser_window/internal/BUILD.gn
@@ -33,14 +33,14 @@
     deps += [
       "//chrome/browser/actor/ui",
       "//chrome/browser/extensions",
-      "//chrome/browser/lens/region_search:region_search",
+      "//chrome/browser/lens/region_search",
       "//chrome/browser/media/router:media_router_feature",
       "//chrome/browser/ui:ui_features",
-      "//chrome/browser/ui/bookmarks:bookmarks",
+      "//chrome/browser/ui/bookmarks",
       "//chrome/browser/ui/commerce",
       "//chrome/browser/ui/exclusive_access",
       "//chrome/browser/ui/extensions",
-      "//chrome/browser/ui/find_bar:find_bar",
+      "//chrome/browser/ui/find_bar",
       "//chrome/browser/ui/lens",
       "//chrome/browser/ui/performance_controls",
       "//chrome/browser/ui/signin",
@@ -55,9 +55,9 @@
       "//chrome/browser/ui/views/toolbar",
       "//chrome/browser/ui/web_applications",
       "//components/breadcrumbs/core:status",
-      "//components/collaboration/public:public",
+      "//components/collaboration/public",
       "//components/commerce/core:feature_list",
-      "//components/data_sharing/public:public",
+      "//components/data_sharing/public",
       "//components/lens:features",
       "//components/profile_metrics",
       "//components/saved_tab_groups/public",
@@ -116,6 +116,7 @@
     visibility = [
       ":*",
       "//chrome/android:chrome_all_java",
+      "//chrome/browser/ui/android/extensions/windowing/internal:javatests",
       "//chrome/browser/ui/browser_window/test:junit_test_support",
       "//chrome/browser/ui/browser_window/test:native_unit_test_support_java",
     ]
@@ -160,4 +161,19 @@
       "//ui/android:ui_no_recycler_view_java",
     ]
   }
+
+  android_library("javatests") {
+    testonly = true
+    sources = [ "android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskIntegrationTest.java" ]
+    deps = [
+      ":java",
+      "//base:base_java_test_support",
+      "//chrome/android:chrome_java",
+      "//chrome/browser/flags:java",
+      "//chrome/browser/ui/browser_window:java",
+      "//chrome/test/android:chrome_java_transit",
+      "//third_party/androidx:androidx_test_runner_java",
+      "//third_party/junit",
+    ]
+  }
 }
diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java
index fc99976..612c260 100644
--- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java
+++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImpl.java
@@ -107,6 +107,12 @@
     }
 
     @Override
+    public long getOrCreateNativeBrowserWindowPtr() {
+        assertAlive();
+        return mAndroidBrowserWindow.getOrCreateNativePtr();
+    }
+
+    @Override
     public void destroy() {
         // Immediately change the state to "DESTROYING" to block access to public methods that
         // should only be called when the state is "ALIVE".
@@ -144,12 +150,8 @@
         return getActivityWindowAndroidInternal(/* assertAlive= */ false);
     }
 
-    AndroidBrowserWindow getAndroidBrowserWindowForTesting() {
-        return mAndroidBrowserWindow;
-    }
-
-    /** Returns all {@link ChromeAndroidTaskFeature}s for testing. */
-    List<ChromeAndroidTaskFeature> getAllFeaturesForTesting() {
+    @Override
+    public List<ChromeAndroidTaskFeature> getAllFeaturesForTesting() {
         synchronized (mFeaturesLock) {
             return mFeatures;
         }
diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java
index cdca4f1..91d8913e 100644
--- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java
+++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskImplUnitTest.java
@@ -190,6 +190,29 @@
     }
 
     @Test
+    public void getOrCreateNativeBrowserWindowPtr_returnsPtrValue() {
+        // Arrange.
+        var chromeAndroidTask = createChromeAndroidTask();
+
+        // Act.
+        long nativeBrowserWindowPtr = chromeAndroidTask.getOrCreateNativeBrowserWindowPtr();
+
+        // Assert.
+        assertEquals(FAKE_NATIVE_ANDROID_BROWSER_WINDOW_PTR, nativeBrowserWindowPtr);
+    }
+
+    @Test
+    public void getOrCreateNativeBrowserWindowPtr_calledAfterTaskDestroyed_throwsException() {
+        // Arrange.
+        var chromeAndroidTask = createChromeAndroidTask();
+        chromeAndroidTask.destroy();
+
+        // Act & Assert.
+        assertThrows(
+                AssertionError.class, () -> chromeAndroidTask.getOrCreateNativeBrowserWindowPtr());
+    }
+
+    @Test
     public void destroy_clearsActivityWindowAndroid() {
         // Arrange.
         var chromeAndroidTask = createChromeAndroidTask();
@@ -223,9 +246,7 @@
     public void destroy_destroysAndroidBrowserWindow() {
         // Arrange: create a ChromeAndroidTask and a fake native AndroidBrowserWindow pointer value.
         var chromeAndroidTask = createChromeAndroidTask();
-        long nativeAndroidBrowserWindowPtr =
-                chromeAndroidTask.getAndroidBrowserWindowForTesting().getOrCreateNativePtr();
-        assertEquals(FAKE_NATIVE_ANDROID_BROWSER_WINDOW_PTR, nativeAndroidBrowserWindowPtr);
+        long nativeAndroidBrowserWindowPtr = chromeAndroidTask.getOrCreateNativeBrowserWindowPtr();
 
         // Act.
         chromeAndroidTask.destroy();
diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskIntegrationTest.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskIntegrationTest.java
new file mode 100644
index 0000000..fc0cb35
--- /dev/null
+++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskIntegrationTest.java
@@ -0,0 +1,79 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.ui.browser_window;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import androidx.test.filters.MediumTest;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.test.BaseJUnit4ClassRunner;
+import org.chromium.base.test.util.Batch;
+import org.chromium.base.test.util.CommandLineFlags;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.test.transit.ChromeTransitTestRules;
+import org.chromium.chrome.test.transit.FreshCtaTransitTestRule;
+
+@RunWith(BaseJUnit4ClassRunner.class)
+@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE})
+@Batch(value = Batch.PER_CLASS)
+@NullMarked
+public class ChromeAndroidTaskIntegrationTest {
+
+    @Rule
+    public FreshCtaTransitTestRule mFreshCtaTransitTestRule =
+            ChromeTransitTestRules.freshChromeTabbedActivityRule();
+
+    @Test
+    @MediumTest
+    public void startChromeTabbedActivity_createsChromeAndroidTask() {
+        // Arrange & Act.
+        mFreshCtaTransitTestRule.startOnBlankPage();
+        int taskId = mFreshCtaTransitTestRule.getActivity().getTaskId();
+
+        // Assert.
+        var chromeAndroidTask = getChromeAndroidTask(taskId);
+        assertNotNull(chromeAndroidTask);
+    }
+
+    /**
+     * Verifies that a {@link ChromeAndroidTask} is destroyed with its {@code Activity}.
+     *
+     * <p>This is the right behavior when {@link ChromeAndroidTask} tracks an {@code Activity},
+     * which is a workaround to track a Task (window).
+     *
+     * <p>If {@link ChromeAndroidTask} tracks a Task, it should continue to exist as long as the
+     * Task is alive.
+     *
+     * <p>Please see the documentation of {@link ChromeAndroidTask} for details.
+     */
+    @Test
+    @MediumTest
+    public void destroyChromeTabbedActivity_destroysChromeAndroidTask() {
+        // Arrange.
+        mFreshCtaTransitTestRule.startOnBlankPage();
+        int taskId = mFreshCtaTransitTestRule.getActivity().getTaskId();
+
+        // Act.
+        mFreshCtaTransitTestRule.finishActivity();
+
+        // Assert.
+        var chromeAndroidTask = getChromeAndroidTask(taskId);
+        assertNull(chromeAndroidTask);
+    }
+
+    private @Nullable ChromeAndroidTask getChromeAndroidTask(int taskId) {
+        var chromeAndroidTaskTracker = ChromeAndroidTaskTrackerFactory.getInstance();
+        assertNotNull(chromeAndroidTaskTracker);
+
+        return chromeAndroidTaskTracker.get(taskId);
+    }
+}
diff --git a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java
index bda23f04..f79567a8 100644
--- a/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java
+++ b/chrome/browser/ui/browser_window/internal/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java
@@ -16,9 +16,8 @@
     /**
      * Obtains the singleton instance of {@link ChromeAndroidTaskTracker}.
      *
-     * <p>Note: this class is compiled using the {@code android_library_factory} GN template, so
-     * this method will return null if {@link ChromeAndroidTaskTrackerImpl} isn't compiled into the
-     * build.
+     * <p>We mark the return value as nullable to be consistent with the stub factory in
+     * //chrome/browser/ui/browser_window/stub.
      */
     @Nullable
     public static ChromeAndroidTaskTracker getInstance() {
diff --git a/chrome/browser/ui/browser_window/internal/browser_window_features.cc b/chrome/browser/ui/browser_window/internal/browser_window_features.cc
index d15896d..d69bb9d 100644
--- a/chrome/browser/ui/browser_window/internal/browser_window_features.cc
+++ b/chrome/browser/ui/browser_window/internal/browser_window_features.cc
@@ -461,7 +461,7 @@
 
   if (CommentsSidePanelCoordinator::IsSupported()) {
     comments_side_panel_coordinator_ =
-        std::make_unique<CommentsSidePanelCoordinator>();
+        std::make_unique<CommentsSidePanelCoordinator>(browser_view);
   }
 
   side_panel_coordinator_->Init(browser_view->browser());
diff --git a/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java b/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java
index ac0ab30..d17f9bc 100644
--- a/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java
+++ b/chrome/browser/ui/browser_window/public/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTask.java
@@ -8,6 +8,8 @@
 import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.base.ActivityWindowAndroid;
 
+import java.util.List;
+
 /**
  * Represents an Android window containing Chrome.
  *
@@ -88,6 +90,14 @@
     void addFeature(ChromeAndroidTaskFeature feature);
 
     /**
+     * Returns the address of the native {@code BrowserWindowInterface}.
+     *
+     * <p>If the native object hasn't been created, this method will create it before returning its
+     * address.
+     */
+    long getOrCreateNativeBrowserWindowPtr();
+
+    /**
      * Destroys all objects owned by this {@link ChromeAndroidTask}, including all {@link
      * ChromeAndroidTaskFeature}s.
      *
@@ -97,4 +107,7 @@
 
     /** Returns whether this {@link ChromeAndroidTask} has been destroyed. */
     boolean isDestroyed();
+
+    /** Returns all {@link ChromeAndroidTaskFeature}s for testing. */
+    List<ChromeAndroidTaskFeature> getAllFeaturesForTesting();
 }
diff --git a/chrome/browser/ui/browser_window/stub/BUILD.gn b/chrome/browser/ui/browser_window/stub/BUILD.gn
new file mode 100644
index 0000000..d5ceb2b
--- /dev/null
+++ b/chrome/browser/ui/browser_window/stub/BUILD.gn
@@ -0,0 +1,21 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+if (is_android) {
+  import("//build/config/android/rules.gni")
+
+  # Stub target to replace
+  # "//chrome/browser/ui/browser_window/internal:java" when the
+  # "internal" target isn't compiled into the build.
+  #
+  # TODO(crbug.com/434123514): see if we can remove this stub target.
+  android_library("java") {
+    visibility = [ "//chrome/android:chrome_all_java" ]
+    sources = [ "android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java" ]
+    deps = [
+      "//build/android:build_java",
+      "//chrome/browser/ui/browser_window:java",
+    ]
+  }
+}
diff --git a/chrome/browser/ui/browser_window/stub/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java b/chrome/browser/ui/browser_window/stub/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java
new file mode 100644
index 0000000..11e7d5b
--- /dev/null
+++ b/chrome/browser/ui/browser_window/stub/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskTrackerFactory.java
@@ -0,0 +1,24 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.chrome.browser.ui.browser_window;
+
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+
+/**
+ * Stub factory for when {@link ChromeAndroidTaskTracker} isn't compiled into the build.
+ *
+ * <p>TODO(crbug.com/434123514): see if we can remove this stub factory.
+ */
+@NullMarked
+public final class ChromeAndroidTaskTrackerFactory {
+
+    private ChromeAndroidTaskTrackerFactory() {}
+
+    @Nullable
+    public static ChromeAndroidTaskTracker getInstance() {
+        return null;
+    }
+}
diff --git a/chrome/browser/ui/browser_window/test/BUILD.gn b/chrome/browser/ui/browser_window/test/BUILD.gn
index 7b9bcf1..f60893ee 100644
--- a/chrome/browser/ui/browser_window/test/BUILD.gn
+++ b/chrome/browser/ui/browser_window/test/BUILD.gn
@@ -15,6 +15,7 @@
     sources = [ "android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java" ]
     deps = [
       "//build/android:build_java",
+      "//chrome/browser/ui/browser_window:java",
       "//chrome/browser/ui/browser_window/internal:java",
       "//third_party/mockito:mockito_java",
       "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java b/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java
index 0005a05a..7758e699 100644
--- a/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java
+++ b/chrome/browser/ui/browser_window/test/android/java/src/org/chromium/chrome/browser/ui/browser_window/ChromeAndroidTaskUnitTestSupport.java
@@ -15,16 +15,23 @@
 
 import java.lang.ref.WeakReference;
 
-/**
- * Supports Robolectric tests relevant to {@link ChromeAndroidTask}.
- *
- * <p>This class is package-private as it hasn't been needed outside this package.
- */
+/** Supports Robolectric and native unit tests relevant to {@link ChromeAndroidTask}. */
 @NullMarked
-final class ChromeAndroidTaskUnitTestSupport {
+public final class ChromeAndroidTaskUnitTestSupport {
     private ChromeAndroidTaskUnitTestSupport() {}
 
     /**
+     * Creates a real {@link ChromeAndroidTask} with mock dependencies.
+     *
+     * @param taskId ID for {@link ChromeAndroidTask#getId()}.
+     * @return A new instance of {@link ChromeAndroidTask}.
+     */
+    public static ChromeAndroidTask createChromeAndroidTaskWithMockDeps(int taskId) {
+        var mockActivityWindowAndroid = createMockActivityWindowAndroid(taskId);
+        return new ChromeAndroidTaskImpl(mockActivityWindowAndroid);
+    }
+
+    /**
      * Creates a mock {@link ActivityWindowAndroid}, which has a mock {@link Activity} with the
      * given {@code taskId}.
      */
diff --git a/chrome/browser/ui/color/BUILD.gn b/chrome/browser/ui/color/BUILD.gn
index 67cea1a..fffee1c 100644
--- a/chrome/browser/ui/color/BUILD.gn
+++ b/chrome/browser/ui/color/BUILD.gn
@@ -54,10 +54,10 @@
     "//chrome/browser/ui:ui_features",
     "//chrome/common/themes:autogenerated_theme_util",
     "//components/compose:buildflags",
-    "//components/omnibox/common:common",
-    "//components/search:search",
+    "//components/omnibox/common",
+    "//components/search",
     "//ui/base:buildflags",
-    "//ui/color:color",
+    "//ui/color",
     "//ui/color:mixers",
   ]
 
diff --git a/chrome/browser/ui/commerce/BUILD.gn b/chrome/browser/ui/commerce/BUILD.gn
index 517d9b0..ddfd3b4 100644
--- a/chrome/browser/ui/commerce/BUILD.gn
+++ b/chrome/browser/ui/commerce/BUILD.gn
@@ -112,7 +112,7 @@
   deps = [
     ":commerce",
     "//base/test:test_support",
-    "//chrome/browser/ui/toasts:toasts",
+    "//chrome/browser/ui/toasts",
     "//chrome/test:test_support",
     "//components/commerce/core:account_checker_test_support",
     "//components/commerce/core:feature_list",
@@ -134,8 +134,8 @@
   ]
   deps = [
     ":commerce",
-    "//chrome/browser/ui/browser_window:browser_window",
-    "//chrome/browser/ui/toasts:toasts",
+    "//chrome/browser/ui/browser_window",
+    "//chrome/browser/ui/toasts",
     "//chrome/test:test_support",
     "//components/commerce/core:account_checker_test_support",
     "//components/commerce/core:shopping_service_test_support",
diff --git a/chrome/browser/ui/content_settings/BUILD.gn b/chrome/browser/ui/content_settings/BUILD.gn
index 07a9e24d..6e19835 100644
--- a/chrome/browser/ui/content_settings/BUILD.gn
+++ b/chrome/browser/ui/content_settings/BUILD.gn
@@ -9,7 +9,7 @@
   deps = []
   public_deps = [
     "//base",
-    "//chrome/app/vector_icons:vector_icons",
+    "//chrome/app/vector_icons",
     "//chrome/browser/ui/blocked_content",
     "//components/content_settings/browser",
     "//components/content_settings/core/common",
@@ -60,7 +60,7 @@
     "//chrome/common:non_code_constants",
     "//components/content_settings/core/browser",
     "//components/content_settings/core/browser:cookie_settings",
-    "//components/infobars/content:content",
+    "//components/infobars/content",
     "//components/no_state_prefetch/browser",
     "//components/subresource_filter/content/browser",
     "//components/subresource_filter/core/browser",
@@ -91,7 +91,7 @@
     "//chrome/browser/ui/browser_window",
     "//chrome/test:test_support",
     "//components/content_settings/core/test:test_support",
-    "//components/subresource_filter/core/browser:browser",
+    "//components/subresource_filter/core/browser",
   ]
 }
 
@@ -137,7 +137,7 @@
     "//chrome/browser/web_applications:web_applications_test_support",
     "//chrome/test:test_support",
     "//components/custom_handlers:test_support",
-    "//components/infobars/content:content",
+    "//components/infobars/content",
     "//components/no_state_prefetch/browser",
     "//services/data_decoder/public/cpp:test_support",
   ]
diff --git a/chrome/browser/ui/exclusive_access/BUILD.gn b/chrome/browser/ui/exclusive_access/BUILD.gn
index 4d2197b8..2bb9d2de 100644
--- a/chrome/browser/ui/exclusive_access/BUILD.gn
+++ b/chrome/browser/ui/exclusive_access/BUILD.gn
@@ -47,7 +47,7 @@
     "//chrome/browser/ui:ui_features",
     "//chrome/common:constants",
     "//components/content_settings/core/browser",
-    "//components/fullscreen_control:fullscreen_control",
+    "//components/fullscreen_control",
     "//components/history/core/browser",
     "//components/input",
     "//components/permissions:permissions_common",
@@ -102,7 +102,7 @@
     ]
     deps = [
       ":test_support",
-      "//components/fullscreen_control:fullscreen_control",
+      "//components/fullscreen_control",
     ]
   }
 
diff --git a/chrome/browser/ui/find_bar/BUILD.gn b/chrome/browser/ui/find_bar/BUILD.gn
index 8884e2a..5a59664 100644
--- a/chrome/browser/ui/find_bar/BUILD.gn
+++ b/chrome/browser/ui/find_bar/BUILD.gn
@@ -75,7 +75,7 @@
     deps = [
       ":find_bar",
       ":test_support",
-      "//chrome/browser/ui/browser_window:browser_window",
+      "//chrome/browser/ui/browser_window",
       "//chrome/test:test_support",
     ]
 
@@ -95,7 +95,7 @@
 
     deps = [
       ":find_bar",
-      "//chrome/browser/ui/browser_window:browser_window",
+      "//chrome/browser/ui/browser_window",
       "//chrome/test:test_support",
     ]
 
diff --git a/chrome/browser/ui/hats/BUILD.gn b/chrome/browser/ui/hats/BUILD.gn
index 9525276..1548b58 100644
--- a/chrome/browser/ui/hats/BUILD.gn
+++ b/chrome/browser/ui/hats/BUILD.gn
@@ -104,7 +104,7 @@
     "//chrome/browser/ui",
   ]
   if (is_android) {
-    deps += [ "//chrome/browser/ui/android/hats:hats" ]
+    deps += [ "//chrome/browser/ui/android/hats" ]
   }
   public_deps = [ "//chrome/browser:browser_public_dependencies" ]
 }
diff --git a/chrome/browser/ui/javascript_dialogs/BUILD.gn b/chrome/browser/ui/javascript_dialogs/BUILD.gn
index b7f4409..11021f3 100644
--- a/chrome/browser/ui/javascript_dialogs/BUILD.gn
+++ b/chrome/browser/ui/javascript_dialogs/BUILD.gn
@@ -20,7 +20,7 @@
     sources += [ "javascript_tab_modal_dialog_manager_delegate_desktop.h" ]
     public_deps += [
       "//chrome/browser/ui:browser_list",
-      "//chrome/browser/ui/browser_window:browser_window",
+      "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/tabs:tab_strip_model_observer",
       "//chrome/browser/ui/tabs:tabs_public",
     ]
diff --git a/chrome/browser/ui/lens/BUILD.gn b/chrome/browser/ui/lens/BUILD.gn
index 9b7c4952..e14e19c1 100644
--- a/chrome/browser/ui/lens/BUILD.gn
+++ b/chrome/browser/ui/lens/BUILD.gn
@@ -154,7 +154,7 @@
     "//components/lens:enterprise_policy",
     "//components/lens:features",
     "//components/lens/proto/server:proto",
-    "//components/metrics_services_manager:metrics_services_manager",
+    "//components/metrics_services_manager",
     "//components/optimization_guide/content/browser",
     "//components/optimization_guide/content/browser:page_context_eligibility",
     "//components/prefs",
@@ -167,7 +167,7 @@
     "//components/variations",
     "//components/variations:variations_mojom",
     "//components/version_info:channel",
-    "//components/web_modal:web_modal",
+    "//components/web_modal",
     "//components/zoom",
     "//google_apis",
     "//google_apis/common",
@@ -322,7 +322,7 @@
     "//testing/gtest",
   ]
   if (enable_pdf) {
-    deps += [ "//components/pdf/browser:browser" ]
+    deps += [ "//components/pdf/browser" ]
   }
 }
 
diff --git a/chrome/browser/ui/login/BUILD.gn b/chrome/browser/ui/login/BUILD.gn
index d780610..4fc6960a 100644
--- a/chrome/browser/ui/login/BUILD.gn
+++ b/chrome/browser/ui/login/BUILD.gn
@@ -64,7 +64,7 @@
       "//base/test:test_support",
       "//chrome/browser:browser_process",
       "//chrome/browser/profiles:profile",
-      "//chrome/browser/ui/browser_window:browser_window",
+      "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/tabs:tab_enums",
       "//chrome/browser/ui/tabs:tab_strip",
       "//chrome/common:chrome_features",
diff --git a/chrome/browser/ui/omnibox/BUILD.gn b/chrome/browser/ui/omnibox/BUILD.gn
index 4a73fd59..36399290 100644
--- a/chrome/browser/ui/omnibox/BUILD.gn
+++ b/chrome/browser/ui/omnibox/BUILD.gn
@@ -51,7 +51,7 @@
     "//build:branding_buildflags",
     "//chrome/app/vector_icons",
     "//chrome/browser:shell_integration",
-    "//chrome/browser/feedback:feedback",
+    "//chrome/browser/feedback",
     "//chrome/browser/feedback:feedback_enum",
     "//chrome/common",
     "//chrome/common:chrome_features",
@@ -89,8 +89,8 @@
       "//chrome/browser/ui:browser_list",
       "//chrome/browser/ui/bookmarks",
       "//chrome/browser/ui/extensions/",
-      "//chrome/browser/ui/hats:hats",
-      "//chrome/browser/ui/lens:lens",
+      "//chrome/browser/ui/hats",
+      "//chrome/browser/ui/lens",
       "//chrome/common",
       "//components/bookmarks/browser",
       "//components/favicon/content",
@@ -221,7 +221,7 @@
         deps += [
           ":omnibox",
           "//chrome/browser/ui:browser_navigator_params_headers",
-          "//chrome/browser/ui/browser_window:browser_window",
+          "//chrome/browser/ui/browser_window",
         ]
       }
     }
diff --git a/chrome/browser/ui/page_info/BUILD.gn b/chrome/browser/ui/page_info/BUILD.gn
index 261c5b0..386faa8a 100644
--- a/chrome/browser/ui/page_info/BUILD.gn
+++ b/chrome/browser/ui/page_info/BUILD.gn
@@ -56,15 +56,13 @@
     deps += [
       "//chrome/browser/extensions",
       "//chrome/browser/hid",
-      "//chrome/browser/smart_card:smart_card",
+      "//chrome/browser/smart_card",
       "//chrome/browser/ui/tabs:tab_strip",
       "//chrome/browser/ui/web_applications",
       "//chrome/browser/web_applications",
     ]
     if (is_chromeos) {
-      deps += [
-        "//chrome/browser/ui/webui/ash/settings/app_management:app_management",
-      ]
+      deps += [ "//chrome/browser/ui/webui/ash/settings/app_management" ]
     }
   }
   deps += [
diff --git a/chrome/browser/ui/plus_addresses/BUILD.gn b/chrome/browser/ui/plus_addresses/BUILD.gn
index d8e3281..d07cc63 100644
--- a/chrome/browser/ui/plus_addresses/BUILD.gn
+++ b/chrome/browser/ui/plus_addresses/BUILD.gn
@@ -46,7 +46,7 @@
       "android/plus_address_creation_view_android.h",
     ]
     public_deps += [
-      "//base:base",
+      "//base",
       "//components/autofill/core/browser",
       "//components/autofill/core/common",
       "//components/plus_addresses:hats_utils",
@@ -158,7 +158,7 @@
     "//components/plus_addresses:features",
     "//components/plus_addresses:prefs",
     "//components/plus_addresses:test_support",
-    "//components/plus_addresses/metrics:metrics",
+    "//components/plus_addresses/metrics",
     "//components/plus_addresses/settings:test_support",
     "//components/sync_preferences:test_support",
     "//content/test:test_support",
@@ -206,9 +206,9 @@
       "//chrome/browser/profiles:profile",
       "//chrome/test:test_support",
       "//chrome/test:test_support_ui_android",
+      "//components/plus_addresses",
       "//components/plus_addresses:features",
       "//components/plus_addresses:plus_address_java_enums",
-      "//components/plus_addresses:plus_addresses",
       "//components/plus_addresses:test_support",
       "//content/test:test_support",
       "//testing/gtest",
diff --git a/chrome/browser/ui/plus_addresses/android/BUILD.gn b/chrome/browser/ui/plus_addresses/android/BUILD.gn
index 0fb4d77..cfeb2dce 100644
--- a/chrome/browser/ui/plus_addresses/android/BUILD.gn
+++ b/chrome/browser/ui/plus_addresses/android/BUILD.gn
@@ -164,7 +164,7 @@
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/hamcrest:hamcrest_java",
     "//third_party/hamcrest:hamcrest_library_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
     "//third_party/mockito:mockito_java",
     "//ui/accessibility:ax_base_java",
     "//ui/android:ui_java_test_support",
diff --git a/chrome/browser/ui/privacy_sandbox/BUILD.gn b/chrome/browser/ui/privacy_sandbox/BUILD.gn
index 603beca5..78b2730 100644
--- a/chrome/browser/ui/privacy_sandbox/BUILD.gn
+++ b/chrome/browser/ui/privacy_sandbox/BUILD.gn
@@ -91,7 +91,7 @@
   if (is_chromeos) {
     deps += [
       "//ash/webui/help_app_ui",
-      "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+      "//chromeos/ash/components/browser_context_helper",
     ]
   }
 }
diff --git a/chrome/browser/ui/recently_audible_helper.cc b/chrome/browser/ui/recently_audible_helper.cc
index 6eceb94e..2beadda3 100644
--- a/chrome/browser/ui/recently_audible_helper.cc
+++ b/chrome/browser/ui/recently_audible_helper.cc
@@ -42,7 +42,8 @@
 }
 
 base::CallbackListSubscription
-RecentlyAudibleHelper::RegisterCallbackForTesting(const Callback& callback) {
+RecentlyAudibleHelper::RegisterRecentlyAudibleChangedCallback(
+    const Callback& callback) {
   return callback_list_.Add(callback);
 }
 
diff --git a/chrome/browser/ui/recently_audible_helper.h b/chrome/browser/ui/recently_audible_helper.h
index 33ba09d..4816e1d 100644
--- a/chrome/browser/ui/recently_audible_helper.h
+++ b/chrome/browser/ui/recently_audible_helper.h
@@ -50,7 +50,7 @@
   // Registers the provided repeating callback for notifications. Destroying
   // the returned subscription will unregister the callback. This is safe to do
   // while in the context of the callback itself.
-  base::CallbackListSubscription RegisterCallbackForTesting(
+  base::CallbackListSubscription RegisterRecentlyAudibleChangedCallback(
       const Callback& callback);
 
   // Allows replacing the tick clock that is used by this class. Setting it back
diff --git a/chrome/browser/ui/recently_audible_helper_unittest.cc b/chrome/browser/ui/recently_audible_helper_unittest.cc
index 9cb7aca7..5b9eb62 100644
--- a/chrome/browser/ui/recently_audible_helper_unittest.cc
+++ b/chrome/browser/ui/recently_audible_helper_unittest.cc
@@ -40,9 +40,10 @@
     RecentlyAudibleHelper::CreateForWebContents(contents_);
     helper_ = RecentlyAudibleHelper::FromWebContents(contents_);
     helper_->SetTickClockForTesting(task_runner_->GetMockTickClock());
-    subscription_ = helper_->RegisterCallbackForTesting(base::BindRepeating(
-        &RecentlyAudibleHelperTest::OnRecentlyAudibleCallback,
-        base::Unretained(this)));
+    subscription_ =
+        helper_->RegisterRecentlyAudibleChangedCallback(base::BindRepeating(
+            &RecentlyAudibleHelperTest::OnRecentlyAudibleCallback,
+            base::Unretained(this)));
   }
 
   void TearDown() override {
diff --git a/chrome/browser/ui/safety_hub/BUILD.gn b/chrome/browser/ui/safety_hub/BUILD.gn
index 62a6ca72..154fa6b 100644
--- a/chrome/browser/ui/safety_hub/BUILD.gn
+++ b/chrome/browser/ui/safety_hub/BUILD.gn
@@ -204,7 +204,7 @@
       "//base",
       "//base/test:test_support",
       "//chrome/browser/content_settings:content_settings_factory",
-      "//chrome/browser/permissions:permissions",
+      "//chrome/browser/permissions",
       "//chrome/browser/profiles:profile",
       "//chrome/browser/safe_browsing:test_support",
       "//chrome/browser/ui",
diff --git a/chrome/browser/ui/signin/BUILD.gn b/chrome/browser/ui/signin/BUILD.gn
index 9f69d20..fc5df75f5 100644
--- a/chrome/browser/ui/signin/BUILD.gn
+++ b/chrome/browser/ui/signin/BUILD.gn
@@ -208,7 +208,7 @@
         "signin_view_controller_browsertest.cc",
       ]
       deps += [
-        "//chrome/browser/ui/webui/signin/signout_confirmation:signout_confirmation",
+        "//chrome/browser/ui/webui/signin/signout_confirmation",
         "//chrome/test:sync_integration_test_support",
         "//chrome/test:test_support",
         "//components/sync:test_support",
diff --git a/chrome/browser/ui/sync/BUILD.gn b/chrome/browser/ui/sync/BUILD.gn
index ac1acf6b..1b73a57 100644
--- a/chrome/browser/ui/sync/BUILD.gn
+++ b/chrome/browser/ui/sync/BUILD.gn
@@ -112,7 +112,7 @@
       "//chrome/browser/extensions:test_support",
       "//chrome/browser/prefs",
       "//components/bookmarks/test",
-      "//components/pref_registry:pref_registry",
+      "//components/pref_registry",
       "//components/prefs:test_support",
       "//components/sync_preferences:test_support",
     ]
diff --git a/chrome/browser/ui/tabs/BUILD.gn b/chrome/browser/ui/tabs/BUILD.gn
index 027e9f92..3e2243c 100644
--- a/chrome/browser/ui/tabs/BUILD.gn
+++ b/chrome/browser/ui/tabs/BUILD.gn
@@ -19,7 +19,7 @@
   public_deps = [
     "//base",
     "//chrome/common:buildflags",
-    "//components/tab_groups:tab_groups",
+    "//components/tab_groups",
     "//components/tabs:public",
   ]
   deps = [
@@ -45,7 +45,7 @@
   ]
 
   deps = [
-    "//components/tab_groups:tab_groups",
+    "//components/tab_groups",
     "//components/tabs:public",
     "//url",
   ]
@@ -158,7 +158,7 @@
       "//chrome/browser/ui:browser_element_identifiers",
       "//chrome/browser/ui:browser_navigator_params_headers",
       "//chrome/browser/ui:ui_features",
-      "//chrome/browser/ui/browser_window:browser_window",
+      "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/color:color_headers",
       "//chrome/browser/ui/tabs:tab_strip",
 
@@ -188,7 +188,7 @@
       ":tabs_public",
       "//base",
       "//components/back_forward_cache",
-      "//components/commerce/core/product_specifications:product_specifications",
+      "//components/commerce/core/product_specifications",
       "//components/constrained_window",
       "//components/favicon/core",
       "//components/sessions",
@@ -231,7 +231,7 @@
       "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/commerce",
       "//chrome/browser/ui/toasts",
-      "//components/commerce/core/product_specifications:product_specifications",
+      "//components/commerce/core/product_specifications",
       "//components/tab_groups",
     ]
 
@@ -290,8 +290,8 @@
       "//chrome/browser/ui:browser_list",
       "//chrome/browser/ui:browser_tab_strip",
       "//chrome/browser/ui:ui_features",
-      "//chrome/browser/ui/browser_window:browser_window",
-      "//chrome/browser/ui/commerce:commerce",
+      "//chrome/browser/ui/browser_window",
+      "//chrome/browser/ui/commerce",
       "//chrome/browser/ui/send_tab_to_self",
       "//chrome/browser/ui/thumbnails",
       "//chrome/browser/ui/user_education",
@@ -350,10 +350,10 @@
       "//chrome/browser/profiles:profile",
       "//chrome/browser/ui:browser_list",
       "//chrome/browser/ui/color:color_headers",
-      "//chrome/browser/ui/omnibox:omnibox",
+      "//chrome/browser/ui/omnibox",
       "//chrome/browser/ui/startup:startup_tab",
-      "//chrome/browser/ui/views/permissions/chip:chip",
-      "//components/collaboration/public:public",
+      "//chrome/browser/ui/views/permissions/chip",
+      "//components/collaboration/public",
       "//components/keyed_service/core",
       "//components/tabs:public",
       "//content/public/browser",
@@ -363,7 +363,7 @@
       "//ui/gfx",
       "//ui/gfx:color_utils",
       "//ui/gfx/geometry",
-      "//ui/menus:menus",
+      "//ui/menus",
       "//url",
     ]
 
@@ -405,11 +405,11 @@
       ":tabs",
       "//chrome/app:command_ids",
       "//chrome/app/vector_icons",
-      "//chrome/browser/actor:actor",
-      "//chrome/browser/actor/ui:ui",
+      "//chrome/browser/actor",
+      "//chrome/browser/actor/ui",
       "//chrome/browser/commerce",
       "//chrome/browser/content_settings:content_settings_factory",
-      "//chrome/browser/contextual_cueing:contextual_cueing",
+      "//chrome/browser/contextual_cueing",
       "//chrome/browser/favicon",
       "//chrome/browser/fingerprinting_protection",
       "//chrome/browser/image_fetcher",
@@ -421,11 +421,11 @@
       "//chrome/browser/signin",
       "//chrome/browser/sync",
       "//chrome/browser/sync:factories",
-      "//chrome/browser/task_manager:task_manager",
+      "//chrome/browser/task_manager",
       "//chrome/browser/themes",
       "//chrome/browser/ui:browser_list",
       "//chrome/browser/ui:ui_features",
-      "//chrome/browser/ui/browser_window:browser_window",
+      "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/commerce",
       "//chrome/browser/ui/lens",
       "//chrome/browser/ui/performance_controls",
@@ -437,7 +437,7 @@
       "//chrome/browser/ui/views/page_action",
       "//chrome/browser/ui/views/page_info",
       "//chrome/browser/ui/views/side_panel",
-      "//chrome/browser/ui/views/toolbar:toolbar",
+      "//chrome/browser/ui/views/toolbar",
       "//chrome/browser/ui/webui:webui_util",
       "//chrome/browser/vr",
       "//chrome/browser/web_applications",
@@ -530,9 +530,9 @@
       ":tab_strip",
       ":tabs_public",
       "//base",
-      "//chrome/browser/extensions:extensions",
+      "//chrome/browser/extensions",
       "//chrome/browser/profiles:profile",
-      "//chrome/browser/ui/tab_contents:tab_contents",
+      "//chrome/browser/ui/tab_contents",
       "//content/public/browser",
       "//content/test:test_support",
       "//services/metrics/public/cpp:metrics_cpp",
@@ -579,7 +579,7 @@
       "//chrome/browser/ui:browser_list",
       "//chrome/browser/ui:browser_navigator_params_headers",
       "//chrome/browser/ui:ui_features",
-      "//chrome/browser/ui/browser_window:browser_window",
+      "//chrome/browser/ui/browser_window",
       "//chrome/browser/web_applications",
       "//chrome/browser/web_applications:prevent_close_test_support",
       "//chrome/browser/web_applications:web_applications_test_support",
@@ -675,7 +675,7 @@
       "//chrome/app:command_ids",
       "//chrome/app:generated_resources",
       "//chrome/browser",
-      "//chrome/browser/commerce:commerce",
+      "//chrome/browser/commerce",
       "//chrome/browser/content_settings:content_settings_factory",
       "//chrome/browser/extensions",
       "//chrome/browser/optimization_guide",
diff --git a/chrome/browser/ui/tabs/alert/BUILD.gn b/chrome/browser/ui/tabs/alert/BUILD.gn
index 7386ef1..4a9ef0d3 100644
--- a/chrome/browser/ui/tabs/alert/BUILD.gn
+++ b/chrome/browser/ui/tabs/alert/BUILD.gn
@@ -18,11 +18,11 @@
 
   public_deps = [
     "//base",
-    "//chrome/browser/vr:vr",
+    "//chrome/browser/vr",
     "//content/public/browser",
   ]
 
-  deps = [ "//chrome/browser/media/webrtc:webrtc" ]
+  deps = [ "//chrome/browser/media/webrtc" ]
 }
 
 source_set("impl") {
@@ -34,14 +34,14 @@
   deps = [
     ":tab_alert",
     ":tab_alert_enum",
-    "//chrome/app/vector_icons:vector_icons",
-    "//chrome/browser/media/webrtc:webrtc",
+    "//chrome/app/vector_icons",
+    "//chrome/browser/media/webrtc",
     "//chrome/common:chrome_features",
-    "//components/vector_icons:vector_icons",
+    "//components/vector_icons",
   ]
 
   if (enable_glic) {
-    deps += [ "//chrome/browser/glic:glic" ]
+    deps += [ "//chrome/browser/glic" ]
   }
 }
 
diff --git a/chrome/browser/ui/tabs/alert/tab_alert_controller.cc b/chrome/browser/ui/tabs/alert/tab_alert_controller.cc
index d46618bf..707ab72 100644
--- a/chrome/browser/ui/tabs/alert/tab_alert_controller.cc
+++ b/chrome/browser/ui/tabs/alert/tab_alert_controller.cc
@@ -14,6 +14,7 @@
 #include "base/containers/to_vector.h"
 #include "base/functional/bind.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
+#include "chrome/browser/ui/recently_audible_helper.h"
 #include "chrome/browser/ui/tabs/alert/tab_alert.h"
 #include "chrome/browser/vr/vr_tab_helper.h"
 #include "content/public/browser/web_contents.h"
@@ -76,6 +77,11 @@
           .get());
   vr_tab_helper_observation_.Observe(
       vr::VrTabHelper::FromWebContents(web_contents()));
+  recently_audible_subscription_ =
+      RecentlyAudibleHelper::FromWebContents(tab.GetContents())
+          ->RegisterRecentlyAudibleChangedCallback(base::BindRepeating(
+              &TabAlertController::OnRecentlyAudibleStateChanged,
+              base::Unretained(this)));
 
 #if BUILDFLAG(ENABLE_GLIC)
   if (glic_keyed_service) {
@@ -130,6 +136,11 @@
   vr_tab_helper_observation_.Reset();
   vr_tab_helper_observation_.Observe(
       vr::VrTabHelper::FromWebContents(new_contents));
+  recently_audible_subscription_ =
+      RecentlyAudibleHelper::FromWebContents(new_contents)
+          ->RegisterRecentlyAudibleChangedCallback(base::BindRepeating(
+              &TabAlertController::OnRecentlyAudibleStateChanged,
+              base::Unretained(this)));
 }
 
 void TabAlertController::OnCapabilityTypesChanged(
@@ -167,10 +178,6 @@
   UpdateAlertState(TabAlert::AUDIO_MUTING, muted);
 }
 
-void TabAlertController::OnAudioStateChanged(bool audible) {
-  UpdateAlertState(TabAlert::AUDIO_PLAYING, audible);
-}
-
 void TabAlertController::OnIsCapturingVideoChanged(
     content::WebContents* contents,
     bool is_capturing_video) {
@@ -242,6 +249,10 @@
 }
 #endif  // BUILDFLAG(ENABLE_GLIC)
 
+void TabAlertController::OnRecentlyAudibleStateChanged(bool was_audible) {
+  UpdateAlertState(TabAlert::AUDIO_PLAYING, was_audible);
+}
+
 void TabAlertController::UpdateAlertState(TabAlert alert, bool is_active) {
   std::optional<TabAlert> previous_alert = GetAlertToShow();
   if (is_active) {
diff --git a/chrome/browser/ui/tabs/alert/tab_alert_controller.h b/chrome/browser/ui/tabs/alert/tab_alert_controller.h
index 5dc54e6..bbc50980 100644
--- a/chrome/browser/ui/tabs/alert/tab_alert_controller.h
+++ b/chrome/browser/ui/tabs/alert/tab_alert_controller.h
@@ -74,7 +74,6 @@
       bool used) override;
   void MediaPictureInPictureChanged(bool is_picture_in_picture) override;
   void DidUpdateAudioMutingState(bool muted) override;
-  void OnAudioStateChanged(bool audible) override;
 
   // MediaStreamCaptureIndicator::Observer:
   void OnIsCapturingVideoChanged(content::WebContents* contents,
@@ -100,6 +99,8 @@
                                bool is_sharing);
 #endif  // BUILDFLAG(ENABLE_GLIC)
 
+  void OnRecentlyAudibleStateChanged(bool was_audible);
+
   // Adds `alert` to the set of already active alerts for this tab if it isn't
   // currently active. Otherwise, removes `alert` from the set and is considered
   // inactive.
@@ -125,6 +126,7 @@
       vr_tab_helper_observation_{this};
 
   // Subscriptions to be notified when an alert status has changed.
+  base::CallbackListSubscription recently_audible_subscription_;
   std::vector<base::CallbackListSubscription> callback_subscriptions_;
 };
 }  // namespace tabs
diff --git a/chrome/browser/ui/tabs/alert/tab_alert_controller_unittest.cc b/chrome/browser/ui/tabs/alert/tab_alert_controller_unittest.cc
index 4a61ad1e..b6f3377 100644
--- a/chrome/browser/ui/tabs/alert/tab_alert_controller_unittest.cc
+++ b/chrome/browser/ui/tabs/alert/tab_alert_controller_unittest.cc
@@ -9,6 +9,8 @@
 
 #include "base/functional/bind.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/task_environment.h"
+#include "base/time/time.h"
 #include "chrome/browser/global_features.h"
 #include "chrome/browser/ui/browser_window/test/mock_browser_window_interface.h"
 #include "chrome/browser/ui/tabs/alert/tab_alert.h"
@@ -140,6 +142,15 @@
 
   TabInterface* tab_interface() { return tab_model_.get(); }
 
+  void SimulateAudioState(bool is_playing_audio) {
+    content::WebContentsTester::For(tab_model_->GetContents())
+        ->SetIsCurrentlyAudible(is_playing_audio);
+  }
+
+  content::BrowserTaskEnvironment* task_environment() {
+    return &task_environment_;
+  }
+
 #if BUILDFLAG(ENABLE_GLIC)
   TestGlicKeyedService* test_glic_keyed_service() {
     return test_glic_keyed_service_.get();
@@ -148,7 +159,8 @@
 
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
-  content::BrowserTaskEnvironment task_environment_;
+  content::BrowserTaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   content::RenderViewHostTestEnabler test_enabler_;
   std::unique_ptr<TestingProfileManager> testing_profile_manager_;
   raw_ptr<Profile> profile_ = nullptr;
@@ -178,7 +190,7 @@
   EXPECT_CALL(*mock_subscriber,
               OnPrioritizedAlertStateChanged(
                   std::make_optional(TabAlert::AUDIO_PLAYING)));
-  tab_alert_controller()->OnAudioStateChanged(true);
+  SimulateAudioState(true);
   ::testing::Mock::VerifyAndClearExpectations(mock_subscriber.get());
 
   // Simulate a higher priority alert being activated.
@@ -193,7 +205,8 @@
   EXPECT_CALL(*mock_subscriber,
               OnPrioritizedAlertStateChanged(std::optional<TabAlert>()))
       .Times(0);
-  tab_alert_controller()->OnAudioStateChanged(false);
+  SimulateAudioState(false);
+  task_environment()->FastForwardBy(base::Seconds(2));
   ::testing::Mock::VerifyAndClearExpectations(mock_subscriber.get());
 
   // Remove the last active tab alert.
@@ -204,7 +217,7 @@
 }
 
 TEST_F(TabAlertControllerTest, GetAllAlert) {
-  tab_alert_controller()->OnAudioStateChanged(true);
+  SimulateAudioState(true);
   tab_alert_controller()->OnCapabilityTypesChanged(
       content::WebContentsCapabilityType::kBluetoothConnected, true);
   tab_alert_controller()->MediaPictureInPictureChanged(true);
@@ -226,7 +239,7 @@
 }
 
 TEST_F(TabAlertControllerTest, AlertIsActive) {
-  tab_alert_controller()->OnAudioStateChanged(true);
+  SimulateAudioState(true);
   tab_alert_controller()->OnCapabilityTypesChanged(
       content::WebContentsCapabilityType::kBluetoothConnected, true);
   tab_alert_controller()->MediaPictureInPictureChanged(true);
@@ -254,6 +267,26 @@
   EXPECT_FALSE(tab_alert_controller()->GetAlertToShow().has_value());
 }
 
+TEST_F(TabAlertControllerTest, AudioStateUpdatesAlertController) {
+  EXPECT_FALSE(tab_alert_controller()->GetAlertToShow().has_value());
+  SimulateAudioState(true);
+  EXPECT_TRUE(tab_alert_controller()->GetAlertToShow().has_value());
+  EXPECT_EQ(tab_alert_controller()->GetAlertToShow().value(),
+            TabAlert::AUDIO_PLAYING);
+
+  // The audio playing alert should still be active even though the audio has
+  // stopped to prevent the audio state from toggling too frequently on pause.
+  SimulateAudioState(false);
+  EXPECT_TRUE(tab_alert_controller()->GetAlertToShow().has_value());
+  EXPECT_EQ(tab_alert_controller()->GetAlertToShow().value(),
+            TabAlert::AUDIO_PLAYING);
+
+  // The tab alert should go away after 2 seconds of consistently not playing
+  // audio.
+  task_environment()->FastForwardBy(base::Seconds(2));
+  EXPECT_FALSE(tab_alert_controller()->GetAlertToShow().has_value());
+}
+
 #if BUILDFLAG(ENABLE_GLIC)
 TEST_F(TabAlertControllerTest, GlicSharingUpdatesAlertController) {
   EXPECT_FALSE(tab_alert_controller()->GetAlertToShow().has_value());
diff --git a/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn
index 5458a02..281ed8a 100644
--- a/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn
+++ b/chrome/browser/ui/tabs/tab_strip_api/BUILD.gn
@@ -56,7 +56,7 @@
         "//chrome/browser/ui/tabs/tab_strip_api/types/tab_group_visual_data_traits.cc",
       ]
       traits_public_deps = [
-        "types:types",
+        "types",
         "//base",
         "//chrome/browser/ui/tabs",
       ]
@@ -89,7 +89,7 @@
     "//chrome/browser/ui/tabs:tab_strip_model_observer",
   ]
 
-  deps = [ "//chrome/browser/ui/tabs/tab_strip_api/events:events" ]
+  deps = [ "//chrome/browser/ui/tabs/tab_strip_api/events" ]
 }
 
 source_set("impl") {
@@ -106,9 +106,9 @@
     "adapters:impl",
     "converters",
     "events",
-    "types:types",
+    "types",
     "//chrome/browser/ui",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/tabs:tab_strip",
   ]
 }
@@ -126,7 +126,7 @@
     "testing",
     "types:unit_tests",
     "//base/test:test_support",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/tabs:tab_strip",
     "//chrome/browser/ui/tabs:test_support",
     "//chrome/test:test_support",
@@ -148,7 +148,7 @@
     "//base",
     "//base/test:test_support",
     "//chrome/browser/ui:ui_features",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/tabs:tab_strip",
     "//chrome/test:test_support",
     "//content/test:test_support",
diff --git a/chrome/browser/ui/tabs/tab_strip_api/adapters/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/adapters/BUILD.gn
index 90c0b02..7cd0bf2 100644
--- a/chrome/browser/ui/tabs/tab_strip_api/adapters/BUILD.gn
+++ b/chrome/browser/ui/tabs/tab_strip_api/adapters/BUILD.gn
@@ -29,7 +29,7 @@
     ":adapters",
     "tree_builder",
     "//chrome/browser/ui",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/tabs:tab_strip",
     "//chrome/browser/ui/tabs:tab_strip_model_observer",
     "//content/public/browser",
diff --git a/chrome/browser/ui/tabs/tab_strip_api/adapters/tree_builder/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/adapters/tree_builder/BUILD.gn
index 7c045e6..96fc368c 100644
--- a/chrome/browser/ui/tabs/tab_strip_api/adapters/tree_builder/BUILD.gn
+++ b/chrome/browser/ui/tabs/tab_strip_api/adapters/tree_builder/BUILD.gn
@@ -16,8 +16,8 @@
   deps = [
     "//chrome/browser/ui/tabs:tab_strip",
     "//chrome/browser/ui/tabs/tab_strip_api:mojom",
-    "//chrome/browser/ui/tabs/tab_strip_api/converters:converters",
-    "//chrome/browser/ui/tabs/tab_strip_api/types:types",
+    "//chrome/browser/ui/tabs/tab_strip_api/converters",
+    "//chrome/browser/ui/tabs/tab_strip_api/types",
   ]
 }
 
@@ -31,7 +31,7 @@
     "//base",
     "//base/test:test_support",
     "//chrome/browser/ui:ui_features",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/tabs:tab_strip",
     "//chrome/test:test_support",
     "//content/test:test_support",
diff --git a/chrome/browser/ui/tabs/tab_strip_api/converters/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/converters/BUILD.gn
index e3ad014..2804cf0809 100644
--- a/chrome/browser/ui/tabs/tab_strip_api/converters/BUILD.gn
+++ b/chrome/browser/ui/tabs/tab_strip_api/converters/BUILD.gn
@@ -11,7 +11,7 @@
   deps = [
     "//chrome/browser/ui/tabs:tab_strip",
     "//chrome/browser/ui/tabs/tab_strip_api:mojom",
-    "//chrome/browser/ui/tabs/tab_strip_api/types:types",
+    "//chrome/browser/ui/tabs/tab_strip_api/types",
   ]
 }
 
@@ -24,7 +24,7 @@
     ":converters",
     "//chrome/browser/ui/tabs:tab_strip",
     "//chrome/browser/ui/tabs/tab_strip_api:mojom",
-    "//chrome/browser/ui/tabs/tab_strip_api/types:types",
+    "//chrome/browser/ui/tabs/tab_strip_api/types",
     "//testing/gtest",
   ]
 }
diff --git a/chrome/browser/ui/tabs/tab_strip_api/events/BUILD.gn b/chrome/browser/ui/tabs/tab_strip_api/events/BUILD.gn
index adb3743..15b8fc5e 100644
--- a/chrome/browser/ui/tabs/tab_strip_api/events/BUILD.gn
+++ b/chrome/browser/ui/tabs/tab_strip_api/events/BUILD.gn
@@ -15,9 +15,9 @@
     "//chrome/browser/ui/tabs:tab_strip",
     "//chrome/browser/ui/tabs:tab_strip_model_observer",
     "//chrome/browser/ui/tabs/tab_strip_api:mojom",
-    "//chrome/browser/ui/tabs/tab_strip_api/adapters:adapters",
-    "//chrome/browser/ui/tabs/tab_strip_api/converters:converters",
-    "//chrome/browser/ui/tabs/tab_strip_api/types:types",
+    "//chrome/browser/ui/tabs/tab_strip_api/adapters",
+    "//chrome/browser/ui/tabs/tab_strip_api/converters",
+    "//chrome/browser/ui/tabs/tab_strip_api/types",
   ]
 }
 
diff --git a/chrome/browser/ui/thumbnails/BUILD.gn b/chrome/browser/ui/thumbnails/BUILD.gn
index 511095a3..81fe3c22 100644
--- a/chrome/browser/ui/thumbnails/BUILD.gn
+++ b/chrome/browser/ui/thumbnails/BUILD.gn
@@ -57,8 +57,8 @@
       ":thumbnails",
       "//base",
       "//base/test:test_support",
-      "//chrome/browser:browser",
-      "//chrome/browser/extensions:extensions",
+      "//chrome/browser",
+      "//chrome/browser/extensions",
       "//chrome/test:test_support",
       "//content/test:test_support",
       "//skia",
diff --git a/chrome/browser/ui/toasts/BUILD.gn b/chrome/browser/ui/toasts/BUILD.gn
index f10d2c1..697be81 100644
--- a/chrome/browser/ui/toasts/BUILD.gn
+++ b/chrome/browser/ui/toasts/BUILD.gn
@@ -17,15 +17,15 @@
   ]
   public_deps = [
     "//base",
-    "//chrome/browser/ui/browser_window:browser_window",
-    "//chrome/browser/ui/commerce:commerce",
+    "//chrome/browser/ui/browser_window",
+    "//chrome/browser/ui/commerce",
     "//chrome/browser/ui/exclusive_access",
-    "//chrome/browser/ui/omnibox:omnibox",
+    "//chrome/browser/ui/omnibox",
     "//chrome/browser/ui/tabs:tab_strip_model_observer",
     "//chrome/browser/ui/toasts/api:toasts",
     "//components/commerce/core:feature_list",
     "//components/omnibox/browser:vector_icons",
-    "//components/omnibox/common:common",
+    "//components/omnibox/common",
     "//content/public/browser",
     "//ui/base",
     "//ui/views",
@@ -56,7 +56,7 @@
     "//components/plus_addresses/resources/strings",
     "//components/safe_browsing/core/common:features",
     "//components/safe_browsing/core/common:safe_browsing_prefs",
-    "//components/vector_icons:vector_icons",
+    "//components/vector_icons",
     "//ui/base/metadata",
     "//ui/compositor",
     "//ui/menus",
@@ -77,8 +77,8 @@
     "//chrome/app:command_ids",
     "//chrome/browser",
     "//chrome/browser:browser_process",
+    "//chrome/browser/ui",
     "//chrome/browser/ui:browser_element_identifiers",
-    "//chrome/browser/ui:ui",
     "//chrome/test:test_support",
     "//components/plus_addresses:features",
     "//components/safe_browsing/core/common:features",
@@ -86,7 +86,7 @@
     "//content/public/browser",
     "//content/test:test_support",
     "//testing/gtest",
-    "//ui/base:base",
+    "//ui/base",
     "//ui/base:test_support",
     "//ui/gfx",
     "//ui/strings:ui_strings_grit",
@@ -112,7 +112,7 @@
     "//base/test:test_support",
     "//chrome/browser",
     "//chrome/browser:browser_process",
-    "//chrome/browser/ui:ui",
+    "//chrome/browser/ui",
     "//chrome/test:test_support",
     "//components/data_sharing/public:features",
     "//components/plus_addresses:features",
@@ -121,7 +121,7 @@
     "//content/public/browser",
     "//content/test:test_support",
     "//testing/gtest",
-    "//ui/base:base",
+    "//ui/base",
     "//ui/gfx",
     "//ui/strings:ui_strings_grit",
     "//ui/views",
diff --git a/chrome/browser/ui/toasts/api/BUILD.gn b/chrome/browser/ui/toasts/api/BUILD.gn
index 6db318a..994f322d 100644
--- a/chrome/browser/ui/toasts/api/BUILD.gn
+++ b/chrome/browser/ui/toasts/api/BUILD.gn
@@ -18,7 +18,7 @@
     "//ui/base",
     "//ui/menus",
   ]
-  deps = [ "//components/vector_icons:vector_icons" ]
+  deps = [ "//components/vector_icons" ]
 }
 
 source_set("unit_tests") {
diff --git a/chrome/browser/ui/toolbar/cast/BUILD.gn b/chrome/browser/ui/toolbar/cast/BUILD.gn
index 69d47a7..1a16ef28 100644
--- a/chrome/browser/ui/toolbar/cast/BUILD.gn
+++ b/chrome/browser/ui/toolbar/cast/BUILD.gn
@@ -36,7 +36,7 @@
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui:ui_features",
     "//chrome/browser/ui/actions:actions_headers",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/views/toolbar",
     "//chrome/common",
     "//chrome/common:constants",
diff --git a/chrome/browser/ui/toolbar/pinned_toolbar/BUILD.gn b/chrome/browser/ui/toolbar/pinned_toolbar/BUILD.gn
index eb03753..8ef5dfa 100644
--- a/chrome/browser/ui/toolbar/pinned_toolbar/BUILD.gn
+++ b/chrome/browser/ui/toolbar/pinned_toolbar/BUILD.gn
@@ -44,7 +44,7 @@
       "//chrome/browser/ui/actions:actions_headers",
       "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/toolbar",
-      "//chrome/browser/ui/views/page_action:page_action",
+      "//chrome/browser/ui/views/page_action",
       "//chrome/browser/ui/views/toolbar",
     ]
     public_deps = [ "//chrome/browser:browser_public_dependencies" ]
diff --git a/chrome/browser/ui/views/BUILD.gn b/chrome/browser/ui/views/BUILD.gn
index 665ed59..3e6878e0 100644
--- a/chrome/browser/ui/views/BUILD.gn
+++ b/chrome/browser/ui/views/BUILD.gn
@@ -68,8 +68,8 @@
     "//chrome/browser/ui/global_media_controls",
     "//chrome/browser/ui/views/toolbar",
     "//chrome/test:test_support_ui",
-    "//components/global_media_controls:global_media_controls",
-    "//components/media_message_center:media_message_center",
+    "//components/global_media_controls",
+    "//components/media_message_center",
     "//components/media_router/browser:test_support",
     "//testing/gtest",
     "//ui/base:test_support",
diff --git a/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.cc b/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.cc
index ca1c24d..bb30c2d7 100644
--- a/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.cc
@@ -20,8 +20,10 @@
 namespace autofill {
 
 SaveAndFillDialog::SaveAndFillDialog(
-    base::WeakPtr<SaveAndFillDialogController> controller)
-    : controller_(controller) {
+    base::WeakPtr<SaveAndFillDialogController> controller,
+    base::RepeatingCallback<void(const GURL&)> on_legal_message_link_clicked)
+    : controller_(controller),
+      on_legal_message_link_clicked_(on_legal_message_link_clicked) {
   // Set the ownership of the delegate, not the View. The View is owned by the
   // Widget as a child view.
   // TODO(crbug.com/338254375): Remove the following line once this is the
@@ -196,6 +198,10 @@
       /*error_message=*/controller_->GetInvalidNameOnCardErrorMessage());
   name_on_card_data_.GetInputTextField().SetController(this);
   AddChildView(std::move(name_on_card_data_.container));
+
+  if (controller_->IsUploadSaveAndFill()) {
+    AddChildView(CreateLegalMessageView());
+  }
 }
 
 payments::PaymentsAutofillClient::UserProvidedCardSaveAndFillDetails
@@ -236,4 +242,17 @@
   }
 }
 
+std::unique_ptr<views::View> SaveAndFillDialog::CreateLegalMessageView() {
+  const LegalMessageLines& message_lines = controller_->GetLegalMessageLines();
+
+  if (message_lines.empty()) {
+    return nullptr;
+  }
+
+  // TODO(crbug.com/378164165): Add account info to the server dialog.
+  return autofill::CreateLegalMessageView(
+      message_lines, std::u16string(), ui::ImageModel(),
+      base::BindRepeating(on_legal_message_link_clicked_));
+}
+
 }  // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.h b/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.h
index 415341f..dfe69ec 100644
--- a/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.h
+++ b/chrome/browser/ui/views/autofill/payments/save_and_fill_dialog.h
@@ -23,7 +23,8 @@
                           public views::FocusChangeListener {
  public:
   explicit SaveAndFillDialog(
-      base::WeakPtr<SaveAndFillDialogController> controller);
+      base::WeakPtr<SaveAndFillDialogController> controller,
+      base::RepeatingCallback<void(const GURL&)> on_legal_message_link_clicked);
   SaveAndFillDialog(const SaveAndFillDialog&) = delete;
   SaveAndFillDialog& operator=(const SaveAndFillDialog&) = delete;
   ~SaveAndFillDialog() override;
@@ -50,8 +51,11 @@
   GetUserProvidedDataFromInput() const;
   // Callback that is triggered when the dialog is accepted or canceled.
   void OnDialogClosed(views::Widget::ClosedReason reason);
+  // Create a view with a legal message.
+  std::unique_ptr<views::View> CreateLegalMessageView();
 
   base::WeakPtr<SaveAndFillDialogController> controller_;
+  base::RepeatingCallback<void(const GURL&)> on_legal_message_link_clicked_;
 
   // The focus manager associated with this view. The focus manager is expected
   // to outlive this view.
diff --git a/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.cc b/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.cc
index 147d6f74..8a0c264 100644
--- a/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.cc
+++ b/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.cc
@@ -25,8 +25,12 @@
 
 SaveAndFillViewDesktop::SaveAndFillViewDesktop(
     base::WeakPtr<SaveAndFillDialogController> controller,
-    content::WebContents* web_contents) {
-  auto dialog_view = std::make_unique<SaveAndFillDialog>(controller);
+    content::WebContents* web_contents)
+    : web_contents_(web_contents) {
+  auto dialog_view = std::make_unique<SaveAndFillDialog>(
+      controller,
+      base::BindRepeating(&SaveAndFillViewDesktop::OnLegalMessageLinkClicked,
+                          weak_ptr_factory_.GetWeakPtr()));
   TabInterface* tab_interface = TabInterface::GetFromContents(web_contents);
   CHECK(tab_interface);
   dialog_widget_ = tab_interface->GetTabFeatures()
@@ -38,4 +42,12 @@
 
 SaveAndFillViewDesktop::~SaveAndFillViewDesktop() = default;
 
+void SaveAndFillViewDesktop::OnLegalMessageLinkClicked(const GURL& url) {
+  web_contents_->OpenURL(
+      content::OpenURLParams(
+          url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB,
+          ui::PAGE_TRANSITION_LINK, /*is_renderer_initiated=*/false),
+      /*navigation_handle_callback=*/{});
+}
+
 }  // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.h b/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.h
index 97b5edb..5531ee41 100644
--- a/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.h
+++ b/chrome/browser/ui/views/autofill/payments/save_and_fill_view_desktop.h
@@ -5,6 +5,7 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_AUTOFILL_PAYMENTS_SAVE_AND_FILL_VIEW_DESKTOP_H_
 #define CHROME_BROWSER_UI_VIEWS_AUTOFILL_PAYMENTS_SAVE_AND_FILL_VIEW_DESKTOP_H_
 
+#include "base/memory/raw_ptr.h"
 #include "components/autofill/core/browser/ui/payments/save_and_fill_dialog_view.h"
 #include "ui/views/widget/widget.h"
 
@@ -28,7 +29,12 @@
   ~SaveAndFillViewDesktop() override;
 
  private:
+  void OnLegalMessageLinkClicked(const GURL& url);
+
+  raw_ptr<content::WebContents> web_contents_;
   std::unique_ptr<views::Widget> dialog_widget_;
+
+  base::WeakPtrFactory<SaveAndFillViewDesktop> weak_ptr_factory_{this};
 };
 
 }  // namespace autofill
diff --git a/chrome/browser/ui/views/bubble/BUILD.gn b/chrome/browser/ui/views/bubble/BUILD.gn
index 944cb77..4e06f4f 100644
--- a/chrome/browser/ui/views/bubble/BUILD.gn
+++ b/chrome/browser/ui/views/bubble/BUILD.gn
@@ -18,7 +18,7 @@
     "//base",
     "//chrome/browser:browser_public_dependencies",
     "//chrome/browser/ui:ui_features",
-    "//chrome/browser/ui/browser_window:browser_window",
+    "//chrome/browser/ui/browser_window",
     "//chrome/browser/ui/webui:webui_util",
     "//content/public/browser",
     "//skia",
diff --git a/chrome/browser/ui/views/download/BUILD.gn b/chrome/browser/ui/views/download/BUILD.gn
index 7c644a6..fb3ed1f 100644
--- a/chrome/browser/ui/views/download/BUILD.gn
+++ b/chrome/browser/ui/views/download/BUILD.gn
@@ -25,10 +25,10 @@
   ]
   deps = [
     "//chrome/browser/profiles:profile",
+    "//chrome/browser/safe_browsing",
     "//chrome/browser/safe_browsing:advanced_protection",
-    "//chrome/browser/safe_browsing:safe_browsing",
-    "//chrome/browser/ui/hats:hats",
-    "//components/constrained_window:constrained_window",
+    "//chrome/browser/ui/hats",
+    "//components/constrained_window",
     "//components/safe_browsing/core/common:features",
     "//components/safe_browsing/core/common:safe_browsing_prefs",
     "//ui/strings:ui_strings_grit",
@@ -69,21 +69,21 @@
       "//chrome/browser:primitives",
       "//chrome/browser/profiles:profile",
       "//chrome/browser/profiles:profile_util",
+      "//chrome/browser/safe_browsing",
       "//chrome/browser/safe_browsing:advanced_protection",
-      "//chrome/browser/safe_browsing:safe_browsing",
       "//chrome/browser/themes",
       "//chrome/browser/ui:browser_element_identifiers",
       "//chrome/browser/ui:browser_list",
       "//chrome/browser/ui:ui_features",
       "//chrome/browser/ui/actions:actions_headers",
-      "//chrome/browser/ui/browser_window:browser_window",
+      "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/color:color_headers",
       "//chrome/browser/ui/download",
-      "//chrome/browser/ui/hats:hats",
+      "//chrome/browser/ui/hats",
       "//chrome/browser/ui/tabs:tab_strip",
       "//chrome/browser/ui/views/frame:immersive_mode_controller",
       "//components/autofill/content/browser",
-      "//components/constrained_window:constrained_window",
+      "//components/constrained_window",
       "//components/feature_engagement/public:feature_constants",
       "//components/safe_browsing/core/common:features",
       "//components/safe_browsing/core/common:safe_browsing_policy_handler",
diff --git a/chrome/browser/ui/views/mahi/BUILD.gn b/chrome/browser/ui/views/mahi/BUILD.gn
index 7102371f..63182a7 100644
--- a/chrome/browser/ui/views/mahi/BUILD.gn
+++ b/chrome/browser/ui/views/mahi/BUILD.gn
@@ -26,7 +26,7 @@
     "//chromeos/components/magic_boost/public/cpp",
     "//chromeos/components/magic_boost/public/cpp/views",
     "//chromeos/components/mahi/public/cpp",
-    "//chromeos/constants:constants",
+    "//chromeos/constants",
     "//chromeos/strings:strings_grit",
     "//chromeos/ui/vector_icons",
     "//components/application_locale_storage",
diff --git a/chrome/browser/ui/views/new_tab_footer/BUILD.gn b/chrome/browser/ui/views/new_tab_footer/BUILD.gn
index f33e021c..dd89f404 100644
--- a/chrome/browser/ui/views/new_tab_footer/BUILD.gn
+++ b/chrome/browser/ui/views/new_tab_footer/BUILD.gn
@@ -13,7 +13,7 @@
     "footer_web_view.h",
   ]
   deps = [
-    "//base:base",
+    "//base",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/resources/new_tab_footer:resources_grit",
     "//chrome/browser/ui:ui_features",
diff --git a/chrome/browser/ui/views/page_action/BUILD.gn b/chrome/browser/ui/views/page_action/BUILD.gn
index 680a95a..2f1faf3 100644
--- a/chrome/browser/ui/views/page_action/BUILD.gn
+++ b/chrome/browser/ui/views/page_action/BUILD.gn
@@ -81,7 +81,7 @@
     ":page_action",
     "//chrome/test:test_support",
     "//components/tabs:test_support",
-    "//testing/gmock:gmock",
+    "//testing/gmock",
     "//ui/actions:actions_headers",
   ]
 }
diff --git a/chrome/browser/ui/views/page_action/page_action_properties_provider.cc b/chrome/browser/ui/views/page_action/page_action_properties_provider.cc
index 3d0a1d0..0b016b0 100644
--- a/chrome/browser/ui/views/page_action/page_action_properties_provider.cc
+++ b/chrome/browser/ui/views/page_action/page_action_properties_provider.cc
@@ -71,6 +71,7 @@
             {
                 .histogram_name = "PwaInstall",
                 .type = PageActionIconType::kPwaInstall,
+                .element_identifier = kInstallPwaElementId,
             },
         },
         {
diff --git a/chrome/browser/ui/views/page_info/BUILD.gn b/chrome/browser/ui/views/page_info/BUILD.gn
index 62c0f98d..7ee2e41 100644
--- a/chrome/browser/ui/views/page_info/BUILD.gn
+++ b/chrome/browser/ui/views/page_info/BUILD.gn
@@ -10,7 +10,7 @@
   ]
 
   public_deps = [
-    "//base:base",
+    "//base",
     "//chrome/browser/ui/page_info",
     "//components/content_settings/core/common",
     "//components/page_info/core",
@@ -30,7 +30,7 @@
 
   deps = [
     ":page_info",
-    "//base:base",
+    "//base",
     "//chrome/browser:browser_public_dependencies",
     "//chrome/browser:primitives",
     "//chrome/browser/page_info",
diff --git a/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc b/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc
index 7a32d57..68c384d 100644
--- a/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc
+++ b/chrome/browser/ui/views/performance_controls/memory_saver_interactive_ui_test.cc
@@ -183,7 +183,7 @@
   base::CallbackListSubscription subscription =
       RecentlyAudibleHelper::FromWebContents(
           browser()->tab_strip_model()->GetWebContentsAt(0))
-          ->RegisterCallbackForTesting(
+          ->RegisterRecentlyAudibleChangedCallback(
               base::BindRepeating(&MemorySaverDiscardPolicyInteractiveTest::
                                       OnRecentlyAudibleCallback,
                                   base::Unretained(this), kFirstTabContents));
diff --git a/chrome/browser/ui/views/permissions/chip/BUILD.gn b/chrome/browser/ui/views/permissions/chip/BUILD.gn
index 57d3d936..096fefb 100644
--- a/chrome/browser/ui/views/permissions/chip/BUILD.gn
+++ b/chrome/browser/ui/views/permissions/chip/BUILD.gn
@@ -10,10 +10,10 @@
   ]
 
   public_deps = [
-    "//base:base",
-    "//chrome/browser/ui/content_settings:content_settings",
-    "//chrome/browser/ui/views/permissions:permissions",
-    "//components/permissions:permissions",
+    "//base",
+    "//chrome/browser/ui/content_settings",
+    "//chrome/browser/ui/views/permissions",
+    "//components/permissions",
     "//ui/gfx",
     "//ui/views",
   ]
@@ -28,8 +28,8 @@
   deps = [
     ":chip",
     "//chrome/browser:browser_public_dependencies",
-    "//chrome/browser/themes:themes",
-    "//chrome/browser/ui/page_info:page_info",
+    "//chrome/browser/themes",
+    "//chrome/browser/ui/page_info",
     "//chrome/browser/ui/views/page_info",
   ]
 }
diff --git a/chrome/browser/ui/views/side_panel/BUILD.gn b/chrome/browser/ui/views/side_panel/BUILD.gn
index f423e44..d3d2c74 100644
--- a/chrome/browser/ui/views/side_panel/BUILD.gn
+++ b/chrome/browser/ui/views/side_panel/BUILD.gn
@@ -103,7 +103,7 @@
     "//chrome/browser/ui/customize_chrome",
     "//chrome/browser/ui/tabs:tab_model",
     "//chrome/browser/ui/toolbar/pinned_toolbar",
-    "//chrome/browser/ui/webui/new_tab_footer:new_tab_footer",
+    "//chrome/browser/ui/webui/new_tab_footer",
     "//chrome/browser/ui/webui/side_panel/customize_chrome",
     "//chrome/common",
     "//chrome/common/read_anything:mojo_bindings",
@@ -140,7 +140,7 @@
     "//chrome/browser/resources:component_extension_resources",
     "//chrome/browser/resources:component_extension_resources_grit",
     "//chrome/browser/search",
-    "//chrome/browser/search/background:background",
+    "//chrome/browser/search/background",
     "//chrome/browser/search_engines",
     "//chrome/browser/themes",
     "//chrome/browser/ui:browser_element_identifiers",
diff --git a/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.cc
index 1363441..40107b5 100644
--- a/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.cc
+++ b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.cc
@@ -5,15 +5,25 @@
 #include "chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h"
 
 #include "base/functional/callback.h"
+#include "chrome/browser/ui/browser_element_identifiers.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_features.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
+#include "chrome/browser/ui/tabs/saved_tab_groups/saved_tab_group_utils.h"
+#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
+#include "chrome/browser/ui/views/frame/browser_view.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_entry.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_registry.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_web_ui_view.h"
+#include "chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.h"
+#include "chrome/browser/ui/views/toolbar/toolbar_view.h"
 #include "chrome/browser/ui/webui/side_panel/comments/comments_side_panel_ui.h"
 #include "chrome/common/webui_url_constants.h"
 #include "components/collaboration/public/features.h"
+#include "components/saved_tab_groups/public/saved_tab_group.h"
+#include "components/saved_tab_groups/public/tab_group_sync_service.h"
 #include "components/strings/grit/components_strings.h"
+#include "components/tab_groups/tab_group_id.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 
 using SidePanelWebUIViewT_CommentsSidePanelUI =
@@ -22,6 +32,108 @@
                         SidePanelWebUIViewT)
 END_METADATA
 
+CommentsSidePanelCoordinator::CommentsSidePanelCoordinator(
+    BrowserView* browser_view)
+    : browser_view_(browser_view),
+      tab_group_sync_service_(
+          tab_groups::SavedTabGroupUtils::GetServiceForProfile(
+              browser_view->browser()->profile())) {
+  browser_view->browser()->GetTabStripModel()->AddObserver(this);
+}
+
+CommentsSidePanelCoordinator::~CommentsSidePanelCoordinator() = default;
+
+void CommentsSidePanelCoordinator::OnTabStripModelChanged(
+    TabStripModel* tab_strip_model,
+    const TabStripModelChange& change,
+    const TabStripSelectionChange& selection) {
+  // TODO(crbug.com/433773768): This should also handle when the current tab
+  // group becomes shared or when the active tab is added to a shared group.
+  if (selection.active_tab_changed()) {
+    const bool should_show_comments_action =
+        ShouldShowCommentsAction(selection);
+    UpdateCommentsActionVisibility(should_show_comments_action);
+    UpdateCommentsSidePanelVisibility(should_show_comments_action);
+  }
+}
+
+bool CommentsSidePanelCoordinator::ShouldShowCommentsAction(
+    const TabStripSelectionChange& selection) {
+  if (!selection.new_tab) {
+    return false;
+  }
+
+  std::optional<tab_groups::TabGroupId> group = selection.new_tab->GetGroup();
+  if (!group.has_value()) {
+    return false;
+  }
+
+  std::optional<tab_groups::SavedTabGroup> saved_group =
+      tab_group_sync_service_->GetGroup(group.value());
+
+  // If the group is shared, we should show the comments action.
+  return saved_group.has_value() && saved_group->is_shared_tab_group();
+}
+
+void CommentsSidePanelCoordinator::UpdateCommentsActionVisibility(
+    bool should_show_comments_action) {
+  PinnedToolbarActionsContainer* container =
+      browser_view_->toolbar()->pinned_toolbar_actions_container();
+  if (!container) {
+    return;
+  }
+
+  if (should_show_comments_action ==
+      container->IsActionPoppedOut(kActionSidePanelShowComments)) {
+    // Do nothing if the action is already in the correct state.
+    return;
+  }
+
+  container->ShowActionEphemerallyInToolbar(kActionSidePanelShowComments,
+                                            should_show_comments_action);
+
+  if (should_show_comments_action) {
+    PinnedActionToolbarButton* button =
+        container->GetButtonFor(kActionSidePanelShowComments);
+    CHECK(button);
+
+    button->SetProperty(views::kElementIdentifierKey,
+                        kSharedTabGroupCommentsActionElementId);
+  }
+}
+
+void CommentsSidePanelCoordinator::UpdateCommentsSidePanelVisibility(
+    bool should_show_comments_action) {
+  SidePanelCoordinator* side_panel_coordinator =
+      browser_view_->browser()->GetFeatures().side_panel_coordinator();
+
+  // TODO(crbug.com/430352059): This should also handle when a different side
+  // panel is open.
+  const bool side_panel_showing =
+      side_panel_coordinator->IsSidePanelEntryShowing(
+          SidePanelEntry::Key(SidePanelEntry::Id::kComments));
+
+  if (should_show_comments_action == side_panel_showing) {
+    // Do nothing if the side panel is in the correct state.
+    return;
+  }
+
+  if (side_panel_showing) {
+    // Close the side panel, setting the flag to recall the state when the
+    // comments action is shown again.
+    side_panel_coordinator->Close();
+    side_panel_should_be_resumed_ = true;
+    return;
+  }
+
+  if (side_panel_should_be_resumed_) {
+    // Resume the side panel if it was closed due to changing the active tab.
+    side_panel_coordinator->Show(
+        SidePanelEntry::Key(SidePanelEntry::Id::kComments));
+    side_panel_should_be_resumed_ = false;
+  }
+}
+
 // static
 bool CommentsSidePanelCoordinator::IsSupported() {
   return base::FeatureList::IsEnabled(
diff --git a/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h
index 5aae991..0ec8e1f 100644
--- a/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h
+++ b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h
@@ -8,20 +8,38 @@
 #include <memory>
 
 #include "base/memory/raw_ptr.h"
+#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
 
+class BrowserView;
 class SidePanelEntryScope;
 class SidePanelRegistry;
 
+class TabStripModel;
+class TabStripModelChange;
+struct TabStripSelectionChange;
+
+namespace tab_groups {
+class TabGroupSyncService;
+}  // namespace tab_groups
+
 namespace views {
 class View;
 }
 
 // CommentsSidePanelCoordinator handles the creation and registration of
 // the comments SidePanelEntry.
-class CommentsSidePanelCoordinator {
+class CommentsSidePanelCoordinator : public TabStripModelObserver {
  public:
-  CommentsSidePanelCoordinator() = default;
-  ~CommentsSidePanelCoordinator() = default;
+  // TODO(crbug.com/434203413): Remove dependency on BrowserView by implementing
+  // a PinnedToolbarActionsController.
+  explicit CommentsSidePanelCoordinator(BrowserView* browser_view);
+  ~CommentsSidePanelCoordinator() override;
+
+  // TabStripModelObserver
+  void OnTabStripModelChanged(
+      TabStripModel* tab_strip_model,
+      const TabStripModelChange& change,
+      const TabStripSelectionChange& selection) override;
 
   // Returns whether CommentsSidePanelCoordinator is supported.
   // If this returns false, it should not be registered with the side
@@ -36,6 +54,25 @@
   // comments side panel entry.
   std::unique_ptr<views::View> CreateCommentsWebView(
       SidePanelEntryScope& scope);
+
+  // Determine if the comments action should be shown in the toolbar for the
+  // active tab.
+  bool ShouldShowCommentsAction(const TabStripSelectionChange& selection);
+
+  // Updates the visibility of the comments action in the toolbar.
+  void UpdateCommentsActionVisibility(bool should_show_comments_action);
+
+  // If the comments side panel is open, temporarily closes it and sets the
+  // side_panel_should_be_resumed_ flag.
+  void UpdateCommentsSidePanelVisibility(bool should_show_comments_action);
+
+  // Whether the comments side panel was temporarily closed by changing the
+  // active tab. When the comments action is shown again, this will be used to
+  // restore the side panel.
+  bool side_panel_should_be_resumed_ = false;
+
+  raw_ptr<BrowserView> browser_view_;
+  raw_ptr<tab_groups::TabGroupSyncService> tab_group_sync_service_;
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_SIDE_PANEL_COMMENTS_COMMENTS_SIDE_PANEL_COORDINATOR_H_
diff --git a/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator_interactive_uitest.cc b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator_interactive_uitest.cc
new file mode 100644
index 0000000..ec13dfcd
--- /dev/null
+++ b/chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator_interactive_uitest.cc
@@ -0,0 +1,198 @@
+// Copyright 2025 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/data_sharing/data_sharing_service_factory.h"
+#include "chrome/browser/signin/identity_manager_factory.h"
+#include "chrome/browser/tab_group_sync/tab_group_sync_service_factory.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_element_identifiers.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_features.h"
+#include "chrome/browser/ui/tabs/public/tab_features.h"
+#include "chrome/browser/ui/tabs/tab_group_model.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/views/side_panel/comments/comments_side_panel_coordinator.h"
+#include "chrome/browser/ui/views/side_panel/side_panel_coordinator.h"
+#include "chrome/browser/ui/views/side_panel/side_panel_registry.h"
+#include "chrome/browser/ui/views/tabs/tab_strip.h"
+#include "chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h"
+#include "chrome/test/interaction/interactive_browser_test.h"
+#include "chrome/test/user_education/interactive_feature_promo_test.h"
+#include "components/collaboration/public/features.h"
+#include "components/data_sharing/public/data_sharing_service.h"
+#include "components/data_sharing/public/features.h"
+#include "components/data_sharing/public/group_data.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/saved_tab_groups/public/features.h"
+#include "components/saved_tab_groups/public/tab_group_sync_service.h"
+#include "components/signin/public/base/consent_level.h"
+#include "components/signin/public/identity_manager/identity_manager.h"
+#include "components/signin/public/identity_manager/identity_test_utils.h"
+#include "components/tab_groups/tab_group_id.h"
+#include "components/tabs/public/tab_group.h"
+#include "components/tabs/public/tab_interface.h"
+#include "components/user_education/views/help_bubble_view.h"
+#include "content/public/test/browser_test.h"
+#include "google_apis/gaia/core_account_id.h"
+#include "google_apis/gaia/gaia_id.h"
+#include "testing/gmock/include/gmock/gmock.h"
+
+class CommentsSidePanelCoordinatorInteractiveUiTest
+    : public TabStripInteractiveTestMixin<InteractiveBrowserTest> {
+ public:
+  void SetUp() override {
+    scoped_feature_list_.InitWithFeatures(
+        {
+            data_sharing::features::kDataSharingFeature,
+            collaboration::features::kCollaborationComments,
+        },
+        {});
+    InteractiveBrowserTest::SetUp();
+  }
+
+  tab_groups::TabGroupId CreateNewTabGroup() {
+    EXPECT_TRUE(
+        AddTabAtIndex(0, GURL(url::kAboutBlankURL), ui::PAGE_TRANSITION_TYPED));
+    return browser()->tab_strip_model()->AddToNewGroup({0});
+  }
+
+  void ShareTabGroup(tab_groups::TabGroupId group_id,
+                     syncer::CollaborationId collaboration_id,
+                     data_sharing::MemberRole member_role,
+                     bool should_sign_in) {
+    tab_groups::TabGroupSyncService* service =
+        tab_groups::TabGroupSyncServiceFactory::GetForProfile(
+            browser()->profile());
+    service->MakeTabGroupSharedForTesting(group_id, collaboration_id);
+
+    // Additional Properties.
+    const std::string display_name = "Display Name";
+    const std::string email = "test@mail.com";
+    const GURL avatar_url = GURL("chrome://newtab");
+    const std::string given_name = "Given Name";
+    const std::string access_token = "fake_access_token";
+    const GaiaId gaia_id("fake_gaia_id");
+
+    GaiaId gaia_id_to_use = gaia_id;
+    if (should_sign_in) {
+      // Simulate a signed in primary account.
+      signin::IdentityManager* identity_manager =
+          IdentityManagerFactory::GetForProfile(browser()->profile());
+      signin::MakePrimaryAccountAvailable(identity_manager, email,
+                                          signin::ConsentLevel::kSignin);
+      signin::MakePrimaryAccountAvailable(identity_manager, email,
+                                          signin::ConsentLevel::kSync);
+      CoreAccountInfo account_info = identity_manager->GetPrimaryAccountInfo(
+          signin::ConsentLevel::kSignin);
+
+      gaia_id_to_use = account_info.gaia;
+    }
+
+    data_sharing::GroupMember group_member =
+        data_sharing::GroupMember(gaia_id_to_use, display_name, email,
+                                  member_role, avatar_url, given_name);
+    data_sharing::GroupData group_data =
+        data_sharing::GroupData(data_sharing::GroupId(collaboration_id.value()),
+                                display_name, {group_member}, {}, access_token);
+
+    data_sharing_service()->AddGroupDataForTesting(std::move(group_data));
+  }
+
+  data_sharing::DataSharingService* data_sharing_service() {
+    data_sharing::DataSharingService* data_sharing_service =
+        data_sharing::DataSharingServiceFactory::GetForProfile(
+            browser()->profile());
+    return data_sharing_service;
+  }
+
+  CommentsSidePanelCoordinator* side_panel_coordinator() {
+    return browser()->GetFeatures().comments_side_panel_coordinator();
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(CommentsSidePanelCoordinatorInteractiveUiTest,
+                       EntryIsRegistered) {
+  // The comments entry should be registered in the window registry.
+  EXPECT_EQ(
+      browser()
+          ->GetFeatures()
+          .side_panel_coordinator()
+          ->GetWindowRegistry()
+          ->GetEntryForKey(SidePanelEntry::Key(SidePanelEntry::Id::kComments))
+          ->key()
+          .id(),
+      SidePanelEntry::Id::kComments);
+}
+
+// Verify the comments action is only shown when the active tab is shared.
+IN_PROC_BROWSER_TEST_F(CommentsSidePanelCoordinatorInteractiveUiTest,
+                       CommentActionIsVisible) {
+  CreateNewTabGroup();
+  tab_groups::TabGroupId group_id = CreateNewTabGroup();
+  ShareTabGroup(group_id, syncer::CollaborationId("fake_collaboration_id"),
+                data_sharing::MemberRole::kOwner, /*should_sign_in=*/false);
+
+  const int shared_tab_index = 0;
+  const int non_shared_tab_index = 1;
+  const int ungrouped_tab_index = 2;
+
+  browser()->tab_strip_model()->ActivateTabAt(ungrouped_tab_index);
+
+  RunTestSequence(
+      // Verify the comments action is visible when the active tab is shared.
+      HoverTabAt(shared_tab_index), ClickMouse(), FinishTabstripAnimations(),
+      WaitForShow(kSharedTabGroupCommentsActionElementId),
+
+      // Activate non-shared tab.
+      HoverTabAt(non_shared_tab_index), ClickMouse(),
+      FinishTabstripAnimations(),
+      WaitForHide(kSharedTabGroupCommentsActionElementId),
+
+      // Activate ungrouped tab.
+      HoverTabAt(ungrouped_tab_index), ClickMouse(), FinishTabstripAnimations(),
+      WaitForHide(kSharedTabGroupCommentsActionElementId),
+
+      // Verify the comments action is visible when the tab is shared.
+      HoverTabAt(shared_tab_index), ClickMouse(), FinishTabstripAnimations(),
+      WaitForShow(kSharedTabGroupCommentsActionElementId));
+}
+
+// Verify the comments side panel will resume visilibity when switching to a
+// non-shared tab and back.
+IN_PROC_BROWSER_TEST_F(CommentsSidePanelCoordinatorInteractiveUiTest,
+                       CommentSidePanelIsVisible) {
+  CreateNewTabGroup();
+  tab_groups::TabGroupId group_id = CreateNewTabGroup();
+  ShareTabGroup(group_id, syncer::CollaborationId("fake_collaboration_id"),
+                data_sharing::MemberRole::kOwner, /*should_sign_in=*/false);
+
+  const int shared_tab_index = 0;
+  const int non_shared_tab_index = 1;
+  const int ungrouped_tab_index = 2;
+
+  browser()->tab_strip_model()->ActivateTabAt(ungrouped_tab_index);
+
+  RunTestSequence(
+      // Verify the comments side panel can be opened when the active tab is
+      // shared.
+      HoverTabAt(shared_tab_index), ClickMouse(), FinishTabstripAnimations(),
+      WaitForShow(kSharedTabGroupCommentsActionElementId),
+      PressButton(kSharedTabGroupCommentsActionElementId),
+      WaitForShow(kSidePanelElementId),
+
+      // Activate non-shared tab.
+      HoverTabAt(non_shared_tab_index), ClickMouse(),
+      FinishTabstripAnimations(), WaitForHide(kSidePanelElementId),
+
+      // Activate ungrouped tab.
+      HoverTabAt(ungrouped_tab_index), ClickMouse(), FinishTabstripAnimations(),
+      WaitForHide(kSidePanelElementId),
+
+      // Verify the comments side panel is resumed without clicking the comments
+      // action.
+      HoverTabAt(shared_tab_index), ClickMouse(), FinishTabstripAnimations(),
+      WaitForShow(kSidePanelElementId));
+}
diff --git a/chrome/browser/ui/views/toolbar/BUILD.gn b/chrome/browser/ui/views/toolbar/BUILD.gn
index a15176a..a6ea453 100644
--- a/chrome/browser/ui/views/toolbar/BUILD.gn
+++ b/chrome/browser/ui/views/toolbar/BUILD.gn
@@ -134,7 +134,7 @@
     "//chrome/browser/ui/tabs:tab_strip",
     "//chrome/browser/ui/tabs:tab_strip_model_observer",
     "//chrome/browser/ui/views/download",
-    "//chrome/browser/ui/views/page_action:page_action",
+    "//chrome/browser/ui/views/page_action",
     "//chrome/browser/ui/views/side_panel:side_panel_enums",
     "//chrome/browser/ui/web_applications",
     "//chrome/browser/upgrade_detector",
diff --git a/chrome/browser/ui/views/toolbar/app_menu.cc b/chrome/browser/ui/views/toolbar/app_menu.cc
index 3ea0c344..33c8669 100644
--- a/chrome/browser/ui/views/toolbar/app_menu.cc
+++ b/chrome/browser/ui/views/toolbar/app_menu.cc
@@ -440,6 +440,13 @@
   item->AddChildView(std::move(profile_chip));
   item->AddChildView(std::move(profile_chip_edge_spacing_view));
   item->SetHighlightWhenSelectedWithChildViews(true);
+  // MenuItemView only delegates accessible names when its title is empty with a
+  // single container view. The Profile MenuItemView has a title and multiple
+  // views. As a result, the accessible name must be manually computed to
+  // account for the profile chip.
+  item->GetViewAccessibility().SetName(
+      views::MenuItemView::GetAccessibleNameForMenuItem(
+          item->title(), GetSigninStatusChipString(profile), false));
 }
 
 // AppMenuView is a view that can contain label buttons.
diff --git a/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc b/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc
index 1007756..3e620cac 100644
--- a/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc
+++ b/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/apps/app_service/app_registry_cache_waiter.h"
 #include "chrome/browser/banners/test_app_banner_manager_desktop.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/actions/chrome_action_id.h"
 #include "chrome/browser/ui/test/test_browser_dialog.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h"
@@ -202,10 +203,8 @@
       webapps::TestAppBannerManagerDesktop::FromWebContents(web_contents);
   app_banner_manager->WaitForInstallableCheck();
   EXPECT_TRUE(BrowserView::GetBrowserViewForBrowser(browser())
-                  ->toolbar()
-                  ->location_bar()
-                  ->page_action_icon_controller()
-                  ->GetIconView(PageActionIconType::kPwaInstall)
+                  ->toolbar_button_provider()
+                  ->GetPageActionView(kActionInstallPwa)
                   ->GetVisible());
   browser()->window()->Activate();
   ui_test_utils::BrowserActivationWaiter(browser()).WaitForActivation();
diff --git a/chrome/browser/ui/views/web_apps/BUILD.gn b/chrome/browser/ui/views/web_apps/BUILD.gn
index 5f90092..0ff6346 100644
--- a/chrome/browser/ui/views/web_apps/BUILD.gn
+++ b/chrome/browser/ui/views/web_apps/BUILD.gn
@@ -13,9 +13,9 @@
   ]
   deps = [
     "//base",
-    "//chrome/browser/picture_in_picture:picture_in_picture",
+    "//chrome/browser/picture_in_picture",
     "//chrome/browser/picture_in_picture:test_support_ui",
-    "//chrome/browser/shortcuts:shortcuts",
+    "//chrome/browser/shortcuts",
     "//chrome/browser/ui",
     "//chrome/browser/ui:test_support",
     "//chrome/browser/web_applications:web_applications_test_support",
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
index 9d0e451..d3cc4f80 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.cc
@@ -57,12 +57,14 @@
 #include "chrome/browser/shell_integration.h"
 #include "chrome/browser/ui/actions/chrome_action_id.h"
 #include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_actions.h"
 #include "chrome/browser/ui/browser_commands.h"
 #include "chrome/browser/ui/browser_finder.h"
 #include "chrome/browser/ui/browser_list.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_features.h"
 #include "chrome/browser/ui/exclusive_access/exclusive_access_manager.h"
 #include "chrome/browser/ui/intent_picker_tab_helper.h"
+#include "chrome/browser/ui/page_action/page_action_icon_type.h"
 #include "chrome/browser/ui/startup/startup_browser_creator.h"
 #include "chrome/browser/ui/startup/web_app_startup_utils.h"
 #include "chrome/browser/ui/ui_features.h"
@@ -1356,7 +1358,15 @@
   ASSERT_TRUE(pwa_install_view()->GetVisible());
   WebAppTestInstallWithOsHooksObserver install_observer(profile());
   install_observer.BeginListening();
-  pwa_install_view()->ExecuteForTesting();
+  if (IsPageActionMigrated(PageActionIconType::kPwaInstall)) {
+    actions::ActionManager::Get()
+        .FindAction(kActionInstallPwa,
+                    browser()->GetActions()->root_action_item())
+        ->InvokeAction();
+  } else {
+    browser()->window()->ExecutePageActionIconForTesting(
+        PageActionIconType::kPwaInstall);
+  }
 
   WaitForAndAcceptInstallDialogForSite(InstallableSiteToSite(site));
 
@@ -4713,11 +4723,11 @@
   return profiles;
 }
 
-PageActionIconView* WebAppIntegrationTestDriver::pwa_install_view() {
-  PageActionIconView* pwa_install_view =
+IconLabelBubbleView* WebAppIntegrationTestDriver::pwa_install_view() {
+  IconLabelBubbleView* pwa_install_view =
       BrowserView::GetBrowserViewForBrowser(browser())
           ->toolbar_button_provider()
-          ->GetPageActionIconView(PageActionIconType::kPwaInstall);
+          ->GetPageActionView(kActionInstallPwa);
   CHECK(pwa_install_view);
   return pwa_install_view;
 }
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
index 7a72c97..338268f 100644
--- a/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
+++ b/chrome/browser/ui/views/web_apps/web_app_integration_test_driver.h
@@ -40,7 +40,7 @@
 #endif
 
 class Browser;
-class PageActionIconView;
+class IconLabelBubbleView;
 
 namespace base {
 class CommandLine;
@@ -501,7 +501,7 @@
 
   Browser* app_browser() { return app_browser_; }
   WebAppProvider* provider() { return WebAppProvider::GetForTest(profile()); }
-  PageActionIconView* pwa_install_view();
+  IconLabelBubbleView* pwa_install_view();
   views::Button* intent_chip_view();
 
   const net::EmbeddedTestServer& GetTestServerForSiteMode(Site site_mode) const;
diff --git a/chrome/browser/ui/views/zoom/BUILD.gn b/chrome/browser/ui/views/zoom/BUILD.gn
index cafdf1d..b7b4e11 100644
--- a/chrome/browser/ui/views/zoom/BUILD.gn
+++ b/chrome/browser/ui/views/zoom/BUILD.gn
@@ -30,7 +30,7 @@
   sources = [ "zoom_view_interactive_ui_tests.cc" ]
 
   deps = [
-    "//chrome/browser/ui:ui",
+    "//chrome/browser/ui",
     "//chrome/browser/ui:ui_features",
     "//chrome/browser/ui/views/page_action",
     "//chrome/browser/ui/views/toolbar",
diff --git a/chrome/browser/ui/web_applications/BUILD.gn b/chrome/browser/ui/web_applications/BUILD.gn
index 7280e50..61100aa8 100644
--- a/chrome/browser/ui/web_applications/BUILD.gn
+++ b/chrome/browser/ui/web_applications/BUILD.gn
@@ -145,8 +145,8 @@
       "//chrome/browser/ui/ash/system_web_apps",
       "//chromeos/ash/components/browser_context_helper",
       "//chromeos/constants",
-      "//components/session_manager/core:core",
-      "//components/user_manager:user_manager",
+      "//components/session_manager/core",
+      "//components/user_manager",
     ]
   }
 }
diff --git a/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc b/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc
index c0f1ca2..2e307a4f 100644
--- a/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc
+++ b/chrome/browser/ui/web_applications/pwa_install_page_action_browsertest.cc
@@ -188,6 +188,10 @@
       enabled_features.push_back(
           {features::kPageActionsMigration,
            {{features::kPageActionsMigrationPwaInstall.name, "true"}}});
+    } else {
+      enabled_features.push_back(
+          {features::kPageActionsMigration,
+           {{features::kPageActionsMigrationPwaInstall.name, "false"}}});
     }
 
     features_.InitAndEnableFeaturesWithParameters(enabled_features, {});
diff --git a/chrome/browser/ui/webid/identity_dialog_controller.cc b/chrome/browser/ui/webid/identity_dialog_controller.cc
index c3e78a95..3747cd4 100644
--- a/chrome/browser/ui/webid/identity_dialog_controller.cc
+++ b/chrome/browser/ui/webid/identity_dialog_controller.cc
@@ -22,7 +22,7 @@
 // We add nognchecks on these includes so that Android bots do not fail
 // dependency checks.
 #if !BUILDFLAG(IS_ANDROID)
-#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"  // nogncheck
 #include "chrome/browser/ui/views/webid/fedcm_account_selection_view_desktop.h"  // nogncheck
 #include "components/tabs/public/tab_interface.h"  // nogncheck
 #endif
diff --git a/chrome/browser/ui/webui/BUILD.gn b/chrome/browser/ui/webui/BUILD.gn
index 468dbf1..070079e1 100644
--- a/chrome/browser/ui/webui/BUILD.gn
+++ b/chrome/browser/ui/webui/BUILD.gn
@@ -37,7 +37,7 @@
 
   deps = [
     ":webui",
-    "//chrome/browser/optimization_guide:optimization_guide",
+    "//chrome/browser/optimization_guide",
     "//chrome/browser/ui",
     "//chrome/browser/ui/webui/about",
     "//chrome/browser/ui/webui/accessibility",
@@ -47,7 +47,7 @@
     "//components/lens:buildflags",
     "//components/security_interstitials/content:security_interstitial_page",
     "//content/public/browser",
-    "//extensions/buildflags:buildflags",
+    "//extensions/buildflags",
     "//printing/buildflags",
     "//skia",
     "//third_party/abseil-cpp:absl",
@@ -106,7 +106,7 @@
   }
 
   if (enable_dice_support) {
-    deps += [ "//chrome/browser/ui/webui/signin/signout_confirmation:signout_confirmation" ]
+    deps += [ "//chrome/browser/ui/webui/signin/signout_confirmation" ]
   }
 
   if (enable_glic) {
@@ -151,7 +151,7 @@
     ]
 
     deps = [
-      "//chrome/browser/ui/browser_window:browser_window",
+      "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/tabs:tabs_public",
     ]
   }
diff --git a/chrome/browser/ui/webui/ash/borealis_motd/BUILD.gn b/chrome/browser/ui/webui/ash/borealis_motd/BUILD.gn
index 765049f..050e115 100644
--- a/chrome/browser/ui/webui/ash/borealis_motd/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/borealis_motd/BUILD.gn
@@ -15,8 +15,8 @@
     "//chrome/common",
     "//content/public/browser",
     "//content/public/common",
-    "//ui/web_dialogs:web_dialogs",
-    "//ui/webui:webui",
+    "//ui/web_dialogs",
+    "//ui/webui",
   ]
 
   deps = [ "//chrome/browser/resources/chromeos/borealis_motd:resources" ]
diff --git a/chrome/browser/ui/webui/ash/config/BUILD.gn b/chrome/browser/ui/webui/ash/config/BUILD.gn
index 2f70474..2c553c4 100644
--- a/chrome/browser/ui/webui/ash/config/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/config/BUILD.gn
@@ -61,7 +61,7 @@
     "//chrome/browser/ash/system_web_apps/apps/vc_background_ui",
     "//chrome/browser/ui",
     "//chrome/browser/ui/ash/holding_space",
-    "//chrome/browser/ui/views/borealis:borealis",
+    "//chrome/browser/ui/views/borealis",
     "//chrome/browser/ui/webui/about",
     "//chrome/browser/ui/webui/ash/account_manager",
     "//chrome/browser/ui/webui/ash/add_supervision",
diff --git a/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn b/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn
index a7c987e..dd187a9 100644
--- a/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/floating_workspace/BUILD.gn
@@ -28,12 +28,12 @@
     "//ash/public/cpp",
     "//ash/webui/common:trusted_types_util",
     "//chrome/app:generated_resources",
-    "//chrome/browser/ash/floating_workspace:floating_workspace",
+    "//chrome/browser/ash/floating_workspace",
     "//chrome/browser/resources/chromeos/floating_workspace:resources",
-    "//chrome/browser/ui/ash/login:login",
-    "//chrome/browser/ui/webui/ash/internet:internet",
-    "//chrome/browser/ui/webui/ash/login:login",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chrome/browser/ui/ash/login",
+    "//chrome/browser/ui/webui/ash/internet",
+    "//chrome/browser/ui/webui/ash/login",
+    "//chromeos/ash/components/browser_context_helper",
     "//content/public/browser",
     "//ui/aura",
     "//ui/base:types",
diff --git a/chrome/browser/ui/webui/ash/lobster/BUILD.gn b/chrome/browser/ui/webui/ash/lobster/BUILD.gn
index d793e5e3..5ff85a84 100644
--- a/chrome/browser/ui/webui/ash/lobster/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/lobster/BUILD.gn
@@ -17,7 +17,7 @@
   public_deps = [
     "//base",
     "//chrome/browser:browser_public_dependencies",
-    "//chrome/browser/ui/views/bubble:bubble",
+    "//chrome/browser/ui/views/bubble",
     "//chrome/browser/ui/webui/ash/mako:mako_bubble",
     "//chrome/browser/ui/webui/top_chrome",
   ]
@@ -36,7 +36,7 @@
 
   deps = [
     ":lobster",
-    "//ash/public/cpp:cpp",
+    "//ash/public/cpp",
     "//base",
     "//base/test:test_support",
     "//chrome/test:test_support",
@@ -73,7 +73,7 @@
       ]
 
       traits_headers = [ "lobster_mojom_traits.h" ]
-      traits_public_deps = [ "//ash/public/cpp:cpp" ]
+      traits_public_deps = [ "//ash/public/cpp" ]
     },
   ]
 }
diff --git a/chrome/browser/ui/webui/ash/mako/BUILD.gn b/chrome/browser/ui/webui/ash/mako/BUILD.gn
index eec12fb..2feb27d 100644
--- a/chrome/browser/ui/webui/ash/mako/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/mako/BUILD.gn
@@ -71,7 +71,7 @@
     "//chrome/browser/ash/lobster",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/resources/chromeos/mako:resources",
-    "//chrome/browser/ui/webui/ash/lobster:lobster",
+    "//chrome/browser/ui/webui/ash/lobster",
     "//chrome/common:mojo_bindings",
     "//chromeos/ash/services/orca/public/mojom",
     "//chromeos/constants",
diff --git a/chrome/browser/ui/webui/ash/settings/BUILD.gn b/chrome/browser/ui/webui/ash/settings/BUILD.gn
index b6aa35c6..4e2ec89 100644
--- a/chrome/browser/ui/webui/ash/settings/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/settings/BUILD.gn
@@ -74,7 +74,7 @@
     "//chrome/browser/resources/ash/settings:resources",
     "//chrome/browser/resources/settings_shared:resources",
     "//chrome/browser/ui/ash/wallpaper",
-    "//chrome/browser/ui/webui/app_management:app_management",
+    "//chrome/browser/ui/webui/app_management",
     "//chrome/browser/ui/webui/ash/settings/pages/apps",
     "//chrome/browser/ui/webui/ash/settings/pages/date_time",
     "//chrome/browser/ui/webui/ash/settings/pages/device",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/device/display_settings/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/device/display_settings/BUILD.gn
index 0af724da..0f7c5b4a 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/device/display_settings/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/settings/pages/device/display_settings/BUILD.gn
@@ -14,7 +14,7 @@
   webui_module_path = "/"
 
   public_deps = [
-    "//ash/public/mojom:mojom",
+    "//ash/public/mojom",
     "//mojo/public/mojom/base",
   ]
 }
diff --git a/chrome/browser/ui/webui/ash/settings/pages/main/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/main/BUILD.gn
index 8fe57ada..a529762 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/main/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/settings/pages/main/BUILD.gn
@@ -38,7 +38,7 @@
     "//chrome/browser/ui/webui/ash/settings/services/hats",
     "//chrome/common",
     "//chrome/common:chrome_features",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//components/strings:components_strings",
     "//components/user_manager",
     "//content/public/browser",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/people/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/people/BUILD.gn
index e7a3308..7f7f726 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/people/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/settings/pages/people/BUILD.gn
@@ -65,7 +65,7 @@
     "//chrome/browser/ui/webui/signin/ash",
     "//chrome/common",
     "//chromeos/ash/components/account_manager",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//chromeos/ash/components/dbus/userdataauth",
     "//chromeos/ash/components/osauth/public",
     "//chromeos/ash/experiences/arc:arc_app_constants",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/personalization/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/personalization/BUILD.gn
index 445db564..810b49e 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/personalization/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/settings/pages/personalization/BUILD.gn
@@ -27,7 +27,7 @@
     "//chrome/browser/ui/ash/system_web_apps",
     "//chrome/browser/ui/webui/ash/settings/pages/multitasking",
     "//chrome/browser/ui/webui/ash/settings/search",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//content/public/browser",
   ]
 }
@@ -47,7 +47,7 @@
     "//chrome/browser/ui/webui/ash/settings/search",
     "//chrome/common",
     "//chrome/test:test_support",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//components/prefs:test_support",
     "//components/user_manager:test_support",
     "//content/test:test_support",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/privacy/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/privacy/BUILD.gn
index 1c9da6a..f2836621 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/privacy/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/settings/pages/privacy/BUILD.gn
@@ -57,7 +57,7 @@
     "//chrome/browser/web_applications",
     "//chrome/common",
     "//chrome/common:chrome_features",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//chromeos/ash/components/dbus/pciguard",
     "//chromeos/ash/components/dbus/userdataauth",
     "//chromeos/ash/components/install_attributes",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/reset/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/reset/BUILD.gn
index 3f07f18e..4f67db3c 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/reset/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/settings/pages/reset/BUILD.gn
@@ -21,7 +21,7 @@
     "//chrome/browser:browser_public_dependencies",
     "//chrome/browser/profiles:profile",
     "//chrome/browser/ui/webui/ash/settings/search",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//components/user_manager",
     "//content/public/browser",
     "//ui/base",
diff --git a/chrome/browser/ui/webui/ash/settings/pages/search/BUILD.gn b/chrome/browser/ui/webui/ash/settings/pages/search/BUILD.gn
index db64fb6d..9334063 100644
--- a/chrome/browser/ui/webui/ash/settings/pages/search/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/settings/pages/search/BUILD.gn
@@ -82,7 +82,7 @@
     "//chrome/common:non_code_constants",
     "//chrome/test:test_support",
     "//chrome/test:test_support_unit",
-    "//chromeos/ash/components/browser_context_helper:browser_context_helper",
+    "//chromeos/ash/components/browser_context_helper",
     "//chromeos/components/magic_boost/test:fake_magic_boost_state",
     "//chromeos/components/quick_answers:test_support",
     "//components/user_manager",
diff --git a/chrome/browser/ui/webui/ash/settings/test_support/BUILD.gn b/chrome/browser/ui/webui/ash/settings/test_support/BUILD.gn
index dc4c1365..f204325 100644
--- a/chrome/browser/ui/webui/ash/settings/test_support/BUILD.gn
+++ b/chrome/browser/ui/webui/ash/settings/test_support/BUILD.gn
@@ -42,7 +42,7 @@
     "//ash/public/cpp",
     "//base/test:test_support",
     "//chrome/app:generated_resources",
-    "//chrome/browser/ui/webui/ash/settings:settings",
+    "//chrome/browser/ui/webui/ash/settings",
     "//chrome/browser/ui/webui/ash/settings/constants",
     "//chromeos/ash/components/osauth/impl",
     "//content/public/browser",
diff --git a/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn b/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn
index 23972c3..30fc5ce 100644
--- a/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn
+++ b/chrome/browser/ui/webui/bluetooth_internals/BUILD.gn
@@ -40,8 +40,8 @@
 
   if (is_android) {
     deps += [
-      "//components/permissions:permissions",
-      "//ui/android:android",
+      "//components/permissions",
+      "//ui/android",
     ]
   }
 }
diff --git a/chrome/browser/ui/webui/commerce/BUILD.gn b/chrome/browser/ui/webui/commerce/BUILD.gn
index 76c7c78..aa7cf7c 100644
--- a/chrome/browser/ui/webui/commerce/BUILD.gn
+++ b/chrome/browser/ui/webui/commerce/BUILD.gn
@@ -17,13 +17,13 @@
   ]
   public_deps = [
     "//chrome/browser/ui/webui/top_chrome",
-    "//components/bookmarks/browser:browser",
+    "//components/bookmarks/browser",
     "//components/commerce/core:commerce_constants",
     "//components/commerce/core:shopping_service",
     "//components/commerce/core/mojom:mojo_bindings",
-    "//components/commerce/core/subscriptions:subscriptions",
+    "//components/commerce/core/subscriptions",
     "//components/commerce/core/webui",
-    "//components/feature_engagement/public:public",
+    "//components/feature_engagement/public",
     "//components/page_image_service/mojom:mojo_bindings",
     "//ui/views",
     "//ui/web_dialogs",
diff --git a/chrome/browser/ui/webui/cr_components/theme_color_picker/BUILD.gn b/chrome/browser/ui/webui/cr_components/theme_color_picker/BUILD.gn
index 41b781d..53ebe2f 100644
--- a/chrome/browser/ui/webui/cr_components/theme_color_picker/BUILD.gn
+++ b/chrome/browser/ui/webui/cr_components/theme_color_picker/BUILD.gn
@@ -11,6 +11,6 @@
     "//chrome/browser/new_tab_page/chrome_colors:generate_chrome_colors_info",
     "//chrome/browser/new_tab_page/chrome_colors:generate_colors_info",
     "//ui/base/mojom",
-    "//ui/color:color",
+    "//ui/color",
   ]
 }
diff --git a/chrome/browser/ui/webui/data_sharing/BUILD.gn b/chrome/browser/ui/webui/data_sharing/BUILD.gn
index c6fe583..ea8c4eb 100644
--- a/chrome/browser/ui/webui/data_sharing/BUILD.gn
+++ b/chrome/browser/ui/webui/data_sharing/BUILD.gn
@@ -8,7 +8,7 @@
   sources = [ "data_sharing.mojom" ]
   public_deps = [
     "//components/data_sharing/public/protocol:mojo_bindings",
-    "//mojo/public/mojom/base:base",
+    "//mojo/public/mojom/base",
   ]
   webui_module_path = "/"
 }
diff --git a/chrome/browser/ui/webui/new_tab_footer/BUILD.gn b/chrome/browser/ui/webui/new_tab_footer/BUILD.gn
index 3ee94cd..650e287a 100644
--- a/chrome/browser/ui/webui/new_tab_footer/BUILD.gn
+++ b/chrome/browser/ui/webui/new_tab_footer/BUILD.gn
@@ -20,8 +20,8 @@
     "//chrome/browser/ui/webui/top_chrome",
     "//components/policy/core/browser",
     "//components/prefs",
-    "//extensions/browser:browser",
-    "//ui/menus:menus",
+    "//extensions/browser",
+    "//ui/menus",
     "//ui/webui",
   ]
 }
@@ -43,11 +43,11 @@
     "//chrome/browser/resources/new_tab_shared:resources_grit",
     "//chrome/browser/search",
     "//chrome/browser/ui/browser_window",
-    "//chrome/browser/ui/views/side_panel:side_panel",
+    "//chrome/browser/ui/views/side_panel",
     "//chrome/browser/ui/webui:webui_util",
-    "//chrome/browser/ui/webui/customize_buttons:customize_buttons",
+    "//chrome/browser/ui/webui/customize_buttons",
     "//chrome/common",
-    "//components/search:search",
+    "//components/search",
     "//content/public/browser",
     "//ui/base",
   ]
diff --git a/chrome/browser/ui/webui/new_tab_page/composebox/composebox_handler.cc b/chrome/browser/ui/webui/new_tab_page/composebox/composebox_handler.cc
index 9b33adb..05684bf 100644
--- a/chrome/browser/ui/webui/new_tab_page/composebox/composebox_handler.cc
+++ b/chrome/browser/ui/webui/new_tab_page/composebox/composebox_handler.cc
@@ -53,6 +53,8 @@
   OpenUrl(query_controller_->CreateAimUrl(query_text, query_start_time), disposition);
   metrics_recorder_->NotifySessionStateChanged(
       SessionState::kNavigationOccurred);
+  metrics_recorder_->RecordQueryMetrics(
+      query_text.size(), query_controller_->num_files_in_request());
 }
 
 void ComposeboxHandler::OpenUrl(GURL url,
@@ -95,6 +97,8 @@
   }
 
   std::move(callback).Run(file_info_metadata->file_token_);
+  metrics_recorder_->RecordFileSizeMetric(file_info_metadata->mime_type_,
+                                          file_bytes.size());
   query_controller_->StartFileUploadFlow(std::move(file_info_metadata),
                                          std::move(file_data),
                                          std::move(image_options));
diff --git a/chrome/browser/ui/webui/privacy_sandbox/BUILD.gn b/chrome/browser/ui/webui/privacy_sandbox/BUILD.gn
index d844872..7f9d7ce 100644
--- a/chrome/browser/ui/webui/privacy_sandbox/BUILD.gn
+++ b/chrome/browser/ui/webui/privacy_sandbox/BUILD.gn
@@ -61,7 +61,7 @@
       ":mojo_bindings",
       ":privacy_sandbox",
       "//base/test:test_support",
-      "//chrome/browser/prefs:prefs",
+      "//chrome/browser/prefs",
       "//chrome/browser/privacy_sandbox/notice:test_support",
       "//chrome/test:test_support",
       "//components/prefs",
@@ -85,7 +85,7 @@
 
     deps = [
       ":privacy_sandbox",
-      "//chrome/browser/ui:ui",
+      "//chrome/browser/ui",
       "//chrome/browser/ui/tabs:tab_strip",
       "//chrome/browser/ui/views/privacy_sandbox",
       "//chrome/test:test_support_ui",
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 7c87f97..6d04ea70 100644
--- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
+++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -773,6 +773,9 @@
       {"glicActivityButton", IDS_SETTINGS_GLIC_PERMISSIONS_ACTIVITY_BUTTON},
       {"glicActivityButtonSublabel",
        IDS_SETTINGS_GLIC_PERMISSIONS_ACTIVITY_BUTTON_SUBLABEL},
+      {"glicExtensionsButton", IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON},
+      {"glicExtensionsButtonSublabel",
+       IDS_SETTINGS_GLIC_EXTENSIONS_BUTTON_SUBLABEL},
       {"glicActivityButtonUrl",
        IDS_SETTINGS_GLIC_PERMISSIONS_ACTIVITY_BUTTON_URL},
       {"glicTabAccessWhenOn1",
@@ -806,10 +809,15 @@
       features::kGlicTabAccessToggleLearnMoreURLDataProtected.Get());
   html_source->AddString("glicSettingsPageLearnMoreUrl",
                          features::kGlicSettingsPageLearnMoreURL.Get());
+  html_source->AddString("glicExtensionsManagementUrl",
+                         features::kGlicExtensionsManagementUrl.Get());
   html_source->AddBoolean(
       "glicClosedCaptionsFeatureEnabled",
       base::FeatureList::IsEnabled(features::kGlicClosedCaptioning));
   html_source->AddBoolean(
+      "glicExtensionsFeatureEnabled",
+      base::FeatureList::IsEnabled(features::kGlicExtensions));
+  html_source->AddBoolean(
       "glicUserStatusCheckFeatureEnabled",
       base::FeatureList::IsEnabled(features::kGlicUserStatusCheck));
   html_source->AddBoolean("glicAssetsV2Enabled", base::FeatureList::IsEnabled(
diff --git a/chrome/browser/ui/webui/settings/sync_settings_interactive_uitest.cc b/chrome/browser/ui/webui/settings/sync_settings_interactive_uitest.cc
index e1759434..a1cde68 100644
--- a/chrome/browser/ui/webui/settings/sync_settings_interactive_uitest.cc
+++ b/chrome/browser/ui/webui/settings/sync_settings_interactive_uitest.cc
@@ -140,18 +140,18 @@
   const DeepQuery kTurnHistorySyncOn = {"settings-ui",
                                         "settings-main",
                                         "settings-people-page-index",
-                                        "settings-account-page",
+                                        "settings-people-page",
                                         "settings-sync-account-control",
                                         "cr-button#sync-button"};
   const DeepQuery kHistoryOptinAcceptButton = {"history-sync-optin-app",
                                                "#acceptButton"};
   const DeepQuery kHistoryOptinRejectButton = {"history-sync-optin-app",
                                                "#rejectButton"};
-  const GURL kAccountSettingsUrl = GURL("chrome://settings/account");
+  const GURL kSyncSettingsUrl = GURL("chrome://settings/syncSetup");
 
   RunTestSequence(
       InstrumentTab(kTabId, 0, browser()),
-      NavigateWebContents(kTabId, kAccountSettingsUrl),
+      NavigateWebContents(kTabId, kSyncSettingsUrl),
       WaitForStateChange(kTabId, PageWithMatchingTitle("Settings")),
       WaitForStateChange(kTabId, UiElementHasAppeared(kTurnHistorySyncOn)),
       ClickButton(kTabId, kTurnHistorySyncOn),
diff --git a/chrome/browser/ui/webui/signin/BUILD.gn b/chrome/browser/ui/webui/signin/BUILD.gn
index d7c6d1a..0788646 100644
--- a/chrome/browser/ui/webui/signin/BUILD.gn
+++ b/chrome/browser/ui/webui/signin/BUILD.gn
@@ -40,7 +40,7 @@
     "//base",
     "//components/signin/public/base",
     "//components/signin/public/base:signin_buildflags",
-    "//components/signin/public/identity_manager:identity_manager",
+    "//components/signin/public/identity_manager",
     "//url",
   ]
 
@@ -392,12 +392,12 @@
       "//chrome/browser/ui/signin",
       "//chrome/browser/ui/webui/top_chrome",
       "//chrome/common",
-      "//components/policy/core/browser:browser",
-      "//components/policy/core/common:common",
+      "//components/policy/core/browser",
+      "//components/policy/core/common",
       "//components/prefs",
       "//components/signin/public/base",
       "//components/signin/public/identity_manager",
-      "//components/startup_metric_utils:startup_metric_utils",
+      "//components/startup_metric_utils",
       "//components/strings:components_strings",
       "//components/supervised_user/core/common:features",
       "//content/public/browser",
diff --git a/chrome/browser/ui/webui/top_chrome/BUILD.gn b/chrome/browser/ui/webui/top_chrome/BUILD.gn
index 97901d0..46a408e 100644
--- a/chrome/browser/ui/webui/top_chrome/BUILD.gn
+++ b/chrome/browser/ui/webui/top_chrome/BUILD.gn
@@ -61,7 +61,7 @@
     "//chrome/browser/ui:ui_features",
     "//chrome/browser/ui/prefs",
     "//chrome/common",
-    "//components/site_engagement/content:content",
+    "//components/site_engagement/content",
     "//content/public/browser",
     "//ui/base",
     "//ui/webui",
diff --git a/chrome/browser/ui/webui/watermark/BUILD.gn b/chrome/browser/ui/webui/watermark/BUILD.gn
index efe987d..d90c323 100644
--- a/chrome/browser/ui/webui/watermark/BUILD.gn
+++ b/chrome/browser/ui/webui/watermark/BUILD.gn
@@ -19,6 +19,6 @@
     "//chrome/common",
     "//content/public/browser",
     "//content/public/common",
-    "//ui/webui:webui",
+    "//ui/webui",
   ]
 }
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index de837ce..cd857917 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1753444792-278e594ceb21901d0083c057278ed3e56f9f629e-b8adc83fcaaadddbd281c738a01518bb24136997.profdata
+chrome-android32-main-1753466383-d5c0ecbef1ab5b2b8a1b60a6069af5519ec9fdfd-1016fee0264fb58c317c90fecaf555acf744f14f.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 89b1fd4..dbcb7b8 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1753462215-1a6c7a95bcc7cf01ed226e5778b66eb9112925c4-4f41019b24842df0a972d7bfbf3e0da447816154.profdata
+chrome-android64-main-1753476102-4c56563d1bfeda195f88b02df26aa0c7553cb32d-5766d2805416e3ed65051ff14d279a905ec10f33.profdata
diff --git a/chrome/build/android-desktop-x64.pgo.txt b/chrome/build/android-desktop-x64.pgo.txt
index e4f13f578..6668508 100644
--- a/chrome/build/android-desktop-x64.pgo.txt
+++ b/chrome/build/android-desktop-x64.pgo.txt
@@ -1 +1 @@
-chrome-android-desktop-x64-main-1753444792-a3e5572a4ae4ee201e7db1156ff85591371449b2-b8adc83fcaaadddbd281c738a01518bb24136997.profdata
+chrome-android-desktop-x64-main-1753466383-f6a951e067e4f56fdcc222645072e2d7b82595fd-1016fee0264fb58c317c90fecaf555acf744f14f.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 8d10b90..9c39b44 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1753459156-0d2939b32e772e5e8db8a79e38c6a14dd184a7de-d679e12bcbda2c603fa9e5dbfbf4c3e645561994.profdata
+chrome-mac-arm-main-1753480777-3bf609099bac8b7f79d7f8b0176fca59c3e0151f-0aa81170039c1a7de145865091db290540de488f.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 742f5a5..0d1abb2 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1753444792-6af79975ee1ef84f827b508d9270596b706dac18-b8adc83fcaaadddbd281c738a01518bb24136997.profdata
+chrome-mac-main-1753466383-24fcedf7a9ada49f5b25f16e1198d9877f932138-1016fee0264fb58c317c90fecaf555acf744f14f.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 7547c84d..3cf597fb6 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1753444792-b2afe06e7c666d00d13f909223b27e0120a1d8bc-b8adc83fcaaadddbd281c738a01518bb24136997.profdata
+chrome-win-arm64-main-1753466383-18e721afbdeb79d65cbfe9279b3de61604d33f72-1016fee0264fb58c317c90fecaf555acf744f14f.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index f2f24233..68585fdf 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1753444792-79f6b8f6e79badffa6585c8fa048b0f5b7388715-b8adc83fcaaadddbd281c738a01518bb24136997.profdata
+chrome-win32-main-1753455521-781fa55618fd89b21ba2997522f6f671122065c1-471970fe60970101bc2cc0b717ced93539e92d13.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 9578e2c..8c5cd0db 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1753444792-bf9da62fd564f3015f4daf05cc3bb2efb4c056b7-b8adc83fcaaadddbd281c738a01518bb24136997.profdata
+chrome-win64-main-1753455521-078061a290d7a9fabe8ba8e4e08f1e034ebcceaa-471970fe60970101bc2cc0b717ced93539e92d13.profdata
diff --git a/chrome/chrome_elf/BUILD.gn b/chrome/chrome_elf/BUILD.gn
index 335a734..21854891 100644
--- a/chrome/chrome_elf/BUILD.gn
+++ b/chrome/chrome_elf/BUILD.gn
@@ -166,7 +166,7 @@
   deps = [
     ":constants",
     ":nt_registry",
-    "//base:base",
+    "//base",
     "//chrome/install_static:install_static_util",
   ]
 }
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn
index c527797..45f0ff0b 100644
--- a/chrome/common/BUILD.gn
+++ b/chrome/common/BUILD.gn
@@ -249,7 +249,7 @@
     "//ui/gl",
     "//ui/message_center/public/cpp",
     "//ui/native_theme",
-    "//ui/resources:resources",
+    "//ui/resources",
     "//url",
   ]
 
@@ -263,7 +263,7 @@
     "//components/metrics:call_stack_profile_builder",
     "//components/no_state_prefetch/common",
     "//components/no_state_prefetch/common:mojo_bindings",
-    "//components/page_load_metrics/common:common",
+    "//components/page_load_metrics/common",
     "//components/pdf/common:constants",
     "//components/pdf/common:util",
   ]
diff --git a/chrome/common/chromeos/extensions/BUILD.gn b/chrome/common/chromeos/extensions/BUILD.gn
index b60df53..5b37980a 100644
--- a/chrome/common/chromeos/extensions/BUILD.gn
+++ b/chrome/common/chromeos/extensions/BUILD.gn
@@ -31,7 +31,7 @@
 
   deps = [
     ":resources",
-    "api:api",
+    "api",
     "api:extensions_features",
     "//base",
     "//chrome/common:url_constants",
diff --git a/chrome/common/profiler/BUILD.gn b/chrome/common/profiler/BUILD.gn
index 77a3260..1fe4897 100644
--- a/chrome/common/profiler/BUILD.gn
+++ b/chrome/common/profiler/BUILD.gn
@@ -35,7 +35,7 @@
     "//components/metrics:call_stack_profile_builder",
     "//components/metrics/public/mojom:call_stack_mojo_bindings",
     "//components/sampling_profiler",
-    "//components/version_info:version_info",
+    "//components/version_info",
     "//content/public/common",
     "//extensions/buildflags",
     "//third_party/abseil-cpp:absl",
@@ -57,7 +57,7 @@
   }
 
   if (enable_extensions) {
-    deps += [ "//extensions/common:common" ]
+    deps += [ "//extensions/common" ]
   }
 
   friend = [ ":unit_tests" ]
@@ -81,7 +81,7 @@
     "//components/metrics",
     "//components/metrics:call_stack_profile_builder",
     "//components/sampling_profiler",
-    "//components/version_info:version_info",
+    "//components/version_info",
     "//content/public/common",
     "//extensions/buildflags",
   ]
@@ -91,6 +91,6 @@
   }
 
   if (enable_extensions) {
-    deps += [ "//extensions/common:common" ]
+    deps += [ "//extensions/common" ]
   }
 }
diff --git a/chrome/credential_provider/extension/BUILD.gn b/chrome/credential_provider/extension/BUILD.gn
index 7846e12b..481012e 100644
--- a/chrome/credential_provider/extension/BUILD.gn
+++ b/chrome/credential_provider/extension/BUILD.gn
@@ -38,7 +38,7 @@
   ]
   deps = [
     "../gaiacp:util",
-    "//base:base",
+    "//base",
   ]
   configs += [ "//build/config/win:windowed" ]
 }
@@ -58,8 +58,8 @@
   deps = [
     ":common",
     "../gaiacp:util",
-    "//base:base",
-    "//net:net",
+    "//base",
+    "//net",
   ]
   configs += [ "//build/config/win:windowed" ]
 }
diff --git a/chrome/credential_provider/gaiacp/BUILD.gn b/chrome/credential_provider/gaiacp/BUILD.gn
index c4312034..77bac42b 100644
--- a/chrome/credential_provider/gaiacp/BUILD.gn
+++ b/chrome/credential_provider/gaiacp/BUILD.gn
@@ -41,7 +41,7 @@
     "//components/crash/core/app",
     "//components/crash/core/common",
     "//components/version_info",
-    "//google_apis:google_apis",
+    "//google_apis",
     "//url",
   ]
 
@@ -98,9 +98,9 @@
     "//build:branding_buildflags",
     "//chrome/common:version_header",
     "//chrome/installer/launcher_support",
-    "//google_apis:google_apis",
+    "//google_apis",
     "//third_party/re2",
-    "//url:url",
+    "//url",
   ]
 
   # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and
@@ -157,7 +157,7 @@
     ":util",
     "//base",
     "//build:branding_buildflags",
-    "//url:url",
+    "//url",
   ]
 }
 
@@ -218,7 +218,7 @@
     "//chrome/common:version_header",
     "//chrome/credential_provider/gaiacp/mojom",
     "//chrome/installer/launcher_support",
-    "//components/crash/core/app:app",
+    "//components/crash/core/app",
     "//components/crash/core/app:crash_export_thunks",
     "//components/crash/core/app:run_as_crashpad_handler",
     "//content/public/browser",
diff --git a/chrome/credential_provider/setup/BUILD.gn b/chrome/credential_provider/setup/BUILD.gn
index 54dfc8d..8c32637 100644
--- a/chrome/credential_provider/setup/BUILD.gn
+++ b/chrome/credential_provider/setup/BUILD.gn
@@ -86,7 +86,7 @@
     "../gaiacp:util",
     "//build:branding_buildflags",
     "//chrome/common:version_header",
-    "//components/crash/core/app:app",
+    "//components/crash/core/app",
     "//components/crash/core/app:crash_export_thunks",
     "//components/crash/core/app:run_as_crashpad_handler",
     "//components/crash/core/common",
diff --git a/chrome/elevation_service/BUILD.gn b/chrome/elevation_service/BUILD.gn
index a0e3912..faef0f8 100644
--- a/chrome/elevation_service/BUILD.gn
+++ b/chrome/elevation_service/BUILD.gn
@@ -59,7 +59,7 @@
   ]
 
   deps = [
-    "//base/version_info:version_info",
+    "//base/version_info",
     "//chrome/install_static:install_static_util",
     "//chrome/windows_services/service_program:common",
     "//components/crx_file",
diff --git a/chrome/enterprise_companion/BUILD.gn b/chrome/enterprise_companion/BUILD.gn
index 33c8259..b02bcb0 100644
--- a/chrome/enterprise_companion/BUILD.gn
+++ b/chrome/enterprise_companion/BUILD.gn
@@ -214,7 +214,7 @@
     "//base",
     "//base/test:test_support",
     "//build:branding_buildflags",
-    "//chrome/enterprise_companion/device_management_storage:device_management_storage",
+    "//chrome/enterprise_companion/device_management_storage",
     "//testing/gtest",
   ]
   visibility = [
@@ -312,7 +312,7 @@
     "//chrome/updater:constants_test",
     "//chrome/updater:public_sources",
     "//chrome/updater/protos:omaha_proto",
-    "//components/named_mojo_ipc_server:named_mojo_ipc_server",
+    "//components/named_mojo_ipc_server",
     "//components/policy/core/common",
     "//components/policy/core/common:common_constants",
     "//components/policy/core/common:test_support",
diff --git a/chrome/enterprise_companion/installer_win.cc b/chrome/enterprise_companion/installer_win.cc
index b964db7..097e2aa 100644
--- a/chrome/enterprise_companion/installer_win.cc
+++ b/chrome/enterprise_companion/installer_win.cc
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/base_paths.h"
+#include "base/files/file.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
@@ -20,6 +21,8 @@
 #include "base/strings/strcat.h"
 #include "base/strings/strcat_win.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/threading/platform_thread.h"
+#include "base/time/time.h"
 #include "base/win/registry.h"
 #include "base/win/windows_types.h"
 #include "chrome/enterprise_companion/enterprise_companion_branding.h"
@@ -30,6 +33,45 @@
 
 namespace enterprise_companion {
 
+namespace {
+
+#if ENTERPRISE_COMPANION_USE_ICU_DATA_FILE
+
+// Blocks the calling sequence for up to 10 seconds until a file becomes
+// writable. Returns true if the file is eventually writable. This is
+// particularly useful for spinning on files which may be be open by other
+// processes.
+bool WaitForFileWritable(const base::FilePath& path) {
+  static constexpr base::TimeDelta kMaxWait = base::Seconds(10);
+  static constexpr base::TimeDelta kLoggingInterval = base::Seconds(2);
+  base::TimeTicks next_logging_time = base::TimeTicks::Now() + kLoggingInterval;
+  base::TimeTicks deadline = base::TimeTicks::Now() + kMaxWait;
+  while (base::TimeTicks::Now() < deadline) {
+    if ([&path] {
+          if (!base::PathExists(path)) {
+            return true;
+          }
+          // Consider any failure to open the file to mean that it's in use and
+          // shouldn't be replaced.
+          return base::File(path, base::File::FLAG_OPEN |
+                                      base::File::FLAG_WRITE |
+                                      base::File::FLAG_WIN_SHARE_DELETE)
+              .IsValid();
+        }()) {
+      return true;
+    }
+    if (next_logging_time < base::TimeTicks::Now()) {
+      VLOG(1) << "Still waiting for " << path << " to become writable.";
+      next_logging_time += kLoggingInterval;
+    }
+    base::PlatformThread::Sleep(base::Milliseconds(100));
+  }
+  return false;
+}
+#endif  // ENTERPRISE_COMPANION_USE_ICU_DATA_FILE
+
+}  // namespace
+
 const wchar_t kAppRegKey[] = L"Software\\" COMPANY_SHORTNAME_STRING
                              "\\Update\\Clients\\" ENTERPRISE_COMPANION_APPID;
 const wchar_t kRegValuePV[] = L"pv";
@@ -66,10 +108,15 @@
       temp_dir.GetPath(), WorkItem::ALWAYS);
 #if ENTERPRISE_COMPANION_USE_ICU_DATA_FILE
   if (base::PathExists(source_exe_path.DirName().Append(kIcuDataFileName))) {
-    install_list->AddCopyTreeWorkItem(
-        source_exe_path.DirName().Append(kIcuDataFileName),
-        install_directory->Append(kIcuDataFileName), temp_dir.GetPath(),
-        WorkItem::ALWAYS);
+    if (WaitForFileWritable(install_directory->Append(kIcuDataFileName))) {
+      install_list->AddCopyTreeWorkItem(
+          source_exe_path.DirName().Append(kIcuDataFileName),
+          install_directory->Append(kIcuDataFileName), temp_dir.GetPath(),
+          WorkItem::ALWAYS);
+    } else {
+      VLOG(1) << "ICU data file is not writable. It will be omitted from the "
+                 "installation.";
+    }
   }
 #endif
   install_list->AddCreateRegKeyWorkItem(HKEY_LOCAL_MACHINE, kAppRegKey,
diff --git a/chrome/enterprise_companion/mojom/BUILD.gn b/chrome/enterprise_companion/mojom/BUILD.gn
index 1e32540..6b6dd2c 100644
--- a/chrome/enterprise_companion/mojom/BUILD.gn
+++ b/chrome/enterprise_companion/mojom/BUILD.gn
@@ -32,7 +32,7 @@
   ]
 
   visibility = [
-    "//chrome/enterprise_companion/mojom:mojom",
+    "//chrome/enterprise_companion/mojom",
     "//chrome/updater/mojom:*",
   ]
 }
diff --git a/chrome/installer/mac/BUILD.gn b/chrome/installer/mac/BUILD.gn
index 1562c287..3136c16a 100644
--- a/chrome/installer/mac/BUILD.gn
+++ b/chrome/installer/mac/BUILD.gn
@@ -86,8 +86,8 @@
     "//chrome:entitlements",
     "//chrome/installer/mac/third_party/bsdiff:goobsdiff",
     "//chrome/installer/mac/third_party/bsdiff:goobspatch",
+    "//chrome/installer/mac/third_party/xz",
     "//chrome/installer/mac/third_party/xz:lzma_decompress",
-    "//chrome/installer/mac/third_party/xz:xz",
     "//chrome/installer/mac/third_party/xz:xzdec",
   ]
 
diff --git a/chrome/installer/setup/BUILD.gn b/chrome/installer/setup/BUILD.gn
index 5076e47..7a687dd 100644
--- a/chrome/installer/setup/BUILD.gn
+++ b/chrome/installer/setup/BUILD.gn
@@ -38,7 +38,7 @@
       "//chrome/install_static:install_static_util",
       "//chrome/installer/util:with_rc_strings",
       "//chrome/windows_services/elevated_tracing_service:integration",
-      "//components/crash/core/app:app",
+      "//components/crash/core/app",
       "//components/crash/core/app:crash_export_thunks",
       "//components/crash/core/app:run_as_crashpad_handler",
       "//content/public/common:static_switches",
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn
index b63333e7..c823717 100644
--- a/chrome/renderer/BUILD.gn
+++ b/chrome/renderer/BUILD.gn
@@ -184,7 +184,7 @@
     "//components/safe_browsing/content/renderer:throttles",
     "//components/safe_browsing/core/common",
     "//components/safe_browsing/core/common:interfaces",
-    "//components/search:search",
+    "//components/search",
     "//components/security_interstitials/content/renderer",
     "//components/security_interstitials/core:",
     "//components/security_interstitials/core/common/mojom:",
@@ -226,7 +226,7 @@
     "//third_party/libwebp",
     "//third_party/re2",
     "//third_party/widevine/cdm:buildflags",
-    "//ui/gfx/geometry:geometry",
+    "//ui/gfx/geometry",
     "//ui/surface",
     "//v8",
   ]
@@ -291,7 +291,7 @@
   }
 
   if (enable_spellcheck) {
-    deps += [ "//components/spellcheck/renderer:renderer" ]
+    deps += [ "//components/spellcheck/renderer" ]
   }
 
   if (enable_printing) {
@@ -362,7 +362,7 @@
       "//services/screen_ai/buildflags",
       "//services/screen_ai/public/mojom",
       "//services/strings",
-      "//third_party/re2:re2",
+      "//third_party/re2",
     ]
 
     if (build_with_tflite_lib) {
diff --git a/chrome/services/file_util/BUILD.gn b/chrome/services/file_util/BUILD.gn
index 31913a2..ebdacd4c 100644
--- a/chrome/services/file_util/BUILD.gn
+++ b/chrome/services/file_util/BUILD.gn
@@ -23,14 +23,14 @@
     "//base",
     "//build:chromeos_buildflags",
     "//components/safe_browsing:buildflags",
-    "//extensions/buildflags:buildflags",
+    "//extensions/buildflags",
     "//mojo/public/cpp/bindings",
     "//third_party/zlib",
   ]
 
   public_deps = [
     "//chrome/services/file_util/public/mojom",
-    "//components/safe_browsing/core/common:common",
+    "//components/safe_browsing/core/common",
     "//mojo/public/cpp/bindings",
     "//mojo/public/mojom/base",
   ]
@@ -75,7 +75,7 @@
       "single_file_tar_xz_file_extractor.h",
     ]
     deps += [
-      "//third_party/lzma_sdk:lzma_sdk",
+      "//third_party/lzma_sdk",
       "//third_party/lzma_sdk:lzma_sdk_xz",
     ]
   }
@@ -112,9 +112,9 @@
     ":buildflags",
     "//base",
     "//build:chromeos_buildflags",
-    "//chrome/services/file_util/public/mojom:mojom",
+    "//chrome/services/file_util/public/mojom",
     "//components/safe_browsing:buildflags",
-    "//extensions/buildflags:buildflags",
+    "//extensions/buildflags",
     "//mojo/public/cpp/bindings",
     "//testing/gmock",
     "//third_party/abseil-cpp:absl",
@@ -138,7 +138,7 @@
     ]
 
     if (safe_browsing_mode == 1) {
-      deps += [ "//chrome/common:common" ]
+      deps += [ "//chrome/common" ]
     }
 
     if (is_mac) {
diff --git a/chrome/services/sharing/nearby/BUILD.gn b/chrome/services/sharing/nearby/BUILD.gn
index 88d88ce..ff37821 100644
--- a/chrome/services/sharing/nearby/BUILD.gn
+++ b/chrome/services/sharing/nearby/BUILD.gn
@@ -31,7 +31,7 @@
     "//base",
     "//chrome/services/sharing/public/cpp",
     "//chromeos/ash/services/nearby/public/mojom",
-    "//components/cross_device/logging:logging",
+    "//components/cross_device/logging",
     "//mojo/public/cpp/bindings",
     "//third_party/nearby:connections",
     "//third_party/nearby:connections_credential_proto",
@@ -41,9 +41,9 @@
   ]
 
   deps = [
-    "//chromeos/ash/components/nearby/presence/conversions:conversions",
+    "//chromeos/ash/components/nearby/presence/conversions",
     "//chromeos/services/network_config/public/mojom",
-    "//components/cross_device/nearby:nearby",
+    "//components/cross_device/nearby",
   ]
 }
 
@@ -61,7 +61,7 @@
     "test_support",
     "//ash/public/cpp",
     "//base/test:test_support",
-    "//chromeos/ash/components/nearby/presence/conversions:conversions",
+    "//chromeos/ash/components/nearby/presence/conversions",
     "//chromeos/ash/services/nearby/public/cpp:test_support",
     "//chromeos/ash/services/network_config/public/cpp:test_support",
     "//testing/gmock",
diff --git a/chrome/services/sharing/nearby/platform/BUILD.gn b/chrome/services/sharing/nearby/platform/BUILD.gn
index bdf9025..badc830 100644
--- a/chrome/services/sharing/nearby/platform/BUILD.gn
+++ b/chrome/services/sharing/nearby/platform/BUILD.gn
@@ -96,12 +96,12 @@
     "//base",
     "//chrome/browser/nearby_sharing/common",
     "//chrome/services/sharing/webrtc",
-    "//chromeos/ash/components/nearby/presence/conversions:conversions",
+    "//chromeos/ash/components/nearby/presence/conversions",
     "//chromeos/ash/services/nearby/public/cpp:tcp_server_socket_port",
     "//chromeos/ash/services/nearby/public/mojom",
     "//chromeos/services/network_config/public/mojom",
     "//components/cross_device/logging",
-    "//components/cross_device/nearby:nearby",
+    "//components/cross_device/nearby",
     "//components/webrtc:thread_wrapper",
     "//crypto",
     "//device/bluetooth",
@@ -155,19 +155,19 @@
   deps = [
     ":platform",
     "//base/test:test_support",
-    "//chrome/browser/nearby_sharing/common:common",
+    "//chrome/browser/nearby_sharing/common",
     "//chrome/services/sharing/nearby/test_support",
     "//chromeos/ash/components/login/login_state",
-    "//chromeos/ash/components/nearby/common/connections_manager:connections_manager",
+    "//chromeos/ash/components/nearby/common/connections_manager",
     "//chromeos/ash/services/nearby/public/cpp:tcp_server_socket_port",
     "//chromeos/ash/services/nearby/public/cpp:test_support",
     "//chromeos/ash/services/nearby/public/mojom",
     "//chromeos/ash/services/network_config:in_process_instance",
     "//chromeos/ash/services/network_config/public/cpp:test_support",
-    "//components/cross_device/nearby:nearby",
+    "//components/cross_device/nearby",
     "//components/onc",
     "//components/prefs:test_support",
-    "//components/proxy_config:proxy_config",
+    "//components/proxy_config",
     "//components/sync_preferences:test_support",
     "//components/user_manager:test_support",
     "//device/bluetooth:deprecated_experimental_mojo",
diff --git a/chrome/services/speech/BUILD.gn b/chrome/services/speech/BUILD.gn
index 0dde418..97ccdc2 100644
--- a/chrome/services/speech/BUILD.gn
+++ b/chrome/services/speech/BUILD.gn
@@ -52,7 +52,7 @@
     ]
     deps += [
       "//chromeos/services/machine_learning/public/mojom",
-      "//components/soda:soda",
+      "//components/soda",
     ]
   }
 }
@@ -83,11 +83,11 @@
     ]
 
     deps += [
-      "//ash/constants:constants",
-      "//chromeos/services/machine_learning/public/cpp:cpp",
+      "//ash/constants",
+      "//chromeos/services/machine_learning/public/cpp",
       "//chromeos/services/machine_learning/public/cpp:stub",
       "//chromeos/services/machine_learning/public/mojom",
-      "//components/soda:soda",
+      "//components/soda",
       "//components/soda:test_support",
       "//content/test:test_support",
       "//services/audio/public/cpp:test_support",
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index f1bdf2e..420711d 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -11163,6 +11163,7 @@
       "../browser/ui/views/permissions/permission_rhs_indicators_interactive_uitest.cc",
       "../browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_interactive_ui_test.cc",
       "../browser/ui/views/session_crashed_bubble_view_interactive_uitest.cc",
+      "../browser/ui/views/side_panel/comments/comments_side_panel_coordinator_interactive_uitest.cc",
       "../browser/ui/views/side_panel/read_anything/read_anything_service_interactive_uitest.cc",
       "../browser/ui/views/side_panel/read_anything/read_anything_side_panel_controller_interactive_uitest.cc",
       "../browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_interactive_uitest.cc",
diff --git a/chrome/test/base/ash/interactive/BUILD.gn b/chrome/test/base/ash/interactive/BUILD.gn
index fa9416a..15fd9cf 100644
--- a/chrome/test/base/ash/interactive/BUILD.gn
+++ b/chrome/test/base/ash/interactive/BUILD.gn
@@ -19,7 +19,7 @@
     "//chrome/test/base/ash/interactive/vpn:interactive_ui_tests",
     "//chrome/test/base/ash/interactive/wifi:interactive_ui_tests",
     "//content/test:test_support",
-    "//url:url",
+    "//url",
   ]
 }
 
diff --git a/chrome/test/base/ash/interactive/bluetooth/BUILD.gn b/chrome/test/base/ash/interactive/bluetooth/BUILD.gn
index 0041c5b..f5ab230 100644
--- a/chrome/test/base/ash/interactive/bluetooth/BUILD.gn
+++ b/chrome/test/base/ash/interactive/bluetooth/BUILD.gn
@@ -27,7 +27,7 @@
     "//chrome/test/base/ash/interactive:test_support",
     "//chrome/test/base/ash/interactive/settings:test_support",
     "//chrome/test/base/ash/interactive/webui:test_support",
-    "//chromeos/ash/services/bluetooth_config:bluetooth_config",
+    "//chromeos/ash/services/bluetooth_config",
     "//device/bluetooth",
     "//ui/base",
     "//ui/base:test_support",
diff --git a/chrome/test/base/ash/interactive/cellular/BUILD.gn b/chrome/test/base/ash/interactive/cellular/BUILD.gn
index bf95dd8..aa19c5e 100644
--- a/chrome/test/base/ash/interactive/cellular/BUILD.gn
+++ b/chrome/test/base/ash/interactive/cellular/BUILD.gn
@@ -39,7 +39,7 @@
     "//chromeos/strings:strings_grit",
     "//content/test:test_support",
     "//dbus",
-    "//ui/base:base",
+    "//ui/base",
     "//ui/base:test_support",
     "//ui/chromeos/strings:strings_grit",
     "//ui/message_center",
diff --git a/chrome/test/base/ash/interactive/wifi/BUILD.gn b/chrome/test/base/ash/interactive/wifi/BUILD.gn
index ea177aee..ab6a19b 100644
--- a/chrome/test/base/ash/interactive/wifi/BUILD.gn
+++ b/chrome/test/base/ash/interactive/wifi/BUILD.gn
@@ -30,7 +30,7 @@
     "//chromeos/services/network_config/public/mojom",
     "//chromeos/strings:strings_grit",
     "//content/test:test_support",
-    "//ui/base:base",
+    "//ui/base",
     "//ui/base:test_support",
     "//ui/chromeos/strings:strings_grit",
   ]
diff --git a/chrome/test/chromedriver/BUILD.gn b/chrome/test/chromedriver/BUILD.gn
index 053538a..c1662d38 100644
--- a/chrome/test/chromedriver/BUILD.gn
+++ b/chrome/test/chromedriver/BUILD.gn
@@ -73,7 +73,7 @@
 }
 
 minify_js("minify_bidimapper") {
-  deps = [ "//third_party/bidimapper:bidimapper" ]
+  deps = [ "//third_party/bidimapper" ]
   input_dir =
       get_label_info("//third_party/bidimapper:bidimapper", "target_gen_dir")
   in_folder = "$input_dir"
@@ -491,7 +491,7 @@
   testonly = true
   deps = [
     ":chromedriver_server",
-    "//chrome:chrome",
+    "//chrome",
   ]
 
   pydeps_file = "test/run_py_tests.pydeps"
@@ -519,7 +519,7 @@
   testonly = true
   deps = [
     ":chromedriver_server",
-    "//chrome:chrome",
+    "//chrome",
   ]
 
   pydeps_file = "test/run_py_tests.pydeps"
@@ -667,7 +667,7 @@
       "test/web_view_impl_integrationtest.cc",
     ]
 
-    data_deps = [ "//chrome:chrome" ]
+    data_deps = [ "//chrome" ]
 
     deps = [
       ":automation_client_lib",
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index d1c7b3c..42b7183 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -202,7 +202,7 @@
       "//chrome/browser/media/router/discovery/access_code:access_code_cast_feature",
       "//chrome/browser/optimization_guide",
       "//chrome/browser/optimization_guide:test_support",
-      "//chrome/browser/search/background:background",
+      "//chrome/browser/search/background",
       "//chrome/browser/ui:ui_features",
       "//chrome/browser/ui/browser_window",
       "//chrome/browser/ui/lens",
@@ -222,22 +222,22 @@
       "//components/history_clusters/core",
       "//components/history_clusters/history_clusters_internals/webui:constants",
       "//components/history_embeddings",
-      "//components/language/core/browser:browser",
+      "//components/language/core/browser",
       "//components/lens:enterprise_policy",
       "//components/lens:features",
       "//components/optimization_guide/core",
       "//components/optimization_guide/optimization_guide_internals/webui:url_constants",
       "//components/password_manager/content/browser",
       "//components/password_manager/content/common",
-      "//components/performance_manager:performance_manager",
+      "//components/performance_manager",
       "//components/power_bookmarks/core:features",
       "//components/privacy_sandbox:features",
-      "//components/privacy_sandbox/privacy_sandbox_attestations:privacy_sandbox_attestations",
+      "//components/privacy_sandbox/privacy_sandbox_attestations",
       "//components/privacy_sandbox/privacy_sandbox_attestations:test_support",
       "//components/safe_browsing/core/common",
       "//components/search",
       "//components/site_engagement/content",
-      "//components/spellcheck/browser:browser",
+      "//components/spellcheck/browser",
       "//components/user_education/common",
       "//net:test_support",
     ]
@@ -246,7 +246,7 @@
   if (is_chromeos) {
     deps += [
       "//ash/webui/boca_ui:constants",
-      "//ash/webui/sanitize_ui:sanitize_ui",
+      "//ash/webui/sanitize_ui",
       "//ash/webui/shimless_rma",
       "//ash/webui/vc_background_ui",
       "//chrome/browser/ash/crostini:test_support",
@@ -257,9 +257,9 @@
       "//chrome/browser/nearby_sharing/common",
       "//chrome/browser/ui/webui/ash/extended_updates",
       "//chrome/browser/ui/webui/ash/login",
-      "//chrome/browser/ui/webui/ash/settings:settings",
+      "//chrome/browser/ui/webui/ash/settings",
       "//components/manta",
-      "//components/proxy_config:proxy_config",
+      "//components/proxy_config",
     ]
   }
   if (enable_compose) {
diff --git a/chrome/test/data/webui/chromeos/ash_common/BUILD.gn b/chrome/test/data/webui/chromeos/ash_common/BUILD.gn
index ab3ec86f..a34cc45 100644
--- a/chrome/test/data/webui/chromeos/ash_common/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/ash_common/BUILD.gn
@@ -107,7 +107,7 @@
   deps = [
     "..:chai_assert",
     "//ash/webui/common/resources:navigation_selector",
-    "//third_party/polymer/v3_0/components-chromium/iron-collapse:iron-collapse",
+    "//third_party/polymer/v3_0/components-chromium/iron-collapse",
   ]
   externs_list = [ "$externs_path/mocha-2.5.js" ]
 }
diff --git a/chrome/test/data/webui/glic/api_test.ts b/chrome/test/data/webui/glic/api_test.ts
index 82baed3..24d00cb 100644
--- a/chrome/test/data/webui/glic/api_test.ts
+++ b/chrome/test/data/webui/glic/api_test.ts
@@ -33,13 +33,17 @@
   private writeIndex = 0;
   private subscriber: Subscriber;
 
+  // The last value read from `next()`, or undefined if none was read.
+  current: T|undefined;
+
   constructor(observable: Observable<T>) {
     this.subscriber = observable.subscribe(this.change.bind(this));
   }
-  next(): Promise<T> {
+  async next(): Promise<T> {
     // Wrapping the returned value with `waitFor` improves failure logs
     // on timeout.
-    return waitFor(this.getSignal(this.readIndex++).promise);
+    this.current = await waitFor(this.getSignal(this.readIndex++).promise);
+    return this.current;
   }
   isEmpty(): boolean {
     return this.readIndex === this.writeIndex;
@@ -50,11 +54,11 @@
   waitForValue(targetValue: T) {
     return this.waitFor(v => v === targetValue);
   }
-  async waitFor(condition: (v: T) => boolean) {
+  async waitFor(condition: (v: T) => boolean): Promise<T> {
     while (true) {
       const val = await this.next();
       if (condition(val)) {
-        return;
+        return val;
       }
       console.info(`waitFor saw and ignored ${JSON.stringify(val)}`);
     }
@@ -559,7 +563,9 @@
       await this.host.getContextFromFocusedTab?.({});
     } catch (e) {
       assertEquals(
-          'tabContext failed: permission denied', (e as Error).message);
+          'tabContext failed: permission denied:' +
+              ' context permission not enabled',
+          (e as Error).message);
     }
   }
 
@@ -747,7 +753,8 @@
     assertEquals('', profileInfo.givenName);
     assertEquals(false, profileInfo.isManaged!);
     assertTrue((profileInfo.localProfileName?.length ?? 0) > 0);
-    assertEquals('Your Chromium', profileInfo.localProfileName);
+    // Can be 'Your Chrome' or 'Your Chromium'.
+    assertEquals('Your C', profileInfo.localProfileName?.substring(0, 6));
   }
 
   async testGetUserProfileInfoDoesNotDeferWhenInactive() {
@@ -756,7 +763,8 @@
     await this.closePanelAndWaitUntilInactive();
     const profileInfo: UserProfileInfo = await this.host.getUserProfileInfo();
     assertEquals('glic-test@example.com', profileInfo.email);
-    assertEquals('Your Chromium', profileInfo.localProfileName);
+    // Can be 'Your Chrome' or 'Your Chromium'.
+    assertEquals('Your C', profileInfo.localProfileName?.substring(0, 6));
   }
 
   async testRefreshSignInCookies() {
@@ -1024,6 +1032,72 @@
     }
   }
 
+  async testPinTabs() {
+    // Pin the focused tab and verify it's sent.
+    assertTrue(!!this.host.pinTabs);
+    assertTrue(!!this.host.getPinnedTabs);
+    const focus = this.host.getFocusedTabStateV2?.().getCurrentValue();
+    const tabId = checkDefined(focus?.hasFocus?.tabData.tabId);
+    await this.host.pinTabs([tabId]);
+    const pinnedTabsUpdates = observeSequence(this.host.getPinnedTabs());
+    await pinnedTabsUpdates.waitFor(
+        (tabs) => tabs.length === 1 && tabs[0]?.tabId === tabId);
+  }
+
+  // Helper for `testFetchInactiveTabScreenshot` and
+  // `testFetchInactiveTabScreenshotWhileMinimized`.
+  async fetchInactiveTabScreenshot() {
+    assertTrue(!!this.host.getFocusedTabStateV2);
+    assertTrue(!!this.host.getContextFromTab);
+    assertTrue(!!this.host.pinTabs);
+    assertTrue(!!this.host.getPinnedTabs);
+
+    // Pin the focused tab.
+    const focusSequence = observeSequence(this.host.getFocusedTabStateV2());
+    let focus = await focusSequence.next();
+    const tabId = checkDefined(focus?.hasFocus?.tabData.tabId);
+    await this.host.pinTabs([tabId]);
+
+    // Select the other tab.
+    await this.advanceToNextStep();
+    focus = await focusSequence.waitFor(
+        (f) => !!f.hasFocus && f.hasFocus.tabData.tabId !== tabId);
+
+    // Get context and verify we have a screenshot.
+    const context = await this.host.getContextFromTab(tabId, {
+      viewportScreenshot: true,
+    });
+    return context;
+  }
+
+  async testFetchInactiveTabScreenshot() {
+    const context = await this.fetchInactiveTabScreenshot();
+    const screenshot = checkDefined(context.viewportScreenshot);
+    assertEquals(screenshot.mimeType, 'image/jpeg');
+    assertTrue(screenshot.data.byteLength > 0);
+    assertTrue(screenshot.widthPixels > 0);
+    assertTrue(screenshot.heightPixels > 0);
+  }
+
+  async testFetchInactiveTabScreenshotWhileMinimized() {
+    const shouldGetScreenshot = this.testParams;
+    // Tests fetching the screenshot of a tab while the browser is minimized.
+    // Ideally this would work, but it currently times out and provides no
+    // screenshot on some platforms.
+    const context = await this.fetchInactiveTabScreenshot();
+
+    if (shouldGetScreenshot) {
+      assertTrue(!!context.viewportScreenshot);
+    } else {
+      // For platforms where screenshotting fails while minimized, it fails
+      // randomly, so we don't assert anything here. This test at least confirms
+      // screenshotting does not hang forever.
+      // Note: I've tried adding a sleep between minimizing the window and
+      // capturing the screenshot, but it still succeeds randomly.
+    }
+  }
+
+
   async testReloadWebUi() {}
 
   private async assertCreateTabFails(url: string) {
@@ -1492,6 +1566,13 @@
   }
 }
 
+function checkDefined<T>(v: T|undefined): T {
+  if (v === undefined) {
+    throw new Error('checkDefined: value is undefined');
+  }
+  return v;
+}
+
 function sleep(timeoutMs: number): Promise<void> {
   return new Promise((resolve) => {
     window.setTimeout(resolve, timeoutMs);
diff --git a/chrome/test/data/webui/glic/test_client/client.ts b/chrome/test/data/webui/glic/test_client/client.ts
index c90160f..fb935ec0 100644
--- a/chrome/test/data/webui/glic/test_client/client.ts
+++ b/chrome/test/data/webui/glic/test_client/client.ts
@@ -2,11 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import type {FocusedTabData, GlicBrowserHost, GlicWebClient, Observable, OpenPanelInfo, PanelOpeningData, PanelState, ViewChangeRequest, WebClientInitializeError} from '/glic/glic_api/glic_api.js';
+import type {FocusedTabData, GlicBrowserHost, GlicWebClient, Observable, OpenPanelInfo, PanelOpeningData, PanelState, WebClientInitializeError} from '/glic/glic_api/glic_api.js';
 import {WebClientInitializeErrorReason, WebClientMode} from '/glic/glic_api/glic_api.js';
 
 import {$} from './page_element_types.js';
-import {requestViewChange} from './sections/view.js';
 
 export function logMessage(message: string) {
   const d = new Date();
@@ -213,10 +212,6 @@
     // Nothing need to be checked on the test client.
   }
 
-  requestViewChange(request: ViewChangeRequest) {
-    requestViewChange(request);
-  }
-
   getInitialized(): Promise<void> {
     return new Promise<void>((resolve) => {
       if (this.initialized) {
diff --git a/chrome/test/data/webui/glic/test_client/index.html b/chrome/test/data/webui/glic/test_client/index.html
index 9c80aa5..f1657326 100644
--- a/chrome/test/data/webui/glic/test_client/index.html
+++ b/chrome/test/data/webui/glic/test_client/index.html
@@ -509,6 +509,7 @@
   <h1>Multi-Tab</h1>
   <button id="pinFocusedTab">Share Current</button>
   <button id="fetchPinned">⬆️ </button>
+  <label>Fetch Screenshot?<input id="multiTabFetchScreenshot" type="checkbox"/></label>
   <button id="unpin">❌</button>
   <p>Shared</p>
   <ul id="pinnedTabs">
diff --git a/chrome/test/data/webui/glic/test_client/page_element_types.ts b/chrome/test/data/webui/glic/test_client/page_element_types.ts
index 550be24a..a86fee3 100644
--- a/chrome/test/data/webui/glic/test_client/page_element_types.ts
+++ b/chrome/test/data/webui/glic/test_client/page_element_types.ts
@@ -137,6 +137,7 @@
   viewChangedCurrentView: HTMLSelectElement;
   viewChangedAutomaticallyAccept: HTMLInputElement;
   mqlsClientIdBtn: HTMLButtonElement;
+  multiTabFetchScreenshot: HTMLInputElement;
 }
 
 export const $: PageElementTypes = new Proxy({}, {
diff --git a/chrome/test/data/webui/glic/test_client/sections/multi_tab.ts b/chrome/test/data/webui/glic/test_client/sections/multi_tab.ts
index 5f7661c..be0d37a 100644
--- a/chrome/test/data/webui/glic/test_client/sections/multi_tab.ts
+++ b/chrome/test/data/webui/glic/test_client/sections/multi_tab.ts
@@ -81,8 +81,10 @@
   if (!tabState.tabData.isObservable && observableTabOnly) {
     return update;
   }
+
   try {
-    const viewportScreenshot = observableTabOnly;
+    const viewportScreenshot =
+        observableTabOnly || $.multiTabFetchScreenshot.checked;
     const annotatedPageContent = true;
     const pdfData = true;
     const pdfSizeLimit = DEFAULT_PDF_SIZE_LIMIT;
diff --git a/chrome/test/data/webui/glic/test_client/sections/view.ts b/chrome/test/data/webui/glic/test_client/sections/view.ts
index 06d3e9b..64624527 100644
--- a/chrome/test/data/webui/glic/test_client/sections/view.ts
+++ b/chrome/test/data/webui/glic/test_client/sections/view.ts
@@ -8,7 +8,7 @@
 import {client, logMessage} from '../client.js';
 import {$} from '../page_element_types.js';
 
-window.addEventListener('load', () => {
+window.addEventListener('load', async () => {
   for (const [key, value] of Object.entries(ClientView)) {
     const option = document.createElement('option');
     option.textContent = `${key}: ${value}`;
@@ -25,19 +25,20 @@
     client.browser!.onViewChanged!({currentView});
   });
 
-  client.getInitialized().then(async () => {
-    if (!client?.browser?.onViewChanged) {
-      $.viewChangedBtn.disabled = true;
-      $.viewChangedAutomaticallyAccept.checked = false;
-      $.viewChangedAutomaticallyAccept.disabled = true;
-    }
-  });
-});
+  await client.getInitialized();
 
-export function requestViewChange(request: ViewChangeRequest) {
-  logMessage(`requestViewChange(${JSON.stringify(request)})`);
-  if ($.viewChangedAutomaticallyAccept.checked) {
-    $.viewChangedCurrentView.value = request.desiredView;
-    client.browser!.onViewChanged!({currentView: request.desiredView});
+  if (!client.browser?.onViewChanged) {
+    $.viewChangedBtn.disabled = true;
+    $.viewChangedAutomaticallyAccept.checked = false;
+    $.viewChangedAutomaticallyAccept.disabled = true;
   }
-}
+
+  client.browser?.getViewChangeRequests?.()?.subscribe(
+      (request: ViewChangeRequest) => {
+        logMessage(`requestViewChange(${JSON.stringify(request)})`);
+        if ($.viewChangedAutomaticallyAccept.checked) {
+          $.viewChangedCurrentView.value = request.desiredView;
+          client.browser!.onViewChanged!({currentView: request.desiredView});
+        }
+      });
+});
diff --git a/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts b/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts
index 1db6026..ae954d6 100644
--- a/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts
+++ b/chrome/test/data/webui/new_tab_page/composebox/composebox_test.ts
@@ -9,6 +9,8 @@
 import {$$} from 'chrome://new-tab-page/new_tab_page.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.js';
 import {assertDeepEquals, assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import type {MetricsTracker} from 'chrome://webui-test/metrics_test_support.js';
+import {fakeMetricsPrivate} from 'chrome://webui-test/metrics_test_support.js';
 import type {TestMock} from 'chrome://webui-test/test_mock.js';
 import {eventToPromise, microtasksFinished} from 'chrome://webui-test/test_util.js';
 
@@ -25,6 +27,7 @@
   let composeboxElement: ComposeboxElement;
   let handler: TestMock<PageHandlerRemote>;
   let callbackRouterRemote: PageRemote;
+  let metrics: MetricsTracker;
 
   setup(() => {
     document.body.innerHTML = window.trustedTypes!.emptyHTML;
@@ -34,6 +37,7 @@
             new ComposeboxProxyImpl(mock, new PageCallbackRouter())));
     callbackRouterRemote = ComposeboxProxyImpl.getInstance()
                                .callbackRouter.$.bindNewPipeAndPassRemote();
+    metrics = fakeMetricsPrivate();
   });
 
   function createComposeboxElement() {
@@ -209,6 +213,11 @@
               // Cleanup event listener.
               document.body.removeEventListener(
                   'cr-a11y-announcer-messages-sent', updateAnnouncementCount);
+              assertEquals(
+                  1,
+                  metrics.count(
+                      'NewTabPage.Composebox.File.WebUI.UploadAttemptFailure',
+                      0));
             });
       });
 
@@ -228,6 +237,10 @@
     assertEquals(handler.getCallCount('addFile'), 0);
     const files = composeboxElement.$.carousel.files;
     assertEquals(files.length, 0);
+    assertEquals(
+        1,
+        metrics.count(
+            'NewTabPage.Composebox.File.WebUI.UploadAttemptFailure', 2));
   });
 
   test('upload large file fails', async () => {
@@ -251,6 +264,10 @@
     assertEquals(handler.getCallCount('addFile'), 0);
     const files = composeboxElement.$.carousel.files;
     assertEquals(files.length, 0);
+    assertEquals(
+        1,
+        metrics.count(
+            'NewTabPage.Composebox.File.WebUI.UploadAttemptFailure', 3));
   });
 
   [[
diff --git a/chrome/test/data/webui/settings/people_page_test.ts b/chrome/test/data/webui/settings/people_page_test.ts
index 830b19f..64bacb2 100644
--- a/chrome/test/data/webui/settings/people_page_test.ts
+++ b/chrome/test/data/webui/settings/people_page_test.ts
@@ -6,38 +6,40 @@
 import 'chrome://settings/lazy_load.js';
 
 import {webUIListenerCallback} from 'chrome://resources/js/cr.js';
+// <if expr="not is_chromeos">
+import {listenOnce} from 'chrome://resources/js/util.js';
+// </if>
+
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+// <if expr="not is_chromeos">
+import type {CrCheckboxElement} from 'chrome://settings/lazy_load.js';
+// </if>
+
 import {loadTimeData} from 'chrome://settings/settings.js';
 import type {SettingsPeoplePageElement} from 'chrome://settings/settings.js';
 import {ProfileInfoBrowserProxyImpl, Router, routes, SignedInState, StatusAction, SyncBrowserProxyImpl} from 'chrome://settings/settings.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+// <if expr="not is_chromeos">
+import {assertLT} from 'chrome://webui-test/chai_assert.js';
+import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
+import {waitBeforeNextRender} from 'chrome://webui-test/polymer_test_util.js';
+
+// </if>
 
 import {simulateSyncStatus} from './sync_test_util.js';
-import {TestProfileInfoBrowserProxy} from './test_profile_info_browser_proxy.js';
-import {TestSyncBrowserProxy} from './test_sync_browser_proxy.js';
-
 // <if expr="not is_chromeos">
-import {listenOnce} from 'chrome://resources/js/util.js';
-import type {CrCheckboxElement} from 'chrome://settings/lazy_load.js';
-import {assertLT} from 'chrome://webui-test/chai_assert.js';
-import {flushTasks, waitBeforeNextRender} from 'chrome://webui-test/polymer_test_util.js';
-import type {StoredAccount} from 'chrome://settings/settings.js';
-import { isChildVisible } from 'chrome://webui-test/test_util.js';
-
 import {simulateStoredAccounts} from './sync_test_util.js';
 // </if>
 
+import {TestProfileInfoBrowserProxy} from './test_profile_info_browser_proxy.js';
+import {TestSyncBrowserProxy} from './test_sync_browser_proxy.js';
+
 // clang-format on
 
 let peoplePage: SettingsPeoplePageElement;
 let profileInfoBrowserProxy: TestProfileInfoBrowserProxy;
 let syncBrowserProxy: TestSyncBrowserProxy;
 
-function reset() {
-  peoplePage.remove();
-  Router.getInstance().navigateTo(routes.BASIC);
-}
-
 suite('ProfileInfoTests', function() {
   suiteSetup(function() {
     // <if expr="is_chromeos">
@@ -65,7 +67,7 @@
   });
 
   teardown(function() {
-    reset();
+    peoplePage.remove();
   });
 
   test('GetProfileInfo', function() {
@@ -112,7 +114,7 @@
   });
 
   teardown(function() {
-    reset();
+    peoplePage.remove();
   });
 
   test('ShowCorrectRows', async function() {
@@ -136,8 +138,9 @@
 
 suite('SyncStatusTests', function() {
   setup(function() {
-    loadTimeData.overrideValues(
-        {signinAllowed: true, replaceSyncPromosWithSignInPromos: false});
+    loadTimeData.overrideValues({
+      signinAllowed: true,
+    });
     syncBrowserProxy = new TestSyncBrowserProxy();
     SyncBrowserProxyImpl.setInstance(syncBrowserProxy);
 
@@ -150,7 +153,7 @@
   });
 
   teardown(function() {
-    reset();
+    peoplePage.remove();
   });
 
   test('Toast', function() {
@@ -173,31 +176,45 @@
     assertFalse(!!peoplePage.shadowRoot!.querySelector('#profile-row'));
 
     // The control element should exist when policy allows.
-    assertTrue(isChildVisible(peoplePage, 'settings-sync-account-control'));
+    const accountControl =
+        peoplePage.shadowRoot!.querySelector('settings-sync-account-control')!;
+    assertTrue(window.getComputedStyle(accountControl)['display'] !== 'none');
 
     // Control element doesn't exist when policy forbids sync.
     simulateSyncStatus({
       syncSystemEnabled: false,
       statusAction: StatusAction.NO_ACTION,
     });
-    assertFalse(isChildVisible(peoplePage, '#manage-google-account'));
+    assertEquals('none', window.getComputedStyle(accountControl)['display']);
 
-    // Do not show Google Account when sync status could not be retrieved.
+    const manageGoogleAccount =
+        peoplePage.shadowRoot!.querySelector('#manage-google-account')!;
+
+    // Do not show Google Account when stored accounts or sync status
+    // could not be retrieved.
+    simulateStoredAccounts(undefined);
+    simulateSyncStatus(undefined);
+    assertEquals(
+        'none', window.getComputedStyle(manageGoogleAccount)['display']);
+
     simulateStoredAccounts([]);
     simulateSyncStatus(undefined);
-    assertFalse(isChildVisible(peoplePage, '#manage-google-account'));
+    assertEquals(
+        'none', window.getComputedStyle(manageGoogleAccount)['display']);
+
+    simulateStoredAccounts(undefined);
+    simulateSyncStatus({
+      statusAction: StatusAction.NO_ACTION,
+    });
+    assertEquals(
+        'none', window.getComputedStyle(manageGoogleAccount)['display']);
 
     simulateStoredAccounts([]);
     simulateSyncStatus({
       statusAction: StatusAction.NO_ACTION,
     });
-    assertFalse(isChildVisible(peoplePage, '#manage-google-account'));
-
-    simulateStoredAccounts([]);
-    simulateSyncStatus({
-      statusAction: StatusAction.NO_ACTION,
-    });
-    assertFalse(isChildVisible(peoplePage, '#manage-google-account'));
+    assertEquals(
+        'none', window.getComputedStyle(manageGoogleAccount)['display']);
 
     // A stored account with sync off but no error should result in the
     // Google Account being shown.
@@ -207,7 +224,8 @@
       hasError: false,
       statusAction: StatusAction.NO_ACTION,
     });
-    assertTrue(isChildVisible(peoplePage, '#manage-google-account'));
+    assertTrue(
+        window.getComputedStyle(manageGoogleAccount)['display'] !== 'none');
 
     // A stored account with sync off and error should not result in the
     // Google Account being shown.
@@ -217,7 +235,8 @@
       hasError: true,
       statusAction: StatusAction.NO_ACTION,
     });
-    assertFalse(isChildVisible(peoplePage, '#manage-google-account'));
+    assertEquals(
+        'none', window.getComputedStyle(manageGoogleAccount)['display']);
 
     // A stored account with sync on but no error should result in the
     // Google Account being shown.
@@ -227,7 +246,8 @@
       hasError: false,
       statusAction: StatusAction.NO_ACTION,
     });
-    assertTrue(isChildVisible(peoplePage, '#manage-google-account'));
+    assertTrue(
+        window.getComputedStyle(manageGoogleAccount)['display'] !== 'none');
 
     // A stored account with sync on but with error should not result in
     // the Google Account being shown.
@@ -237,7 +257,8 @@
       hasError: true,
       statusAction: StatusAction.NO_ACTION,
     });
-    assertFalse(isChildVisible(peoplePage, '#manage-google-account'));
+    assertEquals(
+        'none', window.getComputedStyle(manageGoogleAccount)['display']);
   });
 
   test('SignOutNavigationNormalProfile', async function() {
@@ -414,7 +435,7 @@
   });
 
   teardown(function() {
-    reset();
+    peoplePage.remove();
   });
 
   test('ShowCorrectSyncRow', function() {
@@ -433,156 +454,3 @@
     assertEquals(Router.getInstance().getCurrentRoute(), routes.SYNC);
   });
 });
-
-// <if expr="not is_chromeos">
-suite('PeoplePageAccountSettings', function() {
-  setup(function() {
-    loadTimeData.overrideValues(
-        {signinAllowed: true, replaceSyncPromosWithSignInPromos: true});
-
-    syncBrowserProxy = new TestSyncBrowserProxy();
-    SyncBrowserProxyImpl.setInstance(syncBrowserProxy);
-
-    profileInfoBrowserProxy = new TestProfileInfoBrowserProxy();
-    ProfileInfoBrowserProxyImpl.setInstance(profileInfoBrowserProxy);
-
-    document.body.innerHTML = window.trustedTypes!.emptyHTML;
-    peoplePage = document.createElement('settings-people-page');
-    document.body.appendChild(peoplePage);
-  });
-
-  teardown(function() {
-    reset();
-  });
-
-  async function simulateSignedInState(
-      state: SignedInState, accounts: StoredAccount[]) {
-    await syncBrowserProxy.whenCalled('getSyncStatus');
-    simulateSyncStatus({
-      signedInState: state,
-      syncSystemEnabled: true,
-      hasError: false,
-      statusAction: StatusAction.NO_ACTION,
-    });
-    await flush();
-
-    await syncBrowserProxy.whenCalled('getStoredAccounts');
-    simulateStoredAccounts(accounts);
-    return flush();
-  }
-
-  test('ShowCorrectRowsSignedIn', async function() {
-    await simulateSignedInState(
-        SignedInState.SIGNED_IN, [{email: 'foo@foo.com'}]);
-
-    // The account card and the profile should not exist. Instead, there is a
-    // link row which leads to the account settings page.
-    assertFalse(isChildVisible(peoplePage, 'settings-sync-account-control'));
-    assertFalse(isChildVisible(peoplePage, '#profile-row'));
-    assertTrue(isChildVisible(peoplePage, '#account-subpage-row'));
-
-    // The other rows are shown correctly.
-    assertTrue(isChildVisible(peoplePage, '#sync-setup'));
-    assertTrue(isChildVisible(peoplePage, '#edit-profile'));
-    assertTrue(isChildVisible(peoplePage, '#manage-google-account'));
-    assertTrue(isChildVisible(peoplePage, '#importDataDialogTrigger'));
-  });
-
-  test('ShowCorrectRowsSignedOut', async function() {
-    await simulateSignedInState(SignedInState.SIGNED_OUT, []);
-
-    // The first item should be an account card.
-    assertTrue(isChildVisible(peoplePage, 'settings-sync-account-control'));
-    assertFalse(isChildVisible(peoplePage, '#profile-row'));
-    assertFalse(isChildVisible(peoplePage, '#account-subpage-row'));
-
-    // The other rows are shown correctly.
-    assertTrue(isChildVisible(peoplePage, '#sync-setup'));
-    assertTrue(isChildVisible(peoplePage, '#edit-profile'));
-    assertFalse(isChildVisible(peoplePage, '#manage-google-account'));
-    assertTrue(isChildVisible(peoplePage, '#importDataDialogTrigger'));
-  });
-
-  test('ShowCorrectRowsSyncing', async function() {
-    await simulateSignedInState(
-        SignedInState.SYNCING, [{email: 'foo@foo.com'}]);
-
-    // The first item should be an account card.
-    assertTrue(isChildVisible(peoplePage, 'settings-sync-account-control'));
-    assertFalse(isChildVisible(peoplePage, '#profile-row'));
-    assertFalse(isChildVisible(peoplePage, '#account-subpage-row'));
-
-    // The other rows are shown correctly.
-    assertTrue(isChildVisible(peoplePage, '#sync-setup'));
-    assertTrue(isChildVisible(peoplePage, '#edit-profile'));
-    assertTrue(isChildVisible(peoplePage, '#manage-google-account'));
-    assertTrue(isChildVisible(peoplePage, '#importDataDialogTrigger'));
-  });
-
-  test('ShowCorrectRowsSignInPending', async function() {
-    await simulateSignedInState(
-        SignedInState.SIGNED_IN_PAUSED, [{email: 'foo@foo.com'}]);
-
-    // The first item should be an account card.
-    assertTrue(isChildVisible(peoplePage, 'settings-sync-account-control'));
-    assertFalse(isChildVisible(peoplePage, '#profile-row'));
-    assertFalse(isChildVisible(peoplePage, '#account-subpage-row'));
-
-    // The other rows are shown correctly.
-    assertTrue(isChildVisible(peoplePage, '#sync-setup'));
-    assertTrue(isChildVisible(peoplePage, '#edit-profile'));
-    assertTrue(isChildVisible(peoplePage, '#manage-google-account'));
-    assertTrue(isChildVisible(peoplePage, '#importDataDialogTrigger'));
-  });
-
-  test('ShowCorrectRowsWebSignedIn', async function() {
-    await simulateSignedInState(
-        SignedInState.WEB_ONLY_SIGNED_IN, [{email: 'foo@foo.com'}]);
-
-    // The first item should be an account card.
-    assertTrue(isChildVisible(peoplePage, 'settings-sync-account-control'));
-    assertFalse(isChildVisible(peoplePage, '#profile-row'));
-    assertFalse(isChildVisible(peoplePage, '#account-subpage-row'));
-
-    // The other rows are shown correctly.
-    assertTrue(isChildVisible(peoplePage, '#sync-setup'));
-    assertTrue(isChildVisible(peoplePage, '#edit-profile'));
-    assertTrue(isChildVisible(peoplePage, '#manage-google-account'));
-    assertTrue(isChildVisible(peoplePage, '#importDataDialogTrigger'));
-  });
-
-  test('ClickingAccountLinkRowLeadsToAccountSettings', async function() {
-    await simulateSignedInState(
-        SignedInState.SIGNED_IN, [{email: 'foo@foo.com'}]);
-
-    peoplePage.shadowRoot!.querySelector<HTMLElement>(
-                              '#account-subpage-row')!.click();
-    assertEquals(routes.ACCOUNT, Router.getInstance().getCurrentRoute());
-  });
-
-  test('AccountLinkRowHasAccountInfo', async function() {
-    const expectedAccount = {
-      fullName: 'Test Name',
-      email: 'test@email.com',
-      avatarImage: 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAA' +
-          'AAABAAEAAAICTAEAOw==',
-    };
-    await simulateSignedInState(SignedInState.SIGNED_IN, [expectedAccount]);
-
-    const accountName =
-        peoplePage.shadowRoot!.querySelector(
-                                  '#account-name')!.textContent!.trim();
-    const accountEmail =
-        peoplePage.shadowRoot!.querySelector(
-                                  '#account-email')!.textContent!.trim();
-
-    assertEquals(expectedAccount.fullName, accountName);
-    assertEquals(expectedAccount.email, accountEmail);
-
-    const bgImage =
-        peoplePage.shadowRoot!.querySelector<HTMLElement>(
-                                  '#profile-icon')!.style.backgroundImage;
-    assertTrue(bgImage.includes(expectedAccount.avatarImage));
-  });
-});
-// </if>
diff --git a/chrome/test/data/webui/settings/settings_main_plugins_test.ts b/chrome/test/data/webui/settings/settings_main_plugins_test.ts
index a1afa78e..ec8b0775 100644
--- a/chrome/test/data/webui/settings/settings_main_plugins_test.ts
+++ b/chrome/test/data/webui/settings/settings_main_plugins_test.ts
@@ -6,11 +6,10 @@
 
 import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import type {Route, SettingsMainElement, SettingsPrefsElement} from 'chrome://settings/settings.js';
-import {CrSettingsPrefs, loadTimeData, pageVisibility, resetPageVisibilityForTesting, resetRouterForTesting, Router, routes, setSearchManagerForTesting, SignedInState, StatusAction} from 'chrome://settings/settings.js';
+import {CrSettingsPrefs, loadTimeData, pageVisibility, resetPageVisibilityForTesting, resetRouterForTesting, Router, routes, setSearchManagerForTesting} from 'chrome://settings/settings.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
 
-import {simulateSyncStatus} from './sync_test_util.js';
 import {TestSearchManager} from './test_search_manager.js';
 
 suite('SettingsMain', function() {
@@ -40,14 +39,8 @@
       isGuest: false,
       showAiPage: false,
       showResetProfileBanner: false,
-      replaceSyncPromosWithSignInPromos: true,
     });
     createSettingsMain();
-    simulateSyncStatus({
-      signedInState: SignedInState.SIGNED_IN,
-      statusAction: StatusAction.NO_ACTION,
-    });
-    flush();
   });
 
   test('UpdatesActiveViewWhenRouteChanges', async function() {
diff --git a/chrome/test/media_router/access_code_cast/BUILD.gn b/chrome/test/media_router/access_code_cast/BUILD.gn
index 4b94afe..6bc5ece 100644
--- a/chrome/test/media_router/access_code_cast/BUILD.gn
+++ b/chrome/test/media_router/access_code_cast/BUILD.gn
@@ -20,10 +20,10 @@
 
   deps = [
     "//base/test:test_support",
-    "//chrome/browser:browser",
-    "//chrome/browser/media/router:router",
+    "//chrome/browser",
+    "//chrome/browser/media/router",
     "//chrome/browser/media/router:test_support",
-    "//chrome/browser/media/router/discovery:discovery",
+    "//chrome/browser/media/router/discovery",
     "//chrome/browser/media/router/discovery/access_code:access_code_cast_feature",
     "//chrome/browser/media/router/discovery/access_code:access_code_sink_service",
     "//chrome/browser/profiles:profile",
@@ -35,13 +35,13 @@
     "//chrome/test:test_support",
     "//chrome/test:test_support_ui",
     "//chrome/test/media_router:test_support",
-    "//components/keyed_service/content:content",
-    "//components/media_router/browser:browser",
+    "//components/keyed_service/content",
+    "//components/media_router/browser",
     "//components/media_router/browser:test_support",
     "//components/media_router/common:test_support",
-    "//components/performance_manager:performance_manager",
+    "//components/performance_manager",
     "//components/signin/public/identity_manager:test_support",
-    "//components/user_manager:user_manager",
+    "//components/user_manager",
     "//content/test:test_support",
   ]
 
diff --git a/chrome/test/supervised_user/BUILD.gn b/chrome/test/supervised_user/BUILD.gn
index a052d0b5..2587a5f 100644
--- a/chrome/test/supervised_user/BUILD.gn
+++ b/chrome/test/supervised_user/BUILD.gn
@@ -35,7 +35,7 @@
   public_deps = [
     "//base",
     "//net:test_support",
-    "//services/network/public/cpp:cpp",
+    "//services/network/public/cpp",
   ]
 }
 
diff --git a/chrome/test/variations/BUILD.gn b/chrome/test/variations/BUILD.gn
index 1a207825..866dd22 100644
--- a/chrome/test/variations/BUILD.gn
+++ b/chrome/test/variations/BUILD.gn
@@ -18,7 +18,7 @@
 
   data = [ "//chrome/test/variations/test_utils/" ]
 
-  data_deps = [ "//third_party/catapult/third_party/gsutil:gsutil" ]
+  data_deps = [ "//third_party/catapult/third_party/gsutil" ]
 }
 
 python_library("fixtures") {
@@ -43,7 +43,7 @@
       "//build/android:devil_chromium_py",
       "//build/android:test_runner_py",
       "//clank/bin:installer_scripts",
-      "//third_party/catapult/devil:devil",
+      "//third_party/catapult/devil",
     ]
   }
 
@@ -62,8 +62,8 @@
     ]
 
     data_deps += [
-      "//third_party/catapult/devil:devil",
-      "//third_party/catapult/telemetry:telemetry",
+      "//third_party/catapult/devil",
+      "//third_party/catapult/telemetry",
     ]
   }
 
diff --git a/chrome/updater/BUILD.gn b/chrome/updater/BUILD.gn
index fb7ce57..978b733 100644
--- a/chrome/updater/BUILD.gn
+++ b/chrome/updater/BUILD.gn
@@ -988,9 +988,9 @@
         "app/server/win:updater_idl",
         "app/server/win:updater_internal_idl",
         "app/server/win:updater_legacy_idl",
-        "test/qualification_app:qualification_app",
+        "test/qualification_app",
         "win:updater_test",
-        "win/installer:installer",
+        "win/installer",
         "win/installer:installer_test",
         "win/installer:lib",
         "win/installer:msi_custom_action",
diff --git a/chrome/utility/BUILD.gn b/chrome/utility/BUILD.gn
index 26f8d389..64e43a3 100644
--- a/chrome/utility/BUILD.gn
+++ b/chrome/utility/BUILD.gn
@@ -64,7 +64,7 @@
     "//printing/buildflags",
     "//services/data_decoder:lib",
     "//services/network:network_service",
-    "//services/passage_embeddings:passage_embeddings",
+    "//services/passage_embeddings",
     "//services/passage_embeddings/public/mojom",
     "//services/screen_ai/buildflags",
     "//services/service_manager/public/cpp",
@@ -193,7 +193,7 @@
       "//chromeos/ash/services/boca/babelorca/mojom",
       "//chromeos/ash/services/ime:lib",
       "//chromeos/ash/services/ime/public/mojom",
-      "//chromeos/ash/services/nearby/public/mojom:mojom",
+      "//chromeos/ash/services/nearby/public/mojom",
       "//chromeos/ash/services/orca",
       "//chromeos/ash/services/orca/public/mojom",
       "//chromeos/ash/services/quick_pair",
@@ -202,7 +202,7 @@
       "//chromeos/components/mahi/public/mojom",
       "//chromeos/components/quick_answers/public/cpp",
       "//chromeos/components/quick_answers/public/mojom",
-      "//chromeos/constants:constants",
+      "//chromeos/constants",
       "//chromeos/services/tts",
       "//chromeos/services/tts/public/mojom",
     ]
diff --git a/chromecast/app/BUILD.gn b/chromecast/app/BUILD.gn
index 65a3c1d..609b2ca 100644
--- a/chromecast/app/BUILD.gn
+++ b/chromecast/app/BUILD.gn
@@ -74,7 +74,7 @@
 
 cast_source_set("crash_uploader") {
   sources = [ "cast_crash_uploader.h" ]
-  public_deps = [ "//components/prefs:prefs" ]
+  public_deps = [ "//components/prefs" ]
   if (is_android) {
     sources += [
       "android/cast_crash_uploader_android.cc",
diff --git a/chromecast/bindings/BUILD.gn b/chromecast/bindings/BUILD.gn
index 7ac6d90..5dfa30a 100644
--- a/chromecast/bindings/BUILD.gn
+++ b/chromecast/bindings/BUILD.gn
@@ -85,7 +85,7 @@
       "//chromecast/base",
       "//chromecast/base:chromecast_switches",
       "//chromecast/bindings:bindings_manager_cast",
-      "//chromecast/browser:browser",
+      "//chromecast/browser",
       "//chromecast/browser:client",
       "//chromecast/browser:public",
       "//chromecast/browser:test_support",
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn
index 8d300d9c..ae344d46 100644
--- a/chromecast/browser/BUILD.gn
+++ b/chromecast/browser/BUILD.gn
@@ -348,7 +348,7 @@
 
     deps += [
       "//ui/aura",
-      "//ui/views:views",
+      "//ui/views",
     ]
 
     if (!is_fuchsia) {
@@ -539,7 +539,7 @@
     "//chromecast/base",
     "//chromecast/base:chromecast_switches",
     "//chromecast/base/metrics",
-    "//chromecast/graphics:graphics",
+    "//chromecast/graphics",
     "//chromecast/mojo",
     "//components/keyed_service/content",
     "//components/prefs",
@@ -596,7 +596,7 @@
     "//third_party/blink/public/common",
     "//ui/base",
     "//ui/base:test_support",
-    "//ui/events/devices:devices",
+    "//ui/events/devices",
     "//ui/gl:test_support",
   ]
 
diff --git a/chromecast/common/BUILD.gn b/chromecast/common/BUILD.gn
index edbfcc1..24ce364 100644
--- a/chromecast/common/BUILD.gn
+++ b/chromecast/common/BUILD.gn
@@ -39,7 +39,7 @@
     "//base",
     "//components/url_matcher",
     "//services/network/public/cpp:cpp_base",
-    "//third_party/blink/public/common:common",
+    "//third_party/blink/public/common",
     "//third_party/blink/public/common:headers",
     "//url",
   ]
@@ -111,7 +111,7 @@
     "//media:media_buildflags",
     "//third_party/widevine/cdm:buildflags",
     "//ui/base",
-    "//url:url",
+    "//url",
   ]
 
   if (!is_fuchsia) {
@@ -119,7 +119,7 @@
   }
 
   if (is_android || is_fuchsia) {
-    deps += [ "//components/cdm/common:common" ]
+    deps += [ "//components/cdm/common" ]
   }
 
   if (enable_library_cdms) {
diff --git a/chromecast/device/bluetooth/BUILD.gn b/chromecast/device/bluetooth/BUILD.gn
index 2348be4..881469a 100644
--- a/chromecast/device/bluetooth/BUILD.gn
+++ b/chromecast/device/bluetooth/BUILD.gn
@@ -26,7 +26,7 @@
     "//base/test:run_all_unittests",
     "//base/test:test_support",
     "//chromecast/device/bluetooth/le:unittests",
-    "//testing/gmock:gmock",
-    "//testing/gtest:gtest",
+    "//testing/gmock",
+    "//testing/gtest",
   ]
 }
diff --git a/chromecast/device/bluetooth/shlib/BUILD.gn b/chromecast/device/bluetooth/shlib/BUILD.gn
index 10f0bfd..331759f6 100644
--- a/chromecast/device/bluetooth/shlib/BUILD.gn
+++ b/chromecast/device/bluetooth/shlib/BUILD.gn
@@ -24,6 +24,6 @@
     ":shlib",
     "//base",
     "//chromecast/public",
-    "//testing/gmock:gmock",
+    "//testing/gmock",
   ]
 }
diff --git a/chromecast/media/audio/BUILD.gn b/chromecast/media/audio/BUILD.gn
index 99e9b26..546b79bb 100644
--- a/chromecast/media/audio/BUILD.gn
+++ b/chromecast/media/audio/BUILD.gn
@@ -204,7 +204,7 @@
     "//chromecast/media/audio/audio_output_service:output_connection",
     "//chromecast/media/audio/audio_output_service:proto",
     "//chromecast/media/base:monotonic_clock",
-    "//content/renderer:renderer",
+    "//content/renderer",
     "//media",
     "//media/mojo/mojom",
     "//net",
@@ -223,7 +223,7 @@
       "//base",
       "//chromecast/base",
       "//content/public/renderer",
-      "//content/renderer:renderer",
+      "//content/renderer",
       "//media",
       "//third_party/blink/public:blink",
       "//third_party/blink/public/common",
diff --git a/chromecast/media/base/BUILD.gn b/chromecast/media/base/BUILD.gn
index 58016c96..bf4eaa2 100644
--- a/chromecast/media/base/BUILD.gn
+++ b/chromecast/media/base/BUILD.gn
@@ -104,6 +104,6 @@
   deps = [
     ":buildflags",
     "//base",
-    "//chromecast/media/api:api",
+    "//chromecast/media/api",
   ]
 }
diff --git a/chromecast/media/cma/backend/BUILD.gn b/chromecast/media/cma/backend/BUILD.gn
index 90ac57ca..fdf84b9 100644
--- a/chromecast/media/cma/backend/BUILD.gn
+++ b/chromecast/media/cma/backend/BUILD.gn
@@ -26,7 +26,7 @@
   deps = [
     "//base",
     "//chromecast:chromecast_buildflags",
-    "//chromecast/base/metrics:metrics",
+    "//chromecast/base/metrics",
     "//chromecast/media:libcast_media",
     "//chromecast/media/cma/base",
     "//chromecast/media/cma/decoder",
@@ -108,7 +108,7 @@
   deps = [
     "//base",
     "//chromecast/public",
-    "//chromecast/public/media:media",
+    "//chromecast/public/media",
   ]
 }
 
diff --git a/chromecast/media/cma/backend/mixer/post_processors/BUILD.gn b/chromecast/media/cma/backend/mixer/post_processors/BUILD.gn
index 2095ec9..2964a6c 100644
--- a/chromecast/media/cma/backend/mixer/post_processors/BUILD.gn
+++ b/chromecast/media/cma/backend/mixer/post_processors/BUILD.gn
@@ -110,6 +110,6 @@
     "//chromecast/media/base",
     "//chromecast/public",
     "//chromecast/public/media",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
   ]
 }
diff --git a/chromecast/media/cma/pipeline/BUILD.gn b/chromecast/media/cma/pipeline/BUILD.gn
index 368413e7..9122ec4 100644
--- a/chromecast/media/cma/pipeline/BUILD.gn
+++ b/chromecast/media/cma/pipeline/BUILD.gn
@@ -49,7 +49,7 @@
     ":cma_pipeline_buildflags",
     "//base",
     "//chromecast/base",
-    "//chromecast/base/metrics:metrics",
+    "//chromecast/base/metrics",
     "//chromecast/media/base",
     "//chromecast/media/cdm",
     "//chromecast/media/cma/backend",
diff --git a/chromecast/media/common/BUILD.gn b/chromecast/media/common/BUILD.gn
index 466ce4d..ee55062 100644
--- a/chromecast/media/common/BUILD.gn
+++ b/chromecast/media/common/BUILD.gn
@@ -40,7 +40,7 @@
     ":media_resource_tracker",
     "//base",
     "//chromecast:chromecast_buildflags",
-    "//chromecast/base/metrics:metrics",
+    "//chromecast/base/metrics",
     "//chromecast/media/common/base",
   ]
 
diff --git a/chromecast/media/gpu/BUILD.gn b/chromecast/media/gpu/BUILD.gn
index 74916e6..ec5ed3b 100644
--- a/chromecast/media/gpu/BUILD.gn
+++ b/chromecast/media/gpu/BUILD.gn
@@ -16,9 +16,9 @@
       "//chromecast/mojo",
       "//components/viz/common",
       "//media/gpu",
-      "//media/gpu/ipc/client:client",
+      "//media/gpu/ipc/client",
       "//media/gpu/ipc/common",
-      "//media/mojo/clients:clients",
+      "//media/mojo/clients",
       "//media/mojo/mojom",
       "//ui/gfx/geometry/mojom",
     ]
diff --git a/chromecast/metrics/BUILD.gn b/chromecast/metrics/BUILD.gn
index 856085f..db9dd7a 100644
--- a/chromecast/metrics/BUILD.gn
+++ b/chromecast/metrics/BUILD.gn
@@ -23,7 +23,7 @@
     "//components/metrics",
     "//components/metrics:net",
     "//components/prefs",
-    "//components/variations:variations",
+    "//components/variations",
     "//services/network/public/cpp",
   ]
 }
@@ -73,7 +73,7 @@
     "metrics_util.h",
   ]
 
-  public_deps = [ "//net:net" ]
+  public_deps = [ "//net" ]
 
   deps = [ "//base" ]
 }
@@ -106,7 +106,7 @@
     ":cast_event_builder_interface",
     "//base",
     "//net",
-    "//testing/gmock:gmock",
+    "//testing/gmock",
   ]
 }
 
@@ -129,8 +129,8 @@
     "//chromecast/base:dummy_cast_sys_info",
     "//components/metrics",
     "//services/network/public/cpp",
-    "//testing/gmock:gmock",
-    "//testing/gtest:gtest",
+    "//testing/gmock",
+    "//testing/gtest",
   ]
 }
 
diff --git a/chromecast/renderer/BUILD.gn b/chromecast/renderer/BUILD.gn
index f9f2fa6..0a58fb3d 100644
--- a/chromecast/renderer/BUILD.gn
+++ b/chromecast/renderer/BUILD.gn
@@ -74,7 +74,7 @@
     "//ipc",
     "//media/remoting:remoting_renderer",
     "//net",
-    "//services/network/public/cpp:cpp",
+    "//services/network/public/cpp",
     "//services/service_manager/public/cpp",
   ]
 
diff --git a/chromecast/renderer/media/BUILD.gn b/chromecast/renderer/media/BUILD.gn
index d2aa73a..0aacc45 100644
--- a/chromecast/renderer/media/BUILD.gn
+++ b/chromecast/renderer/media/BUILD.gn
@@ -18,7 +18,7 @@
     "//chromecast/common/mojom",
     "//chromecast/media",
     "//chromecast/media/cdm",
-    "//chromecast/public:public",
+    "//chromecast/public",
     "//components/cdm/renderer",
     "//content/public/renderer",
     "//media",
diff --git a/chromecast/starboard/media/cdm/BUILD.gn b/chromecast/starboard/media/cdm/BUILD.gn
index 122460f..782e9ef 100644
--- a/chromecast/starboard/media/cdm/BUILD.gn
+++ b/chromecast/starboard/media/cdm/BUILD.gn
@@ -63,6 +63,6 @@
     "//media",
     "//testing/gmock",
     "//testing/gtest",
-    "//url:url",
+    "//url",
   ]
 }
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index 8a3476e..569377c 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-16361.0.0-1070508
\ No newline at end of file
+16361.0.0-1070514
\ No newline at end of file
diff --git a/chromeos/ash/components/boca/babelorca/DEPS b/chromeos/ash/components/boca/babelorca/DEPS
index 1b5d8e9..911a524 100644
--- a/chromeos/ash/components/boca/babelorca/DEPS
+++ b/chromeos/ash/components/boca/babelorca/DEPS
@@ -7,6 +7,7 @@
   "+components/soda/constants.h",
   "+content/public/browser/service_process_host.h",
   "+media/mojo/mojom/speech_recognition.mojom.h",
+  "+media/mojo/mojom/speech_recognition.mojom-forward.h",
   "+media/mojo/mojom/speech_recognition_result.h",
   "+ui/native_theme",
   "+ui/views",
diff --git a/chromeos/ash/components/boca/babelorca/babel_orca_consumer.cc b/chromeos/ash/components/boca/babelorca/babel_orca_consumer.cc
index cb82d16c..515e132 100644
--- a/chromeos/ash/components/boca/babelorca/babel_orca_consumer.cc
+++ b/chromeos/ash/components/boca/babelorca/babel_orca_consumer.cc
@@ -36,6 +36,7 @@
 #include "components/signin/public/identity_manager/identity_manager.h"
 #include "content/public/browser/service_process_host.h"
 #include "google_apis/gaia/gaia_id.h"
+#include "media/mojo/mojom/speech_recognition.mojom.h"
 #include "media/mojo/mojom/speech_recognition_result.h"
 #include "services/network/public/cpp/shared_url_loader_factory.h"
 
@@ -329,6 +330,13 @@
 void BabelOrcaConsumer::OnTranscriptReceived(
     media::SpeechRecognitionResult transcript,
     std::string language) {
+  if (!transcript_lang_.has_value() || transcript_lang_.value() != language) {
+    transcript_lang_ = language;
+    caption_controller_->OnLanguageIdentificationEvent(
+        media::mojom::LanguageIdentificationEvent::New(
+            /*language=*/language, media::mojom::ConfidenceLevel::kConfident,
+            media::mojom::AsrSwitchResult::kSwitchSucceeded));
+  }
   if (caption_controller_->IsTranslateAllowedAndEnabled()) {
     translator_->Translate(
         transcript,
diff --git a/chromeos/ash/components/boca/babelorca/babel_orca_consumer.h b/chromeos/ash/components/boca/babelorca/babel_orca_consumer.h
index 22b8d36e..c68835a 100644
--- a/chromeos/ash/components/boca/babelorca/babel_orca_consumer.h
+++ b/chromeos/ash/components/boca/babelorca/babel_orca_consumer.h
@@ -6,6 +6,7 @@
 #define CHROMEOS_ASH_COMPONENTS_BOCA_BABELORCA_BABEL_ORCA_CONSUMER_H_
 
 #include <memory>
+#include <optional>
 #include <string>
 
 #include "base/functional/callback.h"
@@ -136,6 +137,7 @@
   bool local_captions_enabled_ = false;
   bool session_captions_enabled_ = false;
   bool in_session_ = false;
+  std::optional<std::string> transcript_lang_;
 
   base::WeakPtrFactory<BabelOrcaConsumer> weak_ptr_factory_{this};
 };
diff --git a/chromeos/ash/components/boca/babelorca/babel_orca_consumer_unittest.cc b/chromeos/ash/components/boca/babelorca/babel_orca_consumer_unittest.cc
index cff3239..fde91f6 100644
--- a/chromeos/ash/components/boca/babelorca/babel_orca_consumer_unittest.cc
+++ b/chromeos/ash/components/boca/babelorca/babel_orca_consumer_unittest.cc
@@ -50,7 +50,8 @@
 namespace ash::babelorca {
 namespace {
 
-const std::string kApplicationLocale = "en-US";
+const std::string kEnglishUsLocale = "en-US";
+const std::string kSpanishUsLocale = "es-US";
 const GaiaId::Literal kGaiaId("gaia-id");
 const std::string kSessionId = "session_id";
 const std::string kEmail = "test@school.edu";
@@ -74,11 +75,11 @@
         std::make_unique<FakeCaptionControllerDelegate>();
     caption_controller_delegate_ = caption_controller_delegate.get();
     auto caption_bubble_settings = std::make_unique<CaptionBubbleSettingsImpl>(
-        &pref_service_, kApplicationLocale, base::DoNothing());
+        &pref_service_, kEnglishUsLocale, base::DoNothing());
     caption_bubble_settings_ = caption_bubble_settings.get();
     auto caption_controller = std::make_unique<CaptionController>(
         /*caption_bubble_context=*/
-        nullptr, &pref_service_, kApplicationLocale,
+        nullptr, &pref_service_, kEnglishUsLocale,
         std::move(caption_bubble_settings),
         std::move(caption_controller_delegate));
     caption_controller->SetLiveTranslateEnabled(translate_enabled);
@@ -123,7 +124,7 @@
     message->current_transcript->is_final = true;
     message->current_transcript->text_index = 0;
     message->current_transcript->text = "transcript";
-    message->current_transcript->language = "en";
+    message->current_transcript->language = kEnglishUsLocale;
     return message;
   }
 
@@ -451,5 +452,63 @@
   EXPECT_TRUE(caption_bubble_settings_->GetLiveTranslateEnabled());
 }
 
+TEST_F(BabelOrcaConsumerTest, OnLanguageIdentificationEvent) {
+  request_data_provider_ = std::make_unique<FakeTachyonRequestDataProvider>(
+      kSessionId, "tachyon-token", "group_id", kEmail);
+  CreateConsumer();
+  consumer_->OnSessionStarted();
+  consumer_->OnLocalCaptionConfigUpdated(/*local_captions_enabled=*/true);
+  consumer_->OnSessionCaptionConfigUpdated(/*session_captions_enabled=*/true,
+                                           /*translations_enabled=*/false);
+
+  // Join Tachyon group.
+  url_loader_factory_.AddResponse(JoinGroupUrl(), "");
+  identity_test_env_.WaitForAccessTokenRequestIfNecessaryAndRespondWithToken(
+      "oauth_token", base::Time::Max());
+  ASSERT_TRUE(streaming_client_waiter_.Wait());
+
+  ASSERT_FALSE(on_message_cb_.is_null());
+
+  // Language identification event will initially be triggered.
+  mojom::BabelOrcaMessagePtr message_1 = CreateMessage();
+  on_message_cb_.Run(std::move(message_1));
+  ASSERT_THAT(caption_controller_delegate_->GetLanguageIdentificationEvents(),
+              testing::SizeIs(1));
+  EXPECT_EQ(caption_controller_delegate_->GetLanguageIdentificationEvents()
+                .at(0)
+                ->language,
+            kEnglishUsLocale);
+
+  // Language not changed so no language identification event.
+  mojom::BabelOrcaMessagePtr message_2 = CreateMessage();
+  message_2->order = 2;
+  on_message_cb_.Run(std::move(message_2));
+  EXPECT_THAT(caption_controller_delegate_->GetLanguageIdentificationEvents(),
+              testing::SizeIs(1));
+
+  // Language identification event will be triggered when switching language.
+  mojom::BabelOrcaMessagePtr message_3 = CreateMessage();
+  message_3->order = 3;
+  message_3->current_transcript->language = kSpanishUsLocale;
+  on_message_cb_.Run(std::move(message_3));
+  ASSERT_THAT(caption_controller_delegate_->GetLanguageIdentificationEvents(),
+              testing::SizeIs(2));
+  EXPECT_EQ(caption_controller_delegate_->GetLanguageIdentificationEvents()
+                .at(1)
+                ->language,
+            kSpanishUsLocale);
+
+  mojom::BabelOrcaMessagePtr message_4 = CreateMessage();
+  message_4->order = 4;
+  message_4->current_transcript->language = kEnglishUsLocale;
+  on_message_cb_.Run(std::move(message_4));
+  ASSERT_THAT(caption_controller_delegate_->GetLanguageIdentificationEvents(),
+              testing::SizeIs(3));
+  EXPECT_EQ(caption_controller_delegate_->GetLanguageIdentificationEvents()
+                .at(2)
+                ->language,
+            kEnglishUsLocale);
+}
+
 }  // namespace
 }  // namespace ash::babelorca
diff --git a/chromeos/ash/components/boca/babelorca/caption_controller_unittest.cc b/chromeos/ash/components/boca/babelorca/caption_controller_unittest.cc
index 3dd720e..be880ac 100644
--- a/chromeos/ash/components/boca/babelorca/caption_controller_unittest.cc
+++ b/chromeos/ash/components/boca/babelorca/caption_controller_unittest.cc
@@ -20,6 +20,7 @@
 #include "components/live_caption/pref_names.h"
 #include "components/prefs/pref_registry_simple.h"
 #include "components/prefs/testing_pref_service.h"
+#include "media/mojo/mojom/speech_recognition.mojom.h"
 #include "media/mojo/mojom/speech_recognition_result.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
@@ -45,6 +46,12 @@
   EXPECT_THAT(style.text_shadow, testing::HasSubstr(kCaptionsTextShadow));
 }
 
+media::mojom::LanguageIdentificationEventPtr GetLanguageIdentificationEvent() {
+  return media::mojom::LanguageIdentificationEvent::New(
+      "ar-EG", media::mojom::ConfidenceLevel::kConfident,
+      media::mojom::AsrSwitchResult::kSwitchSucceeded);
+}
+
 TEST(CaptionControllerTest, SetStyleOnStartLiveCaption) {
   TestingPrefServiceSimple pref_service;
   RegisterPrefsForTesting(&pref_service);
@@ -124,7 +131,8 @@
       /*caption_bubble_context=*/nullptr, &pref_service, kApplicationLocale,
       /*caption_bubble_settings=*/nullptr, std::move(delegate));
 
-  caption_controller.OnLanguageIdentificationEvent(nullptr);
+  caption_controller.OnLanguageIdentificationEvent(
+      GetLanguageIdentificationEvent());
 
   EXPECT_EQ(delegate_ptr->GetOnLanguageIdentificationEventCount(), 0u);
 }
@@ -139,7 +147,8 @@
       /*caption_bubble_settings=*/nullptr, std::move(delegate));
 
   caption_controller.StartLiveCaption();
-  caption_controller.OnLanguageIdentificationEvent(nullptr);
+  caption_controller.OnLanguageIdentificationEvent(
+      GetLanguageIdentificationEvent());
 
   EXPECT_EQ(delegate_ptr->GetOnLanguageIdentificationEventCount(), 1u);
 }
@@ -155,7 +164,8 @@
 
   caption_controller.StartLiveCaption();
   caption_controller.StopLiveCaption();
-  caption_controller.OnLanguageIdentificationEvent(nullptr);
+  caption_controller.OnLanguageIdentificationEvent(
+      GetLanguageIdentificationEvent());
 
   EXPECT_EQ(delegate_ptr->GetOnLanguageIdentificationEventCount(), 0u);
 }
diff --git a/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.cc b/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.cc
index 1fee3e01..03276615 100644
--- a/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.cc
+++ b/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.cc
@@ -42,8 +42,8 @@
   void OnLanguageIdentificationEvent(
       content::RenderFrameHost*,
       captions::CaptionBubbleContext*,
-      const media::mojom::LanguageIdentificationEventPtr&) override {
-    delegate_->OnLanguageIdentificationEvent();
+      const media::mojom::LanguageIdentificationEventPtr& event) override {
+    delegate_->OnLanguageIdentificationEvent(event);
   }
 
   void UpdateCaptionStyle(std::optional<ui::CaptionStyle> style) override {
@@ -101,7 +101,7 @@
 }
 
 size_t FakeCaptionControllerDelegate::GetOnLanguageIdentificationEventCount() {
-  return language_identification_event_count_;
+  return language_identification_events_.size();
 }
 
 const std::vector<std::optional<ui::CaptionStyle>>&
@@ -114,6 +114,11 @@
   return transcriptions_;
 }
 
+const std::vector<media::mojom::LanguageIdentificationEventPtr>&
+FakeCaptionControllerDelegate::GetLanguageIdentificationEvents() {
+  return language_identification_events_;
+}
+
 bool FakeCaptionControllerDelegate::AddTranscription(
     media::SpeechRecognitionResult transcription) {
   transcriptions_.push_back(std::move(transcription));
@@ -124,8 +129,9 @@
   on_transcritption_success_ = success;
 }
 
-void FakeCaptionControllerDelegate::OnLanguageIdentificationEvent() {
-  ++language_identification_event_count_;
+void FakeCaptionControllerDelegate::OnLanguageIdentificationEvent(
+    const media::mojom::LanguageIdentificationEventPtr& event) {
+  language_identification_events_.push_back(event->Clone());
 }
 
 void FakeCaptionControllerDelegate::AddStyleUpdate(
diff --git a/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.h b/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.h
index 183fb92..2abd15e 100644
--- a/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.h
+++ b/chromeos/ash/components/boca/babelorca/fakes/fake_caption_controller_delegate.h
@@ -13,6 +13,7 @@
 
 #include "base/memory/raw_ptr.h"
 #include "chromeos/ash/components/boca/babelorca/caption_controller.h"
+#include "media/mojo/mojom/speech_recognition.mojom-forward.h"
 
 namespace captions {
 class CaptionBubbleController;
@@ -59,11 +60,15 @@
 
   const std::vector<media::SpeechRecognitionResult>& GetTranscriptions();
 
+  const std::vector<media::mojom::LanguageIdentificationEventPtr>&
+  GetLanguageIdentificationEvents();
+
   bool AddTranscription(media::SpeechRecognitionResult transcription);
 
   void SetOnTranscriptionSuccess(bool success);
 
-  void OnLanguageIdentificationEvent();
+  void OnLanguageIdentificationEvent(
+      const media::mojom::LanguageIdentificationEventPtr& event);
 
   void AddStyleUpdate(std::optional<ui::CaptionStyle> style);
 
@@ -75,7 +80,8 @@
   bool caption_bubble_alive_ = false;
   bool on_transcritption_success_ = true;
   size_t create_bubble_controller_count_ = 0;
-  size_t language_identification_event_count_ = 0;
+  std::vector<media::mojom::LanguageIdentificationEventPtr>
+      language_identification_events_;
   std::vector<std::optional<ui::CaptionStyle>> caption_style_updates_;
   std::vector<media::SpeechRecognitionResult> transcriptions_;
   raw_ptr<ui::NativeThemeObserver> style_observer_;
diff --git a/chromeos/profiles/atom.afdo.newest.txt b/chromeos/profiles/atom.afdo.newest.txt
index 0d9f6772..efdaf529 100644
--- a/chromeos/profiles/atom.afdo.newest.txt
+++ b/chromeos/profiles/atom.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-amd64-atom-140-7258.43-1753070574-benchmark-140.0.7313.0_pre1490386-r1-redacted.afdo.xz
+chromeos-chrome-amd64-atom-140-7258.43-1753070574-benchmark-140.0.7317.0_pre1491800-r1-redacted.afdo.xz
diff --git a/clank b/clank
index e101239..dccbc9a 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit e1012395eec3db1f82de8817f9f439253fe87155
+Subproject commit dccbc9a6d7146b71f54ed6f3bc739c3c3a5098b5
diff --git a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller.h b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller.h
index f513d753..e965b36e 100644
--- a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller.h
+++ b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller.h
@@ -6,6 +6,7 @@
 #define COMPONENTS_AUTOFILL_CORE_BROWSER_UI_PAYMENTS_SAVE_AND_FILL_DIALOG_CONTROLLER_H_
 
 #include "base/memory/weak_ptr.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "components/autofill/core/browser/payments/payments_autofill_client.h"
 
 namespace autofill {
@@ -44,6 +45,9 @@
       std::u16string_view expiration_date) const = 0;
   virtual bool IsValidNameOnCard(std::u16string_view input_text) const = 0;
 
+  // Returns empty vector if no legal message should be shown.
+  virtual const LegalMessageLines& GetLegalMessageLines() const = 0;
+
   // Dismisses the dialog by destroying its view and associated widget.
   virtual void Dismiss() = 0;
   // Callbacks for when the user accepts the Save and Fill dialog.
diff --git a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.cc b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.cc
index 2aea6f62..1063f25 100644
--- a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.cc
+++ b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.cc
@@ -219,6 +219,11 @@
   return autofill::IsValidNameOnCard(input_text);
 }
 
+const LegalMessageLines& SaveAndFillDialogControllerImpl::GetLegalMessageLines()
+    const {
+  return legal_message_lines_;
+}
+
 void SaveAndFillDialogControllerImpl::Dismiss() {
   dialog_view_.reset();
 }
diff --git a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.h b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.h
index f6acadb..b362164 100644
--- a/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.h
+++ b/components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller_impl.h
@@ -7,6 +7,7 @@
 
 #include "base/functional/callback.h"
 #include "base/memory/weak_ptr.h"
+#include "components/autofill/core/browser/payments/legal_message_line.h"
 #include "components/autofill/core/browser/payments/payments_autofill_client.h"
 #include "components/autofill/core/browser/ui/payments/save_and_fill_dialog_controller.h"
 #include "components/autofill/core/browser/ui/payments/save_and_fill_dialog_view.h"
@@ -62,6 +63,8 @@
       std::u16string_view expiration_date) const override;
   bool IsValidNameOnCard(std::u16string_view input_text) const override;
 
+  const LegalMessageLines& GetLegalMessageLines() const override;
+
   void Dismiss() override;
   void OnUserAcceptedDialog(
       const payments::PaymentsAutofillClient::
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java
index 93807db..b4ea4f3 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BrowserUiListMenuUtils.java
@@ -13,6 +13,7 @@
 import androidx.annotation.StyleRes;
 
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.listmenu.BasicListMenu;
 import org.chromium.ui.listmenu.ListMenu;
 import org.chromium.ui.modelutil.MVCListAdapter;
@@ -38,10 +39,11 @@
      *
      * @param context The Android context.
      * @param data The data to display in the list.
-     * @param delegate Delegate to handle item clicks.
+     * @param delegate The {@link ListMenu.Delegate} used to handle menu clicks. If not provided,
+     *     the item's CLICK_LISTENER or listMenu's onMenuItemSelected method will be used.
      */
     public static BasicListMenu getBasicListMenu(
-            Context context, MVCListAdapter.ModelList data, ListMenu.Delegate delegate) {
+            Context context, MVCListAdapter.ModelList data, ListMenu.@Nullable Delegate delegate) {
         return getBasicListMenu(context, data, delegate, 0);
     }
 
@@ -50,13 +52,14 @@
      *
      * @param context The Android context.
      * @param data The data to display in the list.
-     * @param delegate Delegate to handle item clicks.
+     * @param delegate The {@link ListMenu.Delegate} used to handle menu clicks. If not provided,
+     *     the item's CLICK_LISTENER or listMenu's onMenuItemSelected method will be used.
      * @param backgroundTintColor tint for the menu background.
      */
     public static BasicListMenu getBasicListMenu(
             Context context,
             MVCListAdapter.ModelList data,
-            ListMenu.Delegate delegate,
+            ListMenu.@Nullable Delegate delegate,
             @ColorRes int backgroundTintColor) {
         View contentView = LayoutInflater.from(context).inflate(R.layout.app_menu_layout, null);
         ListView listView = contentView.findViewById(R.id.app_menu_list);
diff --git a/components/embedder_support/user_agent_utils.cc b/components/embedder_support/user_agent_utils.cc
index c9338f0..7c95cb0 100644
--- a/components/embedder_support/user_agent_utils.cc
+++ b/components/embedder_support/user_agent_utils.cc
@@ -346,6 +346,13 @@
   if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) {
     return kUnifiedPlatformLinuxX64;
   }
+#if BUILDFLAG(ENABLE_VR)
+  // The Android XR device by default also has the unified platform of desktop
+  // form factor.
+  if (device::features::IsXrDevice()) {
+    return kUnifiedPlatformLinuxX64;
+  }
+#endif  // BUILDFLAG(ENABLE_VR)
   return "Linux; Android 10; K";
 #elif BUILDFLAG(IS_CHROMEOS)
   return "X11; CrOS x86_64 14541.0.0";
@@ -606,6 +613,11 @@
   if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) {
     return false;
   }
+#if BUILDFLAG(ENABLE_VR)
+  if (device::features::IsXrDevice()) {
+    return false;
+  }
+#endif  // BUILDFLAG(ENABLE_VR)
 #endif
 
 #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS)
@@ -628,6 +640,11 @@
   if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) {
     return std::string();
   }
+#if BUILDFLAG(ENABLE_VR)
+  if (device::features::IsXrDevice()) {
+    return std::string();
+  }
+#endif  // BUILDFLAG(ENABLE_VR)
 #endif
 
 #if BUILDFLAG(IS_WIN)
@@ -645,6 +662,11 @@
   if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) {
     return "Linux";
   }
+#if BUILDFLAG(ENABLE_VR)
+  if (device::features::IsXrDevice()) {
+    return "Linux";
+  }
+#endif  // BUILDFLAG(ENABLE_VR)
 #endif
 
 #if BUILDFLAG(IS_MAC)
@@ -787,9 +809,17 @@
 #elif BUILDFLAG(IS_IOS)
   return "arm";
 #elif BUILDFLAG(IS_ANDROID)
+  // TODO(crbug.com/433345971) The user agent string should contain the actual
+  // cpu type information obtained from the Android device. Same for the cpu bit
+  // count in #GetCpuBitness below.
   if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) {
     return "x86";
   }
+#if BUILDFLAG(ENABLE_VR)
+  if (device::features::IsXrDevice()) {
+    return "x86";
+  }
+#endif  // BUILDFLAG(ENABLE_VR)
   return std::string();
 #elif BUILDFLAG(IS_POSIX)
   std::string cpu_info = BuildCpuInfo();
@@ -829,6 +859,11 @@
   if (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_DESKTOP) {
     return "64";
   }
+#if BUILDFLAG(ENABLE_VR)
+  if (device::features::IsXrDevice()) {
+    return "64";
+  }
+#endif  // BUILDFLAG(ENABLE_VR)
   return std::string();
 #elif BUILDFLAG(IS_POSIX)
   return base::Contains(BuildCpuInfo(), "64") ? "64" : "32";
diff --git a/components/embedder_support/user_agent_utils_unittest.cc b/components/embedder_support/user_agent_utils_unittest.cc
index 2b363bb..58c6648 100644
--- a/components/embedder_support/user_agent_utils_unittest.cc
+++ b/components/embedder_support/user_agent_utils_unittest.cc
@@ -754,13 +754,26 @@
 }
 
 #if BUILDFLAG(IS_ANDROID) && BUILDFLAG(ENABLE_VR)
-TEST_F(UserAgentUtilsTest, UserAgentMetadataXR) {
+TEST_F(UserAgentUtilsTest, UserAgentMetadataForXrDevice) {
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitAndEnableFeature(
       device::features::kForceIsXrDeviceForTesting);
+
+  // Verify the user-agent.
+  EXPECT_THAT(GetUserAgent(), testing::HasSubstr("X11; Linux x86_64"));
+
+  // Verify user-agent client-hints
   auto metadata = GetUserAgentMetadata();
-  std::vector<std::string> expected_form_factors = {
-      (metadata.mobile ? "Mobile" : "Desktop"), "XR"};
+  EXPECT_FALSE(metadata.mobile);
+  EXPECT_EQ(metadata.platform, "Linux");
+  EXPECT_FALSE(metadata.brand_version_list.empty());
+  EXPECT_EQ(metadata.bitness, "64");
+  EXPECT_EQ(metadata.architecture, "x86");
+  EXPECT_FALSE(metadata.model.empty());
+  EXPECT_TRUE(metadata.platform_version.empty());
+  EXPECT_FALSE(metadata.full_version.empty());
+  EXPECT_FALSE(metadata.brand_full_version_list.empty());
+  std::vector<std::string> expected_form_factors = {"Desktop", "XR"};
   EXPECT_EQ(metadata.form_factors, expected_form_factors);
 }
 #endif  // BUILDFLAG(IS_ANDROID) && BUILDFLAG(ENABLE_VR)
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc
index 0f04b8d5..a0213a1 100644
--- a/components/feature_engagement/public/feature_constants.cc
+++ b/components/feature_engagement/public/feature_constants.cc
@@ -250,7 +250,7 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kIPHTabSearchToolbarButtonFeature,
              "IPH_TabSearchToolbarButton",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kIPHDesktopSnoozeFeature,
              "IPH_DesktopSnoozeFeature",
              base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java
index acd1bbea..9d2efdc3 100644
--- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java
+++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java
@@ -22,6 +22,7 @@
 import org.chromium.components.omnibox.AnswerTypeProto.AnswerType;
 import org.chromium.components.omnibox.GroupsProto.GroupId;
 import org.chromium.components.omnibox.RichAnswerTemplateProto.RichAnswerTemplate;
+import org.chromium.components.omnibox.SuggestTemplateInfoProto.SuggestTemplateInfo;
 import org.chromium.components.omnibox.action.OmniboxAction;
 import org.chromium.url.GURL;
 
@@ -93,6 +94,7 @@
     private final String mInlineAutocompletion;
     private final String mAdditionalText;
     private final @Nullable String mTabGroupUuid;
+    private @Nullable SuggestTemplateInfo mSuggestTemplate;
 
     public AutocompleteMatch(
             int nativeType,
@@ -120,7 +122,8 @@
             boolean allowedToBeDefaultMatch,
             String inlineAutocompletion,
             String additionalText,
-            @Nullable String tabGroupUuid) {
+            @Nullable String tabGroupUuid,
+            byte @Nullable [] serializedSuggestTemplate) {
         if (subtypes == null) {
             subtypes = Collections.emptySet();
         }
@@ -158,6 +161,13 @@
         mInlineAutocompletion = inlineAutocompletion;
         mAdditionalText = additionalText;
         mTabGroupUuid = tabGroupUuid;
+        if (serializedSuggestTemplate != null) {
+            try {
+                mSuggestTemplate = SuggestTemplateInfo.parseFrom(serializedSuggestTemplate);
+            } catch (InvalidProtocolBufferException e) {
+                assert false : "Parsing error for SuggestTemplateInfo";
+            }
+        }
     }
 
     @CalledByNative
@@ -190,7 +200,8 @@
             boolean allowedToBeDefaultMatch,
             String inlineAutocompletion,
             String additionalText,
-            String localTabGroupId) {
+            String localTabGroupId,
+            byte[] serializedSuggestTemplate) {
         assert contentClassificationOffsets.length == contentClassificationStyles.length;
         List<MatchClassification> contentClassifications = new ArrayList<>();
         for (int i = 0; i < contentClassificationOffsets.length; i++) {
@@ -231,7 +242,8 @@
                         allowedToBeDefaultMatch,
                         inlineAutocompletion,
                         additionalText,
-                        TextUtils.isEmpty(localTabGroupId) ? null : localTabGroupId);
+                        TextUtils.isEmpty(localTabGroupId) ? null : localTabGroupId,
+                        serializedSuggestTemplate);
         match.updateNativeObjectRef(nativeObject);
         match.setDescription(
                 description, descriptionClassificationOffsets, descriptionClassificationStyles);
@@ -449,6 +461,10 @@
                 (mAnswerTemplate != null && suggestion.mAnswerTemplate != null)
                         ? mAnswerTemplate.equals(suggestion.mAnswerTemplate)
                         : mAnswerTemplate == null && suggestion.mAnswerTemplate == null;
+        boolean suggest_template_is_equal =
+                (mSuggestTemplate != null && suggestion.mSuggestTemplate != null)
+                        ? mSuggestTemplate.equals(suggestion.mSuggestTemplate)
+                        : mSuggestTemplate == null && suggestion.mSuggestTemplate == null;
         return mType == suggestion.mType
                 && mNativeMatch == suggestion.mNativeMatch
                 && ObjectsCompat.equals(mSubtypes, suggestion.mSubtypes)
@@ -465,6 +481,7 @@
                 && mGroupId == suggestion.mGroupId
                 && mAnswerType == suggestion.mAnswerType
                 && answer_template_is_equal
+                && suggest_template_is_equal
                 && ObjectsCompat.equals(mTabGroupUuid, suggestion.mTabGroupUuid);
     }
 
@@ -589,7 +606,8 @@
                 input.getAllowedToBeDefaultMatch(),
                 input.getInlineAutocompletion(),
                 input.getAdditionalText(),
-                /* tabGroupUuid= */ null);
+                /* tabGroupUuid= */ null,
+                /* serializedSuggestTemplate= */ null);
     }
 
     @Override
@@ -613,7 +631,8 @@
                         "mGroupId=" + mGroupId,
                         "mDisplayTextClassifications=" + mDisplayTextClassifications,
                         "mDescriptionClassifications=" + mDescriptionClassifications,
-                        "mAnswerTemplate=" + mAnswerTemplate);
+                        "mAnswerTemplate=" + mAnswerTemplate,
+                        "mSuggestTemplate=" + mSuggestTemplate);
         return pieces.toString();
     }
 
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatchBuilder.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatchBuilder.java
index 4aba5295..82f480e4 100644
--- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatchBuilder.java
+++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatchBuilder.java
@@ -50,6 +50,7 @@
     private String mInlineAutocompletion;
     private String mAdditionalText;
     private String mTabGroupUuid;
+    private byte[] mSerializedSuggestTemplate;
 
     /**
      * Create a suggestion builder for a search suggestion.
@@ -101,6 +102,7 @@
         mInlineAutocompletion = null;
         mAdditionalText = null;
         mTabGroupUuid = null;
+        mSerializedSuggestTemplate = null;
 
         mDisplayTextClassifications.add(
                 new AutocompleteMatch.MatchClassification(0, MatchClassificationStyle.NONE));
@@ -141,7 +143,8 @@
                 mAllowedToBeDefaultMatch,
                 mInlineAutocompletion,
                 mAdditionalText,
-                mTabGroupUuid);
+                mTabGroupUuid,
+                mSerializedSuggestTemplate);
     }
 
     /**
@@ -352,4 +355,13 @@
         mTabGroupUuid = tabGroupUuid;
         return this;
     }
+
+    /**
+     * @param serializedSuggestTemplate Serialized SuggestTemplateInfo proto.
+     * @return Omnibox suggestion builder.
+     */
+    public AutocompleteMatchBuilder setSerializedSuggestTemplate(byte[] serializedSuggestTemplate) {
+        mSerializedSuggestTemplate = serializedSuggestTemplate;
+        return this;
+    }
 }
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index c6cd01c..e76603e 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -255,13 +255,11 @@
   return result.str();
 }
 
-#if !BUILDFLAG(IS_ANDROID)
 // Returns whether this match is provided by an extension in unscoped mode.
 bool IsUnscopedExtensionMatch(const AutocompleteMatch& match) {
   return match.provider && match.provider->type() ==
                                AutocompleteProvider::TYPE_UNSCOPED_EXTENSION;
 }
-#endif  // !BUILDFLAG(IS_ANDROID)
 
 // Returns which rich autocompletion type, if any, had (or would have had for
 // counterfactual variations) an impact; i.e. whether the top scoring rich
@@ -1848,7 +1846,6 @@
     AutocompleteResult* result) {
   // No need to update the description on Android since description for plain
   // text match is not allowed.
-#if !BUILDFLAG(IS_ANDROID)
   // The Lens searchbox does not require the search engine name description
   // label since all suggestions will be from a single source.
   // TODO(crbug.com/338094774): Remove this Lens-specific change and implement a
@@ -1857,6 +1854,11 @@
     return;
   }
 
+#if BUILDFLAG(IS_ANDROID)
+  // Do not include search engine name for the DSE.
+  auto* default_engine = template_url_service_->GetDefaultSearchProvider();
+#endif
+
   std::u16string last_keyword;
   bool last_contextual = false;
   for (auto i(result->begin()); i != result->end(); ++i) {
@@ -1864,6 +1866,13 @@
       if (i->HasCustomDescription() || IsUnscopedExtensionMatch(*i)) {
         continue;
       }
+
+#if BUILDFLAG(IS_ANDROID)
+      if (i->keyword == default_engine->keyword()) {
+        continue;
+      }
+#endif
+
       i->description.clear();
       i->description_class.clear();
       DCHECK(!i->keyword.empty());
@@ -1899,7 +1908,6 @@
       last_keyword.clear();
     }
   }
-#endif  // !BUILDFLAG(IS_ANDROID)
 }
 
 void AutocompleteController::UpdateSearchboxStats(AutocompleteResult* result) {
diff --git a/components/omnibox/browser/autocomplete_match_android.cc b/components/omnibox/browser/autocomplete_match_android.cc
index 54f1da6..d56cd40 100644
--- a/components/omnibox/browser/autocomplete_match_android.cc
+++ b/components/omnibox/browser/autocomplete_match_android.cc
@@ -99,8 +99,16 @@
   int icon_type = omnibox::SuggestTemplateInfo::IconType::
       SuggestTemplateInfo_IconType_ICON_TYPE_UNSPECIFIED;
 
+  ScopedJavaLocalRef<jbyteArray> j_suggest_template;
+
   if (suggest_template.has_value()) {
     icon_type = suggest_template.value().type_icon();
+
+    std::string str_suggest_template;
+    if (suggest_template->SerializeToString(&str_suggest_template)) {
+      j_suggest_template =
+          base::android::ToJavaByteArray(env, str_suggest_template);
+    }
   }
 
   java_match_ = std::make_unique<ScopedJavaGlobalRef<jobject>>(
@@ -124,7 +132,8 @@
           ConvertUTF16ToJavaString(env, inline_autocompletion),
           ConvertUTF16ToJavaString(env, additional_text),
           tab_groups::UuidToJavaString(
-              env, matching_tab_group_uuid.value_or(base::Uuid()))));
+              env, matching_tab_group_uuid.value_or(base::Uuid())),
+          j_suggest_template));
 
   return ScopedJavaLocalRef<jobject>(*java_match_);
 }
diff --git a/components/omnibox/composebox/composebox_metrics_recorder.cc b/components/omnibox/composebox/composebox_metrics_recorder.cc
index 18c70b8..b7543fe 100644
--- a/components/omnibox/composebox/composebox_metrics_recorder.cc
+++ b/components/omnibox/composebox/composebox_metrics_recorder.cc
@@ -8,8 +8,8 @@
 
 namespace {
 const char kComposeboxSessionDuration[] = "Composebox.Session.Duration.Total";
-const char kComposeboxSessionCompletionDuration[] =
-    "Composebox.Session.Duration.Completed";
+const char kComposeboxSessionDurationQuerySubmitted[] =
+    "Composebox.Session.Duration.QuerySubmitted";
 const char kComposeboxSessionAbandonedDuration[] =
     "Composebox.Session.Duration.Abandoned";
 const char kComposeboxQuerySubmissionTime[] =
@@ -22,6 +22,11 @@
     "Composebox.Session.File.Browser.UploadFailureCount.";
 const char kComposeboxFileValidationErrorTypes[] =
     "Composebox.Session.File.Browser.ValidationFailureCount.";
+const char kComposeboxQueryTextLength[] = "Composebox.Query.TextLength";
+const char kComposeboxQueryFileCount[] = "Composebox.Query.FileCount";
+const char kComposeboxQueryModality[] = "Composebox.Query.Modality";
+const char kComposeboxQueryCount[] = "Composebox.Session.QueryCount";
+const char kComposeboxFileSizePerType[] = "Composebox.File.Size.";
 }  // namespace
 
 SessionMetrics::SessionMetrics() = default;
@@ -95,6 +100,31 @@
       break;
   }
 }
+void ComposeboxMetricsRecorder::RecordQueryMetrics(int text_length,
+                                                   int file_count) {
+  base::UmaHistogramCounts1M(metric_category_name_ + kComposeboxQueryTextLength,
+                             text_length);
+  bool has_text = text_length != 0;
+  bool has_files = file_count != 0;
+  // Submission requests will always have either 1) both text and files 2) text
+  // only or 3) files only.
+  NtpComposeboxMultimodalState multimodal_state =
+      has_text ? (has_files ? NtpComposeboxMultimodalState::kTextAndFile
+                            : NtpComposeboxMultimodalState::kTextOnly)
+               : NtpComposeboxMultimodalState::kFileOnly;
+  base::UmaHistogramEnumeration(
+      metric_category_name_ + kComposeboxQueryModality, multimodal_state);
+  base::UmaHistogramCounts100(metric_category_name_ + kComposeboxQueryFileCount,
+                              file_count);
+}
+
+void ComposeboxMetricsRecorder::RecordFileSizeMetric(lens::MimeType mime_type,
+                                                     uint64_t file_size_bytes) {
+  base::UmaHistogramCounts10M(metric_category_name_ +
+                                  kComposeboxFileSizePerType +
+                                  MimeTypeToString(mime_type),
+                              file_size_bytes);
+}
 
 void ComposeboxMetricsRecorder::NotifySessionStarted() {
   session_metrics_->session_elapsed_timer =
@@ -104,11 +134,19 @@
 void ComposeboxMetricsRecorder::NotifyQuerySubmitted() {
   base::TimeDelta time_to_query_submission =
       session_metrics_->session_elapsed_timer->Elapsed();
-  session_metrics_->time_to_query_submissions.push_back(
+  base::UmaHistogramMediumTimes(
+      metric_category_name_ + kComposeboxQuerySubmissionTime,
       time_to_query_submission);
+  session_metrics_->num_query_submissions++;
 }
 
 void ComposeboxMetricsRecorder::RecordSessionAbandonedMetrics() {
+  // In the case that the user has submitted a query in a new tab and abandons
+  // the composebox session record the session as completed.
+  if (session_metrics_->num_query_submissions > 0) {
+    RecordSessionCompletedMetrics();
+    return;
+  }
   base::TimeDelta session_duration =
       session_metrics_->session_elapsed_timer->Elapsed();
   base::UmaHistogramMediumTimes(
@@ -121,16 +159,12 @@
 void ComposeboxMetricsRecorder::RecordSessionCompletedMetrics() {
   base::TimeDelta session_duration =
       session_metrics_->session_elapsed_timer->Elapsed();
-  for (const auto time_to_query_submission :
-       session_metrics_->time_to_query_submissions) {
-    base::UmaHistogramMediumTimes(
-        metric_category_name_ + kComposeboxQuerySubmissionTime,
-        time_to_query_submission);
-    base::UmaHistogramMediumTimes(
-        metric_category_name_ + kComposeboxSessionCompletionDuration,
-        session_duration);
-    RecordTotalSessionDuration(session_duration);
-  }
+  base::UmaHistogramMediumTimes(
+      metric_category_name_ + kComposeboxSessionDurationQuerySubmitted,
+      session_duration);
+  base::UmaHistogramCounts100(metric_category_name_ + kComposeboxQueryCount,
+                              session_metrics_->num_query_submissions);
+  RecordTotalSessionDuration(session_duration);
   FinalizeSessionMetrics();
 }
 
@@ -187,11 +221,11 @@
 
 void ComposeboxMetricsRecorder::ResetSessionMetrics() {
   session_metrics_->session_elapsed_timer.reset();
-  session_metrics_->time_to_query_submissions.clear();
   session_metrics_->file_upload_attempt_count_per_type.clear();
   session_metrics_->file_upload_success_count_per_type.clear();
   session_metrics_->file_upload_failure_count_per_type.clear();
   session_metrics_->file_validation_failure_count_per_type.clear();
+  session_metrics_->num_query_submissions = 0;
 }
 
 std::string ComposeboxMetricsRecorder::FileErrorToString(
diff --git a/components/omnibox/composebox/composebox_metrics_recorder.h b/components/omnibox/composebox/composebox_metrics_recorder.h
index d9e1f57b..de69fd9 100644
--- a/components/omnibox/composebox/composebox_metrics_recorder.h
+++ b/components/omnibox/composebox/composebox_metrics_recorder.h
@@ -22,6 +22,16 @@
   kNavigationOccurred = 4,
 };
 
+// These values are persisted to logs. Entries should not be renumbered and
+// numeric values should never be reused.
+// Describes the query submission details.
+enum class NtpComposeboxMultimodalState {
+  kTextOnly = 0,
+  kFileOnly = 1,
+  kTextAndFile = 2,
+  kMaxValue = kTextAndFile,
+};
+
 using FileUploadStatus = composebox_query::mojom::FileUploadStatus;
 
 struct SessionMetrics {
@@ -29,11 +39,6 @@
   ~SessionMetrics();
   // Timer to keep track of the session durations.
   std::unique_ptr<base::ElapsedTimer> session_elapsed_timer;
-  // `time_to_query_submissions` will only hold one value, except in the case
-  // where a user navigates to the AIM page on a new window or tab and the
-  // composebox remains open. In that edge case the user can continue to submit
-  // queries, leading to multiple completion sessions recorded.
-  std::vector<base::TimeDelta> time_to_query_submissions;
   // Number of file upload attempts per file type.
   std::map<lens::MimeType, int> file_upload_attempt_count_per_type;
   // Number of successful file uploads per file type.
@@ -43,6 +48,10 @@
   // Number of file validation errors per file type.
   std::map<lens::MimeType, std::map<FileUploadErrorType, int>>
       file_validation_failure_count_per_type;
+  // In most cases `num_query_submissions` will equal 1 except in the case
+  // where a user navigates to the AIM page on a new window or tab and the
+  // composebox remains open.
+  int num_query_submissions = 0;
 };
 
 class ComposeboxMetricsRecorder {
@@ -64,6 +73,12 @@
   // Maps mime types to its string version for histogram naming.
   std::string MimeTypeToString(lens::MimeType mime_type);
 
+  // Records several metrics about the query, such the number of characters
+  // found in the query.
+  void RecordQueryMetrics(int text_length, int file_count);
+
+  void RecordFileSizeMetric(lens::MimeType mime_type, uint64_t file_size_bytes);
+
  private:
   // Called when the session starts to correctly track session
   // durations.
diff --git a/components/omnibox/composebox/composebox_metrics_recorder_unittest.cc b/components/omnibox/composebox/composebox_metrics_recorder_unittest.cc
index cb69e38..11c4c44 100644
--- a/components/omnibox/composebox/composebox_metrics_recorder_unittest.cc
+++ b/components/omnibox/composebox/composebox_metrics_recorder_unittest.cc
@@ -15,8 +15,8 @@
     "Test.Composebox.Session.Duration.Total";
 const char kComposeboxSessionAbandonedDuration[] =
     "Test.Composebox.Session.Duration.Abandoned";
-const char kComposeboxSessionDurationCompleted[] =
-    "Test.Composebox.Session.Duration.Completed";
+const char kComposeboxSessionDurationQuerySubmitted[] =
+    "Test.Composebox.Session.Duration.QuerySubmitted";
 const char kComposeboxQuerySubmissionTime[] =
     "Test.Composebox.Query.Time.ToSubmission";
 const char kComposeboxFileUploadAttemptPdf[] =
@@ -36,6 +36,11 @@
     "Test.Composebox.Session.File.Browser.UploadFailureCount.";
 const char kComposeboxFileValidationErrorTypes[] =
     "Test.Composebox.Session.File.Browser.ValidationFailureCount.";
+const char kComposeboxQueryTextLength[] = "Test.Composebox.Query.TextLength";
+const char kComposeboxQueryFileCount[] = "Test.Composebox.Query.FileCount";
+const char kComposeboxQueryModality[] = "Test.Composebox.Query.Modality";
+const char kComposeboxQueryCount[] = "Test.Composebox.Session.QueryCount";
+const char kComposeboxFileSizePdf[] = "Test.Composebox.File.Size.Pdf";
 }  // namespace
 
 class ComposeboxMetricsRecorderTest : public testing::Test {
@@ -84,12 +89,13 @@
   metrics().NotifySessionStateChanged(SessionState::kNavigationOccurred);
 
   DestructMetricsRecorder();
-  histogram_tester().ExpectTotalCount(kComposeboxSessionDurationCompleted, 1);
+  histogram_tester().ExpectTotalCount(kComposeboxSessionDurationQuerySubmitted,
+                                      1);
   histogram_tester().ExpectTotalCount(kComposeboxSessionDurationTotal, 1);
   histogram_tester().ExpectTotalCount(kComposeboxQuerySubmissionTime, 1);
   // Check session duration times.
-  histogram_tester().ExpectUniqueTimeSample(kComposeboxSessionDurationCompleted,
-                                            base::Seconds(10), 1);
+  histogram_tester().ExpectUniqueTimeSample(
+      kComposeboxSessionDurationQuerySubmitted, base::Seconds(10), 1);
   histogram_tester().ExpectUniqueTimeSample(kComposeboxSessionDurationTotal,
                                             base::Seconds(10), 1);
   // Check query submission time.
@@ -102,6 +108,7 @@
   metrics().NotifySessionStateChanged(SessionState::kSessionStarted);
   task_environment().FastForwardBy(base::Seconds(30));
   metrics().NotifySessionStateChanged(SessionState::kQuerySubmitted);
+  metrics().RecordQueryMetrics(/*text_length=*/100, /*file_count=*/1);
   metrics().NotifySessionStateChanged(SessionState::kNavigationOccurred);
 
   // Mimic the session remaining open when the AIM page is opened in another
@@ -110,20 +117,68 @@
   metrics().NotifySessionStateChanged(SessionState::kQuerySubmitted);
   metrics().NotifySessionStateChanged(SessionState::kNavigationOccurred);
 
-  DestructMetricsRecorder();
-  histogram_tester().ExpectTotalCount(kComposeboxSessionDurationCompleted, 2);
-  histogram_tester().ExpectTotalCount(kComposeboxSessionDurationTotal, 2);
+  metrics().NotifySessionStateChanged(SessionState::kSessionAbandoned);
+  histogram_tester().ExpectTotalCount(kComposeboxSessionDurationQuerySubmitted,
+                                      1);
+  histogram_tester().ExpectTotalCount(kComposeboxSessionDurationTotal, 1);
   histogram_tester().ExpectTotalCount(kComposeboxQuerySubmissionTime, 2);
   // Check session duration times.
-  histogram_tester().ExpectUniqueTimeSample(kComposeboxSessionDurationCompleted,
-                                            base::Seconds(90), 2);
+  histogram_tester().ExpectUniqueTimeSample(
+      kComposeboxSessionDurationQuerySubmitted, base::Seconds(90), 1);
   histogram_tester().ExpectUniqueTimeSample(kComposeboxSessionDurationTotal,
-                                            base::Seconds(90), 2);
+                                            base::Seconds(90), 1);
   // Check query submission times.
   histogram_tester().ExpectTimeBucketCount(kComposeboxQuerySubmissionTime,
                                            base::Seconds(30), 1);
   histogram_tester().ExpectTimeBucketCount(kComposeboxQuerySubmissionTime,
                                            base::Seconds(90), 1);
+  histogram_tester().ExpectBucketCount(kComposeboxQueryFileCount, 1, 1);
+  histogram_tester().ExpectBucketCount(kComposeboxQueryCount, 2, 1);
+}
+
+TEST_F(ComposeboxMetricsRecorderTest, TextOnlyQuerySubmissionSession) {
+  // Setup user flow.
+  metrics().NotifySessionStateChanged(SessionState::kSessionStarted);
+  int text_length = 1000;
+  int file_count = 0;
+  metrics().RecordQueryMetrics(text_length, file_count);
+
+  histogram_tester().ExpectBucketCount(kComposeboxQueryTextLength, text_length,
+                                       1);
+  histogram_tester().ExpectBucketCount(
+      kComposeboxQueryModality, NtpComposeboxMultimodalState::kTextOnly, 1);
+  histogram_tester().ExpectBucketCount(kComposeboxQueryFileCount, file_count,
+                                       1);
+}
+
+TEST_F(ComposeboxMetricsRecorderTest, FileOnlyQuerySubmissionSession) {
+  // Setup user flow.
+  metrics().NotifySessionStateChanged(SessionState::kSessionStarted);
+  int text_length = 0;
+  int file_count = 2;
+  metrics().RecordQueryMetrics(text_length, file_count);
+
+  histogram_tester().ExpectBucketCount(kComposeboxQueryTextLength, text_length,
+                                       1);
+  histogram_tester().ExpectBucketCount(
+      kComposeboxQueryModality, NtpComposeboxMultimodalState::kFileOnly, 1);
+  histogram_tester().ExpectBucketCount(kComposeboxQueryFileCount, file_count,
+                                       1);
+}
+
+TEST_F(ComposeboxMetricsRecorderTest, MultimodalQuerySubmissionSession) {
+  // Setup user flow.
+  metrics().NotifySessionStateChanged(SessionState::kSessionStarted);
+  int text_length = 1000;
+  int file_count = 1;
+  metrics().RecordQueryMetrics(text_length, file_count);
+
+  histogram_tester().ExpectBucketCount(kComposeboxQueryTextLength, text_length,
+                                       1);
+  histogram_tester().ExpectBucketCount(
+      kComposeboxQueryModality, NtpComposeboxMultimodalState::kTextAndFile, 1);
+  histogram_tester().ExpectBucketCount(kComposeboxQueryFileCount, file_count,
+                                       1);
 }
 
 TEST_F(ComposeboxMetricsRecorderTest, FileUploadSuccess) {
@@ -171,6 +226,8 @@
   task_environment().FastForwardBy(base::Seconds(30));
   // Simulate file validation error.
   lens::MimeType file_mime_type = lens::MimeType::kPdf;
+  uint64_t file_size = 1000000;
+  metrics().RecordFileSizeMetric(file_mime_type, file_size);
   FileUploadStatus upload_status = FileUploadStatus::kProcessing;
   metrics().OnFileUploadStatusChanged(file_mime_type, upload_status,
                                       std::nullopt);
@@ -189,6 +246,7 @@
   histogram_tester().ExpectBucketCount(kComposeboxFileUploadAttemptPdf, 2, 1);
   histogram_tester().ExpectBucketCount(
       kComposeboxFileValidationBrowserErrorForPdf, 2, 1);
+  histogram_tester().ExpectBucketCount(kComposeboxFileSizePdf, file_size, 1);
 }
 
 TEST_F(ComposeboxMetricsRecorderTest, MultiFileUpload) {
diff --git a/components/omnibox/composebox/composebox_query_controller.cc b/components/omnibox/composebox/composebox_query_controller.cc
index 92d33a94..200205d 100644
--- a/components/omnibox/composebox/composebox_query_controller.cc
+++ b/components/omnibox/composebox/composebox_query_controller.cc
@@ -201,11 +201,15 @@
 
 GURL ComposeboxQueryController::CreateAimUrl(const std::string& query_text,
                                              base::Time query_start_time) {
+  num_files_in_request_ = 0;
   if (!active_files_.empty() && cluster_info_.has_value()) {
     // Since multiple file upload isn't supported right now, use the last file
     // uploaded to determine `vit` param.
     // TODO(crbug.com/428967670): Support multiple file upload.
     const std::unique_ptr<FileInfo>& last_file = active_files_.rbegin()->second;
+    // TODO(crbug.com/428967670): Update `num_files_in_request_` when more than
+    // 1 file is supported.
+    num_files_in_request_ = 1;
     if (IsValidFileUploadStatusForMultimodalRequest(
             last_file->upload_status_)) {
       std::unique_ptr<lens::LensOverlayRequestId> request_id =
@@ -372,6 +376,7 @@
   cluster_info_endpoint_fetcher_.reset();
   cluster_info_.reset();
   request_id_generator_.ResetRequestId();
+  num_files_in_request_ = 0;
 }
 
 void ComposeboxQueryController::ResetRequestClusterInfoState(int session_id) {
diff --git a/components/omnibox/composebox/composebox_query_controller.h b/components/omnibox/composebox/composebox_query_controller.h
index 604799d..36e6168 100644
--- a/components/omnibox/composebox/composebox_query_controller.h
+++ b/components/omnibox/composebox/composebox_query_controller.h
@@ -209,6 +209,8 @@
   // Clear entire file cache.
   virtual void ClearFiles();
 
+  int num_files_in_request() { return num_files_in_request_; }
+
  protected:
   // Returns the EndpointFetcher to use with the given params. Protected to
   // allow overriding in tests to mock server responses.
@@ -370,6 +372,9 @@
   // expiration.
   int session_id_ = 0;
 
+  // The number of files that are sent in the AIM request.
+  int num_files_in_request_ = 0;
+
   base::WeakPtrFactory<ComposeboxQueryController> weak_ptr_factory_{this};
 };
 
diff --git a/components/optimization_guide/internal b/components/optimization_guide/internal
index 0a8ac7a6..c66de765 160000
--- a/components/optimization_guide/internal
+++ b/components/optimization_guide/internal
@@ -1 +1 @@
-Subproject commit 0a8ac7a60d6948d9a88faf17024a73657cb8a8b0
+Subproject commit c66de765dcd2a1b6a180828665edf21f1403a832
diff --git a/components/page_load_metrics/renderer/metrics_render_frame_observer.h b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
index d77dcb9..0f969ac 100644
--- a/components/page_load_metrics/renderer/metrics_render_frame_observer.h
+++ b/components/page_load_metrics/renderer/metrics_render_frame_observer.h
@@ -26,38 +26,7 @@
 class OneShotTimer;
 }  // namespace base
 
-namespace blink {
-struct JavaScriptFrameworkDetectionResult;
-struct SoftNavigationMetrics;
-}  // namespace blink
-
 namespace page_load_metrics {
-
-namespace internal {
-const char kPageLoadInternalSoftNavigationFromStartInvalidTiming[] =
-    "PageLoad.Internal.SoftNavigationFromStartInvalidTiming";
-
-// These values are recorded into a UMA histogram as scenarios where the start
-// time of soft navigation ends up being 0. These entries
-// should not be renumbered and the numeric values should not be reused. These
-// entries should be kept in sync with the definition in
-// tools/metrics/histograms/enums.xml
-// TODO(crbug.com/40074158): Remove the code here and related code once the bug
-// is resolved.
-enum class SoftNavigationFromStartInvalidTimingReasons {
-  kSoftNavStartTimeIsZeroAndLtNavStart = 0,
-  kSoftNavStartTimeIsZeroAndEqNavStart = 1,
-  kSoftNavStartTimeIsNonZeroAndEqNavStart = 2,
-  kSoftNavStartTimeIsNonZeroAndLtNavStart = 3,
-  kMaxValue = kSoftNavStartTimeIsNonZeroAndLtNavStart,
-};
-
-void RecordUmaForkPageLoadInternalSoftNavigationFromStartInvalidTiming(
-    base::TimeDelta start_time_relative_to_reference,
-    double nav_start_to_reference);
-
-}  // namespace internal
-
 class PageTimingMetricsSender;
 class PageTimingSender;
 
diff --git a/components/segmentation_platform/embedder/home_modules/tips_manager/BUILD.gn b/components/segmentation_platform/embedder/home_modules/tips_manager/BUILD.gn
index 5cae168..b40315a 100644
--- a/components/segmentation_platform/embedder/home_modules/tips_manager/BUILD.gn
+++ b/components/segmentation_platform/embedder/home_modules/tips_manager/BUILD.gn
@@ -44,4 +44,8 @@
     "//components/sync_preferences:test_support",
     "//testing/gtest",
   ]
+
+  # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and
+  # enable the diagnostic by removing this line.
+  configs += [ "//build/config/compiler:no_exit_time_destructors" ]
 }
diff --git a/components/segmentation_platform/internal/BUILD.gn b/components/segmentation_platform/internal/BUILD.gn
index 43c3ead3..9f9d053 100644
--- a/components/segmentation_platform/internal/BUILD.gn
+++ b/components/segmentation_platform/internal/BUILD.gn
@@ -373,6 +373,10 @@
       ":unit_tests_bundle_data",
     ]
   }
+
+  # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and
+  # enable the diagnostic by removing this line.
+  configs += [ "//build/config/compiler:no_exit_time_destructors" ]
 }
 
 source_set("test_support") {
diff --git a/content/browser/child_process_host_impl.cc b/content/browser/child_process_host_impl.cc
index 39de45a..1d2ae87b 100644
--- a/content/browser/child_process_host_impl.cc
+++ b/content/browser/child_process_host_impl.cc
@@ -34,7 +34,6 @@
 #include "ipc/ipc.mojom.h"
 #include "ipc/ipc_channel.h"
 #include "ipc/ipc_channel_mojo.h"
-#include "ipc/message_filter.h"
 #include "services/resource_coordinator/public/mojom/memory_instrumentation/constants.mojom.h"
 #include "services/service_manager/public/cpp/interface_provider.h"
 
diff --git a/content/browser/media/media_web_contents_observer_unittest.cc b/content/browser/media/media_web_contents_observer_unittest.cc
index cc4718f..a6a8ac2d 100644
--- a/content/browser/media/media_web_contents_observer_unittest.cc
+++ b/content/browser/media/media_web_contents_observer_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "content/browser/media/media_web_contents_observer.h"
 
+#include <memory>
+
 #include "content/test/test_render_view_host.h"
 #include "content/test/test_web_contents.h"
 #include "media/base/media_content_type.h"
@@ -46,74 +48,265 @@
   mojo::AssociatedReceiver<media::mojom::MediaPlayer> receiver_{this};
 };
 
-using MediaWebContentsObserverTest = RenderViewHostImplTestHarness;
+class MediaWebContentsObserverTest : public RenderViewHostImplTestHarness {
+ public:
+  struct PlayerSetup {
+    std::unique_ptr<TestMediaPlayer> player;
+    mojo::AssociatedRemote<media::mojom::MediaPlayerObserver> observer;
+    int32_t player_id;
+  };
+
+ protected:
+  mojo::AssociatedRemote<media::mojom::MediaPlayerHost> SetupPlayerHost() {
+    mojo::AssociatedRemote<media::mojom::MediaPlayerHost> player_host;
+    contents()->media_web_contents_observer()->BindMediaPlayerHost(
+        contents()->GetPrimaryMainFrame()->GetGlobalId(),
+        player_host.BindNewEndpointAndPassDedicatedReceiver());
+    return player_host;
+  }
+
+  auto CreateAndAddPlayer(
+      mojo::AssociatedRemote<media::mojom::MediaPlayerHost>& player_host,
+      int32_t player_id) -> PlayerSetup {
+    PlayerSetup setup{.player = std::make_unique<TestMediaPlayer>(),
+                      .player_id = player_id};
+    player_host->OnMediaPlayerAdded(
+        setup.player->receiver().BindNewEndpointAndPassRemote(),
+        setup.observer.BindNewEndpointAndPassReceiver(), player_id);
+    player_host.FlushForTesting();
+    return setup;
+  }
+
+  void SetMediaMetadata(
+      mojo::AssociatedRemote<media::mojom::MediaPlayerObserver>& observer,
+      bool has_audio,
+      bool has_video) {
+    observer->OnMediaMetadataChanged(has_audio, has_video, kContentType);
+    observer.FlushForTesting();
+  }
+
+  void PlayMedia(
+      mojo::AssociatedRemote<media::mojom::MediaPlayerObserver>& observer) {
+    observer->OnMediaPlaying();
+    observer.FlushForTesting();
+  }
+
+  void PauseMedia(
+      mojo::AssociatedRemote<media::mojom::MediaPlayerObserver>& observer,
+      bool stream_ended = false) {
+    observer->OnMediaPaused(stream_ended);
+    observer.FlushForTesting();
+  }
+
+  void SetFullscreenStatus(
+      mojo::AssociatedRemote<media::mojom::MediaPlayerObserver>& observer,
+      blink::WebFullscreenVideoStatus status) {
+    observer->OnMediaEffectivelyFullscreenChanged(status);
+    observer.FlushForTesting();
+  }
+
+  MediaPlayerId CreatePlayerId(int32_t player_id) {
+    return MediaPlayerId(contents()->GetPrimaryMainFrame()->GetGlobalId(),
+                         player_id);
+  }
+
+  MediaWebContentsObserver& media_web_contents_observer() {
+    return *contents()->media_web_contents_observer();
+  }
+};
 
 TEST_F(MediaWebContentsObserverTest, GetCurrentlyPlayingVideoCount) {
-  MediaWebContentsObserver& media_web_contents_observer =
-      *contents()->media_web_contents_observer();
+  auto player_host = SetupPlayerHost();
+  constexpr int32_t kAudioVideoPlayerId = 0;
+  constexpr int32_t kVideoPlayerId = 1;
+  auto audio_video_player =
+      CreateAndAddPlayer(player_host, kAudioVideoPlayerId);
+  auto video_player = CreateAndAddPlayer(player_host, kVideoPlayerId);
 
-  mojo::AssociatedRemote<media::mojom::MediaPlayerHost> player_host;
-  media_web_contents_observer.BindMediaPlayerHost(
-      contents()->GetPrimaryMainFrame()->GetGlobalId(),
-      player_host.BindNewEndpointAndPassDedicatedReceiver());
+  EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 0);
 
-  TestMediaPlayer audio_video_player;
-  mojo::AssociatedRemote<media::mojom::MediaPlayerObserver>
-      audio_video_player_observer;
-  player_host->OnMediaPlayerAdded(
-      audio_video_player.receiver().BindNewEndpointAndPassRemote(),
-      audio_video_player_observer.BindNewEndpointAndPassReceiver(),
-      /*player_id=*/0);
-
-  TestMediaPlayer video_player;
-  mojo::AssociatedRemote<media::mojom::MediaPlayerObserver>
-      video_player_observer;
-  player_host->OnMediaPlayerAdded(
-      video_player.receiver().BindNewEndpointAndPassRemote(),
-      video_player_observer.BindNewEndpointAndPassReceiver(),
-      /*player_id=*/1);
-
-  player_host.FlushForTesting();
-
-  EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 0);
-
-  audio_video_player_observer->OnMediaMetadataChanged(
-      /*has_audio=*/true, /*has_video=*/false, kContentType);
-  audio_video_player_observer.FlushForTesting();
-  EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 0)
+  SetMediaMetadata(audio_video_player.observer, /*has_audio=*/true,
+                   /*has_video=*/false);
+  EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 0)
       << "Nothing is playing";
 
-  audio_video_player_observer->OnMediaPlaying();
-  audio_video_player_observer.FlushForTesting();
-  EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 0)
+  PlayMedia(audio_video_player.observer);
+  EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 0)
       << "An audio-only player is playing";
 
-  video_player_observer->OnMediaMetadataChanged(
-      /*has_audio=*/false, /*has_video=*/true, kContentType);
-  video_player_observer.FlushForTesting();
-  EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 0)
+  SetMediaMetadata(video_player.observer, /*has_audio=*/false,
+                   /*has_video=*/true);
+  EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 0)
       << "An audio-only player is playing";
 
-  video_player_observer->OnMediaPlaying();
-  video_player_observer.FlushForTesting();
-  EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 1);
+  PlayMedia(video_player.observer);
+  EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 1);
 
-  audio_video_player_observer->OnMediaMetadataChanged(
-      /*has_audio=*/true, /*has_video=*/true, kContentType);
-  audio_video_player_observer.FlushForTesting();
-  EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 2)
+  SetMediaMetadata(audio_video_player.observer, /*has_audio=*/true,
+                   /*has_video=*/true);
+  EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 2)
       << "A video track was added to an initially audio-only player";
 
-  video_player_observer->OnMediaPaused(/*stream_ended=*/false);
-  video_player_observer.FlushForTesting();
-  EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 1);
+  PauseMedia(video_player.observer);
+  EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 1);
 
-  audio_video_player_observer->OnMediaMetadataChanged(
-      /*has_audio=*/true, /*has_video=*/false, kContentType);
-  audio_video_player_observer.FlushForTesting();
-  EXPECT_EQ(media_web_contents_observer.GetCurrentlyPlayingVideoCount(), 0)
+  SetMediaMetadata(audio_video_player.observer, /*has_audio=*/true,
+                   /*has_video=*/false);
+  EXPECT_EQ(media_web_contents_observer().GetCurrentlyPlayingVideoCount(), 0)
       << "The video track was removed again";
 }
 
+TEST_F(MediaWebContentsObserverTest,
+       HasActiveEffectivelyFullscreenVideoEarlyReturns) {
+  // Test early return when no fullscreen player exists.
+  EXPECT_FALSE(
+      media_web_contents_observer().HasActiveEffectivelyFullscreenVideo());
+
+  auto player_host = SetupPlayerHost();
+  constexpr int32_t kVideoPlayerId = 0;
+  auto video_player = CreateAndAddPlayer(player_host, kVideoPlayerId);
+
+  SetFullscreenStatus(
+      video_player.observer,
+      blink::WebFullscreenVideoStatus::kFullscreenAndPictureInPictureEnabled);
+
+  // Should return false when player is fullscreen but web contents is not.
+  EXPECT_FALSE(
+      media_web_contents_observer().HasActiveEffectivelyFullscreenVideo());
+}
+
+TEST_F(MediaWebContentsObserverTest, FullscreenVideoPlayerIdAndPipPermission) {
+  // Initially no fullscreen player.
+  EXPECT_FALSE(media_web_contents_observer()
+                   .GetFullscreenVideoMediaPlayerId()
+                   .has_value());
+
+  auto player_host = SetupPlayerHost();
+  constexpr int32_t kVideoPlayerId = 42;
+  auto video_player = CreateAndAddPlayer(player_host, kVideoPlayerId);
+
+  // Enter fullscreen with PiP enabled.
+  SetFullscreenStatus(
+      video_player.observer,
+      blink::WebFullscreenVideoStatus::kFullscreenAndPictureInPictureEnabled);
+
+  EXPECT_TRUE(media_web_contents_observer()
+                  .GetFullscreenVideoMediaPlayerId()
+                  .has_value());
+  EXPECT_EQ(media_web_contents_observer()
+                .GetFullscreenVideoMediaPlayerId()
+                ->player_id,
+            kVideoPlayerId);
+  EXPECT_TRUE(media_web_contents_observer()
+                  .IsPictureInPictureAllowedForFullscreenVideo());
+
+  // Change to PiP disabled.
+  SetFullscreenStatus(
+      video_player.observer,
+      blink::WebFullscreenVideoStatus::kFullscreenAndPictureInPictureDisabled);
+
+  EXPECT_TRUE(media_web_contents_observer()
+                  .GetFullscreenVideoMediaPlayerId()
+                  .has_value());
+  EXPECT_FALSE(media_web_contents_observer()
+                   .IsPictureInPictureAllowedForFullscreenVideo());
+
+  // Exit fullscreen.
+  SetFullscreenStatus(
+      video_player.observer,
+      blink::WebFullscreenVideoStatus::kNotEffectivelyFullscreen);
+
+  EXPECT_FALSE(media_web_contents_observer()
+                   .GetFullscreenVideoMediaPlayerId()
+                   .has_value());
+}
+
+TEST_F(MediaWebContentsObserverTest, RequestPersistentVideoStateInvariant) {
+  // Early return when no fullscreen player exists.
+  EXPECT_FALSE(media_web_contents_observer()
+                   .GetFullscreenVideoMediaPlayerId()
+                   .has_value());
+  media_web_contents_observer().RequestPersistentVideo(true);
+  EXPECT_FALSE(media_web_contents_observer()
+                   .GetFullscreenVideoMediaPlayerId()
+                   .has_value());
+
+  auto player_host = SetupPlayerHost();
+  constexpr int32_t kVideoPlayerId = 0;
+  auto video_player = CreateAndAddPlayer(player_host, kVideoPlayerId);
+
+  SetFullscreenStatus(
+      video_player.observer,
+      blink::WebFullscreenVideoStatus::kFullscreenAndPictureInPictureEnabled);
+
+  EXPECT_TRUE(media_web_contents_observer()
+                  .GetFullscreenVideoMediaPlayerId()
+                  .has_value());
+  EXPECT_EQ(media_web_contents_observer()
+                .GetFullscreenVideoMediaPlayerId()
+                ->player_id,
+            kVideoPlayerId);
+
+  // Send persistent state change.
+  media_web_contents_observer().RequestPersistentVideo(false);
+
+  EXPECT_TRUE(media_web_contents_observer()
+                  .GetFullscreenVideoMediaPlayerId()
+                  .has_value());
+  EXPECT_EQ(media_web_contents_observer()
+                .GetFullscreenVideoMediaPlayerId()
+                ->player_id,
+            kVideoPlayerId);
+
+  SetFullscreenStatus(
+      video_player.observer,
+      blink::WebFullscreenVideoStatus::kNotEffectivelyFullscreen);
+
+  EXPECT_FALSE(media_web_contents_observer()
+                   .GetFullscreenVideoMediaPlayerId()
+                   .has_value());
+
+  // Early return again when no fullscreen player exists.
+  media_web_contents_observer().RequestPersistentVideo(true);
+  EXPECT_FALSE(media_web_contents_observer()
+                   .GetFullscreenVideoMediaPlayerId()
+                   .has_value());
+}
+
+TEST_F(MediaWebContentsObserverTest, PlayerStartStopNotifications) {
+  auto player_host = SetupPlayerHost();
+  constexpr int32_t kTestPlayerId = 123;
+  auto test_player = CreateAndAddPlayer(player_host, kTestPlayerId);
+  auto player_id = CreatePlayerId(test_player.player_id);
+
+  // Audio player setup to trigger audio stream monitor registration.
+  SetMediaMetadata(test_player.observer, /*has_audio=*/true,
+                   /*has_video=*/false);
+
+  PlayMedia(test_player.observer);
+
+  EXPECT_TRUE(media_web_contents_observer().IsPlayerActive(player_id));
+
+  PauseMedia(test_player.observer);
+  EXPECT_FALSE(media_web_contents_observer().IsPlayerActive(player_id));
+}
+
+TEST_F(MediaWebContentsObserverTest, PlayerPausedWithStreamEnded) {
+  auto player_host = SetupPlayerHost();
+  constexpr int32_t kTestPlayerId = 456;
+  auto test_player = CreateAndAddPlayer(player_host, kTestPlayerId);
+  auto player_id = CreatePlayerId(test_player.player_id);
+
+  SetMediaMetadata(test_player.observer, /*has_audio=*/true,
+                   /*has_video=*/false);
+
+  PlayMedia(test_player.observer);
+  EXPECT_TRUE(media_web_contents_observer().IsPlayerActive(player_id));
+
+  // Test pause with stream ended.
+  PauseMedia(test_player.observer, /*stream_ended=*/true);
+  EXPECT_FALSE(media_web_contents_observer().IsPlayerActive(player_id));
+}
+
 }  // namespace
 }  // namespace content
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
index 178a492..9a1c0a26 100644
--- a/content/browser/renderer_host/navigation_request.cc
+++ b/content/browser/renderer_host/navigation_request.cc
@@ -187,6 +187,7 @@
 #include "services/network/public/mojom/web_client_hints_types.mojom-shared.h"
 #include "services/network/public/mojom/web_client_hints_types.mojom.h"
 #include "services/network/public/mojom/web_sandbox_flags.mojom.h"
+#include "storage/browser/blob/blob_url_registry.h"
 #include "third_party/abseil-cpp/absl/cleanup/cleanup.h"
 #include "third_party/blink/public/common/blob/blob_utils.h"
 #include "third_party/blink/public/common/chrome_debug_urls.h"
diff --git a/content/browser/security_exploit_browsertest.cc b/content/browser/security_exploit_browsertest.cc
index f02b036..6a2e6a0 100644
--- a/content/browser/security_exploit_browsertest.cc
+++ b/content/browser/security_exploit_browsertest.cc
@@ -96,6 +96,7 @@
 #include "services/network/public/mojom/url_loader.mojom.h"
 #include "services/network/test/test_url_loader_client.h"
 #include "storage/browser/blob/blob_registry_impl.h"
+#include "storage/browser/blob/blob_url_registry.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/blob/blob_utils.h"
diff --git a/content/browser/service_worker/service_worker_internals_ui_browsertest.cc b/content/browser/service_worker/service_worker_internals_ui_browsertest.cc
index 0f45713..b8f0116 100644
--- a/content/browser/service_worker/service_worker_internals_ui_browsertest.cc
+++ b/content/browser/service_worker/service_worker_internals_ui_browsertest.cc
@@ -548,8 +548,8 @@
   TearDownWindow(sw_internal_ui_window);
 }
 
-// The test is flaky on Mac and Linux. crbug.com/1324856
-#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
+// The test is flaky on Mac, Linux, Android. http://crbug.com/1324856
+#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_ANDROID)
 #define MAYBE_StopStartSWReflectedOnInternalUI \
   DISABLED_StopStartSWReflectedOnInternalUI
 #else
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.cc b/content/browser/shared_storage/shared_storage_worklet_host.cc
index be34127..1000228 100644
--- a/content/browser/shared_storage/shared_storage_worklet_host.cc
+++ b/content/browser/shared_storage/shared_storage_worklet_host.cc
@@ -51,6 +51,7 @@
 #include "services/network/public/cpp/simple_url_loader.h"
 #include "services/network/public/mojom/shared_storage.mojom.h"
 #include "storage/browser/blob/blob_url_loader_factory.h"
+#include "storage/browser/blob/blob_url_registry.h"
 #include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/mime_util/mime_util.h"
 #include "third_party/blink/public/common/shared_storage/shared_storage_utils.h"
diff --git a/content/browser/smart_card/mock_smart_card_context_factory.cc b/content/browser/smart_card/mock_smart_card_context_factory.cc
index 54ebe12c..4ec3f8e 100644
--- a/content/browser/smart_card/mock_smart_card_context_factory.cc
+++ b/content/browser/smart_card/mock_smart_card_context_factory.cc
@@ -17,16 +17,6 @@
   context_receivers_.set_disconnect_handler(
       base::BindRepeating(&MockSmartCardContextFactory::ContextDisconnected,
                           base::Unretained(this)));
-
-  ON_CALL(*this, CreateContext)
-      .WillByDefault([this](CreateContextCallback callback) {
-        mojo::PendingRemote<device::mojom::SmartCardContext> context_remote;
-        context_receivers_.Add(this,
-                               context_remote.InitWithNewPipeAndPassReceiver());
-
-        std::move(callback).Run(SmartCardCreateContextResult::NewContext(
-            std::move(context_remote)));
-      });
 }
 
 MockSmartCardContextFactory::~MockSmartCardContextFactory() = default;
@@ -38,6 +28,15 @@
   return pending_remote;
 }
 
+void MockSmartCardContextFactory::CreateContext(
+    CreateContextCallback callback) {
+  mojo::PendingRemote<device::mojom::SmartCardContext> context_remote;
+  context_receivers_.Add(this, context_remote.InitWithNewPipeAndPassReceiver());
+
+  std::move(callback).Run(
+      SmartCardCreateContextResult::NewContext(std::move(context_remote)));
+}
+
 void MockSmartCardContextFactory::ExpectConnectFakeReaderSharedT1(
     mojo::Receiver<device::mojom::SmartCardConnection>& connection_receiver) {
   EXPECT_CALL(*this,
@@ -79,13 +78,6 @@
           device::mojom::SmartCardListReadersResult::NewError(error)));
 }
 
-void MockSmartCardContextFactory::ExpectCreateContextError(
-    device::mojom::SmartCardError error) {
-  EXPECT_CALL(*this, CreateContext(_))
-      .WillOnce(RunOnceCallback<0>(
-          device::mojom::SmartCardCreateContextResult::NewError(error)));
-}
-
 void MockSmartCardContextFactory::ClearContextReceivers() {
   context_receivers_.Clear();
 }
diff --git a/content/browser/smart_card/mock_smart_card_context_factory.h b/content/browser/smart_card/mock_smart_card_context_factory.h
index 06c0ebf..2ec98d5 100644
--- a/content/browser/smart_card/mock_smart_card_context_factory.h
+++ b/content/browser/smart_card/mock_smart_card_context_factory.h
@@ -22,7 +22,7 @@
   mojo::PendingRemote<device::mojom::SmartCardContextFactory> GetRemote();
 
   // `device::mojom::SmartCardContextFactory` overrides:
-  MOCK_METHOD(void, CreateContext, (CreateContextCallback), (override));
+  void CreateContext(CreateContextCallback) override;
 
   // `device::mojom::SmartCardContext` overrides:
   MOCK_METHOD(void, ListReaders, (ListReadersCallback callback), (override));
@@ -56,8 +56,6 @@
   void ExpectListReaders(std::vector<std::string> readers);
   void ExpectListReadersError(device::mojom::SmartCardError error);
 
-  void ExpectCreateContextError(device::mojom::SmartCardError error);
-
   void ClearContextReceivers();
 
  private:
diff --git a/content/browser/storage_access/storage_access_handle.cc b/content/browser/storage_access/storage_access_handle.cc
index 149a4a0..c3375f9 100644
--- a/content/browser/storage_access/storage_access_handle.cc
+++ b/content/browser/storage_access/storage_access_handle.cc
@@ -16,6 +16,7 @@
 #include "content/public/browser/permission_descriptor_util.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_client.h"
+#include "storage/browser/blob/blob_url_registry.h"
 #include "storage/browser/quota/quota_manager_proxy.h"
 #include "third_party/blink/public/common/permissions/permission_utils.h"
 
diff --git a/content/browser/storage_partition_impl.cc b/content/browser/storage_partition_impl.cc
index e8e0b0be..d00eb60 100644
--- a/content/browser/storage_partition_impl.cc
+++ b/content/browser/storage_partition_impl.cc
@@ -154,6 +154,7 @@
 #include "services/network/public/mojom/shared_dictionary_access_observer.mojom.h"
 #include "services/network/public/mojom/trust_tokens.mojom.h"
 #include "services/network/public/mojom/url_loader_network_service_observer.mojom.h"
+#include "storage/browser/blob/blob_url_registry.h"
 #include "storage/browser/quota/quota_client_type.h"
 #include "storage/browser/quota/quota_manager.h"
 #include "storage/browser/quota/quota_manager_impl.h"
diff --git a/content/browser/storage_partition_impl.h b/content/browser/storage_partition_impl.h
index 190a9a22..ef22ea4 100644
--- a/content/browser/storage_partition_impl.h
+++ b/content/browser/storage_partition_impl.h
@@ -47,7 +47,6 @@
 #include "services/network/public/mojom/device_bound_sessions.mojom.h"
 #include "services/network/public/mojom/network_context.mojom.h"
 #include "services/network/public/mojom/network_context_client.mojom.h"
-#include "storage/browser/blob/blob_url_registry.h"
 #include "storage/browser/quota/quota_client_type.h"
 #include "storage/browser/quota/quota_settings.h"
 #include "third_party/blink/public/common/storage_key/storage_key.h"
@@ -71,6 +70,7 @@
 }  // namespace network
 
 namespace storage {
+class BlobUrlRegistry;
 struct BucketClientInfo;
 class SharedStorageManager;
 }
diff --git a/content/browser/web_contents/file_chooser_impl.cc b/content/browser/web_contents/file_chooser_impl.cc
index 75db7b5..7104add 100644
--- a/content/browser/web_contents/file_chooser_impl.cc
+++ b/content/browser/web_contents/file_chooser_impl.cc
@@ -170,6 +170,12 @@
     return;
   }
 
+  // Do not allow open dialogs to have renderer-controlled default_file_name.
+  // See https://crbug.com/433800617 for context.
+  if (params->mode != blink::mojom::FileChooserParams::Mode::kSave) {
+    params->default_file_name = base::FilePath();
+  }
+
   // Don't allow page with open FileChooser to enter BackForwardCache to avoid
   // any unexpected behaviour from BackForwardCache.
   BackForwardCache::DisableForRenderFrameHost(
diff --git a/content/browser/web_contents/file_chooser_impl_unittest.cc b/content/browser/web_contents/file_chooser_impl_unittest.cc
new file mode 100644
index 0000000..c736462
--- /dev/null
+++ b/content/browser/web_contents/file_chooser_impl_unittest.cc
@@ -0,0 +1,122 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/web_contents/file_chooser_impl.h"
+
+#include "base/files/file_path.h"
+#include "base/run_loop.h"
+#include "content/browser/renderer_host/render_frame_host_impl.h"
+#include "content/public/browser/web_contents_delegate.h"
+#include "content/test/test_web_contents.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::_;
+using ::testing::Invoke;
+
+namespace content {
+
+class MockWebContentsDelegateForFileChooser : public WebContentsDelegate {
+ public:
+  // Mock the method to inspect the parameters it receives.
+  MOCK_METHOD(void,
+              RunFileChooser,
+              (RenderFrameHost* render_frame_host,
+               scoped_refptr<FileSelectListener> listener,
+               const blink::mojom::FileChooserParams& params),
+              (override));
+};
+
+class FileChooserImplTest : public RenderViewHostTestHarness {
+ public:
+  void SetUp() override {
+    RenderViewHostTestHarness::SetUp();
+    mock_web_contents_delegate_ =
+        std::make_unique<MockWebContentsDelegateForFileChooser>();
+    auto test_web_contents =
+        TestWebContents::Create(browser_context(), nullptr);
+    test_web_contents->SetDelegate(mock_web_contents_delegate_.get());
+    SetContents(std::move(test_web_contents));
+
+    // Navigate to page, otherwise OpenFileChooser() returns early.
+    NavigateAndCommit(GURL(url::kAboutBlankURL));
+  }
+
+  void TearDown() override {
+    mock_web_contents_delegate_.reset();
+    RenderViewHostTestHarness::TearDown();
+  }
+
+ protected:
+  std::unique_ptr<MockWebContentsDelegateForFileChooser>
+      mock_web_contents_delegate_;
+};
+
+TEST_F(FileChooserImplTest, DefaultFileNameClearedWhenModeIsNotSave) {
+  FileChooserImpl* file_chooser_impl =
+      FileChooserImpl::CreateForTesting(
+          static_cast<RenderFrameHostImpl*>(main_rfh()))
+          .first;
+
+  auto params = blink::mojom::FileChooserParams::New();
+  params->mode = blink::mojom::FileChooserParams::Mode::kOpen;
+  const base::FilePath kInitialFile =
+      base::FilePath(FILE_PATH_LITERAL("file.txt"));
+  params->default_file_name = kInitialFile;
+
+  blink::mojom::FileChooserParamsPtr captured_params;
+  EXPECT_CALL(*mock_web_contents_delegate_, RunFileChooser(_, _, _))
+      .WillOnce(Invoke(
+          [&](RenderFrameHost* rfh, scoped_refptr<FileSelectListener> listener,
+              const blink::mojom::FileChooserParams& passed_params) {
+            // Capture the arguments for later inspection.
+            captured_params = passed_params.Clone();
+
+            // Avoid logging error on destruction in test.
+            static_cast<FileChooserImpl::FileSelectListenerImpl*>(
+                listener.get())
+                ->SetListenerFunctionCalledTrueForTesting();
+          }));
+
+  file_chooser_impl->OpenFileChooser(std::move(params), base::DoNothing());
+
+  // Verify the default file name was cleared.
+  ASSERT_TRUE(captured_params);
+  EXPECT_EQ(captured_params->default_file_name, base::FilePath());
+}
+
+TEST_F(FileChooserImplTest, DefaultFileNamePreservedWhenModeIsSave) {
+  FileChooserImpl* file_chooser_impl =
+      FileChooserImpl::CreateForTesting(
+          static_cast<RenderFrameHostImpl*>(main_rfh()))
+          .first;
+
+  auto params = blink::mojom::FileChooserParams::New();
+  params->mode = blink::mojom::FileChooserParams::Mode::kSave;
+  const base::FilePath kInitialFile =
+      base::FilePath(FILE_PATH_LITERAL("file.txt"));
+  params->default_file_name = kInitialFile;
+
+  blink::mojom::FileChooserParamsPtr captured_params;
+  EXPECT_CALL(*mock_web_contents_delegate_, RunFileChooser(_, _, _))
+      .WillOnce(Invoke(
+          [&](RenderFrameHost* rfh, scoped_refptr<FileSelectListener> listener,
+              const blink::mojom::FileChooserParams& passed_params) {
+            // Capture the arguments for later inspection.
+            captured_params = passed_params.Clone();
+
+            // Avoid logging error on destruction in test.
+            static_cast<FileChooserImpl::FileSelectListenerImpl*>(
+                listener.get())
+                ->SetListenerFunctionCalledTrueForTesting();
+          }));
+
+  file_chooser_impl->OpenFileChooser(std::move(params), base::DoNothing());
+
+  // Verify the default file name was preserved.
+  ASSERT_TRUE(captured_params);
+  EXPECT_EQ(captured_params->default_file_name, kInitialFile);
+}
+
+}  // namespace content
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java
index 692c4f91..5bab56b 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTest.java
@@ -2936,6 +2936,7 @@
     @Test
     @SmallTest
     @EnableFeatures(AccessibilityFeatures.ACCESSIBILITY_TEXT_FORMATTING)
+    @DisabledTest(message = "https://crbug.com/434253831")
     public void testAccessibilityNodeInfo_textFormatting() throws Throwable {
         // Build a simple web page with a variety of text formatting options.
         setupTestFromFile("content/test/data/android/accessibility_text_formatting_examples.html");
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java
index d870765a..c47fc7a 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityTreeTest.java
@@ -1267,6 +1267,7 @@
 
     @Test
     @SmallTest
+    @DisabledTest(message = "https://crbug.com/434253831")
     public void test_fontSize() {
         performCssTest("font-size.html");
     }
@@ -2411,6 +2412,7 @@
 
     @Test
     @SmallTest
+    @DisabledTest(message = "https://crbug.com/434253831")
     public void test_scrollableOverflow() {
         performHtmlTest("scrollable-overflow.html");
     }
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h
index 87b1b6e..5616f81 100644
--- a/content/public/test/browser_test_utils.h
+++ b/content/public/test/browser_test_utils.h
@@ -48,7 +48,6 @@
 #include "content/public/common/isolated_world_ids.h"
 #include "content/public/common/page_type.h"
 #include "content/public/test/test_utils.h"
-#include "ipc/message_filter.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
 #include "mojo/public/cpp/bindings/self_owned_associated_receiver.h"
diff --git a/content/public/test/mock_render_thread.cc b/content/public/test/mock_render_thread.cc
index e6577d6..1268b3e 100644
--- a/content/public/test/mock_render_thread.cc
+++ b/content/public/test/mock_render_thread.cc
@@ -18,7 +18,6 @@
 #include "content/test/test_render_frame.h"
 #include "ipc/ipc_message_utils.h"
 #include "ipc/ipc_sync_message.h"
-#include "ipc/message_filter.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/dom_storage/session_storage_namespace_id.h"
diff --git a/content/public/test/mock_render_thread.h b/content/public/test/mock_render_thread.h
index 469cc7c2..7db7621 100644
--- a/content/public/test/mock_render_thread.h
+++ b/content/public/test/mock_render_thread.h
@@ -15,7 +15,6 @@
 #include "build/build_config.h"
 #include "content/public/common/widget_type.h"
 #include "content/public/renderer/render_thread.h"
-#include "ipc/message_filter.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "third_party/blink/public/mojom/browser_interface_broker.mojom.h"
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
index 47da750..5456a50d 100644
--- a/content/renderer/render_frame_impl.h
+++ b/content/renderer/render_frame_impl.h
@@ -147,7 +147,6 @@
 class WebURL;
 struct FramePolicy;
 struct JavaScriptFrameworkDetectionResult;
-struct SoftNavigationMetrics;
 }  // namespace blink
 
 namespace gfx {
diff --git a/content/shell/browser/shell.cc b/content/shell/browser/shell.cc
index 5d06602..6259e4b2 100644
--- a/content/shell/browser/shell.cc
+++ b/content/shell/browser/shell.cc
@@ -139,7 +139,8 @@
   // main frame being created as a WebContentsObservers. This gives the delegate
   // a chance to act on the main frame accordingly.
   if (raw_web_contents->GetPrimaryMainFrame()->IsRenderFrameLive())
-    g_platform->MainFrameCreated(shell);
+    g_platform->MainFrameCreated(shell,
+                                 raw_web_contents->GetPrimaryMainFrame());
 
   return shell;
 }
@@ -242,8 +243,9 @@
 }
 
 void Shell::RenderFrameCreated(RenderFrameHost* frame_host) {
-  if (frame_host == web_contents_->GetPrimaryMainFrame())
-    g_platform->MainFrameCreated(this);
+  if (frame_host == frame_host->GetOutermostMainFrame()) {
+    g_platform->MainFrameCreated(this, frame_host);
+  }
 }
 
 void Shell::LoadURL(const GURL& url) {
diff --git a/content/shell/browser/shell_platform_delegate.h b/content/shell/browser/shell_platform_delegate.h
index ef6ec51..e66501c 100644
--- a/content/shell/browser/shell_platform_delegate.h
+++ b/content/shell/browser/shell_platform_delegate.h
@@ -86,7 +86,11 @@
   // Called when the main frame is created in the renderer process; forwarded
   // from WebContentsObserver. If navigation creates a new main frame, this may
   // occur more than once.
-  virtual void MainFrameCreated(Shell* shell);
+  // |main_frame| points to the new frame that was created. This is different
+  // than |shell|'s primary main frame, because |main_frame|'s document hasn't
+  // committed at this point and hasn't been swapped with the old |shell|'s
+  // primary main frame.
+  virtual void MainFrameCreated(Shell* shell, RenderFrameHost* main_frame);
 
   // Allows platforms to override the JavascriptDialogManager. By default
   // returns null, which signals that the Shell should use its own instance.
diff --git a/content/shell/browser/shell_platform_delegate_android.cc b/content/shell/browser/shell_platform_delegate_android.cc
index a8d5b86..a62e0fd 100644
--- a/content/shell/browser/shell_platform_delegate_android.cc
+++ b/content/shell/browser/shell_platform_delegate_android.cc
@@ -111,7 +111,8 @@
 void ShellPlatformDelegate::SetTitle(Shell* shell,
                                      const std::u16string& title) {}
 
-void ShellPlatformDelegate::MainFrameCreated(Shell* shell) {}
+void ShellPlatformDelegate::MainFrameCreated(Shell* shell,
+                                             RenderFrameHost* main_frame) {}
 
 bool ShellPlatformDelegate::DestroyShell(Shell* shell) {
   return false;  // Shell destroys itself.
diff --git a/content/shell/browser/shell_platform_delegate_aura.cc b/content/shell/browser/shell_platform_delegate_aura.cc
index 1831839..97b3b62 100644
--- a/content/shell/browser/shell_platform_delegate_aura.cc
+++ b/content/shell/browser/shell_platform_delegate_aura.cc
@@ -83,7 +83,8 @@
 void ShellPlatformDelegate::SetTitle(Shell* shell,
                                      const std::u16string& title) {}
 
-void ShellPlatformDelegate::MainFrameCreated(Shell* shell) {}
+void ShellPlatformDelegate::MainFrameCreated(Shell* shell,
+                                             RenderFrameHost* main_frame) {}
 
 bool ShellPlatformDelegate::DestroyShell(Shell* shell) {
   return false;  // Shell destroys itself.
diff --git a/content/shell/browser/shell_platform_delegate_ios.mm b/content/shell/browser/shell_platform_delegate_ios.mm
index 8eef2ee..b61368e5 100644
--- a/content/shell/browser/shell_platform_delegate_ios.mm
+++ b/content/shell/browser/shell_platform_delegate_ios.mm
@@ -695,7 +695,8 @@
   DCHECK(base::Contains(shell_data_map_, shell));
 }
 
-void ShellPlatformDelegate::MainFrameCreated(Shell* shell) {}
+void ShellPlatformDelegate::MainFrameCreated(Shell* shell,
+                                             RenderFrameHost* main_frame) {}
 
 bool ShellPlatformDelegate::DestroyShell(Shell* shell) {
   DCHECK(base::Contains(shell_data_map_, shell));
diff --git a/content/shell/browser/shell_platform_delegate_mac.mm b/content/shell/browser/shell_platform_delegate_mac.mm
index fd7e0efb..03957f27 100644
--- a/content/shell/browser/shell_platform_delegate_mac.mm
+++ b/content/shell/browser/shell_platform_delegate_mac.mm
@@ -295,7 +295,8 @@
   shell_data.delegate.window.title = base::SysUTF16ToNSString(title);
 }
 
-void ShellPlatformDelegate::MainFrameCreated(Shell* shell) {}
+void ShellPlatformDelegate::MainFrameCreated(Shell* shell,
+                                             RenderFrameHost* main_frame) {}
 
 bool ShellPlatformDelegate::DestroyShell(Shell* shell) {
   DCHECK(base::Contains(shell_data_map_, shell));
diff --git a/content/shell/browser/shell_platform_delegate_views.cc b/content/shell/browser/shell_platform_delegate_views.cc
index 0d89ad3..93710e52ef 100644
--- a/content/shell/browser/shell_platform_delegate_views.cc
+++ b/content/shell/browser/shell_platform_delegate_views.cc
@@ -450,7 +450,8 @@
   shell_data.window_widget->widget_delegate()->SetTitle(title);
 }
 
-void ShellPlatformDelegate::MainFrameCreated(Shell* shell) {}
+void ShellPlatformDelegate::MainFrameCreated(Shell* shell,
+                                             RenderFrameHost* main_frame) {}
 
 bool ShellPlatformDelegate::DestroyShell(Shell* shell) {
   DCHECK(base::Contains(shell_data_map_, shell));
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 4c4b74ad4..1e0218fe 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -2891,6 +2891,7 @@
     "../browser/tracing/tracing_scenario_unittest.cc",
     "../browser/usb/web_usb_service_impl_unittest.cc",
     "../browser/web_contents/aura/gesture_nav_simple_unittest.cc",
+    "../browser/web_contents/file_chooser_impl_unittest.cc",
     "../browser/web_contents/web_contents_delegate_unittest.cc",
     "../browser/web_contents/web_contents_impl_unittest.cc",
     "../browser/web_contents/web_contents_user_data_unittest.cc",
diff --git a/content/web_test/browser/web_test_shell_platform_delegate.h b/content/web_test/browser/web_test_shell_platform_delegate.h
index 054df33..dc88732411 100644
--- a/content/web_test/browser/web_test_shell_platform_delegate.h
+++ b/content/web_test/browser/web_test_shell_platform_delegate.h
@@ -31,7 +31,7 @@
                        bool is_enabled) override;
   void SetAddressBarURL(Shell* shell, const GURL& url) override;
   void SetTitle(Shell* shell, const std::u16string& title) override;
-  void MainFrameCreated(Shell* shell) override;
+  void MainFrameCreated(Shell* shell, RenderFrameHost* main_frame) override;
   std::unique_ptr<JavaScriptDialogManager> CreateJavaScriptDialogManager(
       Shell* shell) override;
   bool HandlePointerLockRequest(Shell* shell,
diff --git a/content/web_test/browser/web_test_shell_platform_delegate_aura.cc b/content/web_test/browser/web_test_shell_platform_delegate_aura.cc
index f677b6ea..2250fd2 100644
--- a/content/web_test/browser/web_test_shell_platform_delegate_aura.cc
+++ b/content/web_test/browser/web_test_shell_platform_delegate_aura.cc
@@ -57,8 +57,10 @@
   ShellPlatformDelegate::SetTitle(shell, title);
 }
 
-void WebTestShellPlatformDelegate::MainFrameCreated(Shell* shell) {
-  ShellPlatformDelegate::MainFrameCreated(shell);
+void WebTestShellPlatformDelegate::MainFrameCreated(
+    Shell* shell,
+    RenderFrameHost* main_frame) {
+  ShellPlatformDelegate::MainFrameCreated(shell, main_frame);
 }
 
 bool WebTestShellPlatformDelegate::DestroyShell(Shell* shell) {
diff --git a/content/web_test/browser/web_test_shell_platform_delegate_ios.mm b/content/web_test/browser/web_test_shell_platform_delegate_ios.mm
index a376c1ff..b04ed9d 100644
--- a/content/web_test/browser/web_test_shell_platform_delegate_ios.mm
+++ b/content/web_test/browser/web_test_shell_platform_delegate_ios.mm
@@ -53,8 +53,10 @@
   ShellPlatformDelegate::SetTitle(shell, title);
 }
 
-void WebTestShellPlatformDelegate::MainFrameCreated(Shell* shell) {
-  ShellPlatformDelegate::MainFrameCreated(shell);
+void WebTestShellPlatformDelegate::MainFrameCreated(
+    Shell* shell,
+    RenderFrameHost* main_frame) {
+  ShellPlatformDelegate::MainFrameCreated(shell, main_frame);
 }
 
 bool WebTestShellPlatformDelegate::DestroyShell(Shell* shell) {
diff --git a/content/web_test/browser/web_test_shell_platform_delegate_mac.mm b/content/web_test/browser/web_test_shell_platform_delegate_mac.mm
index ca216bb..3498a49 100644
--- a/content/web_test/browser/web_test_shell_platform_delegate_mac.mm
+++ b/content/web_test/browser/web_test_shell_platform_delegate_mac.mm
@@ -6,6 +6,8 @@
 
 #import "base/apple/foundation_util.h"
 #include "base/containers/contains.h"
+#include "content/browser/renderer_host/render_frame_host_delegate.h"
+#include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/browser/renderer_host/render_widget_host_view_mac.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_widget_host.h"
@@ -97,9 +99,11 @@
   }
 }
 
-void WebTestShellPlatformDelegate::MainFrameCreated(Shell* shell) {
+void WebTestShellPlatformDelegate::MainFrameCreated(
+    Shell* shell,
+    RenderFrameHost* main_frame) {
   if (!IsHeadless()) {
-    ShellPlatformDelegate::MainFrameCreated(shell);
+    ShellPlatformDelegate::MainFrameCreated(shell, main_frame);
     return;
   }
 
@@ -119,8 +123,24 @@
   // We use the signal that the `blink::WebView` has been created in the
   // renderer as a proxy for knowing when the top level RenderWidgetHostView is
   // created, since they are created at the same time.
-  DCHECK(shell->web_contents()->GetPrimaryMainFrame()->GetView());
   ResizeWebContent(shell, shell_data.initial_size);
+
+  // The above code changes the widget screen rects of the currently navigated
+  // RenderWidgetHostView, but not the RenderWidgetHostView of the new main
+  // frame. If there is no render frame swap (i.e. RenderDocument is disabled),
+  // then this doesn't matter. However, if there is a swap, then the new RWHV
+  // will also need to have its screen rects updated so they are not left at
+  // 0x0. Popups are left alone since there are some tests that modify the
+  // window size mid-navigation, and this code block can race with that and undo
+  // the resize.
+  if (!RenderFrameHostImpl::From(main_frame)->delegate()->IsPopup()) {
+    DCHECK(main_frame->GetView());
+    auto* rwhv_mac =
+        static_cast<RenderWidgetHostViewMac*>(main_frame->GetView());
+    if (rwhv_mac) {
+      rwhv_mac->SetWindowFrameInScreen(gfx::Rect(shell_data.initial_size));
+    }
+  }
 }
 
 bool WebTestShellPlatformDelegate::DestroyShell(Shell* shell) {
diff --git a/content/web_test/browser/web_test_shell_platform_delegate_views.cc b/content/web_test/browser/web_test_shell_platform_delegate_views.cc
index 2d18ec09..d799813 100644
--- a/content/web_test/browser/web_test_shell_platform_delegate_views.cc
+++ b/content/web_test/browser/web_test_shell_platform_delegate_views.cc
@@ -121,9 +121,11 @@
   // Nothing in headless mode.
 }
 
-void WebTestShellPlatformDelegate::MainFrameCreated(Shell* shell) {
+void WebTestShellPlatformDelegate::MainFrameCreated(
+    Shell* shell,
+    RenderFrameHost* main_frame) {
   // No difference in headless mode.
-  ShellPlatformDelegate::MainFrameCreated(shell);
+  ShellPlatformDelegate::MainFrameCreated(shell, main_frame);
 }
 
 bool WebTestShellPlatformDelegate::DestroyShell(Shell* shell) {
diff --git a/docs/website b/docs/website
index a96616b..1906b0b 160000
--- a/docs/website
+++ b/docs/website
@@ -1 +1 @@
-Subproject commit a96616b68569bc8dc258cb570fd1b2f9122ce85e
+Subproject commit 1906b0bbaa142dc87acd171137d5a234aeba74c8
diff --git a/extensions/browser/api/web_request/web_request_permissions_unittest.cc b/extensions/browser/api/web_request/web_request_permissions_unittest.cc
index d10a669..0579aa7 100644
--- a/extensions/browser/api/web_request/web_request_permissions_unittest.cc
+++ b/extensions/browser/api/web_request/web_request_permissions_unittest.cc
@@ -17,6 +17,7 @@
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/extensions_test.h"
 #include "extensions/browser/process_map.h"
+#include "extensions/common/constants.h"
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_builder.h"
 #include "extensions/common/permissions/permission_set.h"
diff --git a/extensions/browser/extensions_browser_client.h b/extensions/browser/extensions_browser_client.h
index c59f2b9..7b13431 100644
--- a/extensions/browser/extensions_browser_client.h
+++ b/extensions/browser/extensions_browser_client.h
@@ -21,7 +21,6 @@
 #include "extensions/browser/extension_event_histogram_value.h"
 #include "extensions/browser/extension_prefs_observer.h"
 #include "extensions/browser/extensions_browser_api_provider.h"
-#include "extensions/browser/script_executor.h"
 #include "extensions/common/extension_id.h"
 #include "extensions/common/mojom/view_type.mojom.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
@@ -98,6 +97,7 @@
 class RuntimeAPIDelegate;
 class SafeBrowsingDelegate;
 class ScopedExtensionUpdaterKeepAlive;
+class ScriptExecutor;
 class UserScriptListener;
 
 // Interface to allow the extensions module to make browser-process-specific
diff --git a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
index a1360f1..b742da2 100644
--- a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
+++ b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc
@@ -31,7 +31,6 @@
 #include "extensions/renderer/native_extension_bindings_system.h"
 #include "extensions/renderer/object_backed_native_handler.h"
 #include "extensions/renderer/script_context.h"
-#include "ipc/message_filter.h"
 #include "third_party/blink/public/web/web_local_frame.h"
 #include "ui/accessibility/ax_event.h"
 #include "ui/accessibility/ax_event_generator.h"
diff --git a/extensions/renderer/api/messaging/one_time_message_handler.cc b/extensions/renderer/api/messaging/one_time_message_handler.cc
index 7990d0a7..9c23cf9 100644
--- a/extensions/renderer/api/messaging/one_time_message_handler.cc
+++ b/extensions/renderer/api/messaging/one_time_message_handler.cc
@@ -765,8 +765,9 @@
     return;
   }
 
-  debug::ScopedPromiseRejectedResponseCrashKeys(base::FeatureList::IsEnabled(
-      extensions_features::kRuntimeOnMessagePromiseReturnSupport));
+  debug::ScopedPromiseRejectedResponseCrashKeys promise_rejected_crash_keys(
+      base::FeatureList::IsEnabled(
+          extensions_features::kRuntimeOnMessagePromiseReturnSupport));
   v8::Local<v8::Value> promise_reject_reason;
   // This is safe to CHECK() because when a promise rejects it always provides a
   // value. Even if `reject()` (with no argument) is called we see `undefined`
diff --git a/extensions/test/data/api_test/messaging/on_message_promise_reject/background.js b/extensions/test/data/api_test/messaging/on_message_promise_reject/background.js
index 0112a0c..60b1299 100644
--- a/extensions/test/data/api_test/messaging/on_message_promise_reject/background.js
+++ b/extensions/test/data/api_test/messaging/on_message_promise_reject/background.js
@@ -29,6 +29,10 @@
       return new Promise((unusedResolve, reject) => {
         reject();
       });
+    case 'return promise reject with undefined':
+      return new Promise((unusedResolve, reject) => {
+        reject(undefined);
+      });
     default:
       chrome.test.fail('Unexpected test message: ' + message);
   }
diff --git a/extensions/test/data/api_test/messaging/on_message_promise_reject/content_script.js b/extensions/test/data/api_test/messaging/on_message_promise_reject/content_script.js
index ecec1602..ee34716 100644
--- a/extensions/test/data/api_test/messaging/on_message_promise_reject/content_script.js
+++ b/extensions/test/data/api_test/messaging/on_message_promise_reject/content_script.js
@@ -61,7 +61,7 @@
 
   // Tests if the rejection value is not passed anything, then a generic Error
   // will be provided to the caller.
-  async function onMessagePromiseRejectWithNoRejectValuePromise() {
+  async function onMessagePromiseRejectWithNoRejectValue() {
     await chrome.test.assertPromiseRejects(
         chrome.runtime.sendMessage(
             'return promise reject with no reject value'),
@@ -70,6 +70,14 @@
     chrome.test.succeed();
   },
 
+  async function onMessagePromiseRejectWithUndefinedValue() {
+    await chrome.test.assertPromiseRejects(
+        chrome.runtime.sendMessage('return promise reject with undefined'),
+        'Error: A runtime.onMessage listener\'s promise rejected without an ' +
+            'Error');
+    chrome.test.succeed();
+  },
+
   // TODO(crbug.com/424560420): Also test sender callback behavior for promise
   // returns. mozilla/webextension-polyfill doesn't support callbacks but
   // Firefox does so it'd be good to know what our current behavior is for
diff --git a/gpu/BUILD.gn b/gpu/BUILD.gn
index a04dc73..ed30455 100644
--- a/gpu/BUILD.gn
+++ b/gpu/BUILD.gn
@@ -119,7 +119,7 @@
     "//gpu/ipc/client",
     "//gpu/ipc/common",
     "//gpu/ipc/service",
-    "//gpu/skia_bindings:skia_bindings",
+    "//gpu/skia_bindings",
     "//media",
     "//testing/gmock",
     "//testing/gtest",
@@ -156,7 +156,7 @@
 
     deps = [
       ":gl_lpm_fuzzer_proto",
-      "//base:base",
+      "//base",
     ]
   }
 
@@ -195,12 +195,12 @@
       "//gpu/command_buffer/client:gles2_implementation",
       "//gpu/command_buffer/common:gles2_utils",
       "//gpu/ipc:gl_in_process_context",
-      "//gpu/ipc/service:service",
-      "//testing/gtest:gtest",
+      "//gpu/ipc/service",
+      "//testing/gtest",
       "//third_party/libprotobuf-mutator",
-      "//ui/gfx:gfx",
-      "//ui/gl:gl",
-      "//ui/gl/init:init",
+      "//ui/gfx",
+      "//ui/gl",
+      "//ui/gl/init",
     ]
 
     if (use_ozone) {
@@ -324,7 +324,7 @@
   }
 
   if (enable_vulkan) {
-    deps += [ "//gpu/vulkan/init:init" ]
+    deps += [ "//gpu/vulkan/init" ]
   }
 
   libs = []
@@ -682,7 +682,7 @@
   }
 
   if (is_apple) {
-    deps += [ "//ui/accelerated_widget_mac:accelerated_widget_mac" ]
+    deps += [ "//ui/accelerated_widget_mac" ]
   }
 
   # TODO(crbug.com/40031409): Fix code that adds exit-time destructors and
diff --git a/gpu/command_buffer/client/BUILD.gn b/gpu/command_buffer/client/BUILD.gn
index 22c57a9..796e20d 100644
--- a/gpu/command_buffer/client/BUILD.gn
+++ b/gpu/command_buffer/client/BUILD.gn
@@ -207,7 +207,7 @@
     "//components/viz/common:shared_image_format",
     "//gpu/command_buffer/common",
     "//gpu/command_buffer/common:raster",
-    "//skia:skia",
+    "//skia",
     "//ui/gfx:buffer_types",
   ]
 }
diff --git a/gpu/command_buffer/common/BUILD.gn b/gpu/command_buffer/common/BUILD.gn
index 9527a8a..b9cd79b 100644
--- a/gpu/command_buffer/common/BUILD.gn
+++ b/gpu/command_buffer/common/BUILD.gn
@@ -162,7 +162,7 @@
     ":gles2_utils",
     "//base",
     "//skia",
-    "//ui/gl:gl",
+    "//ui/gl",
   ]
   public_deps = [
     ":common",
diff --git a/gpu/command_buffer/service/BUILD.gn b/gpu/command_buffer/service/BUILD.gn
index 95ed9d4..6cc81843 100644
--- a/gpu/command_buffer/service/BUILD.gn
+++ b/gpu/command_buffer/service/BUILD.gn
@@ -78,7 +78,7 @@
   public_deps = [
     "//base",
     "//gpu/command_buffer/common",
-    "//url:url",
+    "//url",
   ]
   deps = [
     "//base",
@@ -354,6 +354,7 @@
     "//gpu:raster_implementation",
     "//gpu:webgpu_implementation",
     "//third_party/khronos:khronos_headers",
+    "//third_party/angle:no_thread_safety_warnings",
   ]
 
   public_deps = [
diff --git a/gpu/ipc/BUILD.gn b/gpu/ipc/BUILD.gn
index 65a6bb7a..b84577e 100644
--- a/gpu/ipc/BUILD.gn
+++ b/gpu/ipc/BUILD.gn
@@ -35,7 +35,7 @@
     "//gpu/ipc/common:surface_handle_type",
     "//gpu/ipc/host",
     "//gpu/ipc/service",
-    "//gpu/skia_bindings:skia_bindings",
+    "//gpu/skia_bindings",
     "//ui/gfx",
     "//ui/gfx/geometry",
     "//ui/gl",
diff --git a/gpu/ipc/common/BUILD.gn b/gpu/ipc/common/BUILD.gn
index 2d679f1..5209c10 100644
--- a/gpu/ipc/common/BUILD.gn
+++ b/gpu/ipc/common/BUILD.gn
@@ -125,7 +125,7 @@
     ]
   }
   if (is_android) {
-    visibility += [ "//media/gpu:gpu" ]
+    visibility += [ "//media/gpu" ]
   }
 
   configs += [
@@ -844,7 +844,7 @@
     ":memory_stats_sources",
     ":surface_handle_type",
     "//gpu/command_buffer/common",
-    "//mojo/public/cpp/bindings:bindings",
+    "//mojo/public/cpp/bindings",
   ]
 
   if (enable_vulkan) {
diff --git a/gpu/ipc/service/BUILD.gn b/gpu/ipc/service/BUILD.gn
index 71858019..1e35afb 100644
--- a/gpu/ipc/service/BUILD.gn
+++ b/gpu/ipc/service/BUILD.gn
@@ -117,8 +117,8 @@
     if (is_mac) {
       sources += [ "image_transport_surface_mac.mm" ]
       deps += [
-        "//ui/display:display",
-        "//ui/display/types:types",
+        "//ui/display",
+        "//ui/display/types",
       ]
       lib_dirs = [ "$mac_sdk_path/usr/lib" ]
       frameworks = [
@@ -177,7 +177,7 @@
   sources = [ "gpu_memory_buffer_factory_test_template.h" ]
   public_deps = [
     ":service",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
   ]
   deps = [
     "//base/test:test_support",
diff --git a/gpu/vulkan/BUILD.gn b/gpu/vulkan/BUILD.gn
index 0ff2f57..b2a5b94 100644
--- a/gpu/vulkan/BUILD.gn
+++ b/gpu/vulkan/BUILD.gn
@@ -76,7 +76,7 @@
       ":vulkan_function_pointers",
       "//base",
       "//third_party/vulkan_memory_allocator",
-      "//ui/gfx:gfx",
+      "//ui/gfx",
     ]
   }
 
@@ -255,7 +255,7 @@
 
       deps = [
         ":test_support",
-        "//base:base",
+        "//base",
         "//base/test:test_support",
         "//components/viz/common:vulkan_context_provider",
         "//gpu/ipc/service",
diff --git a/gpu/vulkan/android/BUILD.gn b/gpu/vulkan/android/BUILD.gn
index 1dbb1d0..fb0e160 100644
--- a/gpu/vulkan/android/BUILD.gn
+++ b/gpu/vulkan/android/BUILD.gn
@@ -38,7 +38,7 @@
 test("vk_tests") {
   deps = [
     ":android",
-    "//base:base",
+    "//base",
     "//base/test:test_support",
     "//components/viz/common:vulkan_context_provider",
     "//testing/gtest",
diff --git a/infra/config/generated/builder-owners/chrome-deet-core@google.com.txt b/infra/config/generated/builder-owners/chrome-deet-core@google.com.txt
deleted file mode 100644
index 2df91d5..0000000
--- a/infra/config/generated/builder-owners/chrome-deet-core@google.com.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-ci/Centipede High End Upload Linux ASan
-ci/Centipede High End Upload Linux ASan DCheck
-ci/Centipede Upload Linux ASan
-ci/Libfuzzer High End Upload Linux ASan
-ci/Libfuzzer High End Upload Linux ASan Debug
-ci/Libfuzzer Upload Chrome OS ASan
-ci/Libfuzzer Upload Linux ASan
-ci/Libfuzzer Upload Linux ASan Debug
-ci/Libfuzzer Upload Linux MSan
-ci/Libfuzzer Upload Linux UBSan
-ci/Libfuzzer Upload Linux32 ASan
-ci/Libfuzzer Upload Mac ASan
-ci/Libfuzzer Upload Windows ASan
-ci/Libfuzzer Upload iOS Catalyst Debug
-try/chromeos-libfuzzer-asan-rel
-try/linux-centipede-high-end-asan-dcheck
-try/linux-libfuzzer-high-end-asan-dbg
-try/linux-libfuzzer-high-end-asan-rel
-try/mac-libfuzzer-asan-rel
\ No newline at end of file
diff --git a/infra/config/generated/builder-owners/chrome-fuzzing-core@google.com.txt b/infra/config/generated/builder-owners/chrome-fuzzing-core@google.com.txt
index 29fba6a..3c47f7c 100644
--- a/infra/config/generated/builder-owners/chrome-fuzzing-core@google.com.txt
+++ b/infra/config/generated/builder-owners/chrome-fuzzing-core@google.com.txt
@@ -1 +1,20 @@
-ci/linux-centipede-fuzz-coverage
\ No newline at end of file
+ci/Centipede High End Upload Linux ASan
+ci/Centipede High End Upload Linux ASan DCheck
+ci/Centipede Upload Linux ASan
+ci/Libfuzzer High End Upload Linux ASan
+ci/Libfuzzer High End Upload Linux ASan Debug
+ci/Libfuzzer Upload Chrome OS ASan
+ci/Libfuzzer Upload Linux ASan
+ci/Libfuzzer Upload Linux ASan Debug
+ci/Libfuzzer Upload Linux MSan
+ci/Libfuzzer Upload Linux UBSan
+ci/Libfuzzer Upload Linux32 ASan
+ci/Libfuzzer Upload Mac ASan
+ci/Libfuzzer Upload Windows ASan
+ci/Libfuzzer Upload iOS Catalyst Debug
+ci/linux-centipede-fuzz-coverage
+try/chromeos-libfuzzer-asan-rel
+try/linux-centipede-high-end-asan-dcheck
+try/linux-libfuzzer-high-end-asan-dbg
+try/linux-libfuzzer-high-end-asan-rel
+try/mac-libfuzzer-asan-rel
\ No newline at end of file
diff --git a/infra/config/generated/health-specs/health-specs.json b/infra/config/generated/health-specs/health-specs.json
index 66ef2df9..487480d 100644
--- a/infra/config/generated/health-specs/health-specs.json
+++ b/infra/config/generated/health-specs/health-specs.json
@@ -664,7 +664,7 @@
         ]
       },
       "Centipede High End Upload Linux ASan": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -685,7 +685,7 @@
         ]
       },
       "Centipede High End Upload Linux ASan DCheck": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -706,7 +706,7 @@
         ]
       },
       "Centipede Upload Linux ASan": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -2622,7 +2622,7 @@
         ]
       },
       "Libfuzzer High End Upload Linux ASan": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -2643,7 +2643,7 @@
         ]
       },
       "Libfuzzer High End Upload Linux ASan Debug": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -2664,7 +2664,7 @@
         ]
       },
       "Libfuzzer Upload Chrome OS ASan": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -2685,7 +2685,7 @@
         ]
       },
       "Libfuzzer Upload Linux ASan": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -2706,7 +2706,7 @@
         ]
       },
       "Libfuzzer Upload Linux ASan Debug": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -2727,7 +2727,7 @@
         ]
       },
       "Libfuzzer Upload Linux MSan": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -2748,7 +2748,7 @@
         ]
       },
       "Libfuzzer Upload Linux UBSan": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -2811,7 +2811,7 @@
         ]
       },
       "Libfuzzer Upload Linux32 ASan": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -2874,7 +2874,7 @@
         ]
       },
       "Libfuzzer Upload Mac ASan": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -2895,7 +2895,7 @@
         ]
       },
       "Libfuzzer Upload Windows ASan": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
@@ -2916,7 +2916,7 @@
         ]
       },
       "Libfuzzer Upload iOS Catalyst Debug": {
-        "contact_team_email": "chrome-deet-core@google.com",
+        "contact_team_email": "chrome-fuzzing-core@google.com",
         "problem_specs": [
           {
             "name": "Unhealthy",
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 30a33df0..26a0db5 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -5347,14 +5347,14 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder uploads centipede high end fuzzers.Those fuzzers require more resources to run correctly.<br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "This builder uploads centipede high end fuzzers.Those fuzzers require more resources to run correctly.<br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -5458,14 +5458,14 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder uploads centipede high end fuzzers in release mode with dcheck_always_on.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-centipede-high-end-asan-dcheck\">linux-centipede-high-end-asan-dcheck</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "This builder uploads centipede high end fuzzers in release mode with dcheck_always_on.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-centipede-high-end-asan-dcheck\">linux-centipede-high-end-asan-dcheck</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -5575,14 +5575,14 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-centipede-asan-rel\">linux-centipede-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-centipede-asan-rel\">linux-centipede-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -16133,14 +16133,14 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-high-end-asan-rel\">linux-libfuzzer-high-end-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-high-end-asan-rel\">linux-libfuzzer-high-end-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -16244,14 +16244,14 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-high-end-asan-dbg\">linux-libfuzzer-high-end-asan-dbg</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-high-end-asan-dbg\">linux-libfuzzer-high-end-asan-dbg</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -16361,14 +16361,14 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-libfuzzer-asan-rel\">chromeos-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-libfuzzer-asan-rel\">chromeos-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -16478,14 +16478,14 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-asan-rel\">linux-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-libfuzzer-asan-rel\">linux-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -16595,14 +16595,14 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -16712,14 +16712,14 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -16827,7 +16827,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -16835,7 +16835,7 @@
         dimensions: "builderless:1"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -17179,14 +17179,14 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
         dimensions: "free_space:"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -17528,7 +17528,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-libfuzzer-asan-rel\">mac-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-libfuzzer-asan-rel\">mac-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17536,7 +17536,7 @@
         dimensions: "builderless:1"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -17644,7 +17644,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-libfuzzer-asan-rel\">win-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-libfuzzer-asan-rel\">win-libfuzzer-asan-rel</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17652,7 +17652,7 @@
         dimensions: "builderless:1"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -17763,7 +17763,7 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
+      description_html: "Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
       shadow_builder_adjustments {
         service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com"
         pool: "luci.chromium.try"
@@ -17771,7 +17771,7 @@
         dimensions: "builderless:1"
         dimensions: "pool:luci.chromium.try"
       }
-      contact_team_email: "chrome-deet-core@google.com"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -88226,8 +88226,8 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Chrome OS ASan\">Libfuzzer Upload Chrome OS ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
-      contact_team_email: "chrome-deet-core@google.com"
+      description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Chrome OS ASan\">Libfuzzer Upload Chrome OS ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -104337,8 +104337,8 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "<br>This builder uploads centipede high end fuzzers in release mode with dcheck_always_on.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Centipede High End Upload Linux ASan DCheck\">Centipede High End Upload Linux ASan DCheck</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
-      contact_team_email: "chrome-deet-core@google.com"
+      description_html: "<br>This builder uploads centipede high end fuzzers in release mode with dcheck_always_on.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Centipede High End Upload Linux ASan DCheck\">Centipede High End Upload Linux ASan DCheck</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -107687,8 +107687,8 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "<br>This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer High End Upload Linux ASan Debug\">Libfuzzer High End Upload Linux ASan Debug</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
-      contact_team_email: "chrome-deet-core@google.com"
+      description_html: "<br>This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer High End Upload Linux ASan Debug\">Libfuzzer High End Upload Linux ASan Debug</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -107799,8 +107799,8 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "<br>This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer High End Upload Linux ASan\">Libfuzzer High End Upload Linux ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
-      contact_team_email: "chrome-deet-core@google.com"
+      description_html: "<br>This builder uploads libfuzzer high end fuzzers.Those fuzzers require more resources to run correctly.<br/><br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer High End Upload Linux ASan\">Libfuzzer High End Upload Linux ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
@@ -115382,8 +115382,8 @@
           use_invocation_timestamp: true
         }
       }
-      description_html: "Trybot of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Mac ASan\">Libfuzzer Upload Mac ASan</a>.<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Mac ASan\">Libfuzzer Upload Mac ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-deet-core@google.com>chrome-deet-core@google.com</a>"
-      contact_team_email: "chrome-deet-core@google.com"
+      description_html: "Trybot of <a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Mac ASan\">Libfuzzer Upload Mac ASan</a>.<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Libfuzzer Upload Mac ASan\">Libfuzzer Upload Mac ASan</a></li></ul><br/>Builder owner: <a href=mailto:chrome-fuzzing-core@google.com>chrome-fuzzing-core@google.com</a>"
+      contact_team_email: "chrome-fuzzing-core@google.com"
       custom_metric_definitions {
         name: "/chrome/infra/browser/builds/cached_count"
         predicates: "has(build.output.properties.is_cached)"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index 75f5f35b..57d16462 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -6579,67 +6579,67 @@
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "arm"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan Debug"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "arm-dbg"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "arm64"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan Debug"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "arm64-dbg"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Chrome OS ASan"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "chromeos-asan"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload iOS Catalyst Debug"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "ios"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux ASan"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "linux"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux ASan Debug"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "linux-dbg"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux MSan"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "linux-msan"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux UBSan"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "linux-ubsan"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 ASan"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "linux32"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Mac ASan"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "mac-asan"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Windows ASan"
-    category: "chromium.fuzz|libfuzz"
+    category: "chromium.fuzz|libfuzzer"
     short_name: "win-asan"
   }
   builders {
@@ -14877,81 +14877,81 @@
     short_name: "med"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Chrome OS ASan"
-    category: "libfuzz"
-    short_name: "chromeos-asan"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 ASan"
-    category: "libfuzz"
-    short_name: "linux32"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux ASan"
-    category: "libfuzz"
+    category: "libfuzzer"
     short_name: "linux"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux ASan Debug"
-    category: "libfuzz"
+    category: "libfuzzer"
     short_name: "linux-dbg"
   }
   builders {
-    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux MSan"
-    category: "libfuzz"
-    short_name: "linux-msan"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux UBSan"
-    category: "libfuzz"
-    short_name: "linux-ubsan"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Mac ASan"
-    category: "libfuzz"
-    short_name: "mac-asan"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Windows ASan"
-    category: "libfuzz"
-    short_name: "win-asan"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan"
-    category: "libfuzz"
-    short_name: "arm"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan Debug"
-    category: "libfuzz"
-    short_name: "arm-dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan"
-    category: "libfuzz"
-    short_name: "arm64"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan Debug"
-    category: "libfuzz"
-    short_name: "arm64-dbg"
-  }
-  builders {
-    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload iOS Catalyst Debug"
-    category: "libfuzz"
-    short_name: "ios"
-  }
-  builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer High End Upload Linux ASan Debug"
-    category: "libfuzz"
+    category: "libfuzzer"
     short_name: "linux high dbg"
   }
   builders {
     name: "buildbucket/luci.chromium.ci/Libfuzzer High End Upload Linux ASan"
-    category: "libfuzz"
+    category: "libfuzzer"
     short_name: "linux high end"
   }
   builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 ASan"
+    category: "libfuzzer"
+    short_name: "linux32"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux MSan"
+    category: "libfuzzer"
+    short_name: "linux-msan"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux UBSan"
+    category: "libfuzzer"
+    short_name: "linux-ubsan"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Chrome OS ASan"
+    category: "libfuzzer"
+    short_name: "chromeos-asan"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Mac ASan"
+    category: "libfuzzer"
+    short_name: "mac-asan"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Windows ASan"
+    category: "libfuzzer"
+    short_name: "win-asan"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan"
+    category: "libfuzzer"
+    short_name: "arm"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux32 V8-ARM ASan Debug"
+    category: "libfuzzer"
+    short_name: "arm-dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan"
+    category: "libfuzzer"
+    short_name: "arm64"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload Linux V8-ARM64 ASan Debug"
+    category: "libfuzzer"
+    short_name: "arm64-dbg"
+  }
+  builders {
+    name: "buildbucket/luci.chromium.ci/Libfuzzer Upload iOS Catalyst Debug"
+    category: "libfuzzer"
+    short_name: "ios"
+  }
+  builders {
     name: "buildbucket/luci.chromium.ci/MSAN Release (chained origins)"
     category: "linux msan"
     short_name: "org"
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuzz.star b/infra/config/subprojects/chromium/ci/chromium.fuzz.star
index b4a0c86..1b1ed24 100644
--- a/infra/config/subprojects/chromium/ci/chromium.fuzz.star
+++ b/infra/config/subprojects/chromium/ci/chromium.fuzz.star
@@ -37,6 +37,26 @@
     siso_remote_jobs = siso.remote_jobs.DEFAULT,
 )
 
+_DEFAULT_CONSOLE_ORDERING = consoles.ordering(short_names = ["dbg", "rel"])
+
+_LIBFUZZER_CONSOLE_ORDERING = consoles.ordering(short_names = [
+    "linux",
+    "linux-dbg",
+    "linux high dbg",
+    "linux high end",
+    "linux32",
+    "linux-msan",
+    "linux-ubsan",
+    "chromeos-asan",
+    "mac-asan",
+    "win-asan",
+    "arm",
+    "arm-dbg",
+    "arm64",
+    "arm64-dbg",
+    "ios",
+])
+
 consoles.console_view(
     name = "chromium.fuzz",
     branch_selector = [
@@ -50,26 +70,15 @@
             "mac asan",
             "cros asan",
             "linux asan",
-            "libfuzz",
+            "libfuzzer",
             "linux msan",
             "linux tsan",
         ],
-        "*config*": consoles.ordering(short_names = ["dbg", "rel"]),
-        "win asan": "*config*",
-        "mac asan": "*config*",
-        "linux asan": "*config*",
-        "linux asan|x64 v8-ARM": "*config*",
-        "libfuzz": consoles.ordering(short_names = [
-            "chromeos-asan",
-            "linux32",
-            "linux32-dbg",
-            "linux",
-            "linux-dbg",
-            "linux-msan",
-            "linux-ubsan",
-            "mac-asan",
-            "win-asan",
-        ]),
+        "win asan": _DEFAULT_CONSOLE_ORDERING,
+        "mac asan": _DEFAULT_CONSOLE_ORDERING,
+        "linux asan": _DEFAULT_CONSOLE_ORDERING,
+        "linux asan|x64 v8-ARM": _DEFAULT_CONSOLE_ORDERING,
+        "libfuzzer": _LIBFUZZER_CONSOLE_ORDERING,
     },
 )
 
@@ -207,7 +216,7 @@
         clusterfuzz_archive_subdir = None,
         clusterfuzz_ios_targets_only = None,
         clusterfuzz_v8_targets_only = None,
-        contact_team_email = "chrome-deet-core@google.com",
+        contact_team_email = "chrome-fuzzing-core@google.com",
         **kwargs):
     gn_configs = [
         "libfuzzer",
@@ -237,7 +246,7 @@
         gn_extra_configs = gn_configs,
         use_component_build = use_component_build,
         properties = properties,
-        console_category = "libfuzz",
+        console_category = "libfuzzer",
         contact_team_email = contact_team_email,
         **kwargs
     )
@@ -433,7 +442,7 @@
         category = "centipede",
         short_name = "cent",
     ),
-    contact_team_email = "chrome-deet-core@google.com",
+    contact_team_email = "chrome-fuzzing-core@google.com",
     execution_timeout = 4 * time.hour,
     properties = {
         "upload_bucket": "chromium-browser-centipede",
@@ -487,7 +496,7 @@
         category = "centipede",
         short_name = "cent high",
     ),
-    contact_team_email = "chrome-deet-core@google.com",
+    contact_team_email = "chrome-fuzzing-core@google.com",
     properties = {
         "upload_bucket": "chromium-browser-centipede",
         "upload_directory": "asan",
@@ -537,7 +546,7 @@
         category = "centipede",
         short_name = "cent high dc",
     ),
-    contact_team_email = "chrome-deet-core@google.com",
+    contact_team_email = "chrome-fuzzing-core@google.com",
     properties = {
         "upload_bucket": "chromium-browser-centipede",
         "upload_directory": "asan",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
index 83cac76..2a4afdf 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -254,7 +254,7 @@
             "skip_generate_fuzzer_owners",
         ],
     ),
-    contact_team_email = "chrome-deet-core@google.com",
+    contact_team_email = "chrome-fuzzing-core@google.com",
 )
 
 try_.builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star b/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star
index 91468d68..f90bfeab 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.fuzz.star
@@ -27,130 +27,118 @@
     name = "tryserver.chromium.fuzz",
 )
 
-try_.builder(
+def _builder(mirror_of = None, **kwargs):
+    try_.builder(
+        mirrors = [mirror_of],
+        gn_args = mirror_of,
+        **kwargs
+    )
+
+_builder(
     name = "linux-asan-dbg",
-    mirrors = ["ci/ASAN Debug"],
-    gn_args = "ci/ASAN Debug",
+    mirror_of = "ci/ASAN Debug",
 )
 
-try_.builder(
+_builder(
     name = "linux-asan-rel",
-    mirrors = ["ci/ASAN Release"],
-    gn_args = "ci/ASAN Release",
+    mirror_of = "ci/ASAN Release",
 )
 
-try_.builder(
+_builder(
     name = "linux-asan-media-rel",
-    mirrors = ["ci/ASAN Release Media"],
-    gn_args = "ci/ASAN Release Media",
+    mirror_of = "ci/ASAN Release Media",
 )
 
-try_.builder(
+_builder(
     name = "linux-asan-v8-arm-dbg",
-    mirrors = ["ci/ASan Debug (32-bit x86 with V8-ARM)"],
-    gn_args = "ci/ASan Debug (32-bit x86 with V8-ARM)",
+    mirror_of = "ci/ASan Debug (32-bit x86 with V8-ARM)",
 )
 
-try_.builder(
+_builder(
     name = "linux-asan-v8-arm-rel",
-    mirrors = ["ci/ASan Release (32-bit x86 with V8-ARM)"],
-    gn_args = "ci/ASan Release (32-bit x86 with V8-ARM)",
+    mirror_of = "ci/ASan Release (32-bit x86 with V8-ARM)",
 )
 
-try_.builder(
+_builder(
     name = "linux-asan-media-v8-arm-rel",
-    mirrors = ["ci/ASan Release Media (32-bit x86 with V8-ARM)"],
-    gn_args = "ci/ASan Release Media (32-bit x86 with V8-ARM)",
+    mirror_of = "ci/ASan Release Media (32-bit x86 with V8-ARM)",
 )
 
-try_.builder(
+_builder(
     name = "linux-asan-v8-sandbox-testing",
-    mirrors = ["ci/ASAN Release V8 Sandbox Testing"],
-    gn_args = "ci/ASAN Release V8 Sandbox Testing",
     contact_team_email = "v8-infra@google.com",
+    mirror_of = "ci/ASAN Release V8 Sandbox Testing",
 )
 
-try_.builder(
+_builder(
     name = "linux-chromeos-asan-rel",
-    mirrors = ["ci/ChromiumOS ASAN Release"],
-    gn_args = "ci/ChromiumOS ASAN Release",
+    mirror_of = "ci/ChromiumOS ASAN Release",
 )
 
-try_.builder(
+_builder(
     name = "linux-msan-chained-origins-rel",
-    mirrors = ["ci/MSAN Release (chained origins)"],
-    gn_args = "ci/MSAN Release (chained origins)",
+    mirror_of = "ci/MSAN Release (chained origins)",
 )
 
-try_.builder(
+_builder(
     name = "linux-msan-no-origins-rel",
-    mirrors = ["ci/MSAN Release (no origins)"],
-    gn_args = "ci/MSAN Release (no origins)",
+    mirror_of = "ci/MSAN Release (no origins)",
 )
 
-try_.builder(
+_builder(
     name = "linux-tsan-dbg",
-    mirrors = ["ci/TSAN Debug"],
-    gn_args = "ci/TSAN Debug",
+    mirror_of = "ci/TSAN Debug",
 )
 
-try_.builder(
+_builder(
     name = "linux-tsan-rel",
-    mirrors = ["ci/TSAN Release"],
-    gn_args = "ci/TSAN Release",
+    mirror_of = "ci/TSAN Release",
 )
 
-try_.builder(
+_builder(
     name = "linux-ubsan-rel",
-    mirrors = ["ci/UBSan Release"],
-    gn_args = "ci/UBSan Release",
+    mirror_of = "ci/UBSan Release",
 )
 
-try_.builder(
+_builder(
     name = "linux-ubsan-vptr-rel",
-    mirrors = ["ci/UBSan vptr Release"],
-    gn_args = "ci/UBSan vptr Release",
+    mirror_of = "ci/UBSan vptr Release",
 )
 
-try_.builder(
+_builder(
     name = "mac-asan-rel",
-    mirrors = ["ci/Mac ASAN Release"],
-    gn_args = "ci/Mac ASAN Release",
     cores = None,
     os = os.MAC_DEFAULT,
     cpu = cpu.ARM64,
+    mirror_of = "ci/Mac ASAN Release",
 )
 
-try_.builder(
+_builder(
     name = "mac-arm64-asan-rel",
-    mirrors = ["ci/Mac ARM64 ASAN Release"],
-    gn_args = "ci/Mac ARM64 ASAN Release",
     cores = None,
     os = os.MAC_DEFAULT,
     cpu = cpu.ARM64,
     contact_team_email = "chrome-sanitizer-builder-owners@google.com",
+    mirror_of = "ci/Mac ARM64 ASAN Release",
 )
 
-try_.builder(
+_builder(
     name = "mac-asan-media-rel",
-    mirrors = ["ci/Mac ASAN Release Media"],
-    gn_args = "ci/Mac ASAN Release Media",
     cores = None,
     os = os.MAC_DEFAULT,
+    mirror_of = "ci/Mac ASAN Release Media",
 )
 
-try_.builder(
+_builder(
     name = "win-asan-rel",
-    mirrors = ["ci/Win ASan Release"],
-    gn_args = "ci/Win ASan Release",
     os = os.WINDOWS_DEFAULT,
+    mirror_of = "ci/Win ASan Release",
 )
 
-try_.builder(
+_builder(
     name = "win-asan-media-rel",
-    mirrors = ["ci/Win ASan Release Media"],
-    gn_args = "ci/Win ASan Release Media",
     os = os.WINDOWS_DEFAULT,
+    mirror_of = "ci/Win ASan Release Media",
 )
 
 try_.builder(
@@ -163,7 +151,7 @@
             "skip_generate_fuzzer_owners",
         ],
     ),
-    contact_team_email = "chrome-deet-core@google.com",
+    contact_team_email = "chrome-fuzzing-core@google.com",
 )
 
 try_.builder(
@@ -176,7 +164,7 @@
             "skip_generate_fuzzer_owners",
         ],
     ),
-    contact_team_email = "chrome-deet-core@google.com",
+    contact_team_email = "chrome-fuzzing-core@google.com",
 )
 
 try_.builder(
@@ -189,5 +177,5 @@
             "skip_generate_fuzzer_owners",
         ],
     ),
-    contact_team_email = "chrome-deet-core@google.com",
+    contact_team_email = "chrome-fuzzing-core@google.com",
 )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
index b8cd1eaf..af723a3 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.mac.star
@@ -215,7 +215,7 @@
             "skip_generate_fuzzer_owners",
         ],
     ),
-    contact_team_email = "chrome-deet-core@google.com",
+    contact_team_email = "chrome-fuzzing-core@google.com",
 )
 
 try_.builder(
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index aa927bf6b..86bcb307 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -1104,6 +1104,9 @@
       <message name="IDS_IOS_BWG_LOCATION_TITLE" desc="The title text of the BWG location settings page.">
         Precise Location
       </message>
+      <message name="IDS_IOS_BWG_PAGE_ACTION_MENU_ENTRY_POINT_ACCESSIBILITY_LABEL" desc="Accessibility label for the page action menu entry point.">
+          Open on-page AI tools
+      </message>
       <message name="IDS_IOS_BWG_PROMO_FIRST_BOX_BODY" desc="First box body text for the Gemini Promo page.">
           Get relevant answers based on the content of the page you're on
       </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BWG_PAGE_ACTION_MENU_ENTRY_POINT_ACCESSIBILITY_LABEL.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BWG_PAGE_ACTION_MENU_ENTRY_POINT_ACCESSIBILITY_LABEL.png.sha1
new file mode 100644
index 0000000..efd719e7
--- /dev/null
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BWG_PAGE_ACTION_MENU_ENTRY_POINT_ACCESSIBILITY_LABEL.png.sha1
@@ -0,0 +1 @@
+c2f624a4365ba59591d360896626c223fd3d7e8f
\ No newline at end of file
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_most_visited_tile_view.mm b/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_most_visited_tile_view.mm
index 7a7d8682..586a14d 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_most_visited_tile_view.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_most_visited_tile_view.mm
@@ -214,7 +214,7 @@
 // set.
 - (void)applyBackgroundColors {
   NewTabPageColorPalette* colorPalette =
-      [self.traitCollection objectForTrait:NewTabPageTrait.class];
+      [self.traitCollection objectForNewTabPageTrait];
 
   if (colorPalette) {
     self.imageContainerView.backgroundColor = colorPalette.tertiaryColor;
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_shortcut_tile_view.mm b/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_shortcut_tile_view.mm
index 48b3499..bf61ec7 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_shortcut_tile_view.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/cells/content_suggestions_shortcut_tile_view.mm
@@ -194,7 +194,7 @@
 // set.
 - (void)applyBackgroundColors {
   NewTabPageColorPalette* colorPalette =
-      [self.traitCollection objectForTrait:NewTabPageTrait.class];
+      [self.traitCollection objectForNewTabPageTrait];
 
   if (colorPalette) {
     self.imageBackgroundView.tintColor = colorPalette.tertiaryColor;
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_edit_button_cell.mm b/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_edit_button_cell.mm
index bde319c..994b83d3 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_edit_button_cell.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_edit_button_cell.mm
@@ -84,7 +84,7 @@
 // set.
 - (void)applyBackgroundColors {
   NewTabPageColorPalette* colorPalette =
-      [self.traitCollection objectForTrait:NewTabPageTrait.class];
+      [self.traitCollection objectForNewTabPageTrait];
 
   if (colorPalette) {
     _editButton.tintColor = colorPalette.tintColor;
diff --git a/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_module_container.mm b/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_module_container.mm
index fa722529..790841d 100644
--- a/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_module_container.mm
+++ b/ios/chrome/browser/content_suggestions/ui_bundled/magic_stack/magic_stack_module_container.mm
@@ -612,7 +612,7 @@
 // set.
 - (void)applyBackgroundColors {
   NewTabPageColorPalette* colorPalette =
-      [self.traitCollection objectForTrait:NewTabPageTrait.class];
+      [self.traitCollection objectForNewTabPageTrait];
 
   if (colorPalette) {
     self.backgroundColor = colorPalette.secondaryCellColor;
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 5e09c7e..6a1bee4 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1801,6 +1801,10 @@
      flag_descriptions::kDefaultBrowserBannerPromoName,
      flag_descriptions::kDefaultBrowserBannerPromoDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(kDefaultBrowserBannerPromo)},
+    {"default-browser-off-cycle-promo",
+     flag_descriptions::kDefaultBrowserOffCyclePromoName,
+     flag_descriptions::kDefaultBrowserOffCyclePromoDescription,
+     flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSDefaultBrowserOffCyclePromo)},
     {"default-browser-promo-trigger-criteria-experiment",
      flag_descriptions::kDefaultBrowserTriggerCriteriaExperimentName,
      flag_descriptions::kDefaultBrowserTriggerCriteriaExperimentDescription,
@@ -2806,8 +2810,8 @@
      flags_ui::kOsIos, FEATURE_VALUE_TYPE(kCredentialProviderSignalAPI)},
     {"migrate-account-prefs-on-mobile",
      flag_descriptions::kMigrateAccountPrefsOnMobileName,
-     flag_descriptions::kMigrateAccountPrefsOnMobileDescription, flags_ui::kOsIos,
-     FEATURE_VALUE_TYPE(syncer::kMigrateAccountPrefs)},
+     flag_descriptions::kMigrateAccountPrefsOnMobileDescription,
+     flags_ui::kOsIos, FEATURE_VALUE_TYPE(syncer::kMigrateAccountPrefs)},
 };
 
 bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index 7c285dc..053ecfadb 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -437,6 +437,11 @@
     "When enabled, the default browser banner promo will show when conditions "
     "are met.";
 
+const char kDefaultBrowserOffCyclePromoName[] =
+    "Default Browser off-cycle promo";
+const char kDefaultBrowserOffCyclePromoDescription[] =
+    "When enabled, an off-cycle default browser promo will be shown.";
+
 const char kDefaultBrowserPromoPropensityModelName[] =
     "Default Browser promo propensity model";
 const char kDefaultBrowserPromoPropensityModelDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index e1aea35..aa54e59 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -248,6 +248,9 @@
 extern const char kDefaultBrowserBannerPromoName[];
 extern const char kDefaultBrowserBannerPromoDescription[];
 
+extern const char kDefaultBrowserOffCyclePromoName[];
+extern const char kDefaultBrowserOffCyclePromoDescription[];
+
 extern const char kDefaultBrowserPromoPropensityModelName[];
 extern const char kDefaultBrowserPromoPropensityModelDescription[];
 
diff --git a/ios/chrome/browser/intelligence/bwg/ui/bwg_fre_wrapper_view_controller.mm b/ios/chrome/browser/intelligence/bwg/ui/bwg_fre_wrapper_view_controller.mm
index 143c7b5..83d3912 100644
--- a/ios/chrome/browser/intelligence/bwg/ui/bwg_fre_wrapper_view_controller.mm
+++ b/ios/chrome/browser/intelligence/bwg/ui/bwg_fre_wrapper_view_controller.mm
@@ -304,6 +304,16 @@
          kExtraSpacingTitleContent;
 }
 
+// Updates VoiceOver focus to the consent view after promo transition.
+- (void)updateAccessibilityFocus {
+  if (!_consentViewController) {
+    return;
+  }
+
+  UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification,
+                                  _consentViewController.view);
+}
+
 #pragma mark - BWGPromoViewControllerDelegate
 
 // Handles the primary action from the promo screen. It transitions the view
@@ -319,15 +329,19 @@
 
   CGFloat mainStackViewWidth = _mainStackView.frame.size.width;
   [UIView animateWithDuration:kAnimationDuration
-                        delay:0.0
-       usingSpringWithDamping:kDamping
-        initialSpringVelocity:0.0
-                      options:UIViewAnimationOptionCurveEaseInOut
-                   animations:^{
-                     weakSelf.contentScrollView.contentOffset =
-                         CGPointMake(mainStackViewWidth, 0);
-                   }
-                   completion:nil];
+      delay:0.0
+      usingSpringWithDamping:kDamping
+      initialSpringVelocity:0.0
+      options:UIViewAnimationOptionCurveEaseInOut
+      animations:^{
+        weakSelf.contentScrollView.contentOffset =
+            CGPointMake(mainStackViewWidth, 0);
+      }
+      completion:^(BOOL finished) {
+        if (finished && UIAccessibilityIsVoiceOverRunning()) {
+          [weakSelf updateAccessibilityFocus];
+        }
+      }];
 }
 
 - (void)promoViewControllerWasDismissed {
diff --git a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_entrypoint_view.mm b/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_entrypoint_view.mm
index 6caf61d..fece704 100644
--- a/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_entrypoint_view.mm
+++ b/ios/chrome/browser/intelligence/page_action_menu/ui/page_action_menu_entrypoint_view.mm
@@ -43,8 +43,8 @@
     self.pointerStyleProvider = CreateDefaultEffectCirclePointerStyleProvider();
     self.tintColor = [UIColor colorNamed:kToolbarButtonColor];
 
-    // TODO(crbug.com/420643840): Add an actual accessibiity label.
-    self.accessibilityLabel = @"Page action menu";
+    self.accessibilityLabel = l10n_util::GetNSString(
+        IDS_IOS_BWG_PAGE_ACTION_MENU_ENTRY_POINT_ACCESSIBILITY_LABEL);
 
     UIImageSymbolConfiguration* symbolConfig = [UIImageSymbolConfiguration
         configurationWithPointSize:kIconPointSize
diff --git a/ios/chrome/browser/ntp/ui_bundled/BUILD.gn b/ios/chrome/browser/ntp/ui_bundled/BUILD.gn
index 7e183ab..7c530e2 100644
--- a/ios/chrome/browser/ntp/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/ntp/ui_bundled/BUILD.gn
@@ -36,6 +36,7 @@
   deps = [
     "//base",
     "//components/sync/protocol",
+    "//ios/chrome/browser/shared/ui/util",
     "//skia",
     "//skia:skia_core_public_headers",
     "//third_party/material_color_utilities",
@@ -343,8 +344,10 @@
     "new_tab_page_coordinator_unittest.mm",
     "new_tab_page_header_view_controller_unittest.mm",
     "new_tab_page_mediator_unittest.mm",
+    "new_tab_page_trait_unittest.mm",
   ]
   deps = [
+    ":color",
     ":component_factory",
     ":coordinator",
     ":feature_flags",
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm
index 5b916bd..8113afa 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view.mm
@@ -949,7 +949,7 @@
 // set.
 - (void)applyBackgroundColors {
   NewTabPageColorPalette* colorPalette =
-      [self.traitCollection objectForTrait:NewTabPageTrait.class];
+      [self.traitCollection objectForNewTabPageTrait];
 
   if (colorPalette) {
     [_fakeLocationBar setStartColor:colorPalette.omniboxColor
@@ -1164,7 +1164,7 @@
 - (void)setFakeboxBackgroundWithProgress:(CGFloat)progress {
   UIColor* pinnedColor = [UIColor colorNamed:kTextfieldBackgroundColor];
   NewTabPageColorPalette* colorPalette =
-      [self.traitCollection objectForTrait:NewTabPageTrait.class];
+      [self.traitCollection objectForNewTabPageTrait];
 
   // Use a quadratic curve interpolation.
   progress = progress * progress;
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm
index 8f0adcd..dd48ca42 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_header_view_controller.mm
@@ -649,7 +649,7 @@
   } else {
     NewTabPageColorPalette* colorPalette =
         IsNTPBackgroundCustomizationEnabled()
-            ? [self.traitCollection objectForTrait:NewTabPageTrait.class]
+            ? [self.traitCollection objectForNewTabPageTrait]
             : nil;
     button.layer.cornerRadius = 0;
     [button setImage:nil forState:UIControlStateNormal];
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm
index aa5b01b..7a872e7 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_mediator.mm
@@ -61,6 +61,7 @@
 #import "ios/chrome/browser/shared/model/url/chrome_url_constants.h"
 #import "ios/chrome/browser/shared/model/utils/first_run_util.h"
 #import "ios/chrome/browser/shared/public/features/features.h"
+#import "ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/signin/model/authentication_service.h"
 #import "ios/chrome/browser/signin/model/chrome_account_manager_service.h"
@@ -398,8 +399,9 @@
         skia::UIColorFromSkColor(colorTheme->color()),
         ProtoEnumToSchemeVariant(colorTheme->browser_color_variant()));
 
-    [self.consumer.traitOverrides setObject:colorPalette
-                                   forTrait:NewTabPageTrait.class];
+    [[[CustomUITraitAccessor alloc]
+        initWithMutableTraits:self.consumer.traitOverrides]
+        setObjectForNewTabPageTrait:colorPalette];
     [self.consumer setBackgroundImage:nil];
     [self.headerConsumer updateLogoColor:colorPalette.tintColor];
     return;
@@ -407,8 +409,9 @@
 
   // Clears the color palette associated with the New Tab Page trait,
   // reverting to the default colors defined by the trait.
-  [self.consumer.traitOverrides setObject:[NewTabPageTrait defaultValue]
-                                 forTrait:NewTabPageTrait.class];
+  [[[CustomUITraitAccessor alloc]
+      initWithMutableTraits:self.consumer.traitOverrides]
+      setObjectForNewTabPageTrait:[NewTabPageTrait defaultValue]];
   if (!background) {
     [self.consumer setBackgroundImage:nil];
     [self.headerConsumer updateLogoColor:nil];
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm
index da681c6..e256c8e 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_quick_actions_view_controller.mm
@@ -168,7 +168,7 @@
 - (UIColor*)buttonBackgroundColor {
   NewTabPageColorPalette* colorPalette =
       IsNTPBackgroundCustomizationEnabled()
-          ? [self.traitCollection objectForTrait:NewTabPageTrait.class]
+          ? [self.traitCollection objectForNewTabPageTrait]
           : nil;
 
   if (GetNTPMIAEntrypointVariation() ==
@@ -186,7 +186,7 @@
 // set.
 - (void)applyBackgroundColors {
   NewTabPageColorPalette* colorPalette =
-      [self.traitCollection objectForTrait:NewTabPageTrait.class];
+      [self.traitCollection objectForNewTabPageTrait];
 
   _incognitoButton.backgroundColor = [self buttonBackgroundColor];
   _voiceSearchButton.backgroundColor = [self buttonBackgroundColor];
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h
index ca7658d..4024592 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h
@@ -7,9 +7,27 @@
 
 #import <UIKit/UITraitCollection.h>
 
+#import "ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h"
+
+@class NewTabPageColorPalette;
+
 // A trait definition for the New Tab Page (NTP).
 @interface NewTabPageTrait : NSObject <UIObjectTraitDefinition>
 
 @end
 
+@interface CustomUITraitAccessor (NewTabPageTrait)
+
+- (void)setObjectForNewTabPageTrait:(NewTabPageColorPalette*)object;
+
+- (NewTabPageColorPalette*)objectForNewTabPageTrait;
+
+@end
+
+@interface UITraitCollection (NewTabPageTrait)
+
+- (NewTabPageColorPalette*)objectForNewTabPageTrait;
+
+@end
+
 #endif  // IOS_CHROME_BROWSER_NTP_UI_BUNDLED_NEW_TAB_PAGE_TRAIT_H_
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.mm
index 03b9bce..a7db55a6 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.mm
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.mm
@@ -4,12 +4,37 @@
 
 #import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h"
 
+#import "base/apple/foundation_util.h"
+#import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_color_palette.h"
+
 @implementation NewTabPageTrait
 
 #pragma mark - UIObjectTraitDefinition
 
-+ (id<NSObject>)defaultValue {
++ (NewTabPageColorPalette*)defaultValue {
   return nil;
 }
 
 @end
+
+@implementation CustomUITraitAccessor (NewTabPageTrait)
+
+- (void)setObjectForNewTabPageTrait:(NewTabPageColorPalette*)object {
+  [self.mutableTraits setObject:object forTrait:[NewTabPageTrait class]];
+}
+
+- (NewTabPageColorPalette*)objectForNewTabPageTrait {
+  return base::apple::ObjCCastStrict<NewTabPageColorPalette>(
+      [self.mutableTraits objectForTrait:[NewTabPageTrait class]]);
+}
+
+@end
+
+@implementation UITraitCollection (NewTabPageTrait)
+
+- (NewTabPageColorPalette*)objectForNewTabPageTrait {
+  return base::apple::ObjCCastStrict<NewTabPageColorPalette>(
+      [self objectForTrait:[NewTabPageTrait class]]);
+}
+
+@end
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait_unittest.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait_unittest.mm
new file mode 100644
index 0000000..57e686c
--- /dev/null
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait_unittest.mm
@@ -0,0 +1,31 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_trait.h"
+
+#import "ios/chrome/browser/ntp/ui_bundled/new_tab_page_color_palette.h"
+#import "testing/gtest/include/gtest/gtest.h"
+#import "testing/gtest_mac.h"
+#import "testing/platform_test.h"
+
+// Tests for the custom NewTabPageTrait.
+class NewTabPageTraitTest : public PlatformTest {
+ public:
+  void SetUp() override { viewController_ = [[UIViewController alloc] init]; }
+
+ protected:
+  UIViewController* viewController_;
+};
+
+// Tests that setting and retrieving the palette works.
+TEST_F(NewTabPageTraitTest, TestSettingNewTabPageTrait) {
+  NewTabPageColorPalette* palette = [[NewTabPageColorPalette alloc] init];
+
+  [[[CustomUITraitAccessor alloc]
+      initWithMutableTraits:viewController_.traitOverrides]
+      setObjectForNewTabPageTrait:palette];
+
+  EXPECT_EQ(palette,
+            [viewController_.traitCollection objectForNewTabPageTrait]);
+}
diff --git a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm
index 0784621..6a19236 100644
--- a/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm
+++ b/ios/chrome/browser/ntp/ui_bundled/new_tab_page_view_controller.mm
@@ -1101,7 +1101,7 @@
 // set.
 - (void)applyBackgroundColors {
   NewTabPageColorPalette* colorPalette =
-      [self.traitCollection objectForTrait:NewTabPageTrait.class];
+      [self.traitCollection objectForNewTabPageTrait];
 
   if (colorPalette) {
     self.view.backgroundColor = colorPalette.primaryColor;
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h
index ce2b403a..f3b3edc 100644
--- a/ios/chrome/browser/shared/public/features/features.h
+++ b/ios/chrome/browser/shared/public/features/features.h
@@ -1068,4 +1068,9 @@
 // Whether the diamond prototype is enabled.
 bool IsDiamondPrototypeEnabled();
 
+// Feature flag for the Default Browser off-cycle promo.
+BASE_DECLARE_FEATURE(kIOSDefaultBrowserOffCyclePromo);
+
+bool IsDefaultBrowserOffCyclePromoEnabled();
+
 #endif  // IOS_CHROME_BROWSER_SHARED_PUBLIC_FEATURES_FEATURES_H_
diff --git a/ios/chrome/browser/shared/public/features/features.mm b/ios/chrome/browser/shared/public/features/features.mm
index 64a6220..220cbff 100644
--- a/ios/chrome/browser/shared/public/features/features.mm
+++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -1296,3 +1296,11 @@
   }
   return base::FeatureList::IsEnabled(kDiamondPrototype);
 }
+
+BASE_FEATURE(kIOSDefaultBrowserOffCyclePromo,
+             "IOSDefaultBrowserOffCyclePromo",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
+bool IsDefaultBrowserOffCyclePromoEnabled() {
+  return base::FeatureList::IsEnabled(kIOSDefaultBrowserOffCyclePromo);
+}
diff --git a/ios/chrome/browser/shared/ui/util/BUILD.gn b/ios/chrome/browser/shared/ui/util/BUILD.gn
index 6da47b9c..f13dc53 100644
--- a/ios/chrome/browser/shared/ui/util/BUILD.gn
+++ b/ios/chrome/browser/shared/ui/util/BUILD.gn
@@ -14,6 +14,8 @@
     "animation_util.mm",
     "attributed_string_util.h",
     "attributed_string_util.mm",
+    "custom_ui_trait_accessor.h",
+    "custom_ui_trait_accessor.mm",
     "dynamic_type_util.h",
     "dynamic_type_util.mm",
     "keyboard_observer_helper.h",
diff --git a/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h b/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h
new file mode 100644
index 0000000..bed20535
--- /dev/null
+++ b/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h
@@ -0,0 +1,23 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_SHARED_UI_UTIL_CUSTOM_UI_TRAIT_ACCESSOR_H_
+#define IOS_CHROME_BROWSER_SHARED_UI_UTIL_CUSTOM_UI_TRAIT_ACCESSOR_H_
+
+#import <UIKit/UIKit.h>
+
+// Wrapper class to allow extension of the `UIMutableTraits` protocol for type
+// safety.
+@interface CustomUITraitAccessor : NSObject
+
+- (instancetype)initWithMutableTraits:(id<UIMutableTraits>)mutableTraits
+    NS_DESIGNATED_INITIALIZER;
+- (instancetype)init NS_UNAVAILABLE;
+
+// The underlying mutable traits instance, for subclasses to use.
+@property(nonatomic, weak, readonly) id<UIMutableTraits> mutableTraits;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_SHARED_UI_UTIL_CUSTOM_UI_TRAIT_ACCESSOR_H_
diff --git a/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.mm b/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.mm
new file mode 100644
index 0000000..eedbddc
--- /dev/null
+++ b/ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.mm
@@ -0,0 +1,19 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/shared/ui/util/custom_ui_trait_accessor.h"
+
+#import <UIKit/UIKit.h>
+
+@implementation CustomUITraitAccessor
+
+- (instancetype)initWithMutableTraits:(id<UIMutableTraits>)mutableTraits {
+  self = [super init];
+  if (self) {
+    _mutableTraits = mutableTraits;
+  }
+  return self;
+}
+
+@end
diff --git a/ipc/BUILD.gn b/ipc/BUILD.gn
index 6b566e0..1182e91 100644
--- a/ipc/BUILD.gn
+++ b/ipc/BUILD.gn
@@ -53,10 +53,6 @@
       "ipc_sender.h",
       "ipc_sync_channel.cc",
       "ipc_sync_channel.h",
-      "message_filter.cc",
-      "message_filter.h",
-      "message_filter_router.cc",
-      "message_filter_router.h",
       "trace_ipc_message.cc",
       "trace_ipc_message.h",
       "urgent_message_observer.h",
diff --git a/ipc/ipc_channel_proxy.cc b/ipc/ipc_channel_proxy.cc
index a88a18b..d78a94e 100644
--- a/ipc/ipc_channel_proxy.cc
+++ b/ipc/ipc_channel_proxy.cc
@@ -20,8 +20,6 @@
 #include "ipc/ipc_channel_factory.h"
 #include "ipc/ipc_listener.h"
 #include "ipc/ipc_message_macros.h"
-#include "ipc/message_filter.h"
-#include "ipc/message_filter_router.h"
 #include "mojo/public/cpp/bindings/pending_associated_receiver.h"
 
 namespace IPC {
@@ -36,7 +34,6 @@
       listener_(listener),
       ipc_task_runner_(ipc_task_runner),
       channel_connected_called_(false),
-      message_filter_router_(new MessageFilterRouter()),
       peer_pid_(base::kNullProcessId) {
   DCHECK(ipc_task_runner_.get());
   // The Listener thread where Messages are handled must be a separate thread
@@ -76,15 +73,6 @@
 }
 
 bool ChannelProxy::Context::TryFilters(const Message& message) {
-  DCHECK(message_filter_router_);
-  if (message_filter_router_->TryFilters(message)) {
-    if (message.dispatch_error()) {
-      GetTaskRunner(message.routing_id())
-          ->PostTask(FROM_HERE, base::BindOnce(&Context::OnDispatchBadMessage,
-                                               this, message));
-    }
-    return true;
-  }
   return false;
 }
 
@@ -130,12 +118,6 @@
     peer_pid_ = peer_pid;
   }
 
-  // Add any pending filters.  This avoids a race condition where someone
-  // creates a ChannelProxy, calls AddFilter, and then right after starts the
-  // peer process.  The IO thread could receive a message before the task to add
-  // the filter is run on the IO thread.
-  OnAddFilter();
-
   // See above comment about using default_listener_task_runner_ here.
   default_listener_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&Context::OnDispatchConnected, this));
@@ -143,9 +125,6 @@
 
 // Called on the IPC::Channel thread
 void ChannelProxy::Context::OnChannelError() {
-  for (size_t i = 0; i < filters_.size(); ++i)
-    filters_[i]->OnChannelError();
-
   // See above comment about using default_listener_task_runner_ here.
   default_listener_task_runner_->PostTask(
       FROM_HERE, base::BindOnce(&Context::OnDispatchError, this));
@@ -172,9 +151,6 @@
     OnChannelError();
     return;
   }
-
-  for (size_t i = 0; i < filters_.size(); ++i)
-    filters_[i]->OnFilterAdded(channel_.get());
 }
 
 // Called on the IPC::Channel thread
@@ -184,22 +160,6 @@
   if (!channel_)
     return;
 
-  for (auto& filter : pending_filters_) {
-    filter->OnChannelClosing();
-    filter->OnFilterRemoved();
-  }
-  for (auto& filter : filters_) {
-    filter->OnChannelClosing();
-    filter->OnFilterRemoved();
-  }
-
-  // We don't need the filters anymore.
-  message_filter_router_->Clear();
-  filters_.clear();
-  // We don't need the lock, because at this point, the listener thread can't
-  // access it any more.
-  pending_filters_.clear();
-
   ClearChannel();
 
   // Balance with the reference taken during startup.  This may result in
@@ -222,75 +182,6 @@
     OnChannelError();
 }
 
-// Called on the IPC::Channel thread
-void ChannelProxy::Context::OnAddFilter() {
-  // Our OnChannelConnected method has not yet been called, so we can't be
-  // sure that channel_ is valid yet. When OnChannelConnected *is* called,
-  // it invokes OnAddFilter, so any pending filter(s) will be added at that
-  // time.
-  // No lock necessary for |peer_pid_| because it is only modified on this
-  // thread.
-  if (peer_pid_ == base::kNullProcessId)
-    return;
-
-  std::vector<scoped_refptr<MessageFilter> > new_filters;
-  {
-    base::AutoLock auto_lock(pending_filters_lock_);
-    new_filters.swap(pending_filters_);
-  }
-
-  for (size_t i = 0; i < new_filters.size(); ++i) {
-    filters_.push_back(new_filters[i]);
-
-    message_filter_router_->AddFilter(new_filters[i].get());
-
-    // The channel has already been created and connected, so we need to
-    // inform the filters right now.
-    new_filters[i]->OnFilterAdded(channel_.get());
-    new_filters[i]->OnChannelConnected(peer_pid_);
-  }
-}
-
-// Called on the IPC::Channel thread
-void ChannelProxy::Context::OnRemoveFilter(MessageFilter* filter) {
-  // No lock necessary for |peer_pid_| because it is only modified on this
-  // thread.
-  if (peer_pid_ == base::kNullProcessId) {
-    // The channel is not yet connected, so any filters are still pending.
-    base::AutoLock auto_lock(pending_filters_lock_);
-    for (size_t i = 0; i < pending_filters_.size(); ++i) {
-      if (pending_filters_[i].get() == filter) {
-        filter->OnFilterRemoved();
-        pending_filters_.erase(pending_filters_.begin() + i);
-        return;
-      }
-    }
-    return;
-  }
-  if (!channel_)
-    return;  // The filters have already been deleted.
-
-  message_filter_router_->RemoveFilter(filter);
-
-  for (size_t i = 0; i < filters_.size(); ++i) {
-    if (filters_[i].get() == filter) {
-      filter->OnFilterRemoved();
-      filters_.erase(filters_.begin() + i);
-      return;
-    }
-  }
-
-  NOTREACHED() << "filter to be removed not found";
-}
-
-// Called on the listener's thread
-void ChannelProxy::Context::AddFilter(MessageFilter* filter) {
-  base::AutoLock auto_lock(pending_filters_lock_);
-  pending_filters_.push_back(base::WrapRefCounted(filter));
-  ipc_task_runner_->PostTask(FROM_HERE,
-                             base::BindOnce(&Context::OnAddFilter, this));
-}
-
 // Called on the listener's thread
 void ChannelProxy::Context::OnDispatchMessage(const Message& message) {
   if (!listener_)
@@ -530,20 +421,6 @@
   context_->Send(message);
 }
 
-void ChannelProxy::AddFilter(MessageFilter* filter) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  context_->AddFilter(filter);
-}
-
-void ChannelProxy::RemoveFilter(MessageFilter* filter) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-
-  context_->ipc_task_runner()->PostTask(
-      FROM_HERE, base::BindOnce(&Context::OnRemoveFilter, context_,
-                                base::RetainedRef(filter)));
-}
-
 void ChannelProxy::AddGenericAssociatedInterfaceForIOThread(
     const std::string& name,
     const GenericAssociatedInterfaceFactory& factory) {
diff --git a/ipc/ipc_channel_proxy.h b/ipc/ipc_channel_proxy.h
index dc1852d..65c103c 100644
--- a/ipc/ipc_channel_proxy.h
+++ b/ipc/ipc_channel_proxy.h
@@ -39,8 +39,6 @@
 namespace IPC {
 
 class ChannelFactory;
-class MessageFilter;
-class MessageFilterRouter;
 class UrgentMessageObserver;
 
 //-----------------------------------------------------------------------------
@@ -61,13 +59,6 @@
 // channel will not get cycles to flush its message queue until the thread, on
 // which it is running, returns to its message loop.)
 //
-// An IPC::ChannelProxy can have a MessageFilter associated with it, which will
-// be notified of incoming messages on the IPC::Channel's thread.  This gives
-// the consumer of IPC::ChannelProxy the ability to respond to incoming
-// messages on this background thread instead of on their own thread, which may
-// be bogged down with other processing.  The result can be greatly improved
-// latency for messages that can be handled on a background thread.
-//
 // The consumer of IPC::ChannelProxy is responsible for allocating the Thread
 // instance where the IPC::Channel will be created and operated.
 //
@@ -137,29 +128,12 @@
   // Close the IPC::Channel.  This operation completes asynchronously, once the
   // background thread processes the command to close the channel.  It is ok to
   // call this method multiple times.  Redundant calls are ignored.
-  //
-  // WARNING: MessageFilter objects held by the ChannelProxy is also
-  // released asynchronously, and it may in fact have its final reference
-  // released on the background thread.  The caller should be careful to deal
-  // with / allow for this possibility.
   void Close();
 
   // Send a message asynchronously.  The message is routed to the background
   // thread where it is passed to the IPC::Channel's Send method.
   bool Send(Message* message) override;
 
-  // Used to intercept messages as they are received on the background thread.
-  //
-  // Ordinarily, messages sent to the ChannelProxy are routed to the matching
-  // listener on the worker thread.  This API allows code to intercept messages
-  // before they are sent to the worker thread.
-  // If you call this before the target process is launched, then you're
-  // guaranteed to not miss any messages.  But if you call this anytime after,
-  // then some messages might be missed since the filter is added internally on
-  // the IO thread.
-  void AddFilter(MessageFilter* filter);
-  void RemoveFilter(MessageFilter* filter);
-
   // Set the `UrgentMessageObserver` for the channel. Must be called on the
   // proxy thread before initialization.
   void SetUrgentMessageObserver(UrgentMessageObserver* observer);
@@ -314,11 +288,8 @@
 
     // Methods called on the IO thread.
     void OnSendMessage(std::unique_ptr<Message> message_ptr);
-    void OnAddFilter();
-    void OnRemoveFilter(MessageFilter* filter);
 
     // Methods called on the listener thread.
-    void AddFilter(MessageFilter* filter);
     void OnDispatchConnected();
     void OnDispatchError();
     void OnDispatchBadMessage(const Message& message);
@@ -346,8 +317,6 @@
     scoped_refptr<base::SingleThreadTaskRunner> default_listener_task_runner_;
     raw_ptr<Listener> listener_;
 
-    // List of filters.  This is only accessed on the IPC thread.
-    std::vector<scoped_refptr<MessageFilter> > filters_;
     scoped_refptr<base::SingleThreadTaskRunner> ipc_task_runner_;
 
     // Note, channel_ may be set on the Listener thread or the IPC thread.
@@ -361,14 +330,7 @@
     // thread-safe send.
     base::Lock channel_lifetime_lock_;
 
-    // Routes a given message to a proper subset of |filters_|, depending
-    // on which message classes a filter might support.
-    std::unique_ptr<MessageFilterRouter> message_filter_router_;
-
-    // Holds filters between the AddFilter call on the listerner thread and the
-    // IPC thread when they're added to filters_.
-    std::vector<scoped_refptr<MessageFilter> > pending_filters_;
-    // Lock for pending_filters_.
+    // Lock for pending_io_thread_interfaces_ (formerly for pending_filters_)
     base::Lock pending_filters_lock_;
 
     // Cached copy of the peer process ID. Set on IPC but read on both IPC and
diff --git a/ipc/ipc_channel_proxy_unittest.cc b/ipc/ipc_channel_proxy_unittest.cc
index 6d5b2bfd..08b7172 100644
--- a/ipc/ipc_channel_proxy_unittest.cc
+++ b/ipc/ipc_channel_proxy_unittest.cc
@@ -17,7 +17,6 @@
 #include "build/build_config.h"
 #include "ipc/ipc_message.h"
 #include "ipc/ipc_test_base.h"
-#include "ipc/message_filter.h"
 
 // Get basic type definitions.
 #define IPC_MESSAGE_IMPL
@@ -129,108 +128,6 @@
   raw_ptr<IPC::Channel> channel_ = nullptr;
 };
 
-class MessageCountFilter : public IPC::MessageFilter {
- public:
-  enum FilterEvent {
-    NONE,
-    FILTER_ADDED,
-    CHANNEL_CONNECTED,
-    CHANNEL_ERROR,
-    CHANNEL_CLOSING,
-    FILTER_REMOVED
-  };
-
-  MessageCountFilter() = default;
-  MessageCountFilter(uint32_t supported_message_class)
-      : supported_message_class_(supported_message_class),
-        is_global_filter_(false) {}
-
-  void OnFilterAdded(IPC::Channel* channel) override {
-    EXPECT_TRUE(channel);
-    EXPECT_EQ(NONE, last_filter_event_);
-    last_filter_event_ = FILTER_ADDED;
-  }
-
-  void OnChannelConnected(int32_t peer_pid) override {
-    EXPECT_EQ(FILTER_ADDED, last_filter_event_);
-    EXPECT_NE(static_cast<int32_t>(base::kNullProcessId), peer_pid);
-    last_filter_event_ = CHANNEL_CONNECTED;
-  }
-
-  void OnChannelError() override {
-    EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
-    last_filter_event_ = CHANNEL_ERROR;
-  }
-
-  void OnChannelClosing() override {
-    // We may or may not have gotten OnChannelError; if not, the last event has
-    // to be OnChannelConnected.
-    EXPECT_NE(FILTER_REMOVED, last_filter_event_);
-    if (last_filter_event_ != CHANNEL_ERROR)
-      EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
-    last_filter_event_ = CHANNEL_CLOSING;
-  }
-
-  void OnFilterRemoved() override {
-    // A filter may be removed at any time, even before the channel is connected
-    // (and thus before OnFilterAdded is ever able to dispatch.) The only time
-    // we won't see OnFilterRemoved is immediately after OnFilterAdded, because
-    // OnChannelConnected is always the next event to fire after that.
-    EXPECT_NE(FILTER_ADDED, last_filter_event_);
-    last_filter_event_ = FILTER_REMOVED;
-  }
-
-  bool OnMessageReceived(const IPC::Message& message) override {
-    // We should always get the OnFilterAdded and OnChannelConnected events
-    // prior to any messages.
-    EXPECT_EQ(CHANNEL_CONNECTED, last_filter_event_);
-
-    if (!is_global_filter_) {
-      EXPECT_EQ(supported_message_class_, IPC_MESSAGE_CLASS(message));
-    }
-    ++messages_received_;
-
-    if (!message_filtering_enabled_)
-      return false;
-
-    bool handled = true;
-    IPC_BEGIN_MESSAGE_MAP(MessageCountFilter, message)
-      IPC_MESSAGE_HANDLER(TestMsg_BadMessage, OnBadMessage)
-      IPC_MESSAGE_UNHANDLED(handled = false)
-    IPC_END_MESSAGE_MAP()
-    return handled;
-  }
-
-  void OnBadMessage(const BadType& bad_type) {
-    // Should never be called since IPC wouldn't be deserialized correctly.
-    NOTREACHED();
-  }
-
-  bool GetSupportedMessageClasses(
-      std::vector<uint32_t>* supported_message_classes) const override {
-    if (is_global_filter_)
-      return false;
-    supported_message_classes->push_back(supported_message_class_);
-    return true;
-  }
-
-  void set_message_filtering_enabled(bool enabled) {
-    message_filtering_enabled_ = enabled;
-  }
-
-  size_t messages_received() const { return messages_received_; }
-  FilterEvent last_filter_event() const { return last_filter_event_; }
-
- private:
-  ~MessageCountFilter() override = default;
-
-  size_t messages_received_ = 0;
-  uint32_t supported_message_class_ = 0;
-  bool is_global_filter_ = true;
-
-  FilterEvent last_filter_event_ = NONE;
-  bool message_filtering_enabled_ = false;
-};
 
 class IPCChannelProxyTest : public IPCChannelMojoTestBase {
  public:
@@ -280,108 +177,6 @@
   std::unique_ptr<IPC::ChannelProxy> channel_proxy_;
 };
 
-TEST_F(IPCChannelProxyTest, MessageClassFilters) {
-  // Construct a filter per message class.
-  std::vector<scoped_refptr<MessageCountFilter>> class_filters;
-  class_filters.push_back(
-      base::MakeRefCounted<MessageCountFilter>(TestMsgStart));
-  class_filters.push_back(
-      base::MakeRefCounted<MessageCountFilter>(AutomationMsgStart));
-  for (size_t i = 0; i < class_filters.size(); ++i)
-    channel_proxy()->AddFilter(class_filters[i].get());
-
-  // Send a message for each class; each filter should receive just one message.
-  sender()->Send(new TestMsg_Bounce);
-  sender()->Send(new AutomationMsg_Bounce);
-
-  // Send some messages not assigned to a specific or valid message class.
-  sender()->Send(new WorkerMsg_Bounce);
-
-  // Each filter should have received just the one sent message of the
-  // corresponding class.
-  SendQuitMessageAndWaitForIdle();
-  for (size_t i = 0; i < class_filters.size(); ++i)
-    EXPECT_EQ(1U, class_filters[i]->messages_received());
-}
-
-TEST_F(IPCChannelProxyTest, GlobalAndMessageClassFilters) {
-  // Add a class and global filter.
-  scoped_refptr<MessageCountFilter> class_filter(
-      new MessageCountFilter(TestMsgStart));
-  class_filter->set_message_filtering_enabled(false);
-  channel_proxy()->AddFilter(class_filter.get());
-
-  scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter());
-  global_filter->set_message_filtering_enabled(false);
-  channel_proxy()->AddFilter(global_filter.get());
-
-  // A message  of class Test should be seen by both the global filter and
-  // Test-specific filter.
-  sender()->Send(new TestMsg_Bounce);
-
-  // A message of a different class should be seen only by the global filter.
-  sender()->Send(new AutomationMsg_Bounce);
-
-  // Flush all messages.
-  SendQuitMessageAndWaitForIdle();
-
-  // The class filter should have received only the class-specific message.
-  EXPECT_EQ(1U, class_filter->messages_received());
-
-  // The global filter should have received both messages, as well as the final
-  // QUIT message.
-  EXPECT_EQ(3U, global_filter->messages_received());
-}
-
-TEST_F(IPCChannelProxyTest, FilterRemoval) {
-  // Add a class and global filter.
-  scoped_refptr<MessageCountFilter> class_filter(
-      new MessageCountFilter(TestMsgStart));
-  scoped_refptr<MessageCountFilter> global_filter(new MessageCountFilter());
-
-  // Add and remove both types of filters.
-  channel_proxy()->AddFilter(class_filter.get());
-  channel_proxy()->AddFilter(global_filter.get());
-  channel_proxy()->RemoveFilter(global_filter.get());
-  channel_proxy()->RemoveFilter(class_filter.get());
-
-  // Send some messages; they should not be seen by either filter.
-  sender()->Send(new TestMsg_Bounce);
-  sender()->Send(new AutomationMsg_Bounce);
-
-  // Ensure that the filters were removed and did not receive any messages.
-  SendQuitMessageAndWaitForIdle();
-  EXPECT_EQ(MessageCountFilter::FILTER_REMOVED,
-            global_filter->last_filter_event());
-  EXPECT_EQ(MessageCountFilter::FILTER_REMOVED,
-            class_filter->last_filter_event());
-  EXPECT_EQ(0U, class_filter->messages_received());
-  EXPECT_EQ(0U, global_filter->messages_received());
-}
-
-TEST_F(IPCChannelProxyTest, BadMessageOnListenerThread) {
-  scoped_refptr<MessageCountFilter> class_filter(
-      new MessageCountFilter(TestMsgStart));
-  class_filter->set_message_filtering_enabled(false);
-  channel_proxy()->AddFilter(class_filter.get());
-
-  sender()->Send(new TestMsg_SendBadMessage());
-
-  SendQuitMessageAndWaitForIdle();
-  EXPECT_TRUE(DidListenerGetBadMessage());
-}
-
-TEST_F(IPCChannelProxyTest, BadMessageOnIPCThread) {
-  scoped_refptr<MessageCountFilter> class_filter(
-      new MessageCountFilter(TestMsgStart));
-  class_filter->set_message_filtering_enabled(true);
-  channel_proxy()->AddFilter(class_filter.get());
-
-  sender()->Send(new TestMsg_SendBadMessage());
-
-  SendQuitMessageAndWaitForIdle();
-  EXPECT_TRUE(DidListenerGetBadMessage());
-}
 
 class IPCChannelBadMessageTest : public IPCChannelMojoTestBase {
  public:
diff --git a/ipc/ipc_mojo_bootstrap.h b/ipc/ipc_mojo_bootstrap.h
index c5d1a33..bd5ccd4 100644
--- a/ipc/ipc_mojo_bootstrap.h
+++ b/ipc/ipc_mojo_bootstrap.h
@@ -25,13 +25,8 @@
 
 class UrgentMessageObserver;
 
-// Incoming legacy IPCs have always been dispatched to one of two threads: the
-// IO thread (when an installed MessageFilter handles the message), or the
-// thread which owns the corresponding ChannelProxy receiving the message. There
-// were no other places to route legacy IPC messages, so when a message arrived
-// the legacy IPC system would run through its MessageFilters and if the message
-// was still unhandled, it would be posted to the ChannelProxy thread for
-// further processing.
+// Incoming legacy IPCs are now always dispatched to the thread which owns
+// the corresponding ChannelProxy receiving the message.
 //
 // Mojo on the other hand allows for mutually associated endpoints (that is,
 // endpoints which locally share the same message pipe) to span any number of
diff --git a/ipc/message_filter.cc b/ipc/message_filter.cc
deleted file mode 100644
index 714fd436..0000000
--- a/ipc/message_filter.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ipc/message_filter.h"
-
-#include <stdint.h>
-
-#include "base/memory/ref_counted.h"
-#include "ipc/ipc_channel.h"
-
-namespace IPC {
-
-MessageFilter::MessageFilter() = default;
-
-void MessageFilter::OnFilterAdded(Channel* channel) {}
-
-void MessageFilter::OnFilterRemoved() {}
-
-void MessageFilter::OnChannelConnected(int32_t peer_pid) {}
-
-void MessageFilter::OnChannelError() {}
-
-void MessageFilter::OnChannelClosing() {}
-
-bool MessageFilter::OnMessageReceived(const Message& message) {
-  return false;
-}
-
-bool MessageFilter::GetSupportedMessageClasses(
-    std::vector<uint32_t>* /*supported_message_classes*/) const {
-  return false;
-}
-
-MessageFilter::~MessageFilter() = default;
-
-}  // namespace IPC
diff --git a/ipc/message_filter.h b/ipc/message_filter.h
deleted file mode 100644
index 55e13105..0000000
--- a/ipc/message_filter.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IPC_MESSAGE_FILTER_H_
-#define IPC_MESSAGE_FILTER_H_
-
-#include <stdint.h>
-
-#include <vector>
-
-#include "base/component_export.h"
-#include "base/memory/ref_counted.h"
-#include "ipc/ipc_channel.h"
-
-namespace IPC {
-
-class Message;
-
-// A class that receives messages on the thread where the IPC channel is
-// running.  It can choose to prevent the default action for an IPC message.
-class COMPONENT_EXPORT(IPC) MessageFilter
-    : public base::RefCountedThreadSafe<MessageFilter> {
- public:
-  MessageFilter();
-
-  // Called on the background thread to provide the filter with access to the
-  // channel.  Called when the IPC channel is initialized or when AddFilter
-  // is called if the channel is already initialized.
-  virtual void OnFilterAdded(Channel* channel);
-
-  // Called on the background thread when the filter has been removed from
-  // the ChannelProxy and when the Channel is closing.  After a filter is
-  // removed, it will not be called again.
-  virtual void OnFilterRemoved();
-
-  // Called to inform the filter that the IPC channel is connected and we
-  // have received the internal Hello message from the peer.
-  virtual void OnChannelConnected(int32_t peer_pid);
-
-  // Called when there is an error on the channel, typically that the channel
-  // has been closed.
-  virtual void OnChannelError();
-
-  // Called to inform the filter that the IPC channel will be destroyed.
-  // OnFilterRemoved is called immediately after this.
-  virtual void OnChannelClosing();
-
-  // Return true to indicate that the message was handled, or false to let
-  // the message be handled in the default way.
-  virtual bool OnMessageReceived(const Message& message);
-
-  // Called to query the Message classes supported by the filter.  Return
-  // false to indicate that all message types should reach the filter, or true
-  // if the resulting contents of |supported_message_classes| may be used to
-  // selectively offer messages of a particular class to the filter.
-  virtual bool GetSupportedMessageClasses(
-      std::vector<uint32_t>* supported_message_classes) const;
-
- protected:
-  virtual ~MessageFilter();
-
- private:
-  friend class base::RefCountedThreadSafe<MessageFilter>;
-};
-
-}  // namespace IPC
-
-#endif  // IPC_MESSAGE_FILTER_H_
diff --git a/ipc/message_filter_router.cc b/ipc/message_filter_router.cc
deleted file mode 100644
index 1738b1e..0000000
--- a/ipc/message_filter_router.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-
-#include "ipc/message_filter_router.h"
-
-#include <stddef.h>
-#include <stdint.h>
-
-#include "ipc/ipc_message_macros.h"
-#include "ipc/ipc_message_start.h"
-#include "ipc/ipc_message_utils.h"
-#include "ipc/message_filter.h"
-
-namespace IPC {
-
-namespace {
-
-bool TryFiltersImpl(MessageFilterRouter::MessageFilters& filters,
-                    const IPC::Message& message) {
-  for (size_t i = 0; i < filters.size(); ++i) {
-    if (filters[i]->OnMessageReceived(message)) {
-      return true;
-    }
-  }
-  return false;
-}
-
-bool RemoveFilterImpl(MessageFilterRouter::MessageFilters& filters,
-                      MessageFilter* filter) {
-  return std::erase(filters, filter) > 0;
-}
-
-bool ValidMessageClass(int message_class) {
-  return message_class >= 0 && message_class < LastIPCMsgStart;
-}
-
-}  // namespace
-
-MessageFilterRouter::MessageFilterRouter() = default;
-MessageFilterRouter::~MessageFilterRouter() = default;
-
-void MessageFilterRouter::AddFilter(MessageFilter* filter) {
-  // Determine if the filter should be applied to all messages, or only
-  // messages of a certain class.
-  std::vector<uint32_t> supported_message_classes;
-  if (filter->GetSupportedMessageClasses(&supported_message_classes)) {
-    for (size_t i = 0; i < supported_message_classes.size(); ++i) {
-      const int message_class = supported_message_classes[i];
-      DCHECK(ValidMessageClass(message_class));
-      // Safely ignore repeated subscriptions to a given message class for the
-      // current filter being added.
-      if (!message_class_filters_[message_class].empty() &&
-          message_class_filters_[message_class].back() == filter) {
-        continue;
-      }
-      message_class_filters_[message_class].push_back(filter);
-    }
-  } else {
-    global_filters_.push_back(filter);
-  }
-}
-
-void MessageFilterRouter::RemoveFilter(MessageFilter* filter) {
-  if (RemoveFilterImpl(global_filters_, filter))
-    return;
-
-  for (size_t i = 0; i < std::size(message_class_filters_); ++i)
-    RemoveFilterImpl(message_class_filters_[i], filter);
-}
-
-bool MessageFilterRouter::TryFilters(const Message& message) {
-  if (TryFiltersImpl(global_filters_, message))
-    return true;
-
-  const int message_class = IPC_MESSAGE_CLASS(message);
-  if (!ValidMessageClass(message_class))
-    return false;
-
-  return TryFiltersImpl(message_class_filters_[message_class], message);
-}
-
-void MessageFilterRouter::Clear() {
-  global_filters_.clear();
-  for (size_t i = 0; i < std::size(message_class_filters_); ++i)
-    message_class_filters_[i].clear();
-}
-
-}  // namespace IPC
diff --git a/ipc/message_filter_router.h b/ipc/message_filter_router.h
deleted file mode 100644
index 84fd39c..0000000
--- a/ipc/message_filter_router.h
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2014 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IPC_MESSAGE_FILTER_ROUTER_H_
-#define IPC_MESSAGE_FILTER_ROUTER_H_
-
-#include <array>
-#include <vector>
-
-#include "base/memory/raw_ptr.h"
-#include "ipc/ipc_message_start.h"
-
-namespace IPC {
-
-class Message;
-class MessageFilter;
-
-class MessageFilterRouter {
- public:
-  typedef std::vector<raw_ptr<MessageFilter, VectorExperimental>>
-      MessageFilters;
-
-  MessageFilterRouter();
-  ~MessageFilterRouter();
-
-  void AddFilter(MessageFilter* filter);
-  void RemoveFilter(MessageFilter* filter);
-  bool TryFilters(const Message& message);
-  void Clear();
-
- private:
-  // List of global and selective filters; a given filter will exist in either
-  // |message_global_filters_| OR |message_class_filters_|, but not both.
-  // Note that |message_global_filters_| will be given first offering of any
-  // given message.  It's the filter implementer and installer's
-  // responsibility to ensure that a filter is either global or selective to
-  // ensure proper message filtering order.
-  MessageFilters global_filters_;
-  std::array<MessageFilters, LastIPCMsgStart> message_class_filters_;
-};
-
-}  // namespace IPC
-
-#endif  // IPC_MESSAGE_FILTER_ROUTER_H_
diff --git a/media/BUILD.gn b/media/BUILD.gn
index 05fd55e..13b51f40 100644
--- a/media/BUILD.gn
+++ b/media/BUILD.gn
@@ -143,7 +143,7 @@
     "//ui/events:events_base",
     "//ui/gfx",
     "//ui/gfx/geometry",
-    "//ui/gl:gl",
+    "//ui/gl",
     "//url",
   ]
 
diff --git a/media/audio/BUILD.gn b/media/audio/BUILD.gn
index e2e8e31..adb7e04 100644
--- a/media/audio/BUILD.gn
+++ b/media/audio/BUILD.gn
@@ -145,7 +145,7 @@
     "//build:chromecast_buildflags",
     "//media/base",
     "//third_party/flac",
-    "//third_party/opus:opus",
+    "//third_party/opus",
     "//url",
   ]
   libs = []
@@ -462,7 +462,7 @@
     "//media:test_support",
     "//testing/gmock",
     "//testing/gtest",
-    "//third_party/opus:opus",
+    "//third_party/opus",
     "//url",
   ]
 
@@ -479,7 +479,7 @@
       "android/audio_device_unittest.cc",
     ]
     deps += [
-      "//media/gpu:gpu",
+      "//media/gpu",
       "//ui/gl",
     ]
   }
@@ -540,7 +540,7 @@
       "win/test_support/wasapi_test_error_code.h",
     ]
 
-    deps += [ "//media/gpu:gpu" ]
+    deps += [ "//media/gpu" ]
   }
 
   if (is_fuchsia) {
diff --git a/media/base/BUILD.gn b/media/base/BUILD.gn
index 6cf9fa7..5ba5a2e2 100644
--- a/media/base/BUILD.gn
+++ b/media/base/BUILD.gn
@@ -402,7 +402,7 @@
   defines = []
   public_deps = [
     ":video_facing",
-    "//gpu/command_buffer/client:client",
+    "//gpu/command_buffer/client",
     "//media:media_buildflags",
     "//media/gpu:buildflags",
     "//media/mojo:buildflags",
@@ -416,17 +416,17 @@
     "//gpu/command_buffer/client:interface_base",
     "//gpu/command_buffer/client:raster_interface",
     "//gpu/command_buffer/common",
-    "//gpu/ipc/common:common",
+    "//gpu/ipc/common",
     "//media/cdm:clear_key_cdm_common",
     "//net",
     "//skia",
     "//third_party/libyuv",
     "//third_party/widevine/cdm:headers",
-    "//ui/display:display",
-    "//ui/events:events",
+    "//ui/display",
+    "//ui/events",
     "//ui/events:events_base",
     "//ui/events:keyboard_hook",
-    "//url:url",
+    "//url",
   ]
 
   libs = []
diff --git a/media/capture/BUILD.gn b/media/capture/BUILD.gn
index 92eeda5..ab0b9d14 100644
--- a/media/capture/BUILD.gn
+++ b/media/capture/BUILD.gn
@@ -102,7 +102,7 @@
     "//base",
     "//base:i18n",
     "//gpu/command_buffer/client",
-    "//gpu/ipc/common:common",
+    "//gpu/ipc/common",
     "//media",
     "//media/capture:capture_gpu_channel",
     "//media/capture:capture_switches",
@@ -355,7 +355,7 @@
       "//components/chromeos_camera/common",
       "//components/device_event_log",
       "//gpu/ipc/client",
-      "//gpu/ipc/common:common",
+      "//gpu/ipc/common",
       "//media/capture/video/chromeos/mojom:cros_camera",
       "//media/capture/video/chromeos/mojom:document_scanner",
       "//media/capture/video/chromeos/mojom:jpeg_accelerator",
@@ -429,7 +429,7 @@
     ":capture_lib",
     "//base/test:test_support",
     "//gpu/command_buffer/client",
-    "//gpu/command_buffer/common:common",
+    "//gpu/command_buffer/common",
     "//media:test_support",
     "//media/capture/mojom:image_capture",
     "//media/capture/mojom:image_capture_types",
@@ -502,7 +502,7 @@
     "//services/video_effects/buildflags",
     "//testing/gmock",
     "//testing/gtest",
-    "//third_party/libyuv:libyuv",
+    "//third_party/libyuv",
     "//ui/gfx:test_support",
   ]
 
diff --git a/media/capture/mojom/BUILD.gn b/media/capture/mojom/BUILD.gn
index 60e41d0b..4d97fe2 100644
--- a/media/capture/mojom/BUILD.gn
+++ b/media/capture/mojom/BUILD.gn
@@ -27,7 +27,7 @@
   public_deps = [
     ":video_capture_types",
     "//gpu/ipc/common:interfaces",
-    "//media//mojo/mojom:mojom",
+    "//media//mojo/mojom",
     "//mojo/public/mojom/base",
     "//services/viz/public/mojom:shared_image_format",
     "//ui/gfx/geometry/mojom",
diff --git a/media/capture/video/win/BUILD.gn b/media/capture/video/win/BUILD.gn
index 4122480..5b513af6 100644
--- a/media/capture/video/win/BUILD.gn
+++ b/media/capture/video/win/BUILD.gn
@@ -85,7 +85,7 @@
     "//base/test:test_support",
     "//gpu/command_buffer/client",
     "//media:test_support",
-    "//media/capture:capture",
+    "//media/capture",
     "//media/capture:test_support",
     "//media/capture/mojom:image_capture",
     "//media/capture/mojom:image_capture_types",
@@ -93,7 +93,7 @@
     "//services/video_capture/public/mojom",
     "//testing/gmock",
     "//testing/gtest",
-    "//third_party/libyuv:libyuv",
+    "//third_party/libyuv",
     "//ui/gfx:test_support",
   ]
 
diff --git a/media/cast/BUILD.gn b/media/cast/BUILD.gn
index 7fa20a0c..06cba8e 100644
--- a/media/cast/BUILD.gn
+++ b/media/cast/BUILD.gn
@@ -196,7 +196,7 @@
     ":encoding",
     ":sender",
     "//base/test:test_support",
-    "//components/openscreen_platform:openscreen_platform",
+    "//components/openscreen_platform",
     "//media",
     "//media:test_support",
     "//testing/gmock",
diff --git a/media/cdm/BUILD.gn b/media/cdm/BUILD.gn
index 1e23eda6..29d1930 100644
--- a/media/cdm/BUILD.gn
+++ b/media/cdm/BUILD.gn
@@ -18,7 +18,7 @@
     ]
     configs += [ "//media:subcomponent_config" ]
   } else {
-    visibility = [ "//media/cdm/library_cdm/clear_key_cdm:clear_key_cdm" ]
+    visibility = [ "//media/cdm/library_cdm/clear_key_cdm" ]
   }
 
   sources = [
diff --git a/media/filters/BUILD.gn b/media/filters/BUILD.gn
index a4a1734..c490809 100644
--- a/media/filters/BUILD.gn
+++ b/media/filters/BUILD.gn
@@ -94,7 +94,7 @@
     "//media/video",
     "//net",
     "//third_party/libyuv",
-    "//ui/gfx/geometry:geometry",
+    "//ui/gfx/geometry",
   ]
 
   libs = []
@@ -340,7 +340,7 @@
 
   deps = [
     "//base/test:test_support",
-    "//crypto:crypto",
+    "//crypto",
     "//media:test_support",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/media/formats/BUILD.gn b/media/formats/BUILD.gn
index 578baa1..4a9ebec 100644
--- a/media/formats/BUILD.gn
+++ b/media/formats/BUILD.gn
@@ -244,7 +244,7 @@
     "hls/variant_stream.h",
   ]
   deps += [
-    "//crypto:crypto",
+    "//crypto",
     "//third_party/re2",
   ]
   public_deps = [
diff --git a/media/fuchsia/video/BUILD.gn b/media/fuchsia/video/BUILD.gn
index caaf4d6..58ace35 100644
--- a/media/fuchsia/video/BUILD.gn
+++ b/media/fuchsia/video/BUILD.gn
@@ -41,7 +41,7 @@
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.mediacodec:fuchsia.mediacodec_hlcpp",
     "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.sysmem:fuchsia.sysmem_hlcpp",
     "//third_party/fuchsia-sdk/sdk/pkg/sys_cpp",
-    "//third_party/libyuv:libyuv",
+    "//third_party/libyuv",
     "//ui/ozone",
   ]
 }
diff --git a/media/gpu/BUILD.gn b/media/gpu/BUILD.gn
index eed8029..67d06ff3 100644
--- a/media/gpu/BUILD.gn
+++ b/media/gpu/BUILD.gn
@@ -188,11 +188,11 @@
       # TODO(crbug.com/40552063): This can be removed once CdmManager is removed.
       "//gpu/ipc/common",
       "//media/mojo:buildflags",
-      "//services/service_manager/public/cpp:cpp",
+      "//services/service_manager/public/cpp",
       "//third_party/libgav1:libgav1_parser",
     ]
     if (enable_vulkan) {
-      deps += [ "//gpu/vulkan:vulkan" ]
+      deps += [ "//gpu/vulkan" ]
     }
   }
 
@@ -306,7 +306,7 @@
       ]
     }
     deps += [
-      "//gpu/ipc/common:common",
+      "//gpu/ipc/common",
       "//media/base/win:color_space_util_win",
       "//third_party/angle:includes",
       "//third_party/libaom:libaomrc",
@@ -604,7 +604,7 @@
       "//media:test_support",
       "//testing/gmock",
       "//testing/gtest",
-      "//third_party/libyuv:libyuv",
+      "//third_party/libyuv",
       "//ui/gl",
       "//ui/gl/init",
     ]
diff --git a/media/gpu/chromeos/BUILD.gn b/media/gpu/chromeos/BUILD.gn
index e9723a5..4a6e17c 100644
--- a/media/gpu/chromeos/BUILD.gn
+++ b/media/gpu/chromeos/BUILD.gn
@@ -35,7 +35,7 @@
     "//media/gpu:buildflags",
     "//media/gpu:command_buffer_helper",
     "//media/gpu:common",
-    "//media/mojo/common:common",
+    "//media/mojo/common",
   ]
 
   if (use_vaapi) {
@@ -104,7 +104,7 @@
     ":video_frame_resource",
     ":video_frame_utils",
     "//gpu/ipc/service",
-    "//media/mojo/mojom:mojom",
+    "//media/mojo/mojom",
     "//ui/ozone",
   ]
 
@@ -112,7 +112,7 @@
     ":fourcc",
     "//base",
     "//build/config/linux/libdrm",
-    "//gpu/ipc/common:common",
+    "//gpu/ipc/common",
     "//media",
     "//media/gpu:buffer_validation",
     "//media/gpu:buildflags",
@@ -135,7 +135,7 @@
     ]
     deps += [
       "//gpu/command_buffer/service:gles2",
-      "//gpu/vulkan/init:init",
+      "//gpu/vulkan/init",
     ]
   }
 
@@ -196,7 +196,7 @@
     "//base",
     "//build/config/linux/libdrm",
     "//components/viz/common:shared_image_format",
-    "//gpu/ipc/common:common",
+    "//gpu/ipc/common",
     "//media",
     "//media/gpu:buffer_validation",
     "//media/gpu:common",
@@ -244,7 +244,7 @@
     "//base/test:test_support",
     "//build/config/linux/libdrm",
     "//gpu:test_support",
-    "//gpu/ipc/service:service",
+    "//gpu/ipc/service",
     "//media",
     "//media:test_support",
     "//media/gpu:buildflags",
@@ -317,7 +317,7 @@
     "//ui/gl:test_support",
   ]
   if (use_vaapi) {
-    deps += [ "//media/gpu/vaapi:vaapi" ]
+    deps += [ "//media/gpu/vaapi" ]
   }
   if (use_v4l2_codec) {
     deps += [ "//media/gpu/v4l2" ]
diff --git a/media/gpu/sandbox/BUILD.gn b/media/gpu/sandbox/BUILD.gn
index 67b4c62..7987b932 100644
--- a/media/gpu/sandbox/BUILD.gn
+++ b/media/gpu/sandbox/BUILD.gn
@@ -17,7 +17,7 @@
   deps = [
     "//base",
     "//media/gpu:buildflags",
-    "//sandbox/policy:policy",
+    "//sandbox/policy",
   ]
   if (use_vaapi) {
     deps += [ "//media/gpu/vaapi:common" ]
diff --git a/media/gpu/test/BUILD.gn b/media/gpu/test/BUILD.gn
index 6ad942f..68bb3a3d 100644
--- a/media/gpu/test/BUILD.gn
+++ b/media/gpu/test/BUILD.gn
@@ -129,7 +129,7 @@
     "video_frame_helpers.h",
   ]
   deps = [
-    "//base:base",
+    "//base",
     "//base/test:test_config",
     "//base/test:test_support",
     "//gpu:test_support",
@@ -175,7 +175,7 @@
   deps = [
     ":helpers",
     "//media/gpu",
-    "//ui/gfx/codec:codec",
+    "//ui/gfx/codec",
   ]
 }
 
@@ -216,7 +216,7 @@
     "//gpu:test_support",
     "//media/gpu",
     "//testing/gmock",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
   ]
 
   if (use_vaapi || use_v4l2_codec) {
@@ -237,11 +237,11 @@
 
   deps = [
     ":helpers",
-    "//base:base",
+    "//base",
     "//base/test:test_support",
     "//media:test_support",
     "//media/gpu",
-    "//mojo/core/embedder:embedder",
+    "//mojo/core/embedder",
   ]
 
   public_deps = [
@@ -288,7 +288,7 @@
     "//gpu:test_support",
     "//media/gpu",
     "//testing/gmock",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
   ]
 }
 
diff --git a/media/gpu/v4l2/BUILD.gn b/media/gpu/v4l2/BUILD.gn
index 86cc9e2..8246d40c 100644
--- a/media/gpu/v4l2/BUILD.gn
+++ b/media/gpu/v4l2/BUILD.gn
@@ -223,7 +223,7 @@
     "//base/test:test_support",
     "//build/config/linux/libdrm",
     "//media:test_support",
-    "//media/gpu/chromeos:chromeos",
+    "//media/gpu/chromeos",
     "//testing/gtest",
     "//ui/gfx/linux:gbm",
   ]
@@ -241,7 +241,7 @@
       "mt21/mt21_util_unittest.cc",
     ]
     deps = [
-      "//base:base",
+      "//base",
       "//base/test:test_support",
       "//testing/gtest",
     ]
@@ -256,7 +256,7 @@
       "mt21/mt21_util.h",
     ]
     deps = [
-      "//base:base",
+      "//base",
       "//base/test:test_support",
       "//testing/gtest",
       "//testing/perf",
diff --git a/media/gpu/vaapi/BUILD.gn b/media/gpu/vaapi/BUILD.gn
index 13d3797..3cade22 100644
--- a/media/gpu/vaapi/BUILD.gn
+++ b/media/gpu/vaapi/BUILD.gn
@@ -176,7 +176,7 @@
     ":common",
     "//base",
     "//testing/gtest",
-    "//third_party/libyuv:libyuv",
+    "//third_party/libyuv",
   ]
   if (is_chromeos) {
     deps += [ "//media/gpu/test:local_gpu_memory_buffer_manager" ]
@@ -245,7 +245,7 @@
       "//base",
       "//media/gpu/test:local_gpu_memory_buffer_manager",
       "//testing/gtest",
-      "//third_party/libyuv:libyuv",
+      "//third_party/libyuv",
       "//ui/gfx:memory_buffer",
       "//ui/gfx/codec",
       "//ui/gfx/geometry",
@@ -365,7 +365,7 @@
     "//media/gpu:common",
     "//third_party/libgav1:libgav1_parser",
     "//third_party/libyuv",
-    "//ui/gfx/codec:codec",
+    "//ui/gfx/codec",
     "//ui/gfx/geometry",
   ]
 }
diff --git a/media/mojo/clients/BUILD.gn b/media/mojo/clients/BUILD.gn
index 26bd2b65..f334bb0 100644
--- a/media/mojo/clients/BUILD.gn
+++ b/media/mojo/clients/BUILD.gn
@@ -26,9 +26,9 @@
     # TODO(liberato): can we avoid this?
     "//content/test/*",
     "//third_party/blink/renderer/modules/mediarecorder",
-    "//third_party/blink/renderer/modules/peerconnection:peerconnection",
+    "//third_party/blink/renderer/modules/peerconnection",
     "//third_party/blink/renderer/modules/webcodecs",
-    "//third_party/blink/renderer/platform:platform",
+    "//third_party/blink/renderer/platform",
   ]
 
   sources = [
@@ -83,7 +83,7 @@
     "//mojo/public/cpp/bindings",
     "//mojo/public/cpp/system",
     "//services/service_manager/public/mojom",
-    "//services/viz/public/cpp/gpu:gpu",
+    "//services/viz/public/cpp/gpu",
   ]
 
   deps = [
@@ -94,8 +94,8 @@
 
   if (is_android) {
     deps += [
-      "//gpu/ipc/common:common",
-      "//ui/gl:gl",
+      "//gpu/ipc/common",
+      "//ui/gl",
     ]
   }
   if (is_win) {
@@ -176,7 +176,7 @@
 
     deps += [
       "//content/public/renderer",
-      "//content/renderer:renderer",
+      "//content/renderer",
       "//media",
     ]
   }
diff --git a/media/mojo/mojom/BUILD.gn b/media/mojo/mojom/BUILD.gn
index fcedeb1..50e52c0 100644
--- a/media/mojo/mojom/BUILD.gn
+++ b/media/mojo/mojom/BUILD.gn
@@ -933,7 +933,7 @@
     ":mojom_shared",
     "//gpu/ipc/common",
     "//media",
-    "//media/base/ipc:ipc",
+    "//media/base/ipc",
     "//mojo/public/mojom/base",
     "//ui/gfx/geometry/mojom:mojom_traits",
   ]
diff --git a/media/muxers/BUILD.gn b/media/muxers/BUILD.gn
index 45bf28b..6a2cefb3 100644
--- a/media/muxers/BUILD.gn
+++ b/media/muxers/BUILD.gn
@@ -48,7 +48,7 @@
 
   deps = [
     "//base",
-    "//components/version_info:version_info",
+    "//components/version_info",
     "//media/base",
     "//media/formats",
     "//third_party/libwebm",
diff --git a/media/remoting/BUILD.gn b/media/remoting/BUILD.gn
index f49c592..6ad93b52 100644
--- a/media/remoting/BUILD.gn
+++ b/media/remoting/BUILD.gn
@@ -68,7 +68,7 @@
   ]
 
   deps = [
-    "//media/mojo/common:common",
+    "//media/mojo/common",
     "//media/mojo/mojom:remoting",
     "//third_party/openscreen/src/cast/streaming:common",
   ]
@@ -123,7 +123,7 @@
 
     deps += [
       "//media/test:pipeline_integration_test_base",
-      "//services/service_manager/public/cpp:cpp",
+      "//services/service_manager/public/cpp",
       "//ui/gfx:test_support",
       "//ui/gfx/geometry",
     ]
diff --git a/media/video/BUILD.gn b/media/video/BUILD.gn
index 611c114..9f24e07 100644
--- a/media/video/BUILD.gn
+++ b/media/video/BUILD.gn
@@ -82,7 +82,7 @@
   }
 
   if (is_apple) {
-    deps += [ "//media/base/mac:mac" ]
+    deps += [ "//media/base/mac" ]
   }
 }
 
@@ -137,8 +137,8 @@
     "//media:test_support",
     "//testing/gmock",
     "//testing/gtest",
-    "//third_party/libvpx:libvpx",
-    "//third_party/libyuv:libyuv",
+    "//third_party/libvpx",
+    "//third_party/libyuv",
     "//ui/gfx",
   ]
 }
diff --git a/mojo/public/cpp/bindings/README.md b/mojo/public/cpp/bindings/README.md
index 1f09732..fbddaaa 100644
--- a/mojo/public/cpp/bindings/README.md
+++ b/mojo/public/cpp/bindings/README.md
@@ -718,6 +718,70 @@
 LOG(INFO) << "Value is " << value->get_string_value();  // DCHECK!
 ```
 
+### Result
+
+Methods may use a special `result<T,E>` type to express that a method may either
+return a message of type T on success and a message of type E on failure. This
+type maps to `base::expected` in C++.
+
+For example, consider the following Mojom method:
+
+```mojom
+module foo.mojom;
+
+struct Success {
+  int64 elapsed_ms;
+};
+
+struct Failure {
+  string reason;
+};
+
+interface Iface {
+  DoSomething() => result<Success, Failure>;
+};
+```
+
+This would generate a C++ interface like so:
+
+```cpp
+namespace foo::mojom {
+
+class Iface {
+  virtual ~IFace() {}
+
+  virtual void DoSomething(DoSomethingCallback callback) = 0;
+};
+
+}  // namespace foo::mojom
+```
+
+`DoSomethingCallback` takes a base::expected as the single parameter. If the
+API invocation was successful, the callback can be invoked with `base::ok`
+along with the success type. If the API invocation was unsuccessful, the
+callback can be invoked with `base::unexpected` along with the error type.
+For example:
+
+```cpp
+namespace foo {
+
+class IfaceImpl : public mojom::Iface {
+  DoSomething(DoSomethingCallback callback) override {
+    if (success) {
+      auto success = mojom::Success::New();
+      success->elapsed_ms = 9001;
+      callback.Run(base::ok(std::move(success)));
+    } else {
+      auto failure = mojom::Failure::New();
+      failure->reason = "too hard!";
+      callback.Run(base::unexpected(std::move(success)));
+    }
+  }
+};
+
+} // namespace foo
+```
+
 ### Features
 
 Mojom `feature` generates a `base::Feature` with the given `name` and
diff --git a/pdf/pdfium/pdfium_draw_selection_test_base.cc b/pdf/pdfium/pdfium_draw_selection_test_base.cc
index 08d9de58..141aa9a 100644
--- a/pdf/pdfium/pdfium_draw_selection_test_base.cc
+++ b/pdf/pdfium/pdfium_draw_selection_test_base.cc
@@ -24,11 +24,10 @@
     PDFiumEngine& engine,
     int page_index,
     std::string_view expected_png_filename) {
-  return DrawAndCompareImpl(engine, page_index,
-                            FILE_PATH_LITERAL("text_selection"),
-                            expected_png_filename,
-                            /*use_platform_suffix=*/false,
-                            /*draw_caret=*/false);
+  DrawAndCompareImpl(engine, page_index, FILE_PATH_LITERAL("text_selection"),
+                     expected_png_filename,
+                     /*use_platform_suffix=*/false,
+                     /*draw_caret=*/false);
 }
 
 void PDFiumDrawSelectionTestBase::
@@ -36,32 +35,30 @@
         PDFiumEngine& engine,
         int page_index,
         std::string_view expected_png_filename) {
-  return DrawAndCompareImpl(engine, page_index,
-                            FILE_PATH_LITERAL("text_selection"),
-                            expected_png_filename,
-                            /*use_platform_suffix=*/true,
-                            /*draw_caret=*/false);
+  DrawAndCompareImpl(engine, page_index, FILE_PATH_LITERAL("text_selection"),
+                     expected_png_filename,
+                     /*use_platform_suffix=*/true,
+                     /*draw_caret=*/false);
 }
 
 void PDFiumDrawSelectionTestBase::DrawHighlightsAndCompare(
     PDFiumEngine& engine,
     int page_index,
     std::string_view expected_png_filename) {
-  return DrawAndCompareImpl(engine, page_index,
-                            FILE_PATH_LITERAL("text_fragments"),
-                            expected_png_filename,
-                            /*use_platform_suffix=*/false,
-                            /*draw_caret=*/false);
+  DrawAndCompareImpl(engine, page_index, FILE_PATH_LITERAL("text_fragments"),
+                     expected_png_filename,
+                     /*use_platform_suffix=*/false,
+                     /*draw_caret=*/false);
 }
 
 void PDFiumDrawSelectionTestBase::DrawCaretAndCompareWithPlatformExpectations(
     PDFiumEngine& engine,
     int page_index,
     std::string_view expected_png_filename) {
-  return DrawAndCompareImpl(engine, page_index, FILE_PATH_LITERAL("caret"),
-                            expected_png_filename,
-                            /*use_platform_suffix=*/true,
-                            /*draw_caret=*/true);
+  DrawAndCompareImpl(engine, page_index, FILE_PATH_LITERAL("caret"),
+                     expected_png_filename,
+                     /*use_platform_suffix=*/true,
+                     /*draw_caret=*/true);
 }
 
 void PDFiumDrawSelectionTestBase::SetSelection(PDFiumEngine& engine,
diff --git a/remoting/protocol/webrtc_video_encoder_wrapper.cc b/remoting/protocol/webrtc_video_encoder_wrapper.cc
index b2086ec..5d14c5a0 100644
--- a/remoting/protocol/webrtc_video_encoder_wrapper.cc
+++ b/remoting/protocol/webrtc_video_encoder_wrapper.cc
@@ -8,6 +8,7 @@
 
 #include <algorithm>
 #include <functional>
+#include <memory>
 #include <string>
 #include <vector>
 
@@ -20,6 +21,7 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "build/build_config.h"
 #include "remoting/base/constants.h"
 #include "remoting/base/session_options.h"
@@ -31,6 +33,7 @@
 #include "third_party/webrtc/api/video_codecs/sdp_video_format.h"
 #include "third_party/webrtc/api/video_codecs/vp9_profile.h"
 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
+#include "third_party/webrtc/modules/desktop_capture/shared_desktop_frame.h"
 #include "third_party/webrtc/modules/video_coding/include/video_codec_interface.h"
 #include "third_party/webrtc/modules/video_coding/include/video_error_codes.h"
 
@@ -283,7 +286,8 @@
       static_cast<WebrtcVideoFrameAdapter*>(frame.video_frame_buffer().get());
 
   // Store RTP timestamp and FrameStats so they can be added to the
-  // EncodedImage and EncodedFrame when encoding is complete.
+  // EncodedImage and EncodedFrame when encoding is complete, and used for
+  // top-off extrapolation.
   rtp_timestamp_ = frame.rtp_timestamp();
   frame_stats_ = video_frame_adapter->TakeFrameStats();
   if (!frame_stats_) {
@@ -303,7 +307,13 @@
 
   frame_stats_->encode_started_time = encode_start;
 
-  auto desktop_frame = video_frame_adapter->TakeDesktopFrame();
+  auto desktop_frame =
+      webrtc::SharedDesktopFrame::Wrap(video_frame_adapter->TakeDesktopFrame());
+
+  last_capturer_fed_frame_ = desktop_frame->Share();
+  // Clear the updated region since the extrapolated frames are exactly the same
+  // as the last frame.
+  last_capturer_fed_frame_->mutable_updated_region()->Clear();
 
   // If any frames were dropped by WebRTC or by this class, the
   // original DesktopFrame's updated-region should not be used as-is
@@ -355,32 +365,7 @@
   }
   latest_frame_encode_start_time_ = encode_start;
 
-  WebrtcVideoEncoder::FrameParams frame_params;
-
-  // SetRates() must be called prior to Encode(), with a non-zero bitrate.
-  DCHECK_NE(0, bitrate_kbps_);
-  frame_params.bitrate_kbps = bitrate_kbps_;
-  frame_params.duration = current_frame_interval_;
-  frame_params.fps = current_frame_interval_.ToHz();
-
-  frame_params.vpx_min_quantizer =
-      ShouldDropQualityForLargeFrame(*desktop_frame) ? kMaxQuantizer
-                                                     : kMinQuantizer;
-  frame_params.vpx_max_quantizer = kMaxQuantizer;
-  frame_params.clear_active_map = !top_off_active_;
-
-  frame_params.key_frame = pending_key_frame_request_;
-  pending_key_frame_request_ = false;
-
-  encode_pending_ = true;
-
-  auto encode_callback = base::BindPostTaskToCurrentDefault(base::BindOnce(
-      &WebrtcVideoEncoderWrapper::OnFrameEncoded, weak_factory_.GetWeakPtr()));
-  encode_task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&WebrtcVideoEncoder::Encode,
-                     base::Unretained(encoder_.get()), std::move(desktop_frame),
-                     frame_params, std::move(encode_callback)));
+  EncodeDesktopFrame(std::move(desktop_frame));
   return WEBRTC_VIDEO_CODEC_OK;
 }
 
@@ -491,7 +476,8 @@
     // WebrtcFrameSchedulerConstantRate cannot estimate this delay. Set it to 0
     // so the client can still calculate the derived stats.
     frame_stats_->send_pending_delay = base::TimeDelta();
-    frame->stats = std::move(frame_stats_);
+    frame->stats =
+        std::make_unique<WebrtcVideoEncoder::FrameStats>(*frame_stats_);
 
     frame->rtp_timestamp = rtp_timestamp_;
   }
@@ -509,6 +495,7 @@
 
   if (!frame || !frame->data || !frame->data->size()) {
     top_off_active_ = false;
+    UpdateTopOffExtrapolationTimer();
     NotifyFrameDropped();
     DropPendingFrame();
     return;
@@ -516,6 +503,7 @@
 
   // Top-off until the best quantizer value is reached.
   top_off_active_ = (frame->quantizer > kMinQuantizer);
+  UpdateTopOffExtrapolationTimer();
 
   // If there was a successful capture while the encoder was working then there
   // will be a frame waiting to be encoded. Send it to the encoder now that its
@@ -592,4 +580,87 @@
   }
 }
 
+void WebrtcVideoEncoderWrapper::EncodeDesktopFrame(
+    std::unique_ptr<webrtc::DesktopFrame> desktop_frame) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  DCHECK(!encode_pending_);
+
+  if (keep_alive_timer_.IsRunning()) {
+    keep_alive_timer_.Reset();
+  } else {
+    keep_alive_timer_.Start(FROM_HERE, kKeepAliveInterval, this,
+                            &WebrtcVideoEncoderWrapper::ExtrapolateFrame);
+  }
+  if (top_off_active_) {
+    top_off_timer_.Reset();
+  }
+
+  WebrtcVideoEncoder::FrameParams frame_params;
+
+  // SetRates() must be called prior to Encode(), with a non-zero bitrate.
+  DCHECK_NE(0, bitrate_kbps_);
+  frame_params.bitrate_kbps = bitrate_kbps_;
+  frame_params.duration = current_frame_interval_;
+  frame_params.fps = current_frame_interval_.ToHz();
+
+  frame_params.vpx_min_quantizer =
+      ShouldDropQualityForLargeFrame(*desktop_frame) ? kMaxQuantizer
+                                                     : kMinQuantizer;
+  frame_params.vpx_max_quantizer = kMaxQuantizer;
+  frame_params.clear_active_map = !top_off_active_;
+
+  frame_params.key_frame = pending_key_frame_request_;
+  pending_key_frame_request_ = false;
+
+  encode_pending_ = true;
+
+  auto encode_callback = base::BindPostTaskToCurrentDefault(base::BindOnce(
+      &WebrtcVideoEncoderWrapper::OnFrameEncoded, weak_factory_.GetWeakPtr()));
+  encode_task_runner_->PostTask(
+      FROM_HERE,
+      base::BindOnce(&WebrtcVideoEncoder::Encode,
+                     base::Unretained(encoder_.get()), std::move(desktop_frame),
+                     frame_params, std::move(encode_callback)));
+}
+
+void WebrtcVideoEncoderWrapper::UpdateTopOffExtrapolationTimer() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (top_off_active_) {
+    // For constant rate capturers, top-off frames are extrapolated in a
+    // frequency slightly lower than the targeted frame rate so that it can be
+    // suppressed by capturer-fed frames. For push-based capturers, the top-off
+    // frequency is slightly lower than the minimal frame rate
+    // (1 / kMaxFrameDuration).
+    base::TimeDelta top_off_interval =
+        std::max(current_frame_interval_ * 1.1,
+                 current_frame_interval_ + base::Milliseconds(2));
+    top_off_timer_.Start(FROM_HERE, top_off_interval, this,
+                         &WebrtcVideoEncoderWrapper::ExtrapolateFrame);
+  } else {
+    top_off_timer_.Stop();
+  }
+}
+
+void WebrtcVideoEncoderWrapper::ExtrapolateFrame() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (encode_pending_ || pending_frame_) {
+    VLOG(1) << "Top-off frame not extrapolated because encoder is busy.";
+    return;
+  }
+  if (!last_capturer_fed_frame_) {
+    LOG(ERROR) << "No top-off frame is available.";
+    return;
+  }
+  latest_frame_encode_start_time_ = base::TimeTicks::Now();
+  frame_stats_->encode_started_time = latest_frame_encode_start_time_;
+  // WebRTC requires the RTP timestamp be increasing, so we just add 1.
+  rtp_timestamp_++;
+  EncodeDesktopFrame(last_capturer_fed_frame_->Share());
+}
+
+// static
+base::TimeDelta WebrtcVideoEncoderWrapper::GetKeepAliveIntervalForTesting() {
+  return kKeepAliveInterval;
+}
+
 }  // namespace remoting::protocol
diff --git a/remoting/protocol/webrtc_video_encoder_wrapper.h b/remoting/protocol/webrtc_video_encoder_wrapper.h
index b65add82..1108cf88 100644
--- a/remoting/protocol/webrtc_video_encoder_wrapper.h
+++ b/remoting/protocol/webrtc_video_encoder_wrapper.h
@@ -13,6 +13,8 @@
 #include "base/sequence_checker.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/thread_annotations.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "remoting/base/constants.h"
 #include "remoting/base/running_samples.h"
 #include "remoting/base/session_options.h"
@@ -21,6 +23,8 @@
 #include "third_party/webrtc/api/video_codecs/sdp_video_format.h"
 #include "third_party/webrtc/api/video_codecs/video_encoder.h"
 #include "third_party/webrtc/modules/desktop_capture/desktop_capture_types.h"
+#include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
+#include "third_party/webrtc/modules/desktop_capture/shared_desktop_frame.h"
 
 namespace remoting::protocol {
 
@@ -57,6 +61,8 @@
   void OnRttUpdate(int64_t rtt_ms) override;
   webrtc::VideoEncoder::EncoderInfo GetEncoderInfo() const override;
 
+  static base::TimeDelta GetKeepAliveIntervalForTesting();
+
  private:
   static constexpr int kStatsWindow = 5;
 
@@ -85,6 +91,16 @@
   // |pending_frame_| contains valid frame data.
   void DropPendingFrame();
 
+  // Encodes a desktop frame. Only one frame can be encoded at a time.
+  void EncodeDesktopFrame(std::unique_ptr<webrtc::DesktopFrame> desktop_frame);
+
+  // If `top_off_active_` is true, (re)starts the top-off extrapolation timer
+  // with a recalculated interval, otherwise stops the timer.
+  void UpdateTopOffExtrapolationTimer();
+
+  // Re-encodes the last capturer-fed frame.
+  void ExtrapolateFrame();
+
   std::unique_ptr<WebrtcVideoEncoder> encoder_
       GUARDED_BY_CONTEXT(sequence_checker_);
 
@@ -98,7 +114,8 @@
   uint32_t rtp_timestamp_ GUARDED_BY_CONTEXT(sequence_checker_);
 
   // FrameStats taken from the input VideoFrameAdapter, then added to the
-  // EncodedFrame when encoding is complete.
+  // EncodedFrame when encoding is complete. This is also used for top-off and
+  // keep-alive extrapolation.
   std::unique_ptr<WebrtcVideoEncoder::FrameStats> frame_stats_;
 
   // Bandwidth estimate from SetRates(), which is expected to be called before
@@ -112,6 +129,23 @@
   // True when encoding unchanged frames for top-off.
   bool top_off_active_ GUARDED_BY_CONTEXT(sequence_checker_) = false;
 
+  // Timer to extrapolate top-off frames in a reasonable interval, until
+  // `top_off_active_` is false. It will be suppressed if either a capturer-fed
+  // frame or a keep-alive frame is encoded within the top-off interval.
+  base::RetainingOneShotTimer top_off_timer_
+      GUARDED_BY_CONTEXT(sequence_checker_);
+
+  // Timer to extrapolate keep-alive frames. It will be suppressed if either a
+  // capturer-fed frame or a top-off frame is encoded within the keep-alive
+  // interval.
+  base::RetainingOneShotTimer keep_alive_timer_
+      GUARDED_BY_CONTEXT(sequence_checker_);
+
+  // The last capturer-fed desktop frame, used for top-off and keep-alive
+  // extrapolation.
+  std::unique_ptr<webrtc::SharedDesktopFrame> last_capturer_fed_frame_
+      GUARDED_BY_CONTEXT(sequence_checker_);
+
   webrtc::VideoCodecType codec_type_ GUARDED_BY_CONTEXT(sequence_checker_);
 
   // True when a frame is being encoded. This guards against encoding multiple
diff --git a/remoting/protocol/webrtc_video_encoder_wrapper_unittest.cc b/remoting/protocol/webrtc_video_encoder_wrapper_unittest.cc
index 980358a5..abf8d5b 100644
--- a/remoting/protocol/webrtc_video_encoder_wrapper_unittest.cc
+++ b/remoting/protocol/webrtc_video_encoder_wrapper_unittest.cc
@@ -5,6 +5,7 @@
 #include "remoting/protocol/webrtc_video_encoder_wrapper.h"
 
 #include "base/test/task_environment.h"
+#include "base/time/time.h"
 #include "remoting/base/session_options.h"
 #include "remoting/protocol/video_channel_state_observer.h"
 #include "remoting/protocol/video_stream_event_router.h"
@@ -165,33 +166,44 @@
 }  // namespace
 
 class WebrtcVideoEncoderWrapperTest : public testing::Test {
+ protected:
+  // Returns a lambda for stubbing mock_video_encoder_.Encode().
+  // `quantizer_rate` controls the quantizer of the encoded frame; 0 means
+  // `vpx_min_quantizer` while 1 means `vpx_max_quantizer`.
+  decltype(auto) RespondWithEncodedFrame(float quantizer_rate = 0.f) {
+    return [this, quantizer_rate](
+               std::unique_ptr<webrtc::DesktopFrame> frame,
+               const WebrtcVideoEncoder::FrameParams& frame_params,
+               WebrtcVideoEncoder::EncodeCallback done) {
+      auto encoded_frame = std::make_unique<WebrtcVideoEncoder::EncodedFrame>();
+      encoded_frame->dimensions = frame->size();
+      encoded_frame->data = webrtc::EncodedImageBuffer::Create(
+          frame->size().width() * frame->size().height());
+      encoded_frame->key_frame = frame_params.key_frame;
+      encoded_frame->quantizer =
+          frame_params.vpx_min_quantizer +
+          (frame_params.vpx_max_quantizer - frame_params.vpx_min_quantizer) *
+              quantizer_rate;
+      encoded_frame->codec = kVideoCodecVP9;
+
+      auto expected_framerate = get_expected_framerate();
+      if (expected_framerate.has_value()) {
+        EXPECT_EQ(frame_params.fps, *expected_framerate);
+        EXPECT_NEAR(frame_params.duration.InMilliseconds(),
+                    base::Hertz(*expected_framerate).InMilliseconds(),
+                    kDurationMsFudgeFactor);
+      }
+      std::move(done).Run(WebrtcVideoEncoder::EncodeResult::SUCCEEDED,
+                          std::move(encoded_frame));
+    };
+  }
+
  public:
   void SetUp() override {
     // Configure the mock encoder's default behavior to mimic a real encoder.
     mock_video_encoder_ = std::make_unique<NiceMock<MockVideoEncoder>>();
     ON_CALL(*mock_video_encoder_, Encode)
-        .WillByDefault([&](std::unique_ptr<webrtc::DesktopFrame> frame,
-                           const WebrtcVideoEncoder::FrameParams& frame_params,
-                           WebrtcVideoEncoder::EncodeCallback done) {
-          auto encoded_frame =
-              std::make_unique<WebrtcVideoEncoder::EncodedFrame>();
-          encoded_frame->dimensions = frame->size();
-          encoded_frame->data = webrtc::EncodedImageBuffer::Create(
-              frame->size().width() * frame->size().height());
-          encoded_frame->key_frame = frame_params.key_frame;
-          encoded_frame->quantizer = frame_params.vpx_min_quantizer;
-          encoded_frame->codec = kVideoCodecVP9;
-
-          auto expected_framerate = get_expected_framerate();
-          if (expected_framerate.has_value()) {
-            EXPECT_EQ(frame_params.fps, *expected_framerate);
-            EXPECT_NEAR(frame_params.duration.InMilliseconds(),
-                        base::Hertz(*expected_framerate).InMilliseconds(),
-                        kDurationMsFudgeFactor);
-          }
-          std::move(done).Run(WebrtcVideoEncoder::EncodeResult::SUCCEEDED,
-                              std::move(encoded_frame));
-        });
+        .WillByDefault(RespondWithEncodedFrame());
 
     video_stream_event_router_.SetVideoChannelStateObserver(
         "screen_stream", observer_.GetWeakPtr());
@@ -396,24 +408,6 @@
   PostQuitAndRun();
 }
 
-TEST_F(WebrtcVideoEncoderWrapperTest, EmptyFrameNotDroppedAfter2Seconds) {
-  EXPECT_CALL(callback_, OnEncodedImage(_, _))
-      .Times(2)
-      .WillRepeatedly(Return(kResultOk));
-
-  auto frame1 = MakeVideoFrame();
-  auto frame2 = MakeEmptyVideoFrame();
-  auto encoder = InitEncoder(GetVp9Format(), GetVp9Codec());
-  // Delta is used in this test, because key-frames should never be dropped
-  // anyway.
-  std::vector<VideoFrameType> frame_types{VideoFrameType::kVideoFrameDelta};
-  encoder->Encode(frame1, &frame_types);
-  task_environment_.FastForwardBy(base::Milliseconds(2500));
-  encoder->Encode(frame2, &frame_types);
-
-  PostQuitAndRun();
-}
-
 TEST_F(WebrtcVideoEncoderWrapperTest, EmptyFrameNotDroppedIfKeyFrame) {
   EXPECT_CALL(callback_, OnEncodedImage(_, _))
       .Times(2)
@@ -508,4 +502,87 @@
   PostQuitAndRun();
 }
 
+TEST_F(WebrtcVideoEncoderWrapperTest, ExtrapolateTopOffFrames) {
+  EXPECT_CALL(*mock_video_encoder_, Encode)
+      .WillOnce(RespondWithEncodedFrame(1.f))
+      .WillOnce(RespondWithEncodedFrame(0.50f))
+      .WillOnce(RespondWithEncodedFrame(0.25f))
+      .WillOnce(RespondWithEncodedFrame(0.f));
+  EXPECT_CALL(callback_, OnEncodedImage(_, _))
+      .Times(4)
+      .WillRepeatedly(Return(kResultOk));
+
+  auto encoder = InitEncoder(GetVp9Format(), GetVp9Codec());
+  encoder->SetEncoderForTest(std::move(mock_video_encoder_));
+
+  std::vector<VideoFrameType> frame_types{VideoFrameType::kVideoFrameKey};
+  encoder->Encode(MakeVideoFrame(), &frame_types);
+  ASSERT_LT(base::Seconds(1),
+            WebrtcVideoEncoderWrapper::GetKeepAliveIntervalForTesting());
+  task_environment_.FastForwardBy(base::Seconds(1));
+
+  PostQuitAndRun();
+}
+
+TEST_F(WebrtcVideoEncoderWrapperTest,
+       TopOffExtrapolationSuppressedByCapturerFedFrames) {
+  EXPECT_CALL(*mock_video_encoder_, Encode)
+      .Times(2)
+      .WillRepeatedly(RespondWithEncodedFrame(1.f));
+  EXPECT_CALL(callback_, OnEncodedImage(_, _))
+      .Times(2)
+      .WillRepeatedly(Return(kResultOk));
+
+  auto encoder = InitEncoder(GetVp9Format(), GetVp9Codec());
+  encoder->SetEncoderForTest(std::move(mock_video_encoder_));
+
+  std::vector<VideoFrameType> frame_types{VideoFrameType::kVideoFrameKey};
+  encoder->Encode(MakeVideoFrame(), &frame_types);
+  task_environment_.FastForwardBy(base::Hertz(kTargetFrameRate));
+  encoder->Encode(MakeVideoFrame(), &frame_types);
+  // This would extrapolate a top-off frame if it weren't suppressed.
+  task_environment_.FastForwardBy(base::Hertz(kTargetFrameRate));
+
+  PostQuitAndRun();
+}
+
+TEST_F(WebrtcVideoEncoderWrapperTest, ExtrapolateKeepAliveFrames) {
+  EXPECT_CALL(callback_, OnEncodedImage(_, _))
+      .Times(6)  // 1 capturer-fed frame plus 5 extrapolated frames.
+      .WillRepeatedly(Return(kResultOk));
+
+  auto encoder = InitEncoder(GetVp9Format(), GetVp9Codec());
+  encoder->SetEncoderForTest(std::move(mock_video_encoder_));
+
+  std::vector<VideoFrameType> frame_types{VideoFrameType::kVideoFrameKey};
+  encoder->Encode(MakeVideoFrame(), &frame_types);
+  task_environment_.FastForwardBy(
+      WebrtcVideoEncoderWrapper::GetKeepAliveIntervalForTesting() * 5);
+
+  PostQuitAndRun();
+}
+
+TEST_F(WebrtcVideoEncoderWrapperTest,
+       KeepAliveExtrapolationSuppressedByCapturerFedFrames) {
+  EXPECT_CALL(callback_, OnEncodedImage(_, _))
+      .Times(2)
+      .WillRepeatedly(Return(kResultOk));
+
+  auto encoder = InitEncoder(GetVp9Format(), GetVp9Codec());
+  encoder->SetEncoderForTest(std::move(mock_video_encoder_));
+
+  std::vector<VideoFrameType> frame_types{VideoFrameType::kVideoFrameKey};
+  encoder->Encode(MakeVideoFrame(), &frame_types);
+  task_environment_.FastForwardBy(
+      WebrtcVideoEncoderWrapper::GetKeepAliveIntervalForTesting() -
+      base::Milliseconds(100));
+  encoder->Encode(MakeVideoFrame(), &frame_types);
+  // This would extrapolate a keep-alive frame if it weren't suppressed.
+  task_environment_.FastForwardBy(
+      WebrtcVideoEncoderWrapper::GetKeepAliveIntervalForTesting() -
+      base::Milliseconds(100));
+
+  PostQuitAndRun();
+}
+
 }  // namespace remoting::protocol
diff --git a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
index 420c9c80..ee52cba 100644
--- a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.cc
@@ -58,6 +58,7 @@
 #endif
 
 base::debug::CrashKeyString* seccomp_crash_key = nullptr;
+base::debug::CrashKeyString* seccomp_ioctl_crash_key = nullptr;
 
 inline bool IsArchitectureX86_64() {
 #if defined(__x86_64__)
@@ -210,6 +211,29 @@
       __FILE__ ":**CRASHING**:" SECCOMP_MESSAGE_IOCTL_CONTENT "\n";
   WriteToStdErr(kSeccompIoctlError, sizeof(kSeccompIoctlError) - 1);
   PrintAndSetSeccompCrashKey(args);
+
+  // Log information about the file descriptor.
+  char message[256];
+  size_t message_len;
+  default_stat_struct stat_buf;
+  const int fstat_ret =
+      syscall(__NR_fstat_default, static_cast<int>(args.args[0]), &stat_buf);
+  if (fstat_ret == 0) {
+    message_len = base::strings::SafeSPrintf(
+        message,
+        "dev=0x%x,ino=%d,mode=0%o,nlink=%d,"
+        "uid=%d,gid=%d,rdev=0x%x,size=%d,blksize=%d,blocks=%d",
+        stat_buf.st_dev, stat_buf.st_ino, stat_buf.st_mode, stat_buf.st_nlink,
+        stat_buf.st_uid, stat_buf.st_gid, stat_buf.st_rdev, stat_buf.st_size,
+        stat_buf.st_blksize, stat_buf.st_blocks);
+  } else {
+    // fstat failed, log the errno.
+    message_len = base::strings::SafeSPrintf(message, "fstat failed, errno=%d",
+                                             -fstat_ret);
+  }
+  WriteToStdErr(message, message_len);
+  base::debug::SetCrashKeyString(seccomp_ioctl_crash_key, message);
+
   // Make "request" volatile so that we can see it on the stack in a minidump.
   volatile uint64_t request = args.args[1];
   volatile char* addr = reinterpret_cast<volatile char*>(request & 0xFFFF);
@@ -524,6 +548,8 @@
 
   seccomp_crash_key = base::debug::AllocateCrashKeyString(
       "seccomp-sigsys", base::debug::CrashKeySize::Size256);
+  seccomp_ioctl_crash_key = base::debug::AllocateCrashKeyString(
+      "seccomp-sigsys-ioctl", base::debug::CrashKeySize::Size256);
 }
 
 const char* GetErrorMessageContentForTests() {
diff --git a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc
index 5a0fe9f..391d9ca 100644
--- a/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc
+++ b/sandbox/linux/seccomp-bpf-helpers/sigsys_handlers_unittest.cc
@@ -9,15 +9,26 @@
 
 #include "sandbox/linux/seccomp-bpf-helpers/sigsys_handlers.h"
 
+#include <fcntl.h>
 #include <linux/net.h>
+#include <sys/ioctl.h>
 #include <sys/socket.h>
 #include <sys/syscall.h>
+#include <sys/types.h>
+#include <termios.h>
+#include <unistd.h>
+
+#include <utility>
 
 #include "base/check_op.h"
+#include "base/files/file_util.h"
+#include "base/files/scoped_file.h"
 #include "base/strings/safe_sprintf.h"
 #include "sandbox/linux/bpf_dsl/bpf_dsl.h"
 #include "sandbox/linux/bpf_dsl/policy.h"
 #include "sandbox/linux/seccomp-bpf/bpf_tests.h"
+#include "sandbox/linux/seccomp-bpf/sandbox_bpf.h"
+#include "sandbox/linux/system_headers/linux_stat.h"
 #include "sandbox/linux/system_headers/linux_syscalls.h"
 #include "sandbox/linux/tests/unit_tests.h"
 
@@ -119,6 +130,41 @@
 #pragma GCC diagnostic pop
 }
 
+class CrashIoctlPolicy : public bpf_dsl::Policy {
+ public:
+  CrashIoctlPolicy() = default;
+  ~CrashIoctlPolicy() override = default;
+
+  ResultExpr EvaluateSyscall(int sysno) const override {
+    switch (sysno) {
+      case __NR_ioctl:
+        return CrashSIGSYSIoctl();
+      // The handler needs write() and fstat() for logging.
+      case __NR_write:
+      case __NR_fstat_default:
+        return Allow();
+      default:
+        return Allow();
+    }
+  }
+};
+
+BPF_DEATH_TEST_C(
+    SigsysHandlers,
+    SIGSYSIoctlFailureLogsFdInfo,
+    DEATH_SEGV_MESSAGE_PATTERN(
+        "*dev=0x*,ino=*,mode=0*,nlink=*,uid=*,gid=*,rdev=0x*,size=*,"
+        "blksize=*,blocks=*"),
+    CrashIoctlPolicy) {
+  base::FilePath temp_path;
+  CHECK(base::CreateTemporaryFile(&temp_path));
+  base::ScopedFD fd(open(temp_path.value().c_str(), O_RDONLY));
+  CHECK(fd.is_valid());
+
+  // This ioctl should be trapped and cause a crash.
+  ioctl(fd.get(), 0, 0);
+}
+
 const char kSigsysMessage[] =
     "nr=0x42 arg1=0xffffffffffffffff arg2=0x0 arg3=0xabcdef arg4=0xffffffff";
 
diff --git a/sandbox/linux/tests/unit_tests.cc b/sandbox/linux/tests/unit_tests.cc
index 4a6305c..f04066c 100644
--- a/sandbox/linux/tests/unit_tests.cc
+++ b/sandbox/linux/tests/unit_tests.cc
@@ -7,6 +7,8 @@
 #pragma allow_unsafe_libc_calls
 #endif
 
+#include "sandbox/linux/tests/unit_tests.h"
+
 #include <fcntl.h>
 #include <poll.h>
 #include <signal.h>
@@ -26,8 +28,8 @@
 #include "base/debug/leak_annotations.h"
 #include "base/files/file_util.h"
 #include "base/posix/eintr_wrapper.h"
+#include "base/strings/pattern.h"
 #include "build/build_config.h"
-#include "sandbox/linux/tests/unit_tests.h"
 
 // Specifically, PNaCl toolchain does not have this flag.
 #if !defined(POLLRDHUP)
@@ -63,6 +65,16 @@
   return num_threads;
 }
 
+// Helper for DeathSEGVMessage and DeathSEGVMessagePattern.
+// Checks that the process died with SIGSEGV.
+void CheckDeathBySEGV(int status, const std::string& details) {
+  const bool subprocess_got_sigsegv =
+      WIFSIGNALED(status) && (SIGSEGV == WTERMSIG(status));
+
+  ASSERT_TRUE(subprocess_got_sigsegv)
+      << "Exit status: " << status << " " << details;
+}
+
 }  // namespace
 
 namespace sandbox {
@@ -299,18 +311,24 @@
                                  const void* aux) {
   std::string details(TestFailedMessage(msg));
   const char* expected_msg = static_cast<const char*>(aux);
-
-  const bool subprocess_got_sigsegv =
-      WIFSIGNALED(status) && (SIGSEGV == WTERMSIG(status));
-
-  ASSERT_TRUE(subprocess_got_sigsegv) << "Exit status: " << status
-                                      << " " << details;
-
+  CheckDeathBySEGV(status, details);
   bool subprocess_exited_without_matching_message =
       !base::Contains(msg, expected_msg);
   EXPECT_FALSE(subprocess_exited_without_matching_message) << details;
 }
 
+void UnitTests::DeathSEGVMessagePattern(int status,
+                                        const std::string& msg,
+                                        const void* aux) {
+  std::string details(TestFailedMessage(msg));
+  const char* expected_msg = static_cast<const char*>(aux);
+  CheckDeathBySEGV(status, details);
+  std::string pattern(expected_msg);
+  bool subprocess_exited_without_matching_message =
+      !base::MatchPattern(msg, pattern);
+  EXPECT_FALSE(subprocess_exited_without_matching_message) << details;
+}
+
 void UnitTests::DeathExitCode(int status,
                               const std::string& msg,
                               const void* aux) {
diff --git a/sandbox/linux/tests/unit_tests.h b/sandbox/linux/tests/unit_tests.h
index d51eff26..d1c7cfe2 100644
--- a/sandbox/linux/tests/unit_tests.h
+++ b/sandbox/linux/tests/unit_tests.h
@@ -75,6 +75,9 @@
 #define DEATH_SEGV_MESSAGE(msg)         \
   sandbox::UnitTests::DeathSEGVMessage, \
       static_cast<const void*>(static_cast<const char*>(msg))
+#define DEATH_SEGV_MESSAGE_PATTERN(msg)        \
+  sandbox::UnitTests::DeathSEGVMessagePattern, \
+      static_cast<const void*>(static_cast<const char*>(msg))
 #define DEATH_EXIT_CODE(rc)          \
   sandbox::UnitTests::DeathExitCode, \
       reinterpret_cast<void*>(static_cast<intptr_t>(rc))
@@ -186,6 +189,12 @@
                                const std::string& msg,
                                const void* aux);
 
+  // A DeathCheck that verifies that the child process died with a SIGSEGV
+  // and printed a message matching a pattern.
+  static void DeathSEGVMessagePattern(int status,
+                                      const std::string& msg,
+                                      const void* aux);
+
   // A DeathCheck method that verifies that the test completed with a
   // particular exit code. If the test output any messages to stderr, they are
   // silently ignored. The expected exit code should be passed in by
@@ -203,6 +212,6 @@
                             const void* aux);
 };
 
-}  // namespace
+}  // namespace sandbox
 
 #endif  // SANDBOX_LINUX_TESTS_UNIT_TESTS_H_
diff --git a/services/accessibility/BUILD.gn b/services/accessibility/BUILD.gn
index 92dc930..07984152 100644
--- a/services/accessibility/BUILD.gn
+++ b/services/accessibility/BUILD.gn
@@ -73,7 +73,7 @@
     public_deps += [
       "public/mojom:os_service_mojom",
       "//gin",
-      "//ui/accessibility:accessibility",
+      "//ui/accessibility",
     ]
     deps = [
       "public/mojom:os_service_mojom_js__generator",
diff --git a/services/accessibility/android/BUILD.gn b/services/accessibility/android/BUILD.gn
index b351df4..891dc1a 100644
--- a/services/accessibility/android/BUILD.gn
+++ b/services/accessibility/android/BUILD.gn
@@ -4,9 +4,9 @@
 
 source_set("android_lib") {
   public_deps = [
-    "//ash/public/cpp:cpp",
+    "//ash/public/cpp",
     "//chrome/app:generated_resources_grit",
-    "//extensions/browser/api/automation_internal:automation_internal",
+    "//extensions/browser/api/automation_internal",
     "//services/accessibility/android/public/mojom",
   ]
 
diff --git a/services/accessibility/public/mojom/BUILD.gn b/services/accessibility/public/mojom/BUILD.gn
index 1a19f4b9..e02d1db 100644
--- a/services/accessibility/public/mojom/BUILD.gn
+++ b/services/accessibility/public/mojom/BUILD.gn
@@ -60,10 +60,10 @@
     public_deps = [
       ":assistive_technology_type",
       "//mojo/public/mojom/base",
-      "//skia/public/mojom:mojom",
-      "//ui/events/mojom:mojom",
+      "//skia/public/mojom",
+      "//ui/events/mojom",
       "//ui/gfx/geometry/mojom",
-      "//ui/latency/mojom:mojom",
+      "//ui/latency/mojom",
     ]
   }
 
diff --git a/services/cert_verifier/BUILD.gn b/services/cert_verifier/BUILD.gn
index 0c988c2..4342e3d 100644
--- a/services/cert_verifier/BUILD.gn
+++ b/services/cert_verifier/BUILD.gn
@@ -55,7 +55,7 @@
     "//net",
     "//net:test_support",
     "//net/cert:root_store_proto_lite",
-    "//services/cert_verifier/cert_net_url_loader:cert_net_url_loader",
+    "//services/cert_verifier/cert_net_url_loader",
     "//services/cert_verifier/public/mojom",
     "//services/network:network_service",
     "//services/network:test_support",
diff --git a/services/data_decoder/BUILD.gn b/services/data_decoder/BUILD.gn
index 45bf1e5..1a1d17d 100644
--- a/services/data_decoder/BUILD.gn
+++ b/services/data_decoder/BUILD.gn
@@ -87,7 +87,7 @@
     "//base/test:test_support",
     "//components/cbor",
     "//components/web_package",
-    "//components/web_package/test_support:test_support",
+    "//components/web_package/test_support",
     "//services/data_decoder/public/cpp",
     "//services/data_decoder/public/cpp:test_support",
     "//skia",
diff --git a/services/device/BUILD.gn b/services/device/BUILD.gn
index d4d400c..6b03f876 100644
--- a/services/device/BUILD.gn
+++ b/services/device/BUILD.gn
@@ -220,7 +220,7 @@
       "generic_sensor/platform_sensor_provider_chromeos_unittest.cc",
     ]
     deps += [
-      "//chromeos/components/sensors:sensors",
+      "//chromeos/components/sensors",
       "//chromeos/components/sensors:test_support",
     ]
   } else if (is_linux && use_udev) {
@@ -324,7 +324,7 @@
 
     deps += [
       "//device/bluetooth:mocks",
-      "//services/device/public/cpp/bluetooth:bluetooth",
+      "//services/device/public/cpp/bluetooth",
       "//services/device/serial",
       "//services/device/serial:test_support",
     ]
diff --git a/services/device/battery/BUILD.gn b/services/device/battery/BUILD.gn
index a4c9e2b..0168a24 100644
--- a/services/device/battery/BUILD.gn
+++ b/services/device/battery/BUILD.gn
@@ -52,7 +52,7 @@
         "IOKit.framework",
       ]
     } else if (is_win) {
-      deps += [ "//ui/gfx:gfx" ]
+      deps += [ "//ui/gfx" ]
       sources += [
         "battery_status_manager_win.cc",
         "battery_status_manager_win.h",
diff --git a/services/device/compute_pressure/BUILD.gn b/services/device/compute_pressure/BUILD.gn
index a2768b75..afc311d 100644
--- a/services/device/compute_pressure/BUILD.gn
+++ b/services/device/compute_pressure/BUILD.gn
@@ -29,7 +29,7 @@
 
   deps = [
     "//base",
-    "//components/system_cpu:system_cpu",
+    "//components/system_cpu",
     "//mojo/public/cpp/bindings",
     "//services/device/public/cpp:device_features",
   ]
diff --git a/services/device/generic_sensor/BUILD.gn b/services/device/generic_sensor/BUILD.gn
index f335c58..b3fbdb98 100644
--- a/services/device/generic_sensor/BUILD.gn
+++ b/services/device/generic_sensor/BUILD.gn
@@ -57,7 +57,7 @@
     "//base",
     "//device/base/synchronization",
     "//services/device/public/cpp:device_features",
-    "//ui/gfx/geometry:geometry",
+    "//ui/gfx/geometry",
   ]
 
   public_deps = [ "//services/device/public/cpp/generic_sensor" ]
diff --git a/services/device/public/mojom/BUILD.gn b/services/device/public/mojom/BUILD.gn
index cb4962db..7ada789 100644
--- a/services/device/public/mojom/BUILD.gn
+++ b/services/device/public/mojom/BUILD.gn
@@ -219,7 +219,7 @@
 mojom("geoposition") {
   generate_java = true
   sources = [ "geoposition.mojom" ]
-  public_deps = [ "//mojo/public/mojom/base:base" ]
+  public_deps = [ "//mojo/public/mojom/base" ]
 
   if (use_blink) {
     # The blink variant of the geoposition mojom is depended on by the blink
diff --git a/services/device/serial/BUILD.gn b/services/device/serial/BUILD.gn
index 644e539..928f80d 100644
--- a/services/device/serial/BUILD.gn
+++ b/services/device/serial/BUILD.gn
@@ -44,12 +44,12 @@
     deps = [
       "//base",
       "//components/device_event_log",
-      "//device/bluetooth:bluetooth",
+      "//device/bluetooth",
       "//device/bluetooth/public/cpp",
       "//mojo/public/cpp/bindings",
       "//net",
       "//services/device/public/cpp:device_features",
-      "//services/device/public/cpp/bluetooth:bluetooth",
+      "//services/device/public/cpp/bluetooth",
     ]
 
     if (is_linux || is_chromeos) {
diff --git a/services/image_annotation/BUILD.gn b/services/image_annotation/BUILD.gn
index 3331cc89..f4c8704 100644
--- a/services/image_annotation/BUILD.gn
+++ b/services/image_annotation/BUILD.gn
@@ -51,7 +51,7 @@
     ":lib",
     "//base",
     "//base/test:test_support",
-    "//components/manta:manta",
+    "//components/manta",
     "//mojo/public/cpp/bindings",
     "//net",
     "//services/image_annotation/public/cpp",
diff --git a/services/network/BUILD.gn b/services/network/BUILD.gn
index e9b6941..ec50789 100644
--- a/services/network/BUILD.gn
+++ b/services/network/BUILD.gn
@@ -420,9 +420,9 @@
       "network_sandbox_hook_linux.h",
     ]
     deps = [
-      "//base:base",
+      "//base",
       "//sandbox/linux:sandbox_services",
-      "//sandbox/policy:policy",
+      "//sandbox/policy",
     ]
     configs += [ "//build/config/compiler:wexit_time_destructors" ]
   }
@@ -708,13 +708,13 @@
     "//services/network/public/cpp",
     "//services/network/public/cpp:buildflags",
     "//services/network/public/mojom",
+    "//services/network/trust_tokens",
     "//services/network/trust_tokens:test_support",
-    "//services/network/trust_tokens:trust_tokens",
   ]
 
   deps = [
     "//base",
-    "//components/cbor:cbor",
+    "//components/cbor",
     "//mojo/public/cpp/bindings",
     "//net",
     "//net:test_support",
diff --git a/services/network/public/cpp/BUILD.gn b/services/network/public/cpp/BUILD.gn
index 3fcd5fefa..48c3ad6 100644
--- a/services/network/public/cpp/BUILD.gn
+++ b/services/network/public/cpp/BUILD.gn
@@ -851,7 +851,7 @@
     "//mojo/public/cpp/test_support:test_utils",
     "//net",
     "//testing/gtest",
-    "//testing/perf:perf",
+    "//testing/perf",
     "//third_party/google_benchmark",
   ]
 }
diff --git a/services/on_device_model/android/BUILD.gn b/services/on_device_model/android/BUILD.gn
index b6122450..942c4c0 100644
--- a/services/on_device_model/android/BUILD.gn
+++ b/services/on_device_model/android/BUILD.gn
@@ -52,6 +52,7 @@
   deps = [
     "//base:base_java",
     "//base:service_loader_java",
+    "//services/on_device_model/public/mojom:mojom_java",
     "//third_party/androidx:androidx_annotation_annotation_java",
     "//third_party/jni_zero:jni_zero_java",
   ]
@@ -66,6 +67,7 @@
     "//base:base_java",
     "//base:base_java_test_support",
     "//base:service_loader_java",
+    "//services/on_device_model/public/mojom:mojom_java",
     "//third_party/jni_zero:jni_zero_java",
     "//third_party/junit",
   ]
diff --git a/services/on_device_model/android/backend_impl_android_unittest.cc b/services/on_device_model/android/backend_impl_android_unittest.cc
index 08faced..ddde3ec9 100644
--- a/services/on_device_model/android/backend_impl_android_unittest.cc
+++ b/services/on_device_model/android/backend_impl_android_unittest.cc
@@ -35,6 +35,13 @@
     model_ = std::move(model_result.value());
   }
 
+  mojom::SessionParamsPtr MakeSessionParams(int top_k, float temperature) {
+    auto params = mojom::SessionParams::New();
+    params->top_k = top_k;
+    params->temperature = temperature;
+    return params;
+  }
+
   mojom::AppendOptionsPtr MakeInput(std::vector<ml::InputPiece> input) {
     auto options = mojom::AppendOptions::New();
     options->input = mojom::Input::New(std::move(input));
@@ -50,8 +57,9 @@
 };
 
 TEST_F(BackendImplAndroidTest, GenerateWithDefaultFactory) {
-  std::unique_ptr<BackendSession> session =
-      model_->CreateSession(/*adaptation=*/nullptr, /*params=*/nullptr);
+  std::unique_ptr<BackendSession> session = model_->CreateSession(
+      /*adaptation=*/nullptr,
+      MakeSessionParams(/*top_k=*/3, /*temperature=*/1.0f));
 
   TestResponseHolder response_holder;
   session->Generate(mojom::GenerateOptions::New(), response_holder.BindRemote(),
@@ -64,8 +72,11 @@
   Java_OnDeviceModelBridgeNativeUnitTestHelper_setMockAiCoreSessionFactory(
       env_, java_helper_);
 
-  std::unique_ptr<BackendSession> session =
-      model_->CreateSession(/*adaptation=*/nullptr, /*params=*/nullptr);
+  std::unique_ptr<BackendSession> session = model_->CreateSession(
+      /*adaptation=*/nullptr,
+      MakeSessionParams(/*top_k=*/3, /*temperature=*/1.0f));
+  Java_OnDeviceModelBridgeNativeUnitTestHelper_verifySessionParams(
+      env_, java_helper_, /*topK=*/3, /*temperature=*/1.0f);
 
   {
     std::vector<ml::InputPiece> pieces;
@@ -104,8 +115,9 @@
   Java_OnDeviceModelBridgeNativeUnitTestHelper_setMockAiCoreSessionFactory(
       env_, java_helper_);
 
-  std::unique_ptr<BackendSession> session =
-      model_->CreateSession(/*adaptation=*/nullptr, /*params=*/nullptr);
+  std::unique_ptr<BackendSession> session = model_->CreateSession(
+      /*adaptation=*/nullptr,
+      MakeSessionParams(/*top_k=*/3, /*temperature=*/1.0f));
 
   {
     std::vector<ml::InputPiece> pieces;
diff --git a/services/on_device_model/android/backend_model_impl_android.cc b/services/on_device_model/android/backend_model_impl_android.cc
index 41ed65c..8661e72 100644
--- a/services/on_device_model/android/backend_model_impl_android.cc
+++ b/services/on_device_model/android/backend_model_impl_android.cc
@@ -18,7 +18,7 @@
 std::unique_ptr<BackendSession> BackendModelImplAndroid::CreateSession(
     const ScopedAdaptation* adaptation,
     on_device_model::mojom::SessionParamsPtr params) {
-  return std::make_unique<BackendSessionImplAndroid>();
+  return std::make_unique<BackendSessionImplAndroid>(std::move(params));
 }
 
 std::unique_ptr<BackendModel::ScopedAdaptation>
diff --git a/services/on_device_model/android/backend_session_impl_android.cc b/services/on_device_model/android/backend_session_impl_android.cc
index 9488807..4d5b925 100644
--- a/services/on_device_model/android/backend_session_impl_android.cc
+++ b/services/on_device_model/android/backend_session_impl_android.cc
@@ -58,8 +58,9 @@
 
 }  // namespace
 
-BackendSessionImplAndroid::BackendSessionImplAndroid()
-    : java_session_(OnDeviceModelBridge::CreateSession()) {}
+BackendSessionImplAndroid::BackendSessionImplAndroid(
+    on_device_model::mojom::SessionParamsPtr params)
+    : java_session_(OnDeviceModelBridge::CreateSession(std::move(params))) {}
 
 BackendSessionImplAndroid::~BackendSessionImplAndroid() = default;
 
diff --git a/services/on_device_model/android/backend_session_impl_android.h b/services/on_device_model/android/backend_session_impl_android.h
index b4e2bf3..16523acbf 100644
--- a/services/on_device_model/android/backend_session_impl_android.h
+++ b/services/on_device_model/android/backend_session_impl_android.h
@@ -17,7 +17,8 @@
 // lifetime will be created when this object is created.
 class BackendSessionImplAndroid : public BackendSession {
  public:
-  BackendSessionImplAndroid();
+  explicit BackendSessionImplAndroid(
+      on_device_model::mojom::SessionParamsPtr params);
   ~BackendSessionImplAndroid() override;
 
   // BackendSession:
diff --git a/services/on_device_model/android/java/src/org/chromium/on_device_model/AiCoreSessionFactory.java b/services/on_device_model/android/java/src/org/chromium/on_device_model/AiCoreSessionFactory.java
index 71de8b3..29ac3b3 100644
--- a/services/on_device_model/android/java/src/org/chromium/on_device_model/AiCoreSessionFactory.java
+++ b/services/on_device_model/android/java/src/org/chromium/on_device_model/AiCoreSessionFactory.java
@@ -5,6 +5,7 @@
 package org.chromium.on_device_model;
 
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.on_device_model.mojom.SessionParams;
 
 /**
  * A factory to create AiCoreSession. This is null when the AiCore API is not available. Downstream
@@ -12,5 +13,5 @@
  */
 @NullMarked
 public interface AiCoreSessionFactory {
-    AiCoreSession createSession();
+    AiCoreSession createSession(SessionParams params);
 }
diff --git a/services/on_device_model/android/java/src/org/chromium/on_device_model/OnDeviceModelBridge.java b/services/on_device_model/android/java/src/org/chromium/on_device_model/OnDeviceModelBridge.java
index 0afa6bc..a599d889 100644
--- a/services/on_device_model/android/java/src/org/chromium/on_device_model/OnDeviceModelBridge.java
+++ b/services/on_device_model/android/java/src/org/chromium/on_device_model/OnDeviceModelBridge.java
@@ -9,6 +9,7 @@
 
 import org.chromium.base.ServiceLoaderUtil;
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.on_device_model.mojom.SessionParams;
 
 /**
  * A central bridge to connect between the native and java code for on-device model. Responsible
@@ -22,14 +23,19 @@
     /**
      * Creates a new AiCoreSession.
      *
+     * @param topK The top K value for sampling.
+     * @param temperature The temperature value for sampling.
      * @return The AiCoreSession instance.
      */
     @CalledByNative
-    private static AiCoreSession createSession() {
+    private static AiCoreSession createSession(int topK, float temperature) {
+        SessionParams params = new SessionParams();
+        params.topK = topK;
+        params.temperature = temperature;
         AiCoreSessionFactory factory = ServiceLoaderUtil.maybeCreate(AiCoreSessionFactory.class);
         if (factory == null) {
             return new AiCoreSessionUpstreamImpl();
         }
-        return factory.createSession();
+        return factory.createSession(params);
     }
 }
diff --git a/services/on_device_model/android/native_java_unittests/src/org/chromium/on_device_model/OnDeviceModelBridgeNativeUnitTestHelper.java b/services/on_device_model/android/native_java_unittests/src/org/chromium/on_device_model/OnDeviceModelBridgeNativeUnitTestHelper.java
index 43ec436..3385290 100644
--- a/services/on_device_model/android/native_java_unittests/src/org/chromium/on_device_model/OnDeviceModelBridgeNativeUnitTestHelper.java
+++ b/services/on_device_model/android/native_java_unittests/src/org/chromium/on_device_model/OnDeviceModelBridgeNativeUnitTestHelper.java
@@ -3,9 +3,12 @@
 // found in the LICENSE file.
 package org.chromium.on_device_model;
 
+import static org.junit.Assert.assertEquals;
+
 import org.jni_zero.CalledByNative;
 
 import org.chromium.base.ServiceLoaderUtil;
+import org.chromium.on_device_model.mojom.SessionParams;
 
 /**
  * Helper class to verify the JNI bridge. Invoked by native unit tests:
@@ -17,6 +20,12 @@
      * back as the response.
      */
     public static class MockAiCoreSession implements AiCoreSession {
+        private final SessionParams mParams;
+
+        public MockAiCoreSession(SessionParams params) {
+            mParams = params;
+        }
+
         @Override
         public void generate(long nativeBackendSession, InputPiece[] inputPieces) {
             StringBuilder sb = new StringBuilder();
@@ -49,12 +58,11 @@
     public static class MockAiCoreSessionFactory implements AiCoreSessionFactory {
         MockAiCoreSession mSession;
 
-        public MockAiCoreSessionFactory() {
-            mSession = new MockAiCoreSession();
-        }
+        public MockAiCoreSessionFactory() {}
 
         @Override
-        public AiCoreSession createSession() {
+        public AiCoreSession createSession(SessionParams params) {
+            mSession = new MockAiCoreSession(params);
             return mSession;
         }
     }
@@ -69,6 +77,13 @@
     }
 
     @CalledByNative
+    public void verifySessionParams(int topK, float temperature) {
+        SessionParams params = mMockAiCoreSessionFactory.mSession.mParams;
+        assertEquals(topK, params.topK);
+        assertEquals(temperature, params.temperature, 0.01f);
+    }
+
+    @CalledByNative
     public static OnDeviceModelBridgeNativeUnitTestHelper create() {
         return new OnDeviceModelBridgeNativeUnitTestHelper();
     }
diff --git a/services/on_device_model/android/on_device_model_bridge.cc b/services/on_device_model/android/on_device_model_bridge.cc
index 7bb9687..bd05c60 100644
--- a/services/on_device_model/android/on_device_model_bridge.cc
+++ b/services/on_device_model/android/on_device_model_bridge.cc
@@ -13,10 +13,15 @@
 namespace on_device_model {
 
 // static
-base::android::ScopedJavaLocalRef<jobject>
-OnDeviceModelBridge::CreateSession() {
+base::android::ScopedJavaLocalRef<jobject> OnDeviceModelBridge::CreateSession(
+    on_device_model::mojom::SessionParamsPtr params) {
+  CHECK(params) << "SessionParams is required to create a session.";
   JNIEnv* env = base::android::AttachCurrentThread();
-  return Java_OnDeviceModelBridge_createSession(env);
+  // There isn't a generic mojo utility for converting c++ mojo struct to java,
+  // so disassemble the struct here and reassemble it in java.
+  // Only passing the parameters that are supported on Android.
+  return Java_OnDeviceModelBridge_createSession(env, params->top_k,
+                                                params->temperature);
 }
 
 }  // namespace on_device_model
diff --git a/services/on_device_model/android/on_device_model_bridge.h b/services/on_device_model/android/on_device_model_bridge.h
index 897d2be..169fc59 100644
--- a/services/on_device_model/android/on_device_model_bridge.h
+++ b/services/on_device_model/android/on_device_model_bridge.h
@@ -6,6 +6,7 @@
 #define SERVICES_ON_DEVICE_MODEL_ANDROID_ON_DEVICE_MODEL_BRIDGE_H_
 
 #include "base/android/scoped_java_ref.h"
+#include "services/on_device_model/public/mojom/on_device_model.mojom.h"
 
 namespace on_device_model {
 
@@ -15,7 +16,8 @@
  public:
   // Creates a new AiCoreSession instance. Caller is responsible for
   // creating a global ref if it needs to be stored.
-  static base::android::ScopedJavaLocalRef<jobject> CreateSession();
+  static base::android::ScopedJavaLocalRef<jobject> CreateSession(
+      on_device_model::mojom::SessionParamsPtr params);
 };
 
 }  // namespace on_device_model
diff --git a/services/passage_embeddings/BUILD.gn b/services/passage_embeddings/BUILD.gn
index 478c34770..7128e22e 100644
--- a/services/passage_embeddings/BUILD.gn
+++ b/services/passage_embeddings/BUILD.gn
@@ -23,7 +23,7 @@
       "passage_embeddings_op_resolver.h",
     ]
     public_deps += [
-      "//third_party/sentencepiece:sentencepiece",
+      "//third_party/sentencepiece",
       "//third_party/sentencepiece:sentencepiece_proto",
       "//third_party/tflite",
       "//third_party/tflite:tflite_public_headers",
diff --git a/services/preferences/tracked/BUILD.gn b/services/preferences/tracked/BUILD.gn
index 7188263..69661ce8 100644
--- a/services/preferences/tracked/BUILD.gn
+++ b/services/preferences/tracked/BUILD.gn
@@ -96,7 +96,7 @@
     "//components/prefs:test_support",
     "//components/safe_browsing/core/common:features",
     "//components/sync_preferences:test_support",
-    "//crypto:crypto",
+    "//crypto",
     "//services/preferences/public/cpp/tracked:test_support",
     "//testing/gtest",
   ]
diff --git a/services/resource_coordinator/BUILD.gn b/services/resource_coordinator/BUILD.gn
index e413fb0..740327e3 100644
--- a/services/resource_coordinator/BUILD.gn
+++ b/services/resource_coordinator/BUILD.gn
@@ -62,7 +62,7 @@
     "//components/ukm:test_support",
     "//mojo/public/cpp/bindings",
     "//services/resource_coordinator/public/cpp:resource_coordinator_cpp",
-    "//services/resource_coordinator/public/cpp/memory_instrumentation:memory_instrumentation",
+    "//services/resource_coordinator/public/cpp/memory_instrumentation",
     "//services/tracing:test_utils",
     "//testing/gmock",
     "//testing/gtest",
diff --git a/services/screen_ai/BUILD.gn b/services/screen_ai/BUILD.gn
index 53e854a..5235382b5 100644
--- a/services/screen_ai/BUILD.gn
+++ b/services/screen_ai/BUILD.gn
@@ -37,10 +37,10 @@
     "//services/screen_ai/proto",
     "//services/screen_ai/public/cpp:metrics",
     "//services/screen_ai/public/cpp:utilities",
+    "//services/screen_ai/public/mojom",
     "//services/screen_ai/public/mojom:factory",
-    "//services/screen_ai/public/mojom:mojom",
     "//skia",
-    "//ui/accessibility:accessibility",
+    "//ui/accessibility",
   ]
 
   if (is_linux) {
diff --git a/services/tracing/BUILD.gn b/services/tracing/BUILD.gn
index 89056bfad..faae7e9 100644
--- a/services/tracing/BUILD.gn
+++ b/services/tracing/BUILD.gn
@@ -34,7 +34,7 @@
     "//build:blink_buildflags",
     "//mojo/public/cpp/bindings",
     "//services/tracing/public/cpp",
-    "//services/tracing/public/mojom:mojom",
+    "//services/tracing/public/mojom",
     "//third_party/perfetto:libperfetto",
     "//third_party/perfetto/include/perfetto/ext/trace_processor:export_json",
     "//third_party/perfetto/include/perfetto/trace_processor:basic_types",
@@ -108,10 +108,10 @@
     "//mojo/public/cpp/bindings",
     "//services/tracing/public/cpp:buildflags",
     "//services/tracing/public/cpp/background_tracing:unit_tests",
-    "//services/tracing/public/mojom:mojom",
+    "//services/tracing/public/mojom",
     "//testing/gmock",
     "//testing/gtest",
-    "//third_party/perfetto/include/perfetto/protozero:protozero",
+    "//third_party/perfetto/include/perfetto/protozero",
     "//third_party/perfetto/protos/perfetto/common:lite",
     "//third_party/perfetto/protos/perfetto/trace:lite",
     "//third_party/perfetto/protos/perfetto/trace/chrome:lite",
diff --git a/services/tracing/public/cpp/BUILD.gn b/services/tracing/public/cpp/BUILD.gn
index 2a7bcfa..7cd998a 100644
--- a/services/tracing/public/cpp/BUILD.gn
+++ b/services/tracing/public/cpp/BUILD.gn
@@ -134,9 +134,9 @@
     deps += [
       ":buildflags",
       "//build:chromecast_buildflags",
-      "//components/system_cpu:system_cpu",
+      "//components/system_cpu",
       "//third_party/perfetto/protos/perfetto/trace/chrome:minimal_complete_lite",
-      "//third_party/snappy:snappy",
+      "//third_party/snappy",
     ]
 
     if (is_win) {
@@ -149,7 +149,7 @@
 
     # Add the SystemProducer implementations.
     if (is_posix || is_fuchsia) {
-      deps += [ "//third_party/perfetto/include/perfetto/ext/ipc:ipc" ]
+      deps += [ "//third_party/perfetto/include/perfetto/ext/ipc" ]
 
       if (is_fuchsia) {
         sources += [
diff --git a/services/tracing/public/cpp/background_tracing/BUILD.gn b/services/tracing/public/cpp/background_tracing/BUILD.gn
index 950d8a0..ca0bcffd 100644
--- a/services/tracing/public/cpp/background_tracing/BUILD.gn
+++ b/services/tracing/public/cpp/background_tracing/BUILD.gn
@@ -18,7 +18,7 @@
   public_deps = [ "//services/tracing/public/mojom" ]
   deps = [
     "//base",
-    "//services/tracing/public/cpp:cpp",
+    "//services/tracing/public/cpp",
   ]
 }
 
diff --git a/services/video_capture/BUILD.gn b/services/video_capture/BUILD.gn
index 1fe0ec3..635b91e 100644
--- a/services/video_capture/BUILD.gn
+++ b/services/video_capture/BUILD.gn
@@ -41,15 +41,15 @@
   public_deps = [
     "//base",
     "//media",
-    "//media/capture:capture",
+    "//media/capture",
     "//media/capture/mojom:image_capture",
-    "//media/mojo/common:common",
+    "//media/mojo/common",
     "//mojo/public/cpp/system",
     "//services/video_capture/public/cpp",
     "//services/video_capture/public/mojom",
     "//services/video_capture/public/mojom:constants",
     "//services/video_effects/buildflags",
-    "//services/video_effects/public/mojom:mojom",
+    "//services/video_effects/public/mojom",
     "//services/viz/public/cpp/gpu",
   ]
 
@@ -75,7 +75,7 @@
 
     deps += [
       "//base",
-      "//services/video_capture/public/cpp:cpp",
+      "//services/video_capture/public/cpp",
       "//services/video_capture/public/mojom",
     ]
 
diff --git a/services/video_capture/public/cpp/BUILD.gn b/services/video_capture/public/cpp/BUILD.gn
index cabb135..c3550de 100644
--- a/services/video_capture/public/cpp/BUILD.gn
+++ b/services/video_capture/public/cpp/BUILD.gn
@@ -19,11 +19,11 @@
   public_deps = [
     "//base",
     "//media",
-    "//media/capture:capture",
+    "//media/capture",
     "//services/video_capture/public/mojom",
   ]
 
-  deps = [ "//mojo/public/cpp/bindings:bindings" ]
+  deps = [ "//mojo/public/cpp/bindings" ]
 }
 
 source_set("mocks") {
diff --git a/services/video_capture/public/mojom/BUILD.gn b/services/video_capture/public/mojom/BUILD.gn
index 9b72ac7..3c5617d4 100644
--- a/services/video_capture/public/mojom/BUILD.gn
+++ b/services/video_capture/public/mojom/BUILD.gn
@@ -22,7 +22,7 @@
     "//media/capture/mojom:image_capture",
     "//media/capture/mojom:video_capture",
     "//media/mojo/mojom",
-    "//services/video_effects/public/mojom:mojom",
+    "//services/video_effects/public/mojom",
     "//ui/gfx/geometry/mojom",
   ]
 
diff --git a/services/video_effects/BUILD.gn b/services/video_effects/BUILD.gn
index 85fce00..b5512c5 100644
--- a/services/video_effects/BUILD.gn
+++ b/services/video_effects/BUILD.gn
@@ -25,13 +25,13 @@
     ]
 
     visibility = [
-      "//content/utility:utility",
+      "//content/utility",
       "//services/video_effects:tests",
     ]
 
     public_deps = [
-      "//services/video_effects/public/mojom:mojom",
-      "//services/viz/public/cpp/gpu:gpu",
+      "//services/video_effects/public/mojom",
+      "//services/viz/public/cpp/gpu",
     ]
 
     deps = [
diff --git a/services/video_effects/public/cpp/BUILD.gn b/services/video_effects/public/cpp/BUILD.gn
index 6ad67a58..fdbdeb6 100644
--- a/services/video_effects/public/cpp/BUILD.gn
+++ b/services/video_effects/public/cpp/BUILD.gn
@@ -11,7 +11,7 @@
       "video_effects_service_host.h",
     ]
 
-    public_deps = [ "//services/video_effects/public/mojom:mojom" ]
+    public_deps = [ "//services/video_effects/public/mojom" ]
 
     deps = [
       "//content/public/browser",
diff --git a/services/video_effects/public/mojom/BUILD.gn b/services/video_effects/public/mojom/BUILD.gn
index 3781190..852f20d2 100644
--- a/services/video_effects/public/mojom/BUILD.gn
+++ b/services/video_effects/public/mojom/BUILD.gn
@@ -14,7 +14,7 @@
   deps = [
     "//media/capture/mojom:video_capture",
     "//media/capture/mojom:video_effects_manager",
-    "//services/viz/public/mojom:mojom",
+    "//services/viz/public/mojom",
   ]
 
   enabled_features = []
diff --git a/services/viz/privileged/mojom/BUILD.gn b/services/viz/privileged/mojom/BUILD.gn
index 40f7103..df9b6c2 100644
--- a/services/viz/privileged/mojom/BUILD.gn
+++ b/services/viz/privileged/mojom/BUILD.gn
@@ -35,7 +35,7 @@
 
   deps = [
     "//base/test:test_support",
-    "//components/viz/common:common",
+    "//components/viz/common",
     "//media/capture/mojom:video_capture",
     "//services/service_manager/public/cpp",
     "//services/viz/privileged/mojom/compositing",
diff --git a/services/viz/privileged/mojom/gl/BUILD.gn b/services/viz/privileged/mojom/gl/BUILD.gn
index e237eb8..5b0052f2 100644
--- a/services/viz/privileged/mojom/gl/BUILD.gn
+++ b/services/viz/privileged/mojom/gl/BUILD.gn
@@ -21,7 +21,7 @@
     "//gpu/ipc/common:surface_handle",
     "//media/mojo/mojom",
     "//services/webnn/public/mojom",
-    "//third_party/blink/public/mojom/tokens:tokens",
+    "//third_party/blink/public/mojom/tokens",
     "//ui/gfx/geometry/mojom",
     "//ui/gfx/mojom",
     "//ui/gl/mojom",
diff --git a/services/viz/public/cpp/compositing/BUILD.gn b/services/viz/public/cpp/compositing/BUILD.gn
index b230e060..12dd47d9 100644
--- a/services/viz/public/cpp/compositing/BUILD.gn
+++ b/services/viz/public/cpp/compositing/BUILD.gn
@@ -9,7 +9,7 @@
 
   deps = [
     "//base/test:test_support",
-    "//components/viz/common:common",
+    "//components/viz/common",
     "//components/viz/test:test_support",
     "//gpu/ipc/common",
     "//ipc",
diff --git a/services/viz/public/cpp/hit_test/BUILD.gn b/services/viz/public/cpp/hit_test/BUILD.gn
index 2f1b5722..a4daf22 100644
--- a/services/viz/public/cpp/hit_test/BUILD.gn
+++ b/services/viz/public/cpp/hit_test/BUILD.gn
@@ -9,7 +9,7 @@
 
   deps = [
     "//base/test:test_support",
-    "//components/viz/common:common",
+    "//components/viz/common",
     "//components/viz/test:test_support",
     "//mojo/public/cpp/test_support:test_utils",
     "//services/viz/public/mojom",
diff --git a/services/viz/public/mojom/BUILD.gn b/services/viz/public/mojom/BUILD.gn
index 1aac4f1..c305546 100644
--- a/services/viz/public/mojom/BUILD.gn
+++ b/services/viz/public/mojom/BUILD.gn
@@ -67,7 +67,7 @@
     "//media/mojo/mojom",
     "//mojo/public/mojom/base",
     "//skia/public/mojom",
-    "//third_party/blink/public/mojom/tokens:tokens",
+    "//third_party/blink/public/mojom/tokens",
     "//ui/gfx/geometry/mojom",
     "//ui/gfx/mojom",
     "//ui/gfx/mojom:hdr_metadata",
diff --git a/testing/perf/cbb_ref_info/chrome/dev/Android.json b/testing/perf/cbb_ref_info/chrome/dev/Android.json
index 9f22263..7a84e56 100644
--- a/testing/perf/cbb_ref_info/chrome/dev/Android.json
+++ b/testing/perf/cbb_ref_info/chrome/dev/Android.json
@@ -2,5 +2,5 @@
   "browser": "Chrome",
   "channel": "Dev",
   "platform": "Android",
-  "version": "140.0.7259.0"
+  "version": "140.0.7313.0"
 }
\ No newline at end of file
diff --git a/testing/perf/cbb_ref_info/chrome/dev/Windows.json b/testing/perf/cbb_ref_info/chrome/dev/Windows.json
index 0da757b..e10800dd 100644
--- a/testing/perf/cbb_ref_info/chrome/dev/Windows.json
+++ b/testing/perf/cbb_ref_info/chrome/dev/Windows.json
@@ -2,5 +2,5 @@
   "browser": "Chrome",
   "channel": "Dev",
   "platform": "Windows",
-  "version": "140.0.7259.2"
+  "version": "140.0.7312.0"
 }
\ No newline at end of file
diff --git a/testing/perf/cbb_ref_info/chrome/dev/macOS.json b/testing/perf/cbb_ref_info/chrome/dev/macOS.json
index 6fc0d92..37e0993 100644
--- a/testing/perf/cbb_ref_info/chrome/dev/macOS.json
+++ b/testing/perf/cbb_ref_info/chrome/dev/macOS.json
@@ -2,5 +2,5 @@
   "browser": "Chrome",
   "channel": "Dev",
   "platform": "Mac",
-  "version": "140.0.7259.2"
+  "version": "140.0.7312.0"
 }
\ No newline at end of file
diff --git a/testing/perf/cbb_ref_info/chrome/stable/Android.json b/testing/perf/cbb_ref_info/chrome/stable/Android.json
index 9bea93d6..19d6e69 100644
--- a/testing/perf/cbb_ref_info/chrome/stable/Android.json
+++ b/testing/perf/cbb_ref_info/chrome/stable/Android.json
@@ -2,5 +2,5 @@
   "browser": "Chrome",
   "channel": "Stable",
   "platform": "Android",
-  "version": "138.0.7204.63"
+  "version": "138.0.7204.168"
 }
\ No newline at end of file
diff --git a/testing/perf/cbb_ref_info/chrome/stable/Windows.json b/testing/perf/cbb_ref_info/chrome/stable/Windows.json
index 6c5dfc3d..ec2105b9 100644
--- a/testing/perf/cbb_ref_info/chrome/stable/Windows.json
+++ b/testing/perf/cbb_ref_info/chrome/stable/Windows.json
@@ -2,5 +2,5 @@
   "browser": "Chrome",
   "channel": "Stable",
   "platform": "Windows",
-  "version": "138.0.7204.50"
+  "version": "138.0.7204.169"
 }
\ No newline at end of file
diff --git a/testing/perf/cbb_ref_info/chrome/stable/macOS.json b/testing/perf/cbb_ref_info/chrome/stable/macOS.json
index 58f280b..1d34ea2d 100644
--- a/testing/perf/cbb_ref_info/chrome/stable/macOS.json
+++ b/testing/perf/cbb_ref_info/chrome/stable/macOS.json
@@ -2,5 +2,5 @@
   "browser": "Chrome",
   "channel": "Stable",
   "platform": "Mac",
-  "version": "138.0.7204.50"
+  "version": "138.0.7204.169"
 }
\ No newline at end of file
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 18ee3fd..a039f361 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -10463,7 +10463,8 @@
     "ForceOffTextAutosizing": [
         {
             "platforms": [
-                "android"
+                "android",
+                "android_webview"
             ],
             "experiments": [
                 {
@@ -14735,24 +14736,6 @@
             ]
         }
     ],
-    "MemoryCacheIntelligentPruning": [
-        {
-            "platforms": [
-                "chromeos",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled",
-                    "enable_features": [
-                        "MemoryCacheIntelligentPruning"
-                    ]
-                }
-            ]
-        }
-    ],
     "MemoryCacheStrongRefPruningTuneUp": [
         {
             "platforms": [
@@ -16580,6 +16563,7 @@
                         "offer_notification": "true",
                         "price_insights": "true",
                         "product_specifications": "true",
+                        "pwa_install": "true",
                         "translate": "true",
                         "zoom": "true"
                     },
@@ -24117,7 +24101,6 @@
                         "tab_search_toolbar_button": "true"
                     },
                     "enable_features": [
-                        "IPH_TabSearchToolbarButton",
                         "TabstripComboButton"
                     ]
                 }
diff --git a/third_party/BUILD.gn b/third_party/BUILD.gn
index 372514fe..5a35bc4 100644
--- a/third_party/BUILD.gn
+++ b/third_party/BUILD.gn
@@ -31,7 +31,7 @@
     public_deps = [ "//third_party/libjpeg_turbo:libjpeg" ]
     public_configs = [ ":libjpeg_turbo_config" ]
   } else {
-    public_deps = [ "//third_party/libjpeg:libjpeg" ]
+    public_deps = [ "//third_party/libjpeg" ]
   }
 }
 
diff --git a/third_party/abseil-cpp/CMake/AbseilDll.cmake b/third_party/abseil-cpp/CMake/AbseilDll.cmake
index f70d6f0..be5aaa9c6 100644
--- a/third_party/abseil-cpp/CMake/AbseilDll.cmake
+++ b/third_party/abseil-cpp/CMake/AbseilDll.cmake
@@ -214,10 +214,14 @@
   "numeric/int128.h"
   "numeric/internal/bits.h"
   "numeric/internal/representation.h"
+  "profiling/hashtable.cc"
+  "profiling/hashtable.h"
   "profiling/internal/exponential_biased.cc"
   "profiling/internal/exponential_biased.h"
   "profiling/internal/periodic_sampler.cc"
   "profiling/internal/periodic_sampler.h"
+  "profiling/internal/profile_builder.cc"
+  "profiling/internal/profile_builder.h"
   "profiling/internal/sample_recorder.h"
   "random/bernoulli_distribution.h"
   "random/beta_distribution.h"
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium
index 8e74febb..09ea45e 100644
--- a/third_party/abseil-cpp/README.chromium
+++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@
 License: Apache-2.0
 License File: LICENSE
 Version: N/A
-Revision: af00a9295f47b4d3441184d5701505b7edec4a4a
+Revision: 64a9eafe33d1ac88ea66d620aeae0da513b515e3
 Update Mechanism: Manual
 Security Critical: yes
 Shipped: yes
diff --git a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc
index c0fce87..965476a 100644
--- a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc
+++ b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.cc
@@ -94,8 +94,9 @@
   // The inliner makes hardcoded skip_count difficult (especially when combined
   // with LTO).  We use the ability to exclude stacks by regex when encoding
   // instead.
-  depth = absl::GetStackTrace(stack, HashtablezInfo::kMaxStackDepth,
-                              /* skip_count= */ 0);
+  depth = static_cast<unsigned>(
+      absl::GetStackTrace(stack, HashtablezInfo::kMaxStackDepth,
+                          /* skip_count= */ 0));
   inline_element_size = inline_element_size_value;
   key_size = key_size_value;
   value_size = value_size_value;
diff --git a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h
index 305dc85..55ce7ed 100644
--- a/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h
+++ b/third_party/abseil-cpp/absl/container/internal/hashtablez_sampler.h
@@ -97,7 +97,7 @@
   // the lock.
   static constexpr int kMaxStackDepth = 64;
   absl::Time create_time;
-  int32_t depth;
+  uint32_t depth;
   // The SOO capacity for this table in elements (not bytes). Note that sampled
   // tables are never SOO because we need to store the infoz handle on the heap.
   // Tables that would be SOO if not sampled should have: soo_capacity > 0 &&
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc
index bd03ac1..9f4ceff 100644
--- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.cc
@@ -45,15 +45,9 @@
 // uninitialized because reading this memory is a bug.
 ABSL_DLL ctrl_t kDefaultIterControl;
 
-// We need one full byte followed by a sentinel byte for iterator::operator++ to
-// work. We have a full group after kSentinel to be safe (in case operator++ is
-// changed to read a full group).
-ABSL_CONST_INIT ABSL_DLL const ctrl_t kSooControl[17] = {
-    ZeroCtrlT(),    ctrl_t::kSentinel, ZeroCtrlT(),    ctrl_t::kEmpty,
-    ctrl_t::kEmpty, ctrl_t::kEmpty,    ctrl_t::kEmpty, ctrl_t::kEmpty,
-    ctrl_t::kEmpty, ctrl_t::kEmpty,    ctrl_t::kEmpty, ctrl_t::kEmpty,
-    ctrl_t::kEmpty, ctrl_t::kEmpty,    ctrl_t::kEmpty, ctrl_t::kEmpty,
-    ctrl_t::kEmpty};
+// We need one full byte followed by a sentinel byte for iterator::operator++.
+ABSL_CONST_INIT ABSL_DLL const ctrl_t kSooControl[2] = {ZeroCtrlT(),
+                                                        ctrl_t::kSentinel};
 
 namespace {
 
@@ -521,16 +515,23 @@
 
 }  // namespace
 
-void EraseMetaOnly(CommonFields& c, const ctrl_t* ctrl, size_t slot_size) {
+void EraseMetaOnlySmall(CommonFields& c, bool soo_enabled, size_t slot_size) {
+  ABSL_SWISSTABLE_ASSERT(c.is_small());
+  if (soo_enabled) {
+    c.set_empty_soo();
+    return;
+  }
+  c.decrement_size();
+  c.infoz().RecordErase();
+  SanitizerPoisonMemoryRegion(c.slot_array(), slot_size);
+}
+
+void EraseMetaOnlyLarge(CommonFields& c, const ctrl_t* ctrl, size_t slot_size) {
+  ABSL_SWISSTABLE_ASSERT(!c.is_small());
   ABSL_SWISSTABLE_ASSERT(IsFull(*ctrl) && "erasing a dangling iterator");
   c.decrement_size();
   c.infoz().RecordErase();
 
-  if (c.is_small()) {
-    SanitizerPoisonMemoryRegion(c.slot_array(), slot_size);
-    return;
-  }
-
   size_t index = static_cast<size_t>(ctrl - c.control());
 
   if (WasNeverFull(c, index)) {
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h
index 1c8e654..5fe3367 100644
--- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set.h
@@ -368,17 +368,6 @@
         std::declval<Ts>()...))>,
     Policy, Hash, Eq, Ts...> : std::true_type {};
 
-// TODO(alkis): Switch to std::is_nothrow_swappable when gcc/clang supports it.
-template <class T>
-constexpr bool IsNoThrowSwappable(std::true_type = {} /* is_swappable */) {
-  using std::swap;
-  return noexcept(swap(std::declval<T&>(), std::declval<T&>()));
-}
-template <class T>
-constexpr bool IsNoThrowSwappable(std::false_type /* is_swappable */) {
-  return false;
-}
-
 ABSL_DLL extern ctrl_t kDefaultIterControl;
 
 // We use these sentinel capacity values in debug mode to indicate different
@@ -400,7 +389,7 @@
 // For use in SOO iterators.
 // TODO(b/289225379): we could potentially get rid of this by adding an is_soo
 // bit in iterators. This would add branches but reduce cache misses.
-ABSL_DLL extern const ctrl_t kSooControl[17];
+ABSL_DLL extern const ctrl_t kSooControl[2];
 
 // Returns a pointer to a full byte followed by a sentinel byte.
 inline ctrl_t* SooControl() {
@@ -1794,8 +1783,9 @@
 void ClearBackingArray(CommonFields& c, const PolicyFunctions& policy,
                        void* alloc, bool reuse, bool soo_enabled);
 
-// Type-erased version of raw_hash_set::erase_meta_only.
-void EraseMetaOnly(CommonFields& c, const ctrl_t* ctrl, size_t slot_size);
+// Type-erased versions of raw_hash_set::erase_meta_only_{small,large}.
+void EraseMetaOnlySmall(CommonFields& c, bool soo_enabled, size_t slot_size);
+void EraseMetaOnlyLarge(CommonFields& c, const ctrl_t* ctrl, size_t slot_size);
 
 // For trivially relocatable types we use memcpy directly. This allows us to
 // share the same function body for raw_hash_set instantiations that have the
@@ -2062,20 +2052,8 @@
     // `slot_` until they reach one.
     void skip_empty_or_deleted() {
       while (IsEmptyOrDeleted(*ctrl_)) {
-        auto mask = GroupFullEmptyOrDeleted{ctrl_}.MaskFullOrSentinel();
-        // Generally it is possible to compute `shift` branchless.
-        // This branch is useful to:
-        // 1. Avoid checking `IsEmptyOrDeleted` after the shift for the most
-        //    common dense table case.
-        // 2. Avoid the cost of `LowestBitSet` for extremely sparse tables.
-        if (ABSL_PREDICT_TRUE(mask)) {
-          auto shift = mask.LowestBitSet();
-          ctrl_ += shift;
-          slot_ += shift;
-          return;
-        }
-        ctrl_ += Group::kWidth;
-        slot_ += Group::kWidth;
+        ++ctrl_;
+        ++slot_;
       }
     }
 
@@ -2333,7 +2311,7 @@
   }
 
   raw_hash_set& operator=(raw_hash_set&& that) noexcept(
-      absl::allocator_traits<allocator_type>::is_always_equal::value &&
+      AllocTraits::is_always_equal::value &&
       std::is_nothrow_move_assignable<hasher>::value &&
       std::is_nothrow_move_assignable<key_equal>::value) {
     // TODO(sbenza): We should only use the operations from the noexcept clause
@@ -2703,7 +2681,7 @@
     if (first == last) return last.inner_;
     if (is_small()) {
       destroy(single_slot());
-      erase_meta_only(single_iterator());
+      erase_meta_only_small();
       return end();
     }
     if (first == begin() && last == end()) {
@@ -2738,12 +2716,12 @@
     if (src.is_small()) {
       if (src.empty()) return;
       if (insert_slot(src.single_slot()))
-        src.erase_meta_only(src.single_iterator());
+        src.erase_meta_only_small();
       return;
     }
     for (auto it = src.begin(), e = src.end(); it != e;) {
       auto next = std::next(it);
-      if (insert_slot(it.slot())) src.erase_meta_only(it);
+      if (insert_slot(it.slot())) src.erase_meta_only_large(it);
       it = next;
     }
   }
@@ -2770,9 +2748,9 @@
   }
 
   void swap(raw_hash_set& that) noexcept(
-      IsNoThrowSwappable<hasher>() && IsNoThrowSwappable<key_equal>() &&
-      IsNoThrowSwappable<allocator_type>(
-          typename AllocTraits::propagate_on_container_swap{})) {
+      AllocTraits::is_always_equal::value &&
+      std::is_nothrow_swappable<hasher>::value &&
+      std::is_nothrow_swappable<key_equal>::value) {
     AssertNotDebugCapacity();
     that.AssertNotDebugCapacity();
     using std::swap;
@@ -3085,11 +3063,17 @@
   // This merely updates the pertinent control byte. This can be used in
   // conjunction with Policy::transfer to move the object to another place.
   void erase_meta_only(const_iterator it) {
-    if (is_soo()) {
-      common().set_empty_soo();
+    if (is_small()) {
+      erase_meta_only_small();
       return;
     }
-    EraseMetaOnly(common(), it.control(), sizeof(slot_type));
+    erase_meta_only_large(it);
+  }
+  void erase_meta_only_small() {
+    EraseMetaOnlySmall(common(), SooEnabled(), sizeof(slot_type));
+  }
+  void erase_meta_only_large(const_iterator it) {
+    EraseMetaOnlyLarge(common(), it.control(), sizeof(slot_type));
   }
 
   template <class K>
@@ -3636,7 +3620,7 @@
         return 0;
       }
       c->destroy(it.slot());
-      c->erase_meta_only(it);
+      c->erase_meta_only_small();
       return 1;
     }
     [[maybe_unused]] const size_t original_size_for_assert = c->size();
@@ -3648,7 +3632,7 @@
           auto* slot = static_cast<SlotType*>(slot_void);
           if (pred(Set::PolicyTraits::element(slot))) {
             c->destroy(slot);
-            EraseMetaOnly(c->common(), ctrl, sizeof(*slot));
+            EraseMetaOnlyLarge(c->common(), ctrl, sizeof(*slot));
             ++num_deleted;
           }
         });
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc
index 2e6f8f5..b268d9e3 100644
--- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_allocator_test.cc
@@ -436,13 +436,14 @@
 }
 
 TEST_F(PropagateOnAll, Swap) {
-  auto it = t1.insert(0).first;
+  t1.insert(0);
   Table u(0, a2);
   u.swap(t1);
   EXPECT_EQ(a1, u.get_allocator());
   EXPECT_EQ(a2, t1.get_allocator());
   EXPECT_EQ(1, a1.num_allocs());
   EXPECT_EQ(0, a2.num_allocs());
+  auto it = u.begin();
   EXPECT_EQ(0, it->num_moves());
   EXPECT_EQ(0, it->num_copies());
 }
diff --git a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
index e1dafff..044e5b5 100644
--- a/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
+++ b/third_party/abseil-cpp/absl/container/internal/raw_hash_set_test.cc
@@ -2247,12 +2247,10 @@
 }
 
 TEST(Table, NoThrowSwappable) {
-  ASSERT_TRUE(
-      container_internal::IsNoThrowSwappable<absl::Hash<absl::string_view>>());
-  ASSERT_TRUE(container_internal::IsNoThrowSwappable<
-              std::equal_to<absl::string_view>>());
-  ASSERT_TRUE(container_internal::IsNoThrowSwappable<std::allocator<int>>());
-  EXPECT_TRUE(container_internal::IsNoThrowSwappable<StringTable>());
+  ASSERT_TRUE(std::is_nothrow_swappable<absl::Hash<absl::string_view>>());
+  ASSERT_TRUE(std::is_nothrow_swappable<std::equal_to<absl::string_view>>());
+  ASSERT_TRUE(std::is_nothrow_swappable<std::allocator<int>>());
+  EXPECT_TRUE(std::is_nothrow_swappable<StringTable>());
 }
 
 TEST(Table, HeterogeneousLookup) {
diff --git a/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc b/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc
index 3194bec46..ee9778d 100644
--- a/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc
+++ b/third_party/abseil-cpp/absl/crc/internal/crc_x86_arm_combined.cc
@@ -137,6 +137,13 @@
 
 // Compute a magic constant, so that multiplying by it is the same as
 // extending crc by length zeros.
+#if defined(NDEBUG) && ABSL_HAVE_CPP_ATTRIBUTE(clang::no_sanitize)
+// The array accesses in this are safe:
+// length > 3, so countr_zero(length >> 2) < 62, and length & (length - 1)
+// cannot introduce bits >= 62.
+// The compiler cannot prove this, so manually disable bounds checking.
+[[clang::no_sanitize("array-bounds")]]
+#endif
 uint32_t CRC32AcceleratedX86ARMCombined::ComputeZeroConstant(
     size_t length) const {
   // Lowest 2 bits are handled separately in ExtendByZeroes
diff --git a/third_party/abseil-cpp/absl/debugging/stacktrace.cc b/third_party/abseil-cpp/absl/debugging/stacktrace.cc
index f71e80c..30d032a4 100644
--- a/third_party/abseil-cpp/absl/debugging/stacktrace.cc
+++ b/third_party/abseil-cpp/absl/debugging/stacktrace.cc
@@ -124,6 +124,19 @@
 internal_stacktrace::GetStackFrames(void** result, uintptr_t* frames,
                                     int* sizes, int max_depth, int skip_count) {
   if (internal_stacktrace::ShouldFixUpStack()) {
+    if constexpr (kHaveAlloca) {
+      // Some implementations of FixUpStack may need to be passed frame
+      // information from Unwind, even if the caller doesn't need that
+      // information. We allocate the necessary buffers for such implementations
+      // here.
+      const size_t nmax = static_cast<size_t>(max_depth);
+      if (frames == nullptr) {
+        frames = static_cast<uintptr_t*>(alloca(nmax * sizeof(*frames)));
+      }
+      if (sizes == nullptr) {
+        sizes = static_cast<int*>(alloca(nmax * sizeof(*sizes)));
+      }
+    }
     size_t depth = static_cast<size_t>(Unwind<true, true>(
         result, frames, sizes, max_depth, skip_count, nullptr, nullptr));
     internal_stacktrace::FixUpStack(result, frames, sizes,
@@ -141,6 +154,19 @@
                                                int skip_count, const void* uc,
                                                int* min_dropped_frames) {
   if (internal_stacktrace::ShouldFixUpStack()) {
+    if constexpr (kHaveAlloca) {
+      // Some implementations of FixUpStack may need to be passed frame
+      // information from Unwind, even if the caller doesn't need that
+      // information. We allocate the necessary buffers for such implementations
+      // here.
+      const size_t nmax = static_cast<size_t>(max_depth);
+      if (frames == nullptr) {
+        frames = static_cast<uintptr_t*>(alloca(nmax * sizeof(*frames)));
+      }
+      if (sizes == nullptr) {
+        sizes = static_cast<int*>(alloca(nmax * sizeof(*sizes)));
+      }
+    }
     size_t depth = static_cast<size_t>(Unwind<true, true>(
         result, frames, sizes, max_depth, skip_count, uc, min_dropped_frames));
     internal_stacktrace::FixUpStack(result, frames, sizes,
diff --git a/third_party/abseil-cpp/absl/profiling/BUILD.bazel b/third_party/abseil-cpp/absl/profiling/BUILD.bazel
index f9a2a72..5afdb96 100644
--- a/third_party/abseil-cpp/absl/profiling/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/profiling/BUILD.bazel
@@ -144,3 +144,44 @@
         "@google_benchmark//:benchmark_main",
     ],
 )
+
+cc_library(
+    name = "profile_builder",
+    srcs = ["internal/profile_builder.cc"],
+    hdrs = ["internal/profile_builder.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    visibility = [
+        "//absl:__subpackages__",
+    ],
+    deps = [
+        "//absl/base",
+        "//absl/base:config",
+        "//absl/base:raw_logging_internal",
+        "//absl/container:btree",
+        "//absl/container:flat_hash_map",
+        "//absl/strings",
+        "//absl/types:span",
+    ],
+)
+
+cc_library(
+    name = "hashtable",
+    srcs = ["hashtable.cc"],
+    hdrs = ["hashtable.h"],
+    copts = ABSL_DEFAULT_COPTS,
+    linkopts = ABSL_DEFAULT_LINKOPTS,
+    visibility = [
+        "//absl:__subpackages__",
+    ],
+    deps = [
+        ":profile_builder",
+        "//absl/base:config",
+        "//absl/container:hashtablez_sampler",
+        "//absl/status:statusor",
+        "//absl/strings",
+        "//absl/strings:string_view",
+        "//absl/time",
+        "//absl/types:span",
+    ],
+)
diff --git a/third_party/abseil-cpp/absl/profiling/BUILD.gn b/third_party/abseil-cpp/absl/profiling/BUILD.gn
index 16b37de5..23764a27 100644
--- a/third_party/abseil-cpp/absl/profiling/BUILD.gn
+++ b/third_party/abseil-cpp/absl/profiling/BUILD.gn
@@ -63,3 +63,32 @@
     "//third_party/abseil-cpp/absl/base:core_headers",
   ]
 }
+
+absl_source_set("profile_builder") {
+  sources = [ "internal/profile_builder.cc" ]
+  public = [ "internal/profile_builder.h" ]
+  deps = [
+    "//third_party/abseil-cpp/absl/base",
+    "//third_party/abseil-cpp/absl/base:config",
+    "//third_party/abseil-cpp/absl/base:raw_logging_internal",
+    "//third_party/abseil-cpp/absl/container:btree",
+    "//third_party/abseil-cpp/absl/container:flat_hash_map",
+    "//third_party/abseil-cpp/absl/strings",
+    "//third_party/abseil-cpp/absl/types:span",
+  ]
+}
+
+absl_source_set("hashtable") {
+  sources = [ "hashtable.cc" ]
+  public = [ "hashtable.h" ]
+  deps = [
+    ":profile_builder",
+    "//third_party/abseil-cpp/absl/base:config",
+    "//third_party/abseil-cpp/absl/container:hashtablez_sampler",
+    "//third_party/abseil-cpp/absl/status:statusor",
+    "//third_party/abseil-cpp/absl/strings",
+    "//third_party/abseil-cpp/absl/strings:string_view",
+    "//third_party/abseil-cpp/absl/time",
+    "//third_party/abseil-cpp/absl/types:span",
+  ]
+}
diff --git a/third_party/abseil-cpp/absl/profiling/CMakeLists.txt b/third_party/abseil-cpp/absl/profiling/CMakeLists.txt
index 84b8b3b8..4807f0dde 100644
--- a/third_party/abseil-cpp/absl/profiling/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/profiling/CMakeLists.txt
@@ -92,3 +92,40 @@
     GTest::gmock_main
 )
 
+# Internal-only target, do not depend on directly
+absl_cc_library(
+  NAME
+    profile_builder
+  HDRS
+    "internal/profile_builder.h"
+  SRCS
+    "internal/profile_builder.cc"
+  COPTS
+    ${ABSL_DEFAULT_COPTS}
+  DEPS
+    absl::config
+    absl::core_headers
+    absl::raw_logging_internal
+    absl::flat_hash_map
+    absl::btree
+    absl::strings
+    absl::span
+)
+
+absl_cc_library(
+  NAME
+    hashtable_profiler
+  HDRS
+    "hashtable.h"
+  SRCS
+    "hashtable.cc"
+  COPTS
+    ${ABSL_DEFAULT_COPTS}
+  DEPS
+    absl::profile_builder
+    absl::config
+    absl::core_headers
+    absl::strings
+    absl::span
+    absl::hashtablez_sampler
+)
diff --git a/third_party/abseil-cpp/absl/profiling/hashtable.cc b/third_party/abseil-cpp/absl/profiling/hashtable.cc
new file mode 100644
index 0000000..bfec0d5
--- /dev/null
+++ b/third_party/abseil-cpp/absl/profiling/hashtable.cc
@@ -0,0 +1,124 @@
+// Copyright 2025 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may
+// obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/profiling/hashtable.h"
+
+#include <atomic>
+#include <cstddef>
+#include <cstdint>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "absl/base/config.h"
+#include "absl/container/internal/hashtablez_sampler.h"
+#include "absl/profiling/internal/profile_builder.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/str_cat.h"
+#include "absl/strings/string_view.h"
+#include "absl/time/clock.h"
+#include "absl/time/time.h"
+#include "absl/types/span.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+
+StatusOr<std::string> MarshalHashtableProfile() {
+  return debugging_internal::MarshalHashtableProfile(
+      container_internal::GlobalHashtablezSampler(), Now());
+}
+
+namespace debugging_internal {
+
+StatusOr<std::string> MarshalHashtableProfile(
+    container_internal::HashtablezSampler& sampler, Time now) {
+  static constexpr absl::string_view kDropFrames =
+      "(::)?absl::container_internal::.*|"
+      "(::)?absl::(flat|node)_hash_(map|set).*";
+
+  ProfileBuilder builder;
+  StringId drop_frames_id = builder.InternString(kDropFrames);
+  builder.set_drop_frames_id(drop_frames_id);
+  builder.AddSampleType(builder.InternString("capacity"),
+                        builder.InternString("count"));
+  builder.set_default_sample_type_id(builder.InternString("capacity"));
+
+  const auto capacity_id = builder.InternString("capacity");
+  const auto size_id = builder.InternString("size");
+  const auto num_erases_id = builder.InternString("num_erases");
+  const auto num_rehashes_id = builder.InternString("num_rehashes");
+  const auto max_probe_length_id = builder.InternString("max_probe_length");
+  const auto total_probe_length_id = builder.InternString("total_probe_length");
+  const auto stuck_bits_id = builder.InternString("stuck_bits");
+  const auto inline_element_size_id =
+      builder.InternString("inline_element_size");
+  const auto key_size_id = builder.InternString("key_size");
+  const auto value_size_id = builder.InternString("value_size");
+  const auto soo_capacity_id = builder.InternString("soo_capacity");
+  const auto checksum_id = builder.InternString("checksum");
+  const auto table_age_id = builder.InternString("table_age");
+  const auto max_reserve_id = builder.InternString("max_reserve");
+
+  size_t dropped =
+      sampler.Iterate([&](const container_internal::HashtablezInfo& info) {
+        const size_t capacity = info.capacity.load(std::memory_order_relaxed);
+        std::vector<std::pair<StringId, int64_t>> labels;
+
+        auto add_label = [&](StringId tag, uint64_t value) {
+          if (value == 0) {
+            return;
+          }
+          labels.emplace_back(tag, static_cast<int64_t>(value));
+        };
+
+        add_label(capacity_id, capacity);
+        add_label(size_id, info.size.load(std::memory_order_relaxed));
+        add_label(num_erases_id,
+                  info.num_erases.load(std::memory_order_relaxed));
+        add_label(num_rehashes_id,
+                  info.num_rehashes.load(std::memory_order_relaxed));
+        add_label(max_probe_length_id,
+                  info.max_probe_length.load(std::memory_order_relaxed));
+        add_label(total_probe_length_id,
+                  info.total_probe_length.load(std::memory_order_relaxed));
+        add_label(stuck_bits_id,
+                  (info.hashes_bitwise_and.load(std::memory_order_relaxed) |
+                   ~info.hashes_bitwise_or.load(std::memory_order_relaxed)));
+        add_label(inline_element_size_id, info.inline_element_size);
+        add_label(key_size_id, info.key_size);
+        add_label(value_size_id, info.value_size);
+        add_label(soo_capacity_id, info.soo_capacity);
+        add_label(checksum_id,
+                  info.hashes_bitwise_xor.load(std::memory_order_relaxed));
+        add_label(
+            table_age_id,
+            static_cast<uint64_t>(ToInt64Microseconds(now - info.create_time)));
+        add_label(max_reserve_id,
+                  info.max_reserve.load(std::memory_order_relaxed));
+        builder.AddSample(static_cast<int64_t>(capacity) * info.weight,
+                          MakeSpan(info.stack, info.depth), labels);
+      });
+
+  // TODO(b/262310142): Make this more structured data.
+  StringId comment_id =
+      builder.InternString(StrCat("dropped_samples: ", dropped));
+  builder.set_comment_id(comment_id);
+  builder.AddCurrentMappings();
+  return std::move(builder).Emit();
+}
+
+}  // namespace debugging_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/profiling/hashtable.h b/third_party/abseil-cpp/absl/profiling/hashtable.h
new file mode 100644
index 0000000..9e490dcd
--- /dev/null
+++ b/third_party/abseil-cpp/absl/profiling/hashtable.h
@@ -0,0 +1,40 @@
+// Copyright 2025 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_PROFILING_HASHTABLE_H_
+#define ABSL_PROFILING_HASHTABLE_H_
+
+#include <cstdint>
+#include <string>
+
+#include "absl/container/internal/hashtablez_sampler.h"
+#include "absl/status/statusor.h"
+#include "absl/strings/string_view.h"
+#include "absl/time/time.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+
+absl::StatusOr<std::string> MarshalHashtableProfile();
+
+namespace debugging_internal {
+
+absl::StatusOr<std::string> MarshalHashtableProfile(
+    container_internal::HashtablezSampler& sampler, absl::Time now);
+
+}  // namespace debugging_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif  // ABSL_PROFILING_HASHTABLE_H_
diff --git a/third_party/abseil-cpp/absl/profiling/internal/profile_builder.cc b/third_party/abseil-cpp/absl/profiling/internal/profile_builder.cc
new file mode 100644
index 0000000..f0bb40b7
--- /dev/null
+++ b/third_party/abseil-cpp/absl/profiling/internal/profile_builder.cc
@@ -0,0 +1,462 @@
+// Copyright 2025 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may
+// obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#include "absl/profiling/internal/profile_builder.h"
+
+#ifdef __linux__
+#include <elf.h>
+#include <link.h>
+#endif  // __linux__
+
+#include <cassert>
+#include <cstdint>
+#include <cstring>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "absl/base/casts.h"
+#include "absl/base/config.h"
+#include "absl/base/internal/raw_logging.h"
+#include "absl/strings/escaping.h"
+#include "absl/strings/str_cat.h"
+#include "absl/types/span.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace debugging_internal {
+
+namespace {
+
+// This file contains a simplified implementation of the pprof profile builder,
+// which avoids a dependency on protobuf.
+//
+// The canonical profile proto definition is at
+// https://github.com/google/pprof/blob/master/proto/profile.proto
+//
+// Wire-format encoding is a simple sequence of (tag, value) pairs. The tag
+// is a varint-encoded integer, where the low 3 bits are the wire type, and the
+// high bits are the field number.
+//
+// For the fields we care about, we'll be using the following wire types:
+//
+// Wire Type 0: Varint-encoded integer.
+// Wire Type 2: Length-delimited. Used for strings and sub-messages.
+enum class WireType {
+  kVarint = 0,
+  kLengthDelimited = 2,
+};
+
+#ifdef __linux__
+// Returns the Phdr of the first segment of the given type.
+const ElfW(Phdr) * GetFirstSegment(const dl_phdr_info* const info,
+                                   const ElfW(Word) segment_type) {
+  for (int i = 0; i < info->dlpi_phnum; ++i) {
+    if (info->dlpi_phdr[i].p_type == segment_type) {
+      return &info->dlpi_phdr[i];
+    }
+  }
+  return nullptr;
+}
+
+// Return DT_SONAME for the given image.  If there is no PT_DYNAMIC or if
+// PT_DYNAMIC does not contain DT_SONAME, return nullptr.
+static const char* GetSoName(const dl_phdr_info* const info) {
+  const ElfW(Phdr)* const pt_dynamic = GetFirstSegment(info, PT_DYNAMIC);
+  if (pt_dynamic == nullptr) {
+    return nullptr;
+  }
+  const ElfW(Dyn)* dyn =
+      reinterpret_cast<ElfW(Dyn)*>(info->dlpi_addr + pt_dynamic->p_vaddr);
+  const ElfW(Dyn)* dt_strtab = nullptr;
+  const ElfW(Dyn)* dt_strsz = nullptr;
+  const ElfW(Dyn)* dt_soname = nullptr;
+  for (; dyn->d_tag != DT_NULL; ++dyn) {
+    if (dyn->d_tag == DT_SONAME) {
+      dt_soname = dyn;
+    } else if (dyn->d_tag == DT_STRTAB) {
+      dt_strtab = dyn;
+    } else if (dyn->d_tag == DT_STRSZ) {
+      dt_strsz = dyn;
+    }
+  }
+  if (dt_soname == nullptr) {
+    return nullptr;
+  }
+  ABSL_RAW_CHECK(dt_strtab != nullptr, "Unexpected nullptr");
+  ABSL_RAW_CHECK(dt_strsz != nullptr, "Unexpected nullptr");
+  const char* const strtab = reinterpret_cast<char*>(
+      info->dlpi_addr + static_cast<ElfW(Word)>(dt_strtab->d_un.d_val));
+  ABSL_RAW_CHECK(dt_soname->d_un.d_val < dt_strsz->d_un.d_val,
+                 "Unexpected order");
+  return strtab + dt_soname->d_un.d_val;
+}
+
+// Helper function to get the build ID of a shared object.
+std::string GetBuildId(const dl_phdr_info* const info) {
+  std::string result;
+
+  // pt_note contains entries (of type ElfW(Nhdr)) starting at
+  //   info->dlpi_addr + pt_note->p_vaddr
+  // with length
+  //   pt_note->p_memsz
+  //
+  // The length of each entry is given by
+  //   Align(sizeof(ElfW(Nhdr)) + nhdr->n_namesz) + Align(nhdr->n_descsz)
+  for (int i = 0; i < info->dlpi_phnum; ++i) {
+    const ElfW(Phdr)* pt_note = &info->dlpi_phdr[i];
+    if (pt_note->p_type != PT_NOTE) continue;
+
+    const char* note =
+        reinterpret_cast<char*>(info->dlpi_addr + pt_note->p_vaddr);
+    const char* const last = note + pt_note->p_filesz;
+    const ElfW(Xword) align = pt_note->p_align;
+    while (note < last) {
+      const ElfW(Nhdr)* const nhdr = reinterpret_cast<const ElfW(Nhdr)*>(note);
+      if (note + sizeof(*nhdr) > last) {
+        // Corrupt PT_NOTE
+        break;
+      }
+
+      // Both the start and end of the descriptor are aligned by sh_addralign
+      // (= p_align).
+      const ElfW(Xword) desc_start =
+          (sizeof(*nhdr) + nhdr->n_namesz + align - 1) & -align;
+      const ElfW(Xword) size =
+          desc_start + ((nhdr->n_descsz + align - 1) & -align);
+
+      // Beware of wrap-around.
+      if (nhdr->n_namesz >= static_cast<ElfW(Word)>(-align) ||
+          nhdr->n_descsz >= static_cast<ElfW(Word)>(-align) ||
+          desc_start < sizeof(*nhdr) || size < desc_start ||
+          size > static_cast<ElfW(Xword)>(last - note)) {
+        // Corrupt PT_NOTE
+        break;
+      }
+
+      if (nhdr->n_type == NT_GNU_BUILD_ID) {
+        const char* const note_name = note + sizeof(*nhdr);
+        // n_namesz is the length of note_name.
+        if (nhdr->n_namesz == 4 && memcmp(note_name, "GNU\0", 4) == 0) {
+          if (!result.empty()) {
+            // Repeated build-ids.  Ignore them.
+            return "";
+          }
+          result = absl::BytesToHexString(
+              absl::string_view(note + desc_start, nhdr->n_descsz));
+        }
+      }
+      note += size;
+    }
+  }
+
+  return result;
+}
+#endif  // __linux__
+
+// A varint-encoded integer.
+struct Varint {
+  explicit Varint(uint64_t v) : value(v) {}
+  explicit Varint(StringId v) : value(static_cast<uint64_t>(v)) {}
+  explicit Varint(LocationId v) : value(static_cast<uint64_t>(v)) {}
+  explicit Varint(MappingId v) : value(static_cast<uint64_t>(v)) {}
+
+  uint64_t value;
+
+  template <typename Sink>
+  friend void AbslStringify(Sink& sink, const Varint& v) {
+    char buf[10];
+    char* p = buf;
+    uint64_t u = v.value;
+    while (u >= 0x80) {
+      *p++ = static_cast<char>((u & 0x7f) | 0x80);
+      u >>= 7;
+    }
+    *p++ = static_cast<char>(u);
+    sink.Append(absl::string_view(buf, static_cast<size_t>(p - buf)));
+  }
+};
+
+struct Tag {
+  int field_number;
+  WireType wire_type;
+
+  template <typename Sink>
+  friend void AbslStringify(Sink& sink, const Tag& t) {
+    absl::Format(&sink, "%v",
+                 Varint((static_cast<uint64_t>(t.field_number) << 3) |
+                        static_cast<uint64_t>(t.wire_type)));
+  }
+};
+
+struct LengthDelimited {
+  int field_number;
+  absl::string_view value;
+
+  template <typename Sink>
+  friend void AbslStringify(Sink& sink, const LengthDelimited& ld) {
+    absl::Format(&sink, "%v%v%v",
+                 Tag{ld.field_number, WireType::kLengthDelimited},
+                 Varint(ld.value.size()), ld.value);
+  }
+};
+
+struct VarintField {
+  int field_number;
+  Varint value;
+
+  template <typename Sink>
+  friend void AbslStringify(Sink& sink, const VarintField& vf) {
+    absl::Format(&sink, "%v%v", Tag{vf.field_number, WireType::kVarint},
+                 vf.value);
+  }
+};
+
+}  // namespace
+
+StringId ProfileBuilder::InternString(absl::string_view str) {
+  if (str.empty()) return StringId(0);
+  return string_table_.emplace(str, StringId(string_table_.size()))
+      .first->second;
+}
+
+LocationId ProfileBuilder::InternLocation(const void* address) {
+  return location_table_
+      .emplace(absl::bit_cast<uintptr_t>(address),
+               LocationId(location_table_.size() + 1))
+      .first->second;
+}
+
+void ProfileBuilder::AddSample(
+    int64_t value, absl::Span<const void* const> stack,
+    absl::Span<const std::pair<StringId, int64_t>> labels) {
+  std::string sample_proto;
+  absl::StrAppend(
+      &sample_proto,
+      VarintField{SampleProto::kValue, Varint(static_cast<uint64_t>(value))});
+
+  for (const void* addr : stack) {
+    // Profile addresses are raw stack unwind addresses, so they should be
+    // adjusted by -1 to land inside the call instruction (although potentially
+    // misaligned).
+    absl::StrAppend(
+        &sample_proto,
+        VarintField{SampleProto::kLocationId,
+                    Varint(InternLocation(absl::bit_cast<const void*>(
+                        absl::bit_cast<uintptr_t>(addr) - 1)))});
+  }
+
+  for (const auto& label : labels) {
+    std::string label_proto =
+        absl::StrCat(VarintField{LabelProto::kKey, Varint(label.first)},
+                     VarintField{LabelProto::kNum,
+                                 Varint(static_cast<uint64_t>(label.second))});
+    absl::StrAppend(&sample_proto,
+                    LengthDelimited{SampleProto::kLabel, label_proto});
+  }
+  samples_.push_back(std::move(sample_proto));
+}
+
+void ProfileBuilder::AddSampleType(StringId type, StringId unit) {
+  std::string sample_type_proto =
+      absl::StrCat(VarintField{ValueTypeProto::kType, Varint(type)},
+                   VarintField{ValueTypeProto::kUnit, Varint(unit)});
+  sample_types_.push_back(std::move(sample_type_proto));
+}
+
+MappingId ProfileBuilder::AddMapping(uintptr_t memory_start,
+                                     uintptr_t memory_limit,
+                                     uintptr_t file_offset,
+                                     absl::string_view filename,
+                                     absl::string_view build_id) {
+  size_t index = mappings_.size() + 1;
+  auto [it, inserted] = mapping_table_.emplace(memory_start, index);
+  if (!inserted) {
+    return static_cast<MappingId>(it->second);
+  }
+
+  Mapping m;
+  m.start = memory_start;
+  m.limit = memory_limit;
+  m.offset = file_offset;
+  m.filename = std::string(filename);
+  m.build_id = std::string(build_id);
+
+  mappings_.push_back(std::move(m));
+  return static_cast<MappingId>(index);
+}
+
+std::string ProfileBuilder::Emit() && {
+  std::string profile_proto;
+  for (const auto& sample_type : sample_types_) {
+    absl::StrAppend(&profile_proto,
+                    LengthDelimited{ProfileProto::kSampleType, sample_type});
+  }
+  for (const auto& sample : samples_) {
+    absl::StrAppend(&profile_proto,
+                    LengthDelimited{ProfileProto::kSample, sample});
+  }
+
+  // Build mapping table.
+  for (size_t i = 0, n = mappings_.size(); i < n; ++i) {
+    const auto& mapping = mappings_[i];
+    std::string mapping_proto = absl::StrCat(
+        VarintField{MappingProto::kId, Varint(static_cast<uint64_t>(i + 1))},
+        VarintField{MappingProto::kMemoryStart, Varint(mapping.start)},
+        VarintField{MappingProto::kMemoryLimit, Varint(mapping.limit)},
+        VarintField{MappingProto::kFileOffset, Varint(mapping.offset)},
+        VarintField{MappingProto::kFilename,
+                    Varint(InternString(mapping.filename))},
+        VarintField{MappingProto::kBuildId,
+                    Varint(InternString(mapping.build_id))});
+
+    absl::StrAppend(&profile_proto,
+                    LengthDelimited{ProfileProto::kMapping, mapping_proto});
+  }
+
+  // Build location table.
+  for (const auto& [address, id] : location_table_) {
+    std::string location =
+        absl::StrCat(VarintField{LocationProto::kId, Varint(id)},
+                     VarintField{LocationProto::kAddress, Varint(address)});
+
+    if (!mappings_.empty()) {
+      // Find the mapping ID.
+      auto it = mapping_table_.upper_bound(address);
+      if (it != mapping_table_.begin()) {
+        --it;
+      }
+
+      // If *it contains address, add mapping to location.
+      const size_t mapping_index = it->second;
+      const Mapping& mapping = mappings_[mapping_index - 1];
+
+      if (it->first <= address && address < mapping.limit) {
+        absl::StrAppend(
+            &location,
+            VarintField{LocationProto::kMappingId,
+                        Varint(static_cast<uint64_t>(mapping_index))});
+      }
+    }
+
+    absl::StrAppend(&profile_proto,
+                    LengthDelimited{ProfileProto::kLocation, location});
+  }
+
+  std::string string_table_proto;
+  std::vector<absl::string_view> sorted_strings(string_table_.size());
+  for (const auto& p : string_table_) {
+    sorted_strings[static_cast<size_t>(p.second)] = p.first;
+  }
+  for (const auto& s : sorted_strings) {
+    absl::StrAppend(&string_table_proto,
+                    LengthDelimited{ProfileProto::kStringTable, s});
+  }
+  absl::StrAppend(&profile_proto, VarintField{ProfileProto::kDropFrames,
+                                              Varint(drop_frames_id_)});
+  absl::StrAppend(&profile_proto,
+                  VarintField{ProfileProto::kComment, Varint(comment_id_)});
+  absl::StrAppend(&profile_proto, VarintField{ProfileProto::kDefaultSampleType,
+                                              Varint(default_sample_type_id_)});
+  return absl::StrCat(string_table_proto, profile_proto);
+}
+
+void ProfileBuilder::set_drop_frames_id(StringId drop_frames_id) {
+  drop_frames_id_ = drop_frames_id;
+}
+
+void ProfileBuilder::set_comment_id(StringId comment_id) {
+  comment_id_ = comment_id;
+}
+
+void ProfileBuilder::set_default_sample_type_id(
+    StringId default_sample_type_id) {
+  default_sample_type_id_ = default_sample_type_id;
+}
+
+void ProfileBuilder::AddCurrentMappings() {
+#ifdef __linux__
+  dl_iterate_phdr(
+      +[](dl_phdr_info* info, size_t, void* data) {
+        auto& builder = *reinterpret_cast<ProfileBuilder*>(data);
+
+        // Skip dummy entry introduced since glibc 2.18.
+        if (info->dlpi_phdr == nullptr && info->dlpi_phnum == 0) {
+          return 0;
+        }
+
+        const bool is_main_executable = builder.mappings_.empty();
+
+        // Evaluate all the loadable segments.
+        for (int i = 0; i < info->dlpi_phnum; ++i) {
+          if (info->dlpi_phdr[i].p_type != PT_LOAD) {
+            continue;
+          }
+          const ElfW(Phdr)* pt_load = &info->dlpi_phdr[i];
+
+          ABSL_RAW_CHECK(pt_load != nullptr, "Unexpected nullptr");
+
+          // Extract data.
+          const size_t memory_start = info->dlpi_addr + pt_load->p_vaddr;
+          const size_t memory_limit = memory_start + pt_load->p_memsz;
+          const size_t file_offset = pt_load->p_offset;
+
+          // Storage for path to executable as dlpi_name isn't populated for the
+          // main executable.  +1 to allow for the null terminator that readlink
+          // does not add.
+          char self_filename[PATH_MAX + 1];
+          const char* filename = info->dlpi_name;
+          if (filename == nullptr || filename[0] == '\0') {
+            // This is either the main executable or the VDSO.  The main
+            // executable is always the first entry processed by callbacks.
+            if (is_main_executable) {
+              // This is the main executable.
+              ssize_t ret = readlink("/proc/self/exe", self_filename,
+                                     sizeof(self_filename) - 1);
+              if (ret >= 0 &&
+                  static_cast<size_t>(ret) < sizeof(self_filename)) {
+                self_filename[ret] = '\0';
+                filename = self_filename;
+              }
+            } else {
+              // This is the VDSO.
+              filename = GetSoName(info);
+            }
+          }
+
+          char resolved_path[PATH_MAX];
+          absl::string_view resolved_filename;
+          if (realpath(filename, resolved_path)) {
+            resolved_filename = resolved_path;
+          } else {
+            resolved_filename = filename;
+          }
+
+          const std::string build_id = GetBuildId(info);
+
+          // Add to profile.
+          builder.AddMapping(memory_start, memory_limit, file_offset,
+                             resolved_filename, build_id);
+        }
+        // Keep going.
+        return 0;
+      },
+      this);
+#endif  // __linux__
+}
+
+}  // namespace debugging_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
diff --git a/third_party/abseil-cpp/absl/profiling/internal/profile_builder.h b/third_party/abseil-cpp/absl/profiling/internal/profile_builder.h
new file mode 100644
index 0000000..45075e60
--- /dev/null
+++ b/third_party/abseil-cpp/absl/profiling/internal/profile_builder.h
@@ -0,0 +1,138 @@
+// Copyright 2025 The Abseil Authors
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may
+// obtain a copy of the License at
+//
+//     https://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef ABSL_PROFILING_INTERNAL_PROFILE_BUILDER_H_
+#define ABSL_PROFILING_INTERNAL_PROFILE_BUILDER_H_
+
+#include <cstddef>
+#include <cstdint>
+#include <string>
+#include <vector>
+
+#include "absl/container/btree_map.h"
+#include "absl/container/flat_hash_map.h"
+#include "absl/strings/string_view.h"
+#include "absl/types/span.h"
+
+namespace absl {
+ABSL_NAMESPACE_BEGIN
+namespace debugging_internal {
+
+// Field numbers for perftools.profiles.Profile.
+// https://github.com/google/pprof/blob/master/proto/profile.proto
+struct ProfileProto {
+  static constexpr int kSampleType = 1;
+  static constexpr int kSample = 2;
+  static constexpr int kMapping = 3;
+  static constexpr int kLocation = 4;
+  static constexpr int kStringTable = 6;
+  static constexpr int kDropFrames = 7;
+  static constexpr int kComment = 13;
+  static constexpr int kDefaultSampleType = 14;
+};
+
+struct ValueTypeProto {
+  static constexpr int kType = 1;
+  static constexpr int kUnit = 2;
+};
+
+struct SampleProto {
+  static constexpr int kLocationId = 1;
+  static constexpr int kValue = 2;
+  static constexpr int kLabel = 3;
+};
+
+struct LabelProto {
+  static constexpr int kKey = 1;
+  static constexpr int kStr = 2;
+  static constexpr int kNum = 3;
+  static constexpr int kNumUnit = 4;
+};
+
+struct MappingProto {
+  static constexpr int kId = 1;
+  static constexpr int kMemoryStart = 2;
+  static constexpr int kMemoryLimit = 3;
+  static constexpr int kFileOffset = 4;
+  static constexpr int kFilename = 5;
+  static constexpr int kBuildId = 6;
+};
+
+struct LocationProto {
+  static constexpr int kId = 1;
+  static constexpr int kMappingId = 2;
+  static constexpr int kAddress = 3;
+};
+
+enum class StringId : size_t {};
+enum class LocationId : size_t {};
+enum class MappingId : size_t {};
+
+// A helper class to build a profile protocol buffer.
+class ProfileBuilder {
+ public:
+  struct Mapping {
+    uint64_t start;
+    uint64_t limit;
+    uint64_t offset;
+    std::string filename;
+    std::string build_id;
+  };
+
+  StringId InternString(absl::string_view str);
+
+  LocationId InternLocation(const void* address);
+
+  void AddSample(int64_t value, absl::Span<const void* const> stack,
+                 absl::Span<const std::pair<StringId, int64_t>> labels);
+
+  void AddSampleType(StringId type, StringId unit);
+
+  // Adds the current process mappings to the profile.
+  void AddCurrentMappings();
+
+  // Adds a single mapping to the profile and to lookup cache and returns the
+  // resulting ID.
+  MappingId AddMapping(uintptr_t memory_start, uintptr_t memory_limit,
+                       uintptr_t file_offset, absl::string_view filename,
+                       absl::string_view build_id);
+
+  std::string Emit() &&;
+
+  void set_drop_frames_id(StringId drop_frames_id);
+  void set_comment_id(StringId comment_id);
+  void set_default_sample_type_id(StringId default_sample_type_id);
+
+ private:
+  absl::flat_hash_map<std::string, StringId> string_table_{{"", StringId(0)}};
+  absl::flat_hash_map<uintptr_t, LocationId> location_table_;
+  // mapping_table_ stores the start address of each mapping in mapping_
+  // to its index.
+  absl::btree_map<uintptr_t, size_t> mapping_table_;
+  std::vector<Mapping> mappings_;
+
+  std::vector<std::string> sample_types_;
+  std::vector<std::string> samples_;
+
+  StringId drop_frames_id_{};
+  StringId comment_id_{};
+  StringId default_sample_type_id_{};
+};
+
+}  // namespace debugging_internal
+ABSL_NAMESPACE_END
+}  // namespace absl
+
+#endif  // ABSL_PROFILING_INTERNAL_PROFILE_BUILDER_H_
diff --git a/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h b/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h
index 371f6c4..84843fd 100644
--- a/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h
+++ b/third_party/abseil-cpp/absl/profiling/internal/sample_recorder.h
@@ -75,7 +75,7 @@
 
   // Iterates over all the registered `StackInfo`s.  Returning the number of
   // samples that have been dropped.
-  int64_t Iterate(const std::function<void(const T& stack)>& f);
+  size_t Iterate(const std::function<void(const T& stack)>& f);
 
   size_t GetMaxSamples() const;
   void SetMaxSamples(size_t max);
@@ -222,7 +222,7 @@
 }
 
 template <typename T>
-int64_t SampleRecorder<T>::Iterate(
+size_t SampleRecorder<T>::Iterate(
     const std::function<void(const T& stack)>& f) {
   T* s = all_.load(std::memory_order_acquire);
   while (s != nullptr) {
diff --git a/third_party/abseil-cpp/ci/absl_alternate_options.h b/third_party/abseil-cpp/ci/absl_alternate_options.h
index a563859..20bf010 100644
--- a/third_party/abseil-cpp/ci/absl_alternate_options.h
+++ b/third_party/abseil-cpp/ci/absl_alternate_options.h
@@ -15,13 +15,12 @@
 // Alternate options.h file, used in continuous integration testing to exercise
 // option settings not used by default.
 
+// SKIP_ABSL_INLINE_NAMESPACE_CHECK
+
 #ifndef ABSL_CI_ABSL_ALTERNATE_OPTIONS_H_
 #define ABSL_CI_ABSL_ALTERNATE_OPTIONS_H_
 
-#define ABSL_OPTION_USE_STD_ANY 0
-#define ABSL_OPTION_USE_STD_OPTIONAL 0
 #define ABSL_OPTION_USE_STD_STRING_VIEW 0
-#define ABSL_OPTION_USE_STD_VARIANT 0
 #define ABSL_OPTION_USE_STD_ORDERING 0
 #define ABSL_OPTION_USE_INLINE_NAMESPACE 1
 #define ABSL_OPTION_INLINE_NAMESPACE_NAME ns
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def
index 7945785d..cdd9fb7 100644
--- a/third_party/abseil-cpp/symbols_arm64_dbg.def
+++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -3082,7 +3082,8 @@
     ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z
     ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z
     ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z
-    ?EraseMetaOnly@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z
+    ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z
+    ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z
     ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z
@@ -3558,7 +3559,6 @@
     ?MaskEmpty@GroupAArch64Impl@container_internal@absl@@QEBA@XZ
     ?MaskEmptyOrDeleted@GroupPortableImpl@container_internal@absl@@QEBA@XZ
     ?MaskFull@GroupPortableImpl@container_internal@absl@@QEBA@XZ
-    ?MaskFullOrSentinel@GroupPortableImpl@container_internal@absl@@QEBA@XZ
     ?MaskNonFull@GroupAArch64Impl@container_internal@absl@@QEBA@XZ
     ?Match@GroupAArch64Impl@container_internal@absl@@QEBA@E@Z
     ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@AEBA_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z
@@ -5287,6 +5287,7 @@
     ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z
     ?set_data@InlineRep@Cord@absl@@QEAAPEAD_K@Z
     ?set_data@InlineRep@Cord@absl@@QEAAXPEBD_K@Z
+    ?set_empty_soo@CommonFields@container_internal@absl@@QEAAXXZ
     ?set_end@CordRepBtree@cord_internal@absl@@AEAAX_K@Z
     ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z
     ?set_full_soo@CommonFields@container_internal@absl@@QEAAXXZ
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def
index 3b37358..4f7a2ab 100644
--- a/third_party/abseil-cpp/symbols_arm64_rel.def
+++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -331,7 +331,6 @@
     ??ACord@absl@@QEBAD_K@Z
     ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ
     ??Bint128@absl@@QEBANXZ
-    ??Eiterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAAAEAV0123@XZ
     ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
     ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
     ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z
@@ -585,7 +584,8 @@
     ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z
     ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z
     ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z
-    ?EraseMetaOnly@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z
+    ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z
+    ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z
     ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def
index 8cb1b02..ef69b47 100644
--- a/third_party/abseil-cpp/symbols_x64_dbg.def
+++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -3083,7 +3083,8 @@
     ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z
     ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z
     ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z
-    ?EraseMetaOnly@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z
+    ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z
+    ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z
     ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z
@@ -3561,7 +3562,6 @@
     ?MaskEmptyOrDeleted@GroupSse2Impl@container_internal@absl@@QEBA?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ
     ?MaskFull@GroupPortableImpl@container_internal@absl@@QEBA@XZ
     ?MaskFull@GroupSse2Impl@container_internal@absl@@QEBA?AV?$BitMask@G$0BA@$0A@$0A@@23@XZ
-    ?MaskFullOrSentinel@GroupSse2Impl@container_internal@absl@@QEBA?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ
     ?MaskNonFull@GroupSse2Impl@container_internal@absl@@QEBA@XZ
     ?Match@GroupSse2Impl@container_internal@absl@@QEBA?AV?$BitMask@G$0BA@$0A@$0A@@23@E@Z
     ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@AEBA_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z
@@ -5291,6 +5291,7 @@
     ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z
     ?set_data@InlineRep@Cord@absl@@QEAAPEAD_K@Z
     ?set_data@InlineRep@Cord@absl@@QEAAXPEBD_K@Z
+    ?set_empty_soo@CommonFields@container_internal@absl@@QEAAXXZ
     ?set_end@CordRepBtree@cord_internal@absl@@AEAAX_K@Z
     ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QEAAXH@Z
     ?set_full_soo@CommonFields@container_internal@absl@@QEAAXXZ
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def
index b854eea..30d5ce84 100644
--- a/third_party/abseil-cpp/symbols_x64_rel.def
+++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -332,7 +332,6 @@
     ??ACord@absl@@QEBAD_K@Z
     ??BCord@absl@@QEBA?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ
     ??Bint128@absl@@QEBANXZ
-    ??Eiterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PEAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QEAAAEAV0123@XZ
     ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Uday_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
     ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
     ??Gdetail@cctz@time_internal@absl@@YA_JV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@0@Z
@@ -584,7 +583,8 @@
     ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z
     ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z
     ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z
-    ?EraseMetaOnly@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z
+    ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z
+    ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z
     ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def
index f9c2b4b..c98a750 100644
--- a/third_party/abseil-cpp/symbols_x64_rel_asan.def
+++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -609,7 +609,8 @@
     ?EqualsImpl@Cord@absl@@AEBA_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@_K@Z
     ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@AEBA_NEE@Z
     ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QEAAPEAUPayload@status_internal@3@PEBU453@0@Z
-    ?EraseMetaOnly@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z
+    ?EraseMetaOnlyLarge@container_internal@absl@@YAXAEAVCommonFields@12@PEBW4ctrl_t@12@_K@Z
+    ?EraseMetaOnlySmall@container_internal@absl@@YAXAEAVCommonFields@12@_N_K@Z
     ?ErasePayload@StatusRep@status_internal@absl@@QEAA?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def
index 65c4b20..e5178a7 100644
--- a/third_party/abseil-cpp/symbols_x86_dbg.def
+++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -3081,7 +3081,8 @@
     ?EqualsImpl@Cord@absl@@ABE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z
     ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@ABE_NEE@Z
     ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAUPayload@status_internal@3@PBU453@0@Z
-    ?EraseMetaOnly@container_internal@absl@@YAXAAVCommonFields@12@PBW4ctrl_t@12@I@Z
+    ?EraseMetaOnlyLarge@container_internal@absl@@YAXAAVCommonFields@12@PBW4ctrl_t@12@I@Z
+    ?EraseMetaOnlySmall@container_internal@absl@@YAXAAVCommonFields@12@_NI@Z
     ?ErasePayload@StatusRep@status_internal@absl@@QAE?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z
@@ -3559,7 +3560,6 @@
     ?MaskEmptyOrDeleted@GroupSse2Impl@container_internal@absl@@QBE?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ
     ?MaskFull@GroupPortableImpl@container_internal@absl@@QBE@XZ
     ?MaskFull@GroupSse2Impl@container_internal@absl@@QBE?AV?$BitMask@G$0BA@$0A@$0A@@23@XZ
-    ?MaskFullOrSentinel@GroupSse2Impl@container_internal@absl@@QBE?AV?$NonIterableBitMask@G$0BA@$0A@@23@XZ
     ?MaskNonFull@GroupSse2Impl@container_internal@absl@@QBE@XZ
     ?Match@GroupSse2Impl@container_internal@absl@@QBE?AV?$BitMask@G$0BA@$0A@$0A@@23@E@Z
     ?MatchesConversions@ParsedFormatBase@str_format_internal@absl@@ABE_N_NV?$initializer_list@W4FormatConversionCharSet@absl@@@std@@@Z
@@ -5289,6 +5289,7 @@
     ?set_cordz_mean_interval@cord_internal@absl@@YAXH@Z
     ?set_data@InlineRep@Cord@absl@@QAEPADI@Z
     ?set_data@InlineRep@Cord@absl@@QAEXPBDI@Z
+    ?set_empty_soo@CommonFields@container_internal@absl@@QAEXXZ
     ?set_end@CordRepBtree@cord_internal@absl@@AAEXI@Z
     ?set_from_arg@InputValue@UnboundConversion@str_format_internal@absl@@QAEXH@Z
     ?set_full_soo@CommonFields@container_internal@absl@@QAEXXZ
diff --git a/third_party/abseil-cpp/symbols_x86_rel.def b/third_party/abseil-cpp/symbols_x86_rel.def
index 628d35a..3e829c7 100644
--- a/third_party/abseil-cpp/symbols_x86_rel.def
+++ b/third_party/abseil-cpp/symbols_x86_rel.def
@@ -338,7 +338,6 @@
     ??ACord@absl@@QBEDI@Z
     ??BCord@absl@@QBE?AV?$basic_string@DU?$char_traits@D@__Cr@std@@V?$allocator@D@23@@__Cr@std@@XZ
     ??Bint128@absl@@QBENXZ
-    ??Eiterator@?$raw_hash_set@U?$FlatHashMapPolicy@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@container_internal@absl@@UStringHash@23@UStringEq@23@V?$allocator@U?$pair@$$CBV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@PAVCommandLineFlag@absl@@@__Cr@std@@@__Cr@std@@@container_internal@absl@@QAEAAV0123@XZ
     ??Gdetail@cctz@time_internal@absl@@YA?AV?$civil_time@Usecond_tag@detail@cctz@time_internal@absl@@@0123@V40123@_J@Z
     ??Kabsl@@YA?AVint128@0@V10@0@Z
     ??Kabsl@@YA?AVuint128@0@V10@0@Z
@@ -589,7 +588,8 @@
     ?EqualsImpl@Cord@absl@@ABE_NV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@I@Z
     ?EquivTransitions@TimeZoneInfo@cctz@time_internal@absl@@ABE_NEE@Z
     ?Erase@?$Storage@UPayload@status_internal@absl@@$00V?$allocator@UPayload@status_internal@absl@@@__Cr@std@@@inlined_vector_internal@absl@@QAEPAUPayload@status_internal@3@PBU453@0@Z
-    ?EraseMetaOnly@container_internal@absl@@YAXAAVCommonFields@12@PBW4ctrl_t@12@I@Z
+    ?EraseMetaOnlyLarge@container_internal@absl@@YAXAAVCommonFields@12@PBW4ctrl_t@12@I@Z
+    ?EraseMetaOnlySmall@container_internal@absl@@YAXAAVCommonFields@12@_NI@Z
     ?ErasePayload@StatusRep@status_internal@absl@@QAE?AUEraseResult@123@V?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatus@absl@@YA?AVStatus@1@HV?$basic_string_view@DU?$char_traits@D@__Cr@std@@@__Cr@std@@@Z
     ?ErrnoToStatusCode@absl@@YA?AW4StatusCode@1@H@Z
diff --git a/third_party/androidx/build.gradle b/third_party/androidx/build.gradle
index b0b7f98..45ffb7b6 100644
--- a/third_party/androidx/build.gradle
+++ b/third_party/androidx/build.gradle
@@ -314,7 +314,7 @@
     google()
     maven {
         // This URL is generated by the fetch_all_androidx.py script.
-        url 'https://androidx.dev/snapshots/builds/13836489/artifacts/repository'
+        url 'https://androidx.dev/snapshots/builds/13838515/artifacts/repository'
     }
     mavenCentral()
 }
diff --git a/third_party/androidx_javascriptengine/BUILD.gn b/third_party/androidx_javascriptengine/BUILD.gn
index 14e8cca..8c7045f 100644
--- a/third_party/androidx_javascriptengine/BUILD.gn
+++ b/third_party/androidx_javascriptengine/BUILD.gn
@@ -84,7 +84,7 @@
     "//third_party/androidx:androidx_test_core_java",
     "//third_party/androidx:androidx_test_ext_junit_java",
     "//third_party/androidx:androidx_test_runner_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
   ]
 
   # Tell GN to ignore 'incremental_install' even if the user has it in their GN
diff --git a/third_party/angle b/third_party/angle
index e4007ff..c8209fe 160000
--- a/third_party/angle
+++ b/third_party/angle
@@ -1 +1 @@
-Subproject commit e4007fff3335258e97e5e8b9569d8d698df820c9
+Subproject commit c8209fec9a5f8d4eef073fb21a8db0c7d51c531d
diff --git a/third_party/anonymous_tokens/BUILD.gn b/third_party/anonymous_tokens/BUILD.gn
index 3e485f4..e9deb58 100644
--- a/third_party/anonymous_tokens/BUILD.gn
+++ b/third_party/anonymous_tokens/BUILD.gn
@@ -269,7 +269,7 @@
     ":constants",
     ":crypto_utils",
     ":status_utils",
-    "//base:base",
+    "//base",
   ]
   public_deps = [
     ":anonymous_tokens_cc_proto",
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index 2a4bed991..8ccd1e2 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -408,7 +408,7 @@
 // Enables camera preview in permission bubble and site settings.
 BASE_FEATURE(kCameraMicPreview,
              "CameraMicPreview",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 #endif
 
 // Temporarily disabled due to issues:
@@ -1147,7 +1147,7 @@
 // Defers device selection until after permission is granted.
 BASE_FEATURE(kGetUserMediaDeferredDeviceSettingsSelection,
              "GetUserMediaDeferredDeviceSettingsSelection",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 #endif
 
 BASE_FEATURE_PARAM(std::string,
diff --git a/third_party/blink/public/mojom/choosers/file_chooser.mojom b/third_party/blink/public/mojom/choosers/file_chooser.mojom
index 411e5aee..c7929be 100644
--- a/third_party/blink/public/mojom/choosers/file_chooser.mojom
+++ b/third_party/blink/public/mojom/choosers/file_chooser.mojom
@@ -31,7 +31,7 @@
     kOpenDirectory,
 
     // Allows picking a nonexistent file, and prompts to overwrite if the file
-    // already exists. This is not for Blink but for PPAPI.
+    // already exists.
     kSave,
   };
   Mode mode = kOpen;
@@ -40,7 +40,8 @@
   // which will be either "Open" or "Save" depending on the mode.
   mojo_base.mojom.String16 title;
 
-  // Default file name to select in the dialog with kSave mode.
+  // Default file name to select in the dialog with kSave mode. This value
+  // is cleared if mode is not kSave.
   mojo_base.mojom.FilePath default_file_name;
 
   // |selected_files| has filenames which a file upload control already
diff --git a/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc
index 9a77cea5..4a1c140 100644
--- a/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc
+++ b/third_party/blink/renderer/core/layout/out_of_flow_layout_part.cc
@@ -2342,31 +2342,6 @@
       node_info.node, space.AvailableSize(), alignment, insets, static_position,
       container_writing_direction, candidate_writing_direction);
 
-  {
-    auto& document = node_info.node.GetDocument();
-    if (alignment.inline_alignment.GetPosition() != ItemPosition::kNormal) {
-      if (insets.inline_start && insets.inline_end) {
-        UseCounter::Count(document,
-                          WebFeature::kOutOfFlowJustifySelfBothInsets);
-      } else if (insets.inline_start || insets.inline_end) {
-        UseCounter::Count(document,
-                          WebFeature::kOutOfFlowJustifySelfSingleInset);
-      } else {
-        UseCounter::Count(document, WebFeature::kOutOfFlowJustifySelfNoInsets);
-      }
-    }
-
-    if (alignment.block_alignment.GetPosition() != ItemPosition::kNormal) {
-      if (insets.block_start && insets.block_end) {
-        UseCounter::Count(document, WebFeature::kOutOfFlowAlignSelfBothInsets);
-      } else if (insets.block_start || insets.block_end) {
-        UseCounter::Count(document, WebFeature::kOutOfFlowAlignSelfSingleInset);
-      } else {
-        UseCounter::Count(document, WebFeature::kOutOfFlowAlignSelfNoInsets);
-      }
-    }
-  }
-
   const BoxStrut border_padding = ComputeBorders(space, node_info.node) +
                                   ComputePadding(space, candidate_style);
 
diff --git a/third_party/blink/renderer/core/layout/out_of_flow_layout_part_test.cc b/third_party/blink/renderer/core/layout/out_of_flow_layout_part_test.cc
index 6cfcfe4..3fa5c76 100644
--- a/third_party/blink/renderer/core/layout/out_of_flow_layout_part_test.cc
+++ b/third_party/blink/renderer/core/layout/out_of_flow_layout_part_test.cc
@@ -1759,36 +1759,6 @@
   EXPECT_EQ(fragmentainer->Children().size(), 2u);
 }
 
-TEST_F(OutOfFlowLayoutPartTest, UseCountOutOfFlowNoInsets) {
-  SetBodyInnerHTML(R"HTML(
-    <div style="position: absolute; justify-self: center;"></div>
-  )HTML");
-  EXPECT_TRUE(
-      GetDocument().IsUseCounted(WebFeature::kOutOfFlowJustifySelfNoInsets));
-  EXPECT_FALSE(
-      GetDocument().IsUseCounted(WebFeature::kOutOfFlowAlignSelfNoInsets));
-}
-
-TEST_F(OutOfFlowLayoutPartTest, UseCountOutOfFlowSingleInset) {
-  SetBodyInnerHTML(R"HTML(
-    <div style="position: absolute; right: 0; bottom: 0; justify-self: center;"></div>
-  )HTML");
-  EXPECT_TRUE(
-      GetDocument().IsUseCounted(WebFeature::kOutOfFlowJustifySelfSingleInset));
-  EXPECT_FALSE(
-      GetDocument().IsUseCounted(WebFeature::kOutOfFlowAlignSelfSingleInset));
-}
-
-TEST_F(OutOfFlowLayoutPartTest, UseCountOutOfFlowBothInsets) {
-  SetBodyInnerHTML(R"HTML(
-    <div style="position: absolute; inset: 0; justify-self: center;"></div>
-  )HTML");
-  EXPECT_TRUE(
-      GetDocument().IsUseCounted(WebFeature::kOutOfFlowJustifySelfBothInsets));
-  EXPECT_FALSE(
-      GetDocument().IsUseCounted(WebFeature::kOutOfFlowAlignSelfBothInsets));
-}
-
 TEST_F(OutOfFlowLayoutPartTest, EmptyFragmentainersBeforeOOF) {
   // There's an OOF in the fourth, fifth and sixth columns.
   SetBodyInnerHTML(
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
index f8cc2c75..448748f 100644
--- a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
+++ b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
@@ -460,15 +460,21 @@
 
 SoftNavigationContext*
 SoftNavigationHeuristics::MaybeGetSoftNavigationContextForTiming(Node* node) {
-  if (!context_for_current_url_ ||
-      !context_for_current_url_->IsRecordingLargestContentfulPaint()) {
+  // In modes other than pre-paint-based attribution, this is constrained to
+  // `context_for_current_url_` for efficiency.
+  SoftNavigationContext* context =
+      IsPrePaintBasedAttributionEnabled()
+          ? paint_attribution_tracker_->GetSoftNavigationContextForNode(node)
+          : context_for_current_url_.Get();
+  if (!context || !context->IsRecordingLargestContentfulPaint()) {
     return nullptr;
   }
-  bool attributable = IsPrePaintBasedAttributionEnabled()
-                          ? paint_attribution_tracker_->IsAttributable(
-                                node, context_for_current_url_)
-                          : context_for_current_url_->IsNeededForTiming(node);
-  return attributable ? context_for_current_url_ : nullptr;
+  // For pre-paint-based attribution, `context` being non-null implies paints
+  // for `node` are attributable to `context`.
+  if (IsPrePaintBasedAttributionEnabled()) {
+    return context;
+  }
+  return context->IsNeededForTiming(node) ? context : nullptr;
 }
 
 void SoftNavigationHeuristics::OnPaintFinished() {
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_paint_attribution_tracker.h b/third_party/blink/renderer/core/timing/soft_navigation_paint_attribution_tracker.h
index 46284bb..b0ad1dfa 100644
--- a/third_party/blink/renderer/core/timing/soft_navigation_paint_attribution_tracker.h
+++ b/third_party/blink/renderer/core/timing/soft_navigation_paint_attribution_tracker.h
@@ -83,6 +83,12 @@
   // are not considered.
   void MarkNodeAsDirectlyModified(Node*, SoftNavigationContext*);
 
+  // Returns the `SoftNavigationContext` associated with `node`, if any.
+  SoftNavigationContext* GetSoftNavigationContextForNode(Node* node) {
+    auto* state = GetNodeState(node);
+    return state ? state->GetSoftNavigationContext() : nullptr;
+  }
+
   // Returns true if the node is attributable to the given context, and false
   // otherwise. The node must be an image, text aggregation node, or something
   // explicitly modified, otherwise this returns false.
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 24d89744..cfef477c 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -379,6 +379,7 @@
         "default": "",
       },
       origin_trial_feature_name: "AIRewriterAPI",
+      origin_trial_os: ["win", "mac", "linux"],
       origin_trial_allows_third_party: true,
       base_feature_status: "enabled",
       copied_from_base_feature_if: "overridden",
@@ -411,6 +412,7 @@
         "default": "",
       },
       origin_trial_feature_name: "AIWriterAPI",
+      origin_trial_os: ["win", "mac", "linux"],
       origin_trial_allows_third_party: true,
       base_feature_status: "enabled",
       copied_from_base_feature_if: "overridden",
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites
index 1c4ce92d..05824d0 100644
--- a/third_party/blink/web_tests/VirtualTestSuites
+++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -4215,6 +4215,9 @@
     "bases": [
       "external/wpt/soft-navigation-heuristics/"
     ],
+    "exclusive_tests": [
+      "external/wpt/soft-navigation-heuristics/smoke/tentative/late-url-change.html"
+    ],
     "args": [
       "--enable-features=SoftNavigationDetectionPrePaintBasedAttribution"
     ],
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 88270e1..da50c0e 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
@@ -6915,6 +6915,13 @@
        {}
       ]
      ],
+     "delete-after-input-setRangeText.html": [
+      "ed33cdd5b978dac7698329b2c4dc34468ab0ebc7",
+      [
+       null,
+       {}
+      ]
+     ],
      "delete-after-justifyleft-in-closed-editable-dialog.html": [
       "185cb01ee51dbf91717887f51ad82812690e0e90",
       [
@@ -7013,6 +7020,13 @@
        {}
       ]
      ],
+     "delete-in-xml-space-preserve.html": [
+      "017af10545a6e4de37010920a14eade6f240566d",
+      [
+       null,
+       {}
+      ]
+     ],
      "delete-selection-with-null-range.html": [
       "4d814eab807facfa13a11084b2d5f1ecda712c18",
       [
@@ -7412,6 +7426,13 @@
        {}
       ]
      ],
+     "inserttext-with-empty-string-to-replace-selection.html": [
+      "4821d77339473d1c745806d4d6b9772488367722",
+      [
+       null,
+       {}
+      ]
+     ],
      "insertunorderedlist-in-empty-inline-editing-host.html": [
       "74b0993322eda076a13023c96261840eadd53339",
       [
@@ -8172,6 +8193,15 @@
       ]
      },
      "widgets": {
+      "button-layout": {
+       "input-fragmentation-crash.html": [
+        "78fa40f08203f1f3a900e73efd2968985754f661",
+        [
+         null,
+         {}
+        ]
+       ]
+      },
       "input-checkbox-appearance-none-dynamic-crash.html": [
        "fb10f6a7fa63a62eee988778b902179ab38e3603",
        [
@@ -75833,6 +75863,19 @@
        {}
       ]
      ],
+     "position-area-anchor-001.html": [
+      "24b9bbcf1d6bbb17d8a9130983f57f289a6679e6",
+      [
+       null,
+       [
+        [
+         "/css/css-anchor-position/position-area-anchor-001-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "position-area-inline-container.html": [
       "b6661ce5baa4a2d8ee3c6a69291096b2be9c74fd",
       [
@@ -137180,6 +137223,32 @@
         {}
        ]
       ],
+      "grid-abspos-staticpos-align-self-end-large-border-padding.html": [
+       "09647be71c9c63f01703f66bf666e7315b39558f",
+       [
+        null,
+        [
+         [
+          "/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "grid-abspos-staticpos-align-self-end.html": [
+       "c8176f1ab7684c130d5039cf38df349543d4ace9",
+       [
+        null,
+        [
+         [
+          "/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "grid-abspos-staticpos-align-self-img-001.html": [
        "cb5906603b35912cf2e649b1fa0a049d801ec236",
        [
@@ -155938,6 +156007,19 @@
        ]
       ]
      },
+     "empty-span-height.html": [
+      "d849938d4438fdf12e60e46a29c608c2e33b9224",
+      [
+       null,
+       [
+        [
+         "/css/css-inline/empty-span-height-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "empty-span-scroll.html": [
       "a7bb092660246ab370ffd04d16e13a11e20c803e",
       [
@@ -162336,6 +162418,45 @@
          {}
         ]
        ],
+       "clip-path-animation-set-currenttime-forward-finish.html": [
+        "29108b189daf4e1dd3d482544d8c0401f0026394",
+        [
+         null,
+         [
+          [
+           "/css/css-masking/clip-path/animations/clip-path-animation-set-currenttime-ref.html",
+           "=="
+          ]
+         ],
+         {}
+        ]
+       ],
+       "clip-path-animation-set-currenttime-negative.html": [
+        "11ef17c4d0ed09ef91a2d592decdc9e49e5668d7",
+        [
+         null,
+         [
+          [
+           "/css/css-masking/clip-path/animations/clip-path-animation-set-currenttime-ref.html",
+           "=="
+          ]
+         ],
+         {}
+        ]
+       ],
+       "clip-path-animation-set-duration-animation-finish.html": [
+        "2e138a7af887131f131e6fa840659c824b7cbaa6",
+        [
+         null,
+         [
+          [
+           "/css/css-masking/clip-path/animations/clip-path-animation-set-currenttime-ref.html",
+           "=="
+          ]
+         ],
+         {}
+        ]
+       ],
        "clip-path-animation-set-effect.html": [
         "a3fae2733d0a6050ca60409a11b69042347adf74",
         [
@@ -162349,6 +162470,19 @@
          {}
         ]
        ],
+       "clip-path-animation-start-time.html": [
+        "56ed807f4d05913ed6247dfed0c07187a0645b5e",
+        [
+         null,
+         [
+          [
+           "/css/css-masking/clip-path/animations/clip-path-animation-start-time-ref.html",
+           "=="
+          ]
+         ],
+         {}
+        ]
+       ],
        "clip-path-animation-svg-zoom.html": [
         "0accfd2102b72b196a4cfa987f88a5e31223d249",
         [
@@ -175607,7 +175741,7 @@
        ]
       ],
       "line-clamp-010.html": [
-       "1386b147ce639f511fa1fc58e0c0cd75ab99efc2",
+       "edeb89897bc610f093b7a5e8a7d49125ec480a74",
        [
         null,
         [
@@ -175620,7 +175754,7 @@
        ]
       ],
       "line-clamp-011.tentative.html": [
-       "953f0c4faa9e57975cfabfd10d20ae4e1f9c45a3",
+       "69effbcca17061a7519316ef097b9903fbe7968e",
        [
         null,
         [
@@ -175723,8 +175857,8 @@
         {}
        ]
       ],
-      "line-clamp-019.tentative.html": [
-       "b39376d39502ff643d41543c26db8f43abcc35bd",
+      "line-clamp-019.html": [
+       "e956fe8686dec75f28d918ee33b6266fe9bdf6e4",
        [
         null,
         [
@@ -175918,6 +176052,32 @@
         {}
        ]
       ],
+      "line-clamp-034.html": [
+       "bb703dd2aec73e95b353482aa940b4a2568a33e7",
+       [
+        null,
+        [
+         [
+          "/css/css-overflow/line-clamp/reference/webkit-line-clamp-001-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
+      "line-clamp-035.tentative.html": [
+       "feb4aac618a21851ad1fb1fe8aa7a3ce80c8e045",
+       [
+        null,
+        [
+         [
+          "/css/css-overflow/line-clamp/reference/webkit-line-clamp-005-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "line-clamp-auto-001.tentative.html": [
        "02d8479736d4d6fd7e26df53611624e7a75d0989",
        [
@@ -176049,7 +176209,7 @@
        ]
       ],
       "line-clamp-auto-011.tentative.html": [
-       "50513516cc9daa3d90063277f2d8d00e52db4f78",
+       "00076a5336e89004b6a2143e9bd6c72ec9fe95e0",
        [
         null,
         [
@@ -176230,6 +176390,19 @@
         {}
        ]
       ],
+      "line-clamp-auto-025.tentative.html": [
+       "7144be1a6e024f5f7dc42407cd8a5821632e3489",
+       [
+        null,
+        [
+         [
+          "/css/css-overflow/line-clamp/reference/line-clamp-auto-025-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "line-clamp-auto-027.tentative.html": [
        "9ed461d8cfb4c2ee035987148e15b6dcce3cdffa",
        [
@@ -176295,6 +176468,19 @@
         {}
        ]
       ],
+      "line-clamp-auto-032.tentative.html": [
+       "17c6981ae33f115d8b7ab4245f44c6c837b44d1a",
+       [
+        null,
+        [
+         [
+          "/css/css-overflow/line-clamp/reference/line-clamp-auto-032-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "line-clamp-auto-033.tentative.html": [
        "f18d7eefb271e8529d0f2dedde8fe3fe9d7ea947",
        [
@@ -176309,12 +176495,12 @@
        ]
       ],
       "line-clamp-auto-034.tentative.html": [
-       "96fe675d1b10c74516b7d2e1a38425b220817a52",
+       "ebb676dfd8e0fa265ddf0280b3987fd1eb8f3587",
        [
         null,
         [
          [
-          "/css/css-overflow/line-clamp/reference/webkit-line-clamp-005-ref.html",
+          "/css/css-overflow/line-clamp/reference/line-clamp-auto-034-ref.html",
           "=="
          ]
         ],
@@ -176348,12 +176534,12 @@
        ]
       ],
       "line-clamp-auto-037.tentative.html": [
-       "37b366660241f9542b273d5999d357b8bdb497fe",
+       "4a2fc3c82064e12b5ff282c56f4e3a03035ee9e9",
        [
         null,
         [
          [
-          "/css/css-overflow/line-clamp/reference/line-clamp-auto-037-ref.html",
+          "/css/css-overflow/line-clamp/reference/line-clamp-auto-011-ref.html",
           "=="
          ]
         ],
@@ -214493,6 +214679,19 @@
         {}
        ]
       ],
+      "text-spacing-trim-fallback-001.html": [
+       "1a13be3b30635d036d3b990c8084c19e8efe9171",
+       [
+        null,
+        [
+         [
+          "/css/css-text/text-spacing-trim/text-spacing-trim-fallback-001-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "text-spacing-trim-feature-001.html": [
        "25ddad34aee7d99ae1b17949773087f2ff558ac3",
        [
@@ -253908,6 +254107,19 @@
        {}
       ]
      ],
+     "inline-cache-base-uri.html": [
+      "96249058d5d0b4a81b52963844b4b628ece300fd",
+      [
+       null,
+       [
+        [
+         "/css/css-values/inline-cache-base-uri-ref.html",
+         "=="
+        ]
+       ],
+       {}
+      ]
+     ],
      "lh-unit-001.html": [
       "f7a6fc9551b4524a41bdb97cb9293ff973cf3e52",
       [
@@ -261791,6 +262003,19 @@
       ]
      ],
      "scoped": {
+      "display-change.html": [
+       "74428fafc7a714ed10bbbed9208a1736e82848c8",
+       [
+        null,
+        [
+         [
+          "/css/css-view-transitions/scoped/content-ref.html",
+          "=="
+         ]
+        ],
+        {}
+       ]
+      ],
       "from-scale-zero.html": [
        "029b8301512e3fc94fc8b428186e811cd376edc7",
        [
@@ -279530,7 +279755,7 @@
       ]
      ],
      "backdrop-filter-edge-behavior.html": [
-      "2123e76d3832b8f7bf7a1a92c01d652ce1a1b358",
+      "7649bfd8f968860f9e7307fcf601c9beb4f03884",
       [
        null,
        [
@@ -282396,7 +282621,7 @@
       ]
      ],
      "svg-image-root-filter.html": [
-      "6df6eb23b9a1443c8c35fe8343a291dd079a03af",
+      "c3d99d0a3cdac080f09633f445a4ef66109585be",
       [
        null,
        [
@@ -282405,7 +282630,23 @@
          "=="
         ]
        ],
-       {}
+       {
+        "fuzzy": [
+         [
+          null,
+          [
+           [
+            0,
+            1
+           ],
+           [
+            0,
+            400
+           ]
+          ]
+         ]
+        ]
+       }
       ]
      ],
      "svg-multiple-filter-functions.html": [
@@ -324543,11 +324784,11 @@
       "8ab9db7bf71318b6b030f32ab7b8bd2554efa3e1",
       []
      ],
-     "cfrg_curves_bits_curve448.https.any-expected.txt": [
+     "cfrg_curves_bits_curve448.tentative.https.any-expected.txt": [
       "66ab63a4e41ed1cbba4838edb1641e59f3c419b0",
       []
      ],
-     "cfrg_curves_bits_curve448.https.any.worker-expected.txt": [
+     "cfrg_curves_bits_curve448.tentative.https.any.worker-expected.txt": [
       "66ab63a4e41ed1cbba4838edb1641e59f3c419b0",
       []
      ],
@@ -324559,11 +324800,11 @@
       "62f9e00aa338468f1a33a5fe91931378a4a72cad",
       []
      ],
-     "cfrg_curves_keys_curve448.https.any-expected.txt": [
+     "cfrg_curves_keys_curve448.tentative.https.any-expected.txt": [
       "d5317de7e76c0d7f37472222b902ca2d078dc3d8",
       []
      ],
-     "cfrg_curves_keys_curve448.https.any.worker-expected.txt": [
+     "cfrg_curves_keys_curve448.tentative.https.any.worker-expected.txt": [
       "d5317de7e76c0d7f37472222b902ca2d078dc3d8",
       []
      ],
@@ -324815,19 +325056,19 @@
       "ab3908ab689aa4d5d1ea9fc73f2637d5c06cf127",
       []
      ],
-     "failures_Ed448.https.any-expected.txt": [
+     "failures_Ed448.tentative.https.any-expected.txt": [
       "9e773ae68af00710e3ef5a44a921d178d7c5d4df",
       []
      ],
-     "failures_Ed448.https.any.worker-expected.txt": [
+     "failures_Ed448.tentative.https.any.worker-expected.txt": [
       "9e773ae68af00710e3ef5a44a921d178d7c5d4df",
       []
      ],
-     "failures_X448.https.any-expected.txt": [
+     "failures_X448.tentative.https.any-expected.txt": [
       "53b8a7e9c387fc3e374b0a595d53ae66b007af36",
       []
      ],
-     "failures_X448.https.any.worker-expected.txt": [
+     "failures_X448.tentative.https.any.worker-expected.txt": [
       "53b8a7e9c387fc3e374b0a595d53ae66b007af36",
       []
      ],
@@ -324867,19 +325108,19 @@
       "74b757b8e50c2418f328be60c8bea7dea8862100",
       []
      ],
-     "successes_Ed448.https.any-expected.txt": [
+     "successes_Ed448.tentative.https.any-expected.txt": [
       "30f29525521455688b1c57973eb48f039224b4cc",
       []
      ],
-     "successes_Ed448.https.any.worker-expected.txt": [
+     "successes_Ed448.tentative.https.any.worker-expected.txt": [
       "30f29525521455688b1c57973eb48f039224b4cc",
       []
      ],
-     "successes_X448.https.any-expected.txt": [
+     "successes_X448.tentative.https.any-expected.txt": [
       "b47aa9dd80efc5d50eeba04e8040fc5696a0a68d",
       []
      ],
-     "successes_X448.https.any.worker-expected.txt": [
+     "successes_X448.tentative.https.any.worker-expected.txt": [
       "b47aa9dd80efc5d50eeba04e8040fc5696a0a68d",
       []
      ]
@@ -324905,35 +325146,35 @@
       "8627f85e466199453efb59109e2ba1d7eb025ff8",
       []
      ],
-     "okp_importKey_Ed448.https.any-expected.txt": [
+     "okp_importKey_Ed448.tentative.https.any-expected.txt": [
       "5ad60d082bfab7b9881fae59280d42cb19cd7154",
       []
      ],
-     "okp_importKey_Ed448.https.any.worker-expected.txt": [
+     "okp_importKey_Ed448.tentative.https.any.worker-expected.txt": [
       "5ad60d082bfab7b9881fae59280d42cb19cd7154",
       []
      ],
-     "okp_importKey_X448.https.any-expected.txt": [
+     "okp_importKey_X448.tentative.https.any-expected.txt": [
       "e6052c5ef1b5501fda60cb3bd128d10df4f65c5f",
       []
      ],
-     "okp_importKey_X448.https.any.worker-expected.txt": [
+     "okp_importKey_X448.tentative.https.any.worker-expected.txt": [
       "e6052c5ef1b5501fda60cb3bd128d10df4f65c5f",
       []
      ],
-     "okp_importKey_failures_Ed448.https.any-expected.txt": [
+     "okp_importKey_failures_Ed448.tentative.https.any-expected.txt": [
       "59e83f578305511158c2b951884d97cfa3eccbd2",
       []
      ],
-     "okp_importKey_failures_Ed448.https.any.worker-expected.txt": [
+     "okp_importKey_failures_Ed448.tentative.https.any.worker-expected.txt": [
       "59e83f578305511158c2b951884d97cfa3eccbd2",
       []
      ],
-     "okp_importKey_failures_X448.https.any-expected.txt": [
+     "okp_importKey_failures_X448.tentative.https.any-expected.txt": [
       "903dd31e8abc800680c6856b78046d2c2acd05a4",
       []
      ],
-     "okp_importKey_failures_X448.https.any.worker-expected.txt": [
+     "okp_importKey_failures_X448.tentative.https.any.worker-expected.txt": [
       "903dd31e8abc800680c6856b78046d2c2acd05a4",
       []
      ],
@@ -324967,11 +325208,11 @@
       "4024674e3c3d7f0500cfc10192714de392e4db1d",
       []
      ],
-     "eddsa_curve448.https.any-expected.txt": [
+     "eddsa_curve448.tentative.https.any-expected.txt": [
       "a3c791dfc4385fb5e57f0b99ce450046f357e9e8",
       []
      ],
-     "eddsa_curve448.https.any.worker-expected.txt": [
+     "eddsa_curve448.tentative.https.any.worker-expected.txt": [
       "a3c791dfc4385fb5e57f0b99ce450046f357e9e8",
       []
      ],
@@ -327499,7 +327740,7 @@
      []
     ],
     "get-host-info.sub.js": [
-     "f680cd8b1999a317066de5ce3aab1c682b081bc5",
+     "42369c7370b91cc2daf46c17a6fd73318327effb",
      []
     ],
     "get-host-info.sub.js.headers": [
@@ -330488,6 +330729,18 @@
       ]
      }
     },
+    "origin-bound-cookies": {
+     "resources": {
+      "scheme-bound-cookies-window.html": [
+       "0ad1d0b23aaf451d8e0b5f02cc4b5023da54303f",
+       []
+      ]
+     },
+     "scheme-bound-cookies.https-expected.txt": [
+      "8b137891791fe96927ad78e64b0aad7bded08bdc",
+      []
+     ]
+    },
     "partitioned-cookies": {
      "OWNERS": [
       "34b3b91a2f61e5e74a2b3e305dbbda30e2031ab6",
@@ -337969,6 +338222,10 @@
       "dd922b0bb218311665711ca9d14d60bdfb72ba98",
       []
      ],
+     "position-area-anchor-001-ref.html": [
+      "a97d290bfda8e46e69f87cfa518a0739ecdf86bd",
+      []
+     ],
      "position-area-inline-container-ref.html": [
       "ecf54f1a9ac2d756cb78f4d2c0690c1ac8b65916",
       []
@@ -355834,6 +356091,14 @@
        "ddb89d1fb2a3601509dbf19219b03b91c930ae84",
        []
       ],
+      "grid-abspos-staticpos-align-self-end-large-border-padding-ref.html": [
+       "7f2a5ad8377f9948d7640673eb76cfac3edfa3cd",
+       []
+      ],
+      "grid-abspos-staticpos-align-self-end-ref.html": [
+       "868717bc53ba75e1d6244fbaccddcf178c8c14da",
+       []
+      ],
       "grid-abspos-staticpos-align-self-img-001-ref.html": [
        "06d9d366127609b22f599fd87528693e37c8e6f4",
        []
@@ -359159,6 +359424,10 @@
        []
       ]
      },
+     "empty-span-height-ref.html": [
+      "34a81ce598333cec011ec83f7a3493d562580ac2",
+      []
+     ],
      "empty-span-scroll-ref.html": [
       "28b7f6e2df48fe2124ed8c623cabb56c1aecb35e",
       []
@@ -359603,7 +359872,7 @@
        []
       ],
       "text-box-trim-line-clamp-001-ref.html": [
-       "9d03140f4d7454f77e960816b8fe96d05f2aec89",
+       "c24d6197fc1f293fe1c3268902c82db045980e53",
        []
       ],
       "text-box-trim-line-clamp-auto-001-ref.html": [
@@ -360601,6 +360870,14 @@
         "b1e9ef5764029a5bd0645b71eb2ece265e340281",
         []
        ],
+       "clip-path-animation-set-currenttime-ref.html": [
+        "b65392923527a6cabeed5222ecf262fd6f71da8f",
+        []
+       ],
+       "clip-path-animation-start-time-ref.html": [
+        "067d779b075431e392be9267d7a9ccc5d57110a0",
+        []
+       ],
        "clip-path-animation-svg-ref.html": [
         "6cc3b4d58bd2ce7c1c9aef9df84dbff47d783f34",
         []
@@ -362637,6 +362914,22 @@
       "2944307d2d976a1690bb0f06d8ee85df18d1ea3c",
       []
      ],
+     "column-scroll-marker-focus-001-expected.txt": [
+      "9765fd727215447cd9b2a91a0a2a0d07a00f9cb0",
+      []
+     ],
+     "column-scroll-marker-focus-002-expected.txt": [
+      "7c7381cf2744290b94eea2a46f51723286da0562",
+      []
+     ],
+     "column-scroll-marker-focus-003-expected.txt": [
+      "9f6b9d845e982d01640b611d174eeb62bc265102",
+      []
+     ],
+     "column-scroll-marker-focus-004-expected.txt": [
+      "9ca55ef8842c2878ab0d215f13eb84decf427071",
+      []
+     ],
      "column-scroll-marker-reattach-target-current-ref.html": [
       "3a5b5cc94bf7c2b3affc363ad0e903155283b6bb",
       []
@@ -362658,7 +362951,7 @@
       []
      ],
      "inheritance-expected.txt": [
-      "c622cbc364d03c4b7c0d81ec09bde9bb1342109b",
+      "4a57f459d0d7152aec425a44e54433efc6efe8cd",
       []
      ],
      "line-clamp": {
@@ -362732,7 +363025,7 @@
         []
        ],
        "line-clamp-011-ref.html": [
-        "04297fff2b5538a8be020d780cba3d82aa30fa9e",
+        "02ef71d56193c97f8662f1ddd81633181deaf7b5",
         []
        ],
        "line-clamp-012-ref.html": [
@@ -362784,7 +363077,7 @@
         []
        ],
        "line-clamp-auto-011-ref.html": [
-        "27a2e7b2bc07ba80f6bfda6b6b10f2c417b27bbb",
+        "5f7120ee39a2014f75f2f700ebedcc0b0e6e6275",
         []
        ],
        "line-clamp-auto-016-ref.html": [
@@ -362811,6 +363104,10 @@
         "adb4b6dc6edf2a401cd4016f394c74b9bf9b89cb",
         []
        ],
+       "line-clamp-auto-025-ref.html": [
+        "c404f65ce6a342b8bb2b7715bd9c7c1b912940ee",
+        []
+       ],
        "line-clamp-auto-027-ref.html": [
         "fa0ade7a61d0729dc216fe92fc9d1f49bcd31991",
         []
@@ -362827,6 +363124,14 @@
         "2d3c9d0261b7eb369d99dbd842309f697e80bad8",
         []
        ],
+       "line-clamp-auto-032-ref.html": [
+        "4768c77ddabc93d3519e671c10d584b12e8a69ad",
+        []
+       ],
+       "line-clamp-auto-034-ref.html": [
+        "8fae3b278c124db00b8f79eb0cd0b91cb8752217",
+        []
+       ],
        "line-clamp-auto-036-ref.html": [
         "0ad96e88d14a735ce9416dba2b31f5f66936b19f",
         []
@@ -363295,19 +363600,11 @@
        []
       ],
       "continue-valid-expected.txt": [
-       "820be9471b599145f4f420aa66ccda17c48a7c3e",
-       []
-      ],
-      "line-clamp-invalid-expected.txt": [
-       "2421724b28f9b349121c0360e7d7b919127bfa0d",
+       "88b127f7ef1046fd8ff5cc5ee1b87140c5d34faa",
        []
       ],
       "line-clamp-valid-expected.txt": [
-       "1bead233776ea1520a1c446eedd988e0a79997ab",
-       []
-      ],
-      "max-lines-valid-expected.txt": [
-       "616418e1723574341bc33a131faf44d371c5cf44",
+       "8253f838ffd72482334d4fb044826daecc4684be",
        []
       ],
       "scroll-markers-computed-expected.txt": [
@@ -363463,14 +363760,26 @@
       "dca775fcecadf26d115e3961da6affb519b0fdba",
       []
      ],
+     "scroll-marker-activation-retains-focus-expected.txt": [
+      "af10820b3b174b512fdf47baffff33c6ca1dfded",
+      []
+     ],
      "scroll-marker-counters-ref.html": [
       "7113a5c5d23a97cf83f173a72ef96b57ecf09263",
       []
      ],
+     "scroll-marker-double-activation-expected.txt": [
+      "74f0476528995fa1ba02abe2727bb80853f2df1c",
+      []
+     ],
      "scroll-marker-dynamic-ref.html": [
       "a004a8583f20e3d0e082c7390e20b040b960bfec",
       []
      ],
+     "scroll-marker-focus-within-expected.txt": [
+      "a96eb2255f7fdd7768522f7d969e1e1e95795f66",
+      []
+     ],
      "scroll-marker-group-001-ref.html": [
       "7f980f575d3a763a84dfb79a00416f2ce656b4d8",
       []
@@ -363519,10 +363828,26 @@
       "58670072f696c6a2143591395512fd17bd4ffa7f",
       []
      ],
+     "scroll-marker-navigation-cycles-expected.txt": [
+      "c0f03de8c90601482fe8862ca03111eeb6452581",
+      []
+     ],
+     "scroll-marker-next-focus-expected.txt": [
+      "18b61ad397ab6e05140958fe017326a5c2b92136",
+      []
+     ],
      "scroll-marker-selection-in-2d-ref.html": [
       "d16263a12a37bf65cf57c46e0a644637462f262d",
       []
      ],
+     "scroll-markers-focus-active-element-expected.txt": [
+      "c658a9b236ce27f3cd262e1fd2e9c75a64ce2920",
+      []
+     ],
+     "scroll-markers-focus-on-scrolling-expected.txt": [
+      "ecc60f3952d8f321f30f1616fdd68648831967f3",
+      []
+     ],
      "scroll-markers-under-content-visibility-auto-ref.html": [
       "559ff4e5aa2cffec5966938a824826a41fbc07d8",
       []
@@ -371503,14 +371828,6 @@
       "word-space-transform-valid-expected.txt": [
        "a62737d545b509d0175fc41937ebac799189d48b",
        []
-      ],
-      "word-spacing-computed-expected.txt": [
-       "9045a13d63617d22ffca2707c88ed3ee911e54b9",
-       []
-      ],
-      "word-spacing-valid-expected.txt": [
-       "77e20da66a1af65c8bde82422205413e505b6ff4",
-       []
       ]
      },
      "shaping": {
@@ -372338,6 +372655,10 @@
        "57013882323048ccc8d651929fdb42f413953882",
        []
       ],
+      "text-spacing-trim-fallback-001-ref.html": [
+       "d3f72b2ecee9848c1a9460ce2bda82bef848798e",
+       []
+      ],
       "text-spacing-trim-feature-001-ref.html": [
        "86b61e064076ab4224a65021e31b5678a54e3ec0",
        []
@@ -376199,10 +376520,6 @@
        []
       ]
      },
-     "properties-value-001-expected.txt": [
-      "6bfe748e6c8666807f25e11081b411a7173b1de4",
-      []
-     ],
      "properties-value-002-expected.txt": [
       "da2ba17acd4db3a02b424f727f9fabeab4a22b38",
       []
@@ -376211,10 +376528,6 @@
       "467d5504ab32556cff3232c145c1dfd83fad2ece",
       []
      ],
-     "properties-value-inherit-002-expected.txt": [
-      "6bfe748e6c8666807f25e11081b411a7173b1de4",
-      []
-     ],
      "pseudo-element-transform-ref.html": [
       "05ea20b69c4b45bb4c9eb49ffa10a342ab97b7ac",
       []
@@ -376860,7 +377173,7 @@
         []
        ],
        "text-overflow-expected.txt": [
-        "79d91df730299c387b59bd7d4b15ab064ea8276c",
+        "65900d570b7084f12e9a26bcada7ed8cc207c620",
         []
        ],
        "text-size-adjust-expected.txt": [
@@ -376888,7 +377201,7 @@
         []
        ],
        "word-spacing-expected.txt": [
-        "114a52f457182ab2da0f7e904b75f75888398d7c",
+        "9bb0afa12b149498a3a8af035045b8cc19e35c6a",
         []
        ],
        "word-wrap-expected.txt": [
@@ -378529,6 +378842,24 @@
       "888a51ea9b6ac04fb065ee5d84a18be8fe765aca",
       []
      ],
+     "inline-cache-base-uri": {
+      "inline-cache-base-uri.css": [
+       "df719dd6cc5ed6996ffd0762f9ee380394cab9de",
+       []
+      ],
+      "inner.html": [
+       "7a23e13a21bbe5c1bb57c6f0cd19d9d04b4dea4c",
+       []
+      ]
+     },
+     "inline-cache-base-uri-ref.html": [
+      "07f7449d52be5f1f82b97b19dfd57a3290e16293",
+      []
+     ],
+     "inline-cache-base-uri.css": [
+      "2efbfba62bd32e22840cfb3e44fda8f5371a9394",
+      []
+     ],
      "minmax-percentage-serialize-expected.txt": [
       "ae7598061a545cb00b15fa5d7ce7cae14af6e41c",
       []
@@ -383618,7 +383949,7 @@
       []
      ],
      "backdrop-filter-edge-behavior-ref.html": [
-      "d5e8fa878cb1930f922f11042d97651746ccb40d",
+      "11246d799658499721e56d8dc1d8b023abc1fa1f",
       []
      ],
      "backdrop-filter-edge-pixels-ref.html": [
@@ -386347,7 +386678,7 @@
      []
     ],
     "helper.js": [
-     "58b7a5fe7a2da56b9c6555f6e21510abd1c81473",
+     "e364e2e24f1d296346fb9025adec160a10ffed8f",
      []
     ],
     "includeInScopeSpecification": {
@@ -386385,7 +386716,7 @@
      []
     ],
     "session_manager.py": [
-     "98e01309192cce32d5437e0b10549ca572a7f0ef",
+     "779d1435ac7edfe57842abddbba6ad2ea64b130d",
      []
     ],
     "set_cookie.py": [
@@ -386393,13 +386724,17 @@
      []
     ],
     "setup_sharded_server_state.py": [
-     "f3e6029e8f3d6fb27cfe9262a419b8eb793c0dd0",
+     "57e935ea57e50a478f3c9ac9684fefb4d121a99b",
      []
     ],
     "start_session.py": [
      "d2b7ee878188e0c928959445cc7722f5725e0da1",
      []
     ],
+    "url_fetcher.html": [
+     "be1cb97921972e0dc577e9f1906ccb0752b96b24",
+     []
+    ],
     "verify_authenticated.py": [
      "ea4b5a2162a366fe8fd04d069f992a909236be66",
      []
@@ -386450,6 +386785,10 @@
     ]
    },
    "digital-credentials": {
+    "DIR_METADATA": [
+     "47815934a4db38ef67f84d3de2ba6fa1a66aef68",
+     []
+    ],
     "META.yml": [
      "177f1411bb96680e76e05f71988dc669f67c9d3a",
      []
@@ -386467,7 +386806,7 @@
      []
     ],
     "dc-types.ts": [
-     "6555add5b5d7d45ebc1004d1d27c329aaf6f55e8",
+     "1f3d620790c14557ba4eeb884b00520b6f1ea9c8",
      []
     ],
     "digital-credentials-static-methods.tentative.https-expected.txt": [
@@ -386487,7 +386826,7 @@
      []
     ],
     "get.tentative.https-expected.txt": [
-     "e6017b50bf9e6c03cd298118e5b7cc1380c72d66",
+     "70beb5727e47727d8c2edb7fa20c03de930b4e78",
      []
     ],
     "support": {
@@ -388778,7 +389117,7 @@
       []
      ],
      "insertparagraph_1-1000-expected.txt": [
-      "c2132fd2be3c2f4565f95791352602ddc38fce5c",
+      "710205557b55312803f09679fcffaa22bd19be70",
       []
      ],
      "insertparagraph_1001-2000-expected.txt": [
@@ -391046,7 +391385,7 @@
       ]
      },
      "fedcm-helper.sub.js": [
-      "f88fd62bd129fa2530b359eca65798b0e0dabde5",
+      "d370ea6e374c0eb7272201452baac874771dce82",
       []
      ],
      "fedcm-helper.sub.js.headers": [
@@ -393546,7 +393885,7 @@
       []
      ],
      "README.md": [
-      "95066cdcd0ba6f2baed3cd02d67610420367b6df",
+      "d4945a0bfb21417f61fca4cf400713089881ba37",
       []
      ],
      "resources": {
@@ -395956,6 +396295,14 @@
        "8aa4c66254cf0e4595a51a083af347e357f4c991",
        []
       ],
+      "NotoSansCJKjp-Regular-subset-halt-3002.otf": [
+       "cd0f08ca4f8d4bff4828034df9332b7a69d4fdd7",
+       []
+      ],
+      "NotoSansCJKjp-Regular-subset-halt-FF1A.otf": [
+       "159aec5f717017658ac416a789722e3ae937f196",
+       []
+      ],
       "NotoSansCJKjp-Regular-subset-halt-min.otf": [
        "1ec5a7dbea3c9ccd088b9ef15e5b67074c830686",
        []
@@ -395969,7 +396316,7 @@
        []
       ],
       "subset.sh": [
-       "c34840667624f7750d8c85b7c4f7b176d1f60581",
+       "899db77945df516444a327b88e6e3db79f421de1",
        []
       ]
      },
@@ -403568,7 +403915,17 @@
        "README.md": [
         "f6b4470618d98cdc0dc09eef7e508c31bee41531",
         []
-       ]
+       ],
+       "resources": {
+        "delay.py": [
+         "d1cc3a9fdfa5e29d81c5b5dca2c405ffea3ec776",
+         []
+        ],
+        "included.txt": [
+         "929838d5eab5dca3e21fe0295dfc3ed3b6cc7a28",
+         []
+        ]
+       }
       }
      },
      "reflection-embedded-expected.txt": [
@@ -407594,12 +407951,6 @@
         ]
        }
       },
-      "sections-and-headings": {
-       "headings-styles-expected.txt": [
-        "e3679dfece450fc9c20be020181da561cf3c5993",
-        []
-       ]
-      },
       "tables": {
        "DIR_METADATA": [
         "c8909f2b9c86237b881f6f2465f13e4fb1ce162f",
@@ -413151,6 +413502,14 @@
         "a-onclick-handler-iframe.html": [
          "711e40f9d4bd83700ed8ab39bdf3795d9287deca",
          []
+        ],
+        "plain-text.unknown": [
+         "efbf544ad0b5fd91a7e4fc42bf98228f065bc240",
+         []
+        ],
+        "plain-text.unknown.headers": [
+         "036ddf96fd8ffb393f8ccdf398d08b2a09b1b15e",
+         []
         ]
        }
       },
@@ -418457,7 +418816,15 @@
       "780d5736c49065f1ea4140cfb8375aeb1005f039",
       []
      ]
-    }
+    },
+    "web-font-styled-text-resize-swap-expected.txt": [
+     "bd90b52636f88f730a07d492db075f16719ec83a",
+     []
+    ],
+    "web-font-styled-text-resize-swap-subnode-expected.txt": [
+     "149db54d04d18a25db719d059f88d19ac77f094b",
+     []
+    ]
    },
    "layout-instability": {
     "DIR_METADATA": [
@@ -427600,6 +427967,10 @@
       []
      ]
     },
+    "sync-network-logo.png": [
+     "91212531e00396593b5c0f6b92713f518a34b125",
+     []
+    ],
     "troy.png": [
      "4987ba65c2cefafeaa07abd87f47431ac7b6ca3a",
      []
@@ -427609,7 +427980,7 @@
      []
     ],
     "utils.sub.js": [
-     "ab7407f7d6c41fd3e77db443dacf3b18252e26e6",
+     "6d66a2186c75ebeb3c5cd5b1c8e0a67e22229be2",
      []
     ]
    },
@@ -432406,7 +432777,7 @@
       []
      ],
      "partitioned-estimate-usage-details-caches-helper-frame.html": [
-      "0679c1decf55835a0de37a9e64f12647da2a6c0a",
+      "c97fffd4c9369ed9e0c92fdc8a33ff7d0b29107a",
       []
      ],
      "partitioned-estimate-usage-details-indexeddb-helper-frame.html": [
@@ -437741,7 +438112,7 @@
        []
       ],
       "accumulation-per-property-002-expected.txt": [
-       "c06b654a1f0adbc286b528eb1e935874fb62ce9a",
+       "49497594c0310210b762d47f6c158be0b20db7c0",
        []
       ],
       "addition-per-property-001-expected.txt": [
@@ -437749,7 +438120,7 @@
        []
       ],
       "addition-per-property-002-expected.txt": [
-       "64682d589996bdf1e9fa5ec481ef42ff06f35de1",
+       "2acc6f2369149657fc3fe14fcdf678cdf714c9a0",
        []
       ],
       "interpolation-per-property-001-expected.txt": [
@@ -437757,7 +438128,7 @@
        []
       ],
       "interpolation-per-property-002-expected.txt": [
-       "b6734d945426c656c44c4bac181f428ef3aeadf5",
+       "075ea6fad635e8cf95e68589207edaee2533ba6a",
        []
       ],
       "property-list.js": [
@@ -438606,7 +438977,7 @@
       []
      ],
      "audit-util.js": [
-      "e036445e4fe6e0cd1ace431742760a3d06f9f9c0",
+      "544bd202ee74033feb8b897914af5a90f24692a3",
       []
      ],
      "audit.js": [
@@ -441059,6 +441430,10 @@
       "9755ac3a6212a7faff06d9522531f2b6ffc1c7b1",
       []
      ],
+     "setter-argument-expected.txt": [
+      "023b960bf637bbde50a27dfb4739d806e4946fa8",
+      []
+     ],
      "support": {
       "constructors-support.html": [
        "3b2616170b1d4f48f9dab114e4135222ed10a6ea",
@@ -441278,7 +441653,7 @@
     },
     "resources": {
      "utils.js": [
-      "1e7b5a9ca79f822d67028e5004583934424903e3",
+      "c2af1ad77e16458f5390795458e99fbe2d3d3c44",
       []
      ],
      "utils_validation.js": [
@@ -442341,10 +442716,6 @@
     "storage_session_setitem_quotaexceedederr.window-expected.txt": [
      "c5fe5ba652b61147ac139cf107297347df9bbbf9",
      []
-    ],
-    "symbol-props.window-expected.txt": [
-     "63078d0da1d964829d01d262953f4ea2c8641d29",
-     []
     ]
    },
    "webtransport": {
@@ -448447,6 +448818,85 @@
       }
      ]
     ],
+    "blob-valid-after-abort.any.js": [
+     "169073b822be5d2ef5800c73352887a888500bb7",
+     [
+      "IndexedDB/blob-valid-after-abort.any.html",
+      {
+       "script_metadata": [
+        [
+         "title",
+         "Blob Valid After Abort"
+        ],
+        [
+         "global",
+         "window,worker"
+        ],
+        [
+         "script",
+         "resources/support.js"
+        ]
+       ]
+      }
+     ],
+     [
+      "IndexedDB/blob-valid-after-abort.any.serviceworker.html",
+      {
+       "script_metadata": [
+        [
+         "title",
+         "Blob Valid After Abort"
+        ],
+        [
+         "global",
+         "window,worker"
+        ],
+        [
+         "script",
+         "resources/support.js"
+        ]
+       ]
+      }
+     ],
+     [
+      "IndexedDB/blob-valid-after-abort.any.sharedworker.html",
+      {
+       "script_metadata": [
+        [
+         "title",
+         "Blob Valid After Abort"
+        ],
+        [
+         "global",
+         "window,worker"
+        ],
+        [
+         "script",
+         "resources/support.js"
+        ]
+       ]
+      }
+     ],
+     [
+      "IndexedDB/blob-valid-after-abort.any.worker.html",
+      {
+       "script_metadata": [
+        [
+         "title",
+         "Blob Valid After Abort"
+        ],
+        [
+         "global",
+         "window,worker"
+        ],
+        [
+         "script",
+         "resources/support.js"
+        ]
+       ]
+      }
+     ]
+    ],
     "blob-valid-after-deletion.any.js": [
      "3a10fbde216acfea9251f40f0d26ad2838b64c87",
      [
@@ -496418,7 +496868,7 @@
      ]
     ],
     "cookieStore_special_names.https.any.js": [
-     "706eb16b55bc4de4d6e67b96e15f74a3690e4b55",
+     "36761b4493995e1bc41d56068b95b745b4cea3c5",
      [
       "cookie-store/cookieStore_special_names.https.any.html",
       {
@@ -497015,6 +497465,22 @@
       ]
      ]
     },
+    "origin-bound-cookies": {
+     "port-bound-cookies.html": [
+      "696e53818cba033c9c3a68fc4bb44c23dffcbe61",
+      [
+       null,
+       {}
+      ]
+     ],
+     "scheme-bound-cookies.https.html": [
+      "e7f1158fe1d3768a967be1b69bd55e5e368dd8a0",
+      [
+       null,
+       {}
+      ]
+     ]
+    },
     "partitioned-cookies": {
      "partitioned-cookies-a-b-a-embed.tentative.https.html": [
       "071948ea8d7b2d95124031d84ecea4be3df2ff4d",
@@ -500170,6 +500636,20 @@
        {}
       ]
      ],
+     "anchor-in-anchor-positioned.html": [
+      "8cd341aece12dc41cfb8a853e181c460ec184319",
+      [
+       null,
+       {}
+      ]
+     ],
+     "anchor-in-popover.html": [
+      "97ae61793e3e98d3b01b3d578eaabfe04d079428",
+      [
+       null,
+       {}
+      ]
+     ],
      "anchor-inherited.html": [
       "0f84311d6d784fdb33fd2c6642a838deefb60830",
       [
@@ -500423,7 +500903,7 @@
       ]
      ],
      "anchor-position-multicol-002.html": [
-      "1e1f0a5c95b1b5f1d86efc5f22ffc87afbbab453",
+      "6ca4c22d8cd1e4f86a2d06e1a32460b16b7c756b",
       [
        null,
        {}
@@ -508741,6 +509221,13 @@
         null,
         {}
        ]
+      ],
+      "multiline-align-self.html": [
+       "3b8f1ca230326584930a2f1f54467e0442508f0d",
+       [
+        null,
+        {}
+       ]
       ]
      },
      "animation": {
@@ -518971,7 +519458,7 @@
       ]
      ],
      "inheritance.html": [
-      "ffc6b2f881965883e74d53b49c2495b141724a06",
+      "bc166cb4205fc176b9e859e776150136ef33b28a",
       [
        null,
        {}
@@ -519121,42 +519608,42 @@
        ]
       ],
       "continue-invalid.html": [
-       "36e164158f3975e735f66c8ae9bcf819694d6b84",
+       "df09e0912bebd72332a8d4a03bed1644ca2c1e66",
        [
         null,
         {}
        ]
       ],
       "continue-valid.html": [
-       "97524cf80db239e111e4f503f5eea397129dca10",
+       "9d9f71e79ccf3d4be71ae2bbaf9cb7e7078f126c",
        [
         null,
         {}
        ]
       ],
       "line-clamp-invalid.html": [
-       "7b64e4735867396c650a7dd29c17577c896daea0",
+       "decff49ecbb16feeb02ab3aa3a31a3d51b5f0044",
        [
         null,
         {}
        ]
       ],
       "line-clamp-valid.html": [
-       "735300c9efe783da28700e082144f01b40c02ac0",
+       "43de2e01372b7b9909868341ab42d8663b562c85",
        [
         null,
         {}
        ]
       ],
       "max-lines-invalid.html": [
-       "85fe77fdb7a6d88c8f2a170b5f86646e5ee7b39c",
+       "8b6da0dcb89693dec8f4eb533e01713e800267f0",
        [
         null,
         {}
        ]
       ],
       "max-lines-valid.html": [
-       "f2fda80c3b3d95137e5e0117467cfb267ce3082b",
+       "431eb5b457367b26414fd9ee89f92aff6de4b130",
        [
         null,
         {}
@@ -519282,21 +519769,21 @@
        ]
       ],
       "text-overflow-computed.html": [
-       "60add5dd12d6435377ab039c4401be1de256ddc4",
+       "32670db9df33bfb5e17eb38851f2052b0f0cd572",
        [
         null,
         {}
        ]
       ],
       "text-overflow-invalid.html": [
-       "785632a727a5643e13ed25e12d71c6c541969e1a",
+       "12e65a893607c67d2ecc05b0d6ff714b34ff5954",
        [
         null,
         {}
        ]
       ],
       "text-overflow-valid.html": [
-       "df77dffd6d8bb89334bd676302842e7483851647",
+       "fbf6a8b15e6a9f09f5e470c357ba39ed598cf74a",
        [
         null,
         {}
@@ -519310,14 +519797,14 @@
        ]
       ],
       "webkit-line-clamp-invalid.html": [
-       "6bb90fa9e1779c09d79b1da04a14ee406fa1833d",
+       "77cbc99d9fee30706d904c152f0b38157293fb95",
        [
         null,
         {}
        ]
       ],
       "webkit-line-clamp-valid.html": [
-       "8b0e9c49e925713f71b63a5fd3ca1941639be160",
+       "9e4541ed5ebf7df74377d5a312516c4322d070bb",
        [
         null,
         {}
@@ -519489,6 +519976,24 @@
        {}
       ]
      ],
+     "scroll-marker-activation-focus-behaviour-links-mode.tentative.html": [
+      "77b0a2527217fa7435a530d6c0a9c8380e45eb64",
+      [
+       null,
+       {
+        "testdriver": true
+       }
+      ]
+     ],
+     "scroll-marker-activation-focus-behaviour-tabs-mode.tentative.html": [
+      "dff1b14ab18c7ebd34fc712146e4764d222d132d",
+      [
+       null,
+       {
+        "testdriver": true
+       }
+      ]
+     ],
      "scroll-marker-activation-retains-focus.html": [
       "cf38ed354c73d3c5840258f87912a76c50ccebed",
       [
@@ -524568,6 +525073,13 @@
        {}
       ]
      ],
+     "host-part-003.html": [
+      "7aac235a043b6c92425e7b8f57c2837a2503e97f",
+      [
+       null,
+       {}
+      ]
+     ],
      "host-part-nesting.html": [
       "c0dc8e20eee9ab3fda124ef99cb7623146b8a321",
       [
@@ -530594,7 +531106,7 @@
        ]
       ],
       "text-decoration-computed.html": [
-       "5371c42249c77c52da09e01ae75c1414da52db83",
+       "c0783969ab30346955c4a46190ab836acdcbab51",
        [
         null,
         {}
@@ -530678,7 +531190,7 @@
        ]
       ],
       "text-decoration-valid.html": [
-       "ad82dd203cdfafc5ee5960837a23bf14cd661cf3",
+       "35fd8f3b906e9ef258bbb859752503fe41670446",
        [
         null,
         {}
@@ -532415,7 +532927,7 @@
       ]
      ],
      "historical.html": [
-      "ceb4dfe56772e26c10b88a01b37470751014bdc7",
+      "3c8ff65102d540522e54c5b4fb46e0451b5df01f",
       [
        null,
        {}
@@ -532571,7 +533083,7 @@
      },
      "stylevalue-subclasses": {
       "cssColorValue.html": [
-       "59a03c138d52e5f42c5deee49525ea6a00fada37",
+       "9a319a51816040ab18f19ef6513815f86667eecc",
        [
         null,
         {}
@@ -532655,7 +533167,7 @@
        ]
       ],
       "cssRGB.html": [
-       "8ec193da4d1ced0169f4b04ec17e3fa55c06f983",
+       "ecd30d7fd4228a76374fc04ccd5bf0fa78cecef9",
        [
         null,
         {}
@@ -540020,7 +540532,7 @@
       ]
      ],
      "shorthand-values.html": [
-      "f831cba2ca5f9aae6a4d610eeba3bfd42ab4d056",
+      "861e4f92fa3ccd6391687f9adfd3c1ce89c71e36",
       [
        null,
        {}
@@ -544823,7 +545335,7 @@
       ]
      ],
      "Document.html": [
-      "da2ea0db4ee937c6ef702c7b08632a1a3b3b452d",
+      "4c5d2eb6e2ee0c580f2490c8a5d7d14f27ca79e0",
       [
        null,
        {}
@@ -545191,7 +545703,7 @@
       ]
      ],
      "CustomElementRegistry-upgrade.html": [
-      "c68bc37df1b04cb451aba83fceb414958149cae3",
+      "5a5d594959c2f28aad2504610a2fe0457732aa33",
       [
        null,
        {}
@@ -545218,6 +545730,13 @@
        {}
       ]
      ],
+     "Document-importNode-cross-document.window.js": [
+      "0501e53c1ccb6f621a212bea5439f62d6ce24b87",
+      [
+       "custom-elements/registries/Document-importNode-cross-document.window.html",
+       {}
+      ]
+     ],
      "Document-importNode.html": [
       "89fc0773b5bda78826ff3cfe8a42606b3f725d2d",
       [
@@ -545260,6 +545779,13 @@
        {}
       ]
      ],
+     "adoption.window.js": [
+      "6371b368a884eddb7c437c776554318ee046fc81",
+      [
+       "custom-elements/registries/adoption.window.html",
+       {}
+      ]
+     ],
      "constructor-reentry-with-different-definition.html": [
       "ef104ebe4c1df1affe6540dae1138e40b724432e",
       [
@@ -545281,6 +545807,13 @@
        {}
       ]
      ],
+     "global.window.js": [
+      "7993ccb93e1c94caf307f025fc9caff15477a583",
+      [
+       "custom-elements/registries/global.window.html",
+       {}
+      ]
+     ],
      "initial-about-blank.window.js": [
       "b3bb7e139b5c543bae2d4cc86d3f5ebe1fe197f1",
       [
@@ -545303,7 +545836,7 @@
       ]
      ],
      "scoped-registry-define-upgrade-criteria.html": [
-      "9c9b076aa8d615c43fecaa77c62e404739db8cfc",
+      "f281f7f74429b9fd2de6e02ffb8778f5c79dc4e8",
       [
        null,
        {}
@@ -545316,6 +545849,13 @@
        {}
       ]
      ],
+     "scoped-registry-initialize.html": [
+      "18dbd0ebeddc0d115d596058fc11d863397c4ee5",
+      [
+       null,
+       {}
+      ]
+     ],
      "scoped-registry-registry-define-get-etc.html": [
       "29e11d97052c0683d92089583957c8217a98fa4f",
       [
@@ -545345,13 +545885,6 @@
       ]
      ]
     },
-    "scoped-registry-initialize.html": [
-     "18dbd0ebeddc0d115d596058fc11d863397c4ee5",
-     [
-      null,
-      {}
-     ]
-    ],
     "state": {
      "ElementInternals-states.html": [
       "1521a8098a36f0c0339fc1e7dceac12d149de385",
@@ -545439,7 +545972,7 @@
       ]
      ],
      "Document-importNode.html": [
-      "9f960127eecf7da66885b433508b9998236f83d5",
+      "3f49d1f53b38ddf47a0b377c7f0f56404baac200",
       [
        null,
        {}
@@ -545584,134 +546117,141 @@
     ]
    },
    "device-bound-session-credentials": {
+    "allowed-refresh-initiators.https.html": [
+     "bef2d55c906d0d7fe5818ba3d8fbbde1f5146ad1",
+     [
+      null,
+      {}
+     ]
+    ],
     "clear-site-data.https.html": [
-     "94f2d96a358138054c427360d3301f875496876c",
+     "ba76a901662b37bc7ca047c52f6469194294367a",
      [
       null,
       {}
      ]
     ],
     "create-session.https.html": [
-     "13e17de37441b4d86b98787718af6477fd27604f",
+     "1ed8ac5e8e20a32d130d074e37eaf4948fe55d8b",
      [
       null,
       {}
      ]
     ],
     "credentials-matching.https.html": [
-     "28af9153db41aa04b9cba84903b3b75c7986be33",
+     "cdbfa6704597c16445f0300be153b63745b29abf",
      [
       null,
       {}
      ]
     ],
     "debug-header.https.html": [
-     "4f384bf11952babc676d3ae23c6ec291aa736862",
+     "b3e09e7fe095f7ced76c341441490d530aa79dac",
      [
       null,
       {}
      ]
     ],
     "fetch-no-credentials.https.html": [
-     "4cac685727ad29cd96be041753623cbc4fdd1be6",
+     "bd87e688648750875bf312b123c5bcd5293b60bb",
      [
       null,
       {}
      ]
     ],
     "include-site.https.html": [
-     "6eaf522c73ba6d6378c60f8460fb3497cd8df424",
+     "3441acfc625f9e7859388d269629f9c88835fb14",
      [
       null,
       {}
      ]
     ],
     "multiple-credentials.https.html": [
-     "57fe9294a7737d5817d127baa29f445bfdd3d1cb",
+     "54fc182b7276d44096f37d8435833fa4032cc96e",
      [
       null,
       {}
      ]
     ],
     "multiple-registrations.https.html": [
-     "ef024bd0c77a3ae432d382d8bacb694e054f250f",
+     "fb0ce500aa4cd764ec3f9d3a7aeeaf059a926fe0",
      [
       null,
       {}
      ]
     ],
     "not-secure-connection.html": [
-     "b2c99b139c8d983dfdf498a6c28aab2f1540b218",
+     "9bc736f1b421409b5188c9a3fd44bed2538bf38d",
      [
       null,
       {}
      ]
     ],
     "refresh-does-not-send-challenge.https.html": [
-     "d882cfe571751191184c442d737bc33260feb225",
+     "a53245c590b905978df79e8b16e4172d4d3978f2",
      [
       null,
       {}
      ]
     ],
     "refresh-replaces-config.https.html": [
-     "d9e8ff27ebbfe5b057eeffbd761f1d9981cc3e13",
+     "74264888075c44c52e65855fc69ad652706a4fb9",
      [
       null,
       {}
      ]
     ],
     "refresh-with-continue-false.https.html": [
-     "7814a49687c5441d7a552bb4329744822d78d5aa",
+     "1953af5c0d29ad10a5b81e5732bb31c2d222f874",
      [
       null,
       {}
      ]
     ],
     "registration-sends-challenge.https.html": [
-     "d95fa429153219fdafe5cdc8ca33a4cf62d2601a",
+     "ab8d033afac166730edafe4f124928b5cf048e16",
      [
       null,
       {}
      ]
     ],
     "resolving-urls.https.html": [
-     "79f1594ba71914fd672a4065374c554820d749c1",
+     "bb10cf52ee17fff4c67f03e1d5546c377fc01b2f",
      [
       null,
       {}
      ]
     ],
     "session-cookie-has-no-attributes.https.html": [
-     "734b4d1a69e636ceecfbbd92280dd5a9962011bd",
+     "5bf07abcac1c880dac4ecd772fc94449f2599905",
      [
       null,
       {}
      ]
     ],
     "set-authorization.https.html": [
-     "26969d40b75950361cbc0cb46c13aff607dd5640",
+     "7e2d8a0819bdc613d984cf05a0de86c49c265016",
      [
       null,
       {}
      ]
     ],
     "set-early-challenge.https.html": [
-     "a6d032f9fe1ec13617f39bd180b68b7642d01d60",
+     "22166c86ffe5c40762276cf5ec1091dbee876c8f",
      [
       null,
       {}
      ]
     ],
     "set-scope-origin.https.html": [
-     "817d5cdaf7f94bf0735fd0ede7aaab03b12e1c3e",
+     "f56778a9e5786e51f1c77a4c8447d71dc8c61676",
      [
       null,
       {}
      ]
     ],
     "set-scope-specification.https.html": [
-     "8ec125d7aa481f2e6d90bd5e6bd7d460d40bec25",
+     "5a36831f6dd73398e1373a7e2971ea133e20b5a7",
      [
       null,
       {}
@@ -572313,7 +572853,7 @@
      ]
     ],
     "fedcm-auto-selected-flag.https.html": [
-     "471f02a9d2c56bdcc2f94d7e5208f1c2a19de94a",
+     "d06aba73bc1de9a9b6e238695587c1ff47480de3",
      [
       null,
       {
@@ -644769,6 +645309,13 @@
          {}
         ]
        ],
+       "patch-all.html": [
+        "437a071cd8246629800a8d3a7ee6629658a7a3f7",
+        [
+         null,
+         {}
+        ]
+       ],
        "patch-event.html": [
         "e4a66254c65da6d3649a178519fcb3d0db6d7b1d",
         [
@@ -644776,6 +645323,13 @@
          {}
         ]
        ],
+       "patch-self.html": [
+        "e5938b69554929a91caafdfefcbef469ee0e8555",
+        [
+         null,
+         {}
+        ]
+       ],
        "patching-pseudo.html": [
         "7724d2e1f260b2d9c8976a5beccd8952dd829c89",
         [
@@ -644783,6 +645337,13 @@
          {}
         ]
        ],
+       "patchsrc.html": [
+        "5b2f319fa342efc9dd1d07ee5a2dd46e91504ab2",
+        [
+         null,
+         {}
+        ]
+       ],
        "template-patchfor-innerHTML-ambiguous.html": [
         "f83395850de49835ddfda11449ebf52c9a49d9fa",
         [
@@ -644811,6 +645372,20 @@
          {}
         ]
        ],
+       "template-patchfor-script-eval.html": [
+        "04426e11714fbf5e80b09dd31a496d5c4841562d",
+        [
+         null,
+         {}
+        ]
+       ],
+       "template-patchfor-script-plaintext.html": [
+        "7e90fdc9d6078c172bb78790f7d285a39f123277",
+        [
+         null,
+         {}
+        ]
+       ],
        "template-patchfor-shadow-nested.html": [
         "e99d8b8e9e0732b7861f7f6667040c98d7ac72da",
         [
@@ -644825,8 +645400,15 @@
          {}
         ]
        ],
+       "template-patchfor-style-plaintext.html": [
+        "1b6db2d7cfd370559f40de3997ebab2e8117dd54",
+        [
+         null,
+         {}
+        ]
+       ],
        "template-patchfor.html": [
-        "82ff12445fa611987f47d66e3143e8ebe343810f",
+        "0b54a7458da98d5bfbb29fde3751cf4253cd552f",
         [
          null,
          {}
@@ -645679,7 +646261,7 @@
         ]
        ],
        "023.html": [
-        "4765d792f40145b0479c6f1226f46562288b6b31",
+        "7109fde453ba6258e8600dda858ddf7583f6a6c7",
         [
          null,
          {
@@ -645688,7 +646270,7 @@
         ]
        ],
        "024.html": [
-        "0e695cf1df1adb330fb1b537481bd6e94d60aad5",
+        "f2814ced61e99d236a8a29140257e0059a131fd3",
         [
          null,
          {
@@ -656686,6 +657268,15 @@
          }
         ]
        ],
+       "radio-focused-and-scrolled-into-view.html": [
+        "b6584d835e8e5325db35aaeac149b88230b21997",
+        [
+         null,
+         {
+          "testdriver": true
+         }
+        ]
+       ],
        "radio-groupname-case.html": [
         "3c54aca3e76bafe4c409ed33b7833dc982fea693",
         [
@@ -664188,6 +664779,13 @@
          {}
         ]
        ],
+       "a-type.historical.html": [
+        "a6ded3b43062ba489e0af0b11e7bd5d919e5229e",
+        [
+         null,
+         {}
+        ]
+       ],
        "a.text-getter-01.html": [
         "e0bb73be0ff0ca65efc6542e24c3c4f161d222fe",
         [
@@ -674587,14 +675185,14 @@
      ]
     ],
     "web-font-styled-text-resize-swap-subnode.html": [
-     "eca5f3590f3b1b84c8a1f4bbd22876ebcf8a26d0",
+     "bd368d66e047499a9e2eeee49596b8a87c33b8a4",
      [
       null,
       {}
      ]
     ],
     "web-font-styled-text-resize-swap.html": [
-     "61c00fad20a375bb22338b24d7814fcc0832edac",
+     "a2250e8d9fbcc9171fa724c4b6933bdab0f4d372",
      [
       null,
       {}
@@ -677350,7 +677948,7 @@
        ]
       ],
       "space-like-003.html": [
-       "5b693fb3c900a7161ac91934ea385f787ac738ed",
+       "649dbe299710e6b16a9eb977633942be6ea1fdd5",
        [
         null,
         {}
@@ -682800,7 +683398,7 @@
     },
     "focus-reset": {
      "autofocus.html": [
-      "60444473673bb8a082d277106a13d70b5a33e0e1",
+      "c40e2f68f11ee1d3147bcfaf1e2dd74e93f399a5",
       [
        null,
        {}
@@ -713111,7 +713709,7 @@
      ]
     ],
     "authentication-accepted.https.html": [
-     "4d8152b816b207c714283040dc63cb5f364d367a",
+     "58b251010a900753e1a949f9dd4634704460ccfe",
      [
       null,
       {
@@ -713173,6 +713771,15 @@
       }
      ]
     ],
+    "authentication-invalid-payment-entity-logo.https.html": [
+     "e229fb2e0d8f3d843a1c8e0b5576ac33772a5213",
+     [
+      null,
+      {
+       "testdriver": true
+      }
+     ]
+    ],
     "authentication-optout.https.html": [
      "a69e0a456a7558825a451c1cd600ab9843fca38f",
      [
@@ -713201,7 +713808,7 @@
      ]
     ],
     "constructor-validate-payment-method-data.https.html": [
-     "ecf432b2857f7f44e13c1ac95e573e852ddb4025",
+     "5d34f68fafb4d23479dc8393d88a5f6df8454576",
      [
       null,
       {
@@ -725412,7 +726019,7 @@
      ]
     ],
     "partitioned-estimate-usage-details-caches.tentative.https.sub.html": [
-     "dc2af7c213c549534f23929bbea210527d1a1f99",
+     "0856648324471c11d165b5673a896ce15c0799ac",
      [
       null,
       {}
@@ -740446,7 +741053,7 @@
       ]
      ],
      "svg-get-bounding-client-rect-in-non-rendered-elements.html": [
-      "41f3fb6bc906b05a2537af20ca1eacb6a4c41935",
+      "c45542d2a25c9e2a325f7408d32a1b7bcb57624c",
       [
        null,
        {}
@@ -760338,7 +760945,7 @@
        ]
       ],
       "setting-the-start-time-of-an-animation.html": [
-       "fee3f1e0de7940beeb46178080c2638454a4af29",
+       "6dabf07d8f419eb7927c2e124cff3256be0ddb70",
        [
         null,
         {}
@@ -763404,7 +764011,7 @@
      },
      "the-channelsplitternode-interface": {
       "audiochannelsplitter.html": [
-       "954c71a96b288530e6c22878fed7a91f42091dc2",
+       "9cb2ab5a4ab9601150cd278bc386e50fa6efa0fb",
        [
         null,
         {}
@@ -763698,7 +764305,7 @@
        ]
       ],
       "iirfilter-getFrequencyResponse.html": [
-       "c98555f1610693abaa0bbe858e826bd1f776fb5b",
+       "eeb4af34f7d439db5b5cba8ee449d234a495f445",
        [
         null,
         {}
@@ -775393,7 +776000,7 @@
    "webnn": {
     "conformance_tests": {
      "abs.https.any.js": [
-      "ea4370c84dc84733290de06391c76f21b2945a37",
+      "20e260b45b47f8c0b9a54f63aca1aebe6e11eb31",
       [
        "webnn/conformance_tests/abs.https.any.html?cpu",
        {
@@ -775504,7 +776111,7 @@
       ]
      ],
      "add.https.any.js": [
-      "5a370de82cc726836ceb5f99075a92b9e24626dd",
+      "8fa8176f6517583f049ca91e436564d1155f86a9",
       [
        "webnn/conformance_tests/add.https.any.html?cpu",
        {
@@ -775615,7 +776222,7 @@
       ]
      ],
      "arg_min_max.https.any.js": [
-      "f0d38cbff82bc89e0fb552583d1ab6d19307b6c3",
+      "33105b7e7ba7d562a4148755d425a0183bb0dfb0",
       [
        "webnn/conformance_tests/arg_min_max.https.any.html?cpu",
        {
@@ -775726,7 +776333,7 @@
       ]
      ],
      "averagePool2d.https.any.js": [
-      "c112cd89c036a5961d8e6b55a35c3581651e168c",
+      "3637f50d75de6016a1207cad18cc4a0ec5e47519",
       [
        "webnn/conformance_tests/averagePool2d.https.any.html?cpu",
        {
@@ -775837,7 +776444,7 @@
       ]
      ],
      "batch_normalization.https.any.js": [
-      "b559cbc26d4d2dda5dfd57307a03fb48f9980f43",
+      "dd23ccec530723e330168580fa5cacd2c95956c4",
       [
        "webnn/conformance_tests/batch_normalization.https.any.html?cpu",
        {
@@ -776431,7 +777038,7 @@
       ]
      ],
      "cast.https.any.js": [
-      "8fd62981f521f4604a94b4a1d94e91c5bcbe05ba",
+      "0219420bb8dc9dc33cd172d77fa34ae3afc5c139",
       [
        "webnn/conformance_tests/cast.https.any.html?cpu",
        {
@@ -776542,7 +777149,7 @@
       ]
      ],
      "ceil.https.any.js": [
-      "7d487dd65fa708e2a94c83a7278d7693359075bf",
+      "20d8a4d188e2efdb28ab1a0fe65fe5307fd6e82c",
       [
        "webnn/conformance_tests/ceil.https.any.html?cpu",
        {
@@ -776653,7 +777260,7 @@
       ]
      ],
      "clamp.https.any.js": [
-      "ebcec4233963c3c8ea23adfc6703856a589d2b30",
+      "cf77b67aa0e981e9e8aa37554f4921ca410a71d8",
       [
        "webnn/conformance_tests/clamp.https.any.html?cpu",
        {
@@ -776764,7 +777371,7 @@
       ]
      ],
      "concat.https.any.js": [
-      "aaecaecc9eb2166658c0e1115265aef9d3d768f5",
+      "821a85e700e759755dc8b30ad5e4e935cd0f441a",
       [
        "webnn/conformance_tests/concat.https.any.html?cpu",
        {
@@ -776875,7 +777482,7 @@
       ]
      ],
      "constant-reshape-optimization.https.any.js": [
-      "eaa232b7413ebd132509ae9a605d3f5e49dc8d17",
+      "3428772ecd04f0f1b8b6f1ef862166964ee6db7f",
       [
        "webnn/conformance_tests/constant-reshape-optimization.https.any.html?cpu",
        {
@@ -776986,7 +777593,7 @@
       ]
      ],
      "conv2d.https.any.js": [
-      "45fecb2b40cc399ace227264e881d2009d467cd2",
+      "9962f210e949e7426b2cbbd0dea82c46b204024c",
       [
        "webnn/conformance_tests/conv2d.https.any.html?cpu",
        {
@@ -777097,7 +777704,7 @@
       ]
      ],
      "conv_transpose2d.https.any.js": [
-      "a17df911e4482de7e49874d84f5818694515e722",
+      "4e5525a8fb3d8f7fa89b341ea06dc07b18f194e2",
       [
        "webnn/conformance_tests/conv_transpose2d.https.any.html?cpu",
        {
@@ -777208,7 +777815,7 @@
       ]
      ],
      "cos.https.any.js": [
-      "6926962d543fa9651d2b7ae8935799641f06ea88",
+      "780474923425e6ea6954ec8c97f9e2eabe7fb5df",
       [
        "webnn/conformance_tests/cos.https.any.html?cpu",
        {
@@ -777319,7 +777926,7 @@
       ]
      ],
      "cumulative_sum.https.any.js": [
-      "34a625152b26a3183a7cd62c38883a684ac93908",
+      "4264b14e366cae9188556a018020b29e42f5a776",
       [
        "webnn/conformance_tests/cumulative_sum.https.any.html?cpu",
        {
@@ -777430,7 +778037,7 @@
       ]
      ],
      "dequantizeLinear.https.any.js": [
-      "85f51e173901eda7608207f484c2d50c2d2116ca",
+      "9ac74fc22402ba40753495b08685faf6c427891c",
       [
        "webnn/conformance_tests/dequantizeLinear.https.any.html?cpu",
        {
@@ -777541,7 +778148,7 @@
       ]
      ],
      "div.https.any.js": [
-      "1914c4829c47a622881d84f69f6c445cc1a37da4",
+      "8749f9f68c42a9e7c7ce9ad74230a3220d43a6e2",
       [
        "webnn/conformance_tests/div.https.any.html?cpu",
        {
@@ -777652,7 +778259,7 @@
       ]
      ],
      "elu.https.any.js": [
-      "09cb0a99115f4089aa82ea6bcb978e9ff6c3c853",
+      "b96929868161a097c2da831d5835dae169c9050d",
       [
        "webnn/conformance_tests/elu.https.any.html?cpu",
        {
@@ -777763,7 +778370,7 @@
       ]
      ],
      "equal.https.any.js": [
-      "33d27cf74b15a84fd672f9793d0c5b53c58d320c",
+      "c2badc5a33743c064741e97d279472581472f2d3",
       [
        "webnn/conformance_tests/equal.https.any.html?cpu",
        {
@@ -777874,7 +778481,7 @@
       ]
      ],
      "erf.https.any.js": [
-      "0c97253eb13e16d628b0937940c9d965f6e887d8",
+      "752623b7bd2aded12be80cb9fc5e728844a992b1",
       [
        "webnn/conformance_tests/erf.https.any.html?cpu",
        {
@@ -777985,7 +778592,7 @@
       ]
      ],
      "exp.https.any.js": [
-      "0f9b648cb9bf6a088e6aeac8240816c01c8d65f2",
+      "179d0e954a2345b2347ba24bff795c846f7ec611",
       [
        "webnn/conformance_tests/exp.https.any.html?cpu",
        {
@@ -778096,7 +778703,7 @@
       ]
      ],
      "expand.https.any.js": [
-      "f9040f25e47912928035dd9aee525334756b0002",
+      "b17c9c665a8693262f7f391bbd7a212576c1e6e7",
       [
        "webnn/conformance_tests/expand.https.any.html?cpu",
        {
@@ -778207,7 +778814,7 @@
       ]
      ],
      "floor.https.any.js": [
-      "50eaa31aee9f85b9923fdb4413879b186f7982de",
+      "ccb0be896c7da57725b4656ef9bd09c1736ec216",
       [
        "webnn/conformance_tests/floor.https.any.html?cpu",
        {
@@ -778318,7 +778925,7 @@
       ]
      ],
      "gather.https.any.js": [
-      "7f3c9c113583fb345c781e93682006c77caf3ecc",
+      "08a14f3baf25cb60dcf7677428cc50f854da57bf",
       [
        "webnn/conformance_tests/gather.https.any.html?cpu",
        {
@@ -778429,7 +779036,7 @@
       ]
      ],
      "gatherElements.https.any.js": [
-      "2b13f59678055b377ef243f442088abc718c5474",
+      "565332aa67244556c26cf25bd883c5bc2687a3a3",
       [
        "webnn/conformance_tests/gatherElements.https.any.html?cpu",
        {
@@ -778540,7 +779147,7 @@
       ]
      ],
      "gatherND.https.any.js": [
-      "41e1bc78790a439dc46efdccfefa32ce4ab4997a",
+      "434410f1a20e3d2cbb672a35421315839a87a0fc",
       [
        "webnn/conformance_tests/gatherND.https.any.html?cpu",
        {
@@ -778651,7 +779258,7 @@
       ]
      ],
      "gelu.https.any.js": [
-      "23b70f1eddf0ad6ed00468b0f48e6041554dc9db",
+      "9c06af3eb563dcb40ccfa3bbc5ea8ca3f3afdb55",
       [
        "webnn/conformance_tests/gelu.https.any.html?cpu",
        {
@@ -778762,7 +779369,7 @@
       ]
      ],
      "gemm.https.any.js": [
-      "b24c806e2849c13e2a489765a84256e48d776373",
+      "f9f15d65a644018b641e6007065157d20c829612",
       [
        "webnn/conformance_tests/gemm.https.any.html?cpu",
        {
@@ -778984,7 +779591,7 @@
       ]
      ],
      "greater.https.any.js": [
-      "bf6f884588518cdadc7a656a16246cc574a06eac",
+      "26723c191126913b9dc88684973c8ac8a697a811",
       [
        "webnn/conformance_tests/greater.https.any.html?cpu",
        {
@@ -779095,7 +779702,7 @@
       ]
      ],
      "greater_or_equal.https.any.js": [
-      "7dffe0980eaa31c262549e94e7c264f92431c507",
+      "18f6b0c0b5bdcd878176d8438f96a6d690d2ef86",
       [
        "webnn/conformance_tests/greater_or_equal.https.any.html?cpu",
        {
@@ -779206,7 +779813,7 @@
       ]
      ],
      "gru.https.any.js": [
-      "4118643044f9255535fbc5bd2352486b37039108",
+      "06ff4a5d344be1741309a3785a9bca78d78a9da1",
       [
        "webnn/conformance_tests/gru.https.any.html?cpu",
        {
@@ -779317,7 +779924,7 @@
       ]
      ],
      "gru_cell.https.any.js": [
-      "4e7452033a069fdaad0dec875b873a5961f15513",
+      "8d2c5992bae020124da1ca601041ba4f78aed6d1",
       [
        "webnn/conformance_tests/gru_cell.https.any.html?cpu",
        {
@@ -779428,7 +780035,7 @@
       ]
      ],
      "hard_sigmoid.https.any.js": [
-      "b5f6fd0c97aa71d8bb75b466dd72526724681060",
+      "5ad5a815dce41b71ebe8238739ca4546c3da51dc",
       [
        "webnn/conformance_tests/hard_sigmoid.https.any.html?cpu",
        {
@@ -779539,7 +780146,7 @@
       ]
      ],
      "hard_swish.https.any.js": [
-      "e49ea6fd719f17aea3c58c7ed78c0bbad3685399",
+      "02d902cea2523bb5df9763da670c61fe5a0589d7",
       [
        "webnn/conformance_tests/hard_swish.https.any.html?cpu",
        {
@@ -779650,7 +780257,7 @@
       ]
      ],
      "identity.https.any.js": [
-      "be645fd8966dae9134f5bbc8282b79a821753012",
+      "a68d0be7cd40fb7f200de84b33fb5a9e38b5ff2f",
       [
        "webnn/conformance_tests/identity.https.any.html?cpu",
        {
@@ -780631,7 +781238,7 @@
       ]
      ],
      "instance_normalization.https.any.js": [
-      "2766f914b3dd66ef5f8120642bfaf30dc3a052fa",
+      "0011a970c67cbdd1fe1ca5c3db52ce502dfc0d30",
       [
        "webnn/conformance_tests/instance_normalization.https.any.html?cpu",
        {
@@ -780742,7 +781349,7 @@
       ]
      ],
      "l2Pool2d.https.any.js": [
-      "f0e16be927bd637fbebd4eb3a63a4fba237e0e8d",
+      "bb4d3d79723af9d41f1d220e0922441857d21441",
       [
        "webnn/conformance_tests/l2Pool2d.https.any.html?cpu",
        {
@@ -780853,7 +781460,7 @@
       ]
      ],
      "layer_normalization.https.any.js": [
-      "f22d0444cfa79285cc9860b7b5a75a7cdfb0f18e",
+      "d0f4f9ac5f5fa7476c2430f69bdd49f5d98fb005",
       [
        "webnn/conformance_tests/layer_normalization.https.any.html?cpu",
        {
@@ -780964,7 +781571,7 @@
       ]
      ],
      "leaky_relu.https.any.js": [
-      "03c8985c6c64e12b8aca59caf071493c7daefa61",
+      "44ba712633141af631aeab44fd46371354d260de",
       [
        "webnn/conformance_tests/leaky_relu.https.any.html?cpu",
        {
@@ -781075,7 +781682,7 @@
       ]
      ],
      "lesser.https.any.js": [
-      "0238a00fca103f571af7c7d296b70ba61f0e1864",
+      "d39c85b0a87f36a53c1e1790f8cc6035f41cc0f5",
       [
        "webnn/conformance_tests/lesser.https.any.html?cpu",
        {
@@ -781186,7 +781793,7 @@
       ]
      ],
      "lesser_or_equal.https.any.js": [
-      "e268dd4d762091758e91d3ddfb8f3e80c5927f7a",
+      "dfdb7bc964db3474f938671a521fa4c7f6010760",
       [
        "webnn/conformance_tests/lesser_or_equal.https.any.html?cpu",
        {
@@ -781297,7 +781904,7 @@
       ]
      ],
      "linear.https.any.js": [
-      "1f13fe170d46fa157035bd6e14de6eb68462c7a4",
+      "794981d1f5f7d915dec09aafdff9016bc235d9ee",
       [
        "webnn/conformance_tests/linear.https.any.html?cpu",
        {
@@ -781408,7 +782015,7 @@
       ]
      ],
      "log.https.any.js": [
-      "8ed807b3401330e961f2ae9721f6378147580ddd",
+      "055d600e2e13952adba394639fdb949227f13052",
       [
        "webnn/conformance_tests/log.https.any.html?cpu",
        {
@@ -781519,7 +782126,7 @@
       ]
      ],
      "logical_and.https.any.js": [
-      "40ba45df42d47d4dfe3f7d174703ba0831aa76f2",
+      "823771c5c5d65936c7bc9f42cd40ca13717330f8",
       [
        "webnn/conformance_tests/logical_and.https.any.html?cpu",
        {
@@ -781630,7 +782237,7 @@
       ]
      ],
      "logical_not.https.any.js": [
-      "5b0b8da43da233886d73f6c3b21efc382c967162",
+      "63bea6fba64ed596f1539c3ccce5a58dafe26ee4",
       [
        "webnn/conformance_tests/logical_not.https.any.html?cpu",
        {
@@ -781741,7 +782348,7 @@
       ]
      ],
      "logical_or.https.any.js": [
-      "587a56710a73be7810f691a9dcd1737c1f377f6a",
+      "60c594233c2d8e428b357fad70688d8993a08a4b",
       [
        "webnn/conformance_tests/logical_or.https.any.html?cpu",
        {
@@ -781852,7 +782459,7 @@
       ]
      ],
      "logical_xor.https.any.js": [
-      "423d36db2ccedb76ef986ca3ef20e1de5ea26bc7",
+      "af5b5dfd06e9c6dfa36c291584bc07049465f5d5",
       [
        "webnn/conformance_tests/logical_xor.https.any.html?cpu",
        {
@@ -781963,7 +782570,7 @@
       ]
      ],
      "lstm.https.any.js": [
-      "74e8cfb7b0cedd87a64d2bd45666b297f24e6c69",
+      "8c0ed856055bb27ab796c1643fe79dc9e59c3363",
       [
        "webnn/conformance_tests/lstm.https.any.html?cpu",
        {
@@ -782074,7 +782681,7 @@
       ]
      ],
      "lstm_cell.https.any.js": [
-      "a1d97ddff4247567276292885c21dcfde6e3f24b",
+      "345c516fdd75411fae990d5d738e3cfd1562c269",
       [
        "webnn/conformance_tests/lstm_cell.https.any.html?cpu",
        {
@@ -782185,7 +782792,7 @@
       ]
      ],
      "matmul.https.any.js": [
-      "f452d59e4a8096621d39b955bd98ef41d8c2bbc8",
+      "f5f79e3aadc21c30dfacdf693bd9e4d8c6753bc6",
       [
        "webnn/conformance_tests/matmul.https.any.html?cpu",
        {
@@ -782296,7 +782903,7 @@
       ]
      ],
      "max.https.any.js": [
-      "bbea2391a3e3a6b2491b6bcc5ba7db79da60e010",
+      "07d600a71f24bd76e8b001f813281d56b4d4b7c6",
       [
        "webnn/conformance_tests/max.https.any.html?cpu",
        {
@@ -782407,7 +783014,7 @@
       ]
      ],
      "maxPool2d.https.any.js": [
-      "6ee8b1976d27b3a7418ccdf9fea56a7ee62e1052",
+      "6fecb3bf979e87a072e739e47bc448c0fe59c174",
       [
        "webnn/conformance_tests/maxPool2d.https.any.html?cpu",
        {
@@ -782518,7 +783125,7 @@
       ]
      ],
      "min.https.any.js": [
-      "3abd2e63fbb85fd34fc91415e4b1229317e7525f",
+      "41e8e43eb4f6a048dbca328e236c3457ca7df395",
       [
        "webnn/conformance_tests/min.https.any.html?cpu",
        {
@@ -782629,7 +783236,7 @@
       ]
      ],
      "mlNumber.https.any.js": [
-      "643d09b767c8528e921bd714a1beabeaf4beeb83",
+      "df7781837761bb2b7d8afb7a3070a0dd9c2d735a",
       [
        "webnn/conformance_tests/mlNumber.https.any.html?cpu",
        {
@@ -782740,7 +783347,7 @@
       ]
      ],
      "mul.https.any.js": [
-      "f8606849dd42aa96f5a8c5bf3a28ba05d3634956",
+      "a026584db94d99d1d3a6b957afb7215bfcc1eaed",
       [
        "webnn/conformance_tests/mul.https.any.html?cpu",
        {
@@ -782851,7 +783458,7 @@
       ]
      ],
      "neg.https.any.js": [
-      "5c5045d355ef1a0f2e7abab561cf48e848189a59",
+      "02ce39617f8086c75aa5098f0f5e14b4dfb25778",
       [
        "webnn/conformance_tests/neg.https.any.html?cpu",
        {
@@ -782962,7 +783569,7 @@
       ]
      ],
      "not_equal.https.any.js": [
-      "e7440799b6eb8bec1cccd3dd1eece1fbf9a5ab83",
+      "ee4f2ded8ea9e2972cf5eccb229d03edfa588172",
       [
        "webnn/conformance_tests/not_equal.https.any.html?cpu",
        {
@@ -783073,7 +783680,7 @@
       ]
      ],
      "pad.https.any.js": [
-      "ad334675a64e284e7c0e073c5a508413e1515e49",
+      "67fb9118969b4fd90106e0d56d8f5731eb1dd52c",
       [
        "webnn/conformance_tests/pad.https.any.html?cpu",
        {
@@ -783619,7 +784226,7 @@
       ]
      ],
      "pow.https.any.js": [
-      "f51feca4eacae6a0a36bd6125e78bb889aac011d",
+      "cf895f4c47ab5770d6a5a97ff47040438f7d64c4",
       [
        "webnn/conformance_tests/pow.https.any.html?cpu",
        {
@@ -783730,7 +784337,7 @@
       ]
      ],
      "prelu.https.any.js": [
-      "cc6e0052e28dd36a0862a8d02815211ad43d9bff",
+      "5f64ff60c768554039eb2a82b6c0b5fb838dfd33",
       [
        "webnn/conformance_tests/prelu.https.any.html?cpu",
        {
@@ -783841,7 +784448,7 @@
       ]
      ],
      "qdq_subgraph.https.any.js": [
-      "8c81447daebe54ef5ba0882254c99ff47125f819",
+      "0e747e761ef2b052520d3bcb38e9b64385499502",
       [
        "webnn/conformance_tests/qdq_subgraph.https.any.html?cpu",
        {
@@ -784276,7 +784883,7 @@
       ]
      ],
      "quantizeLinear.https.any.js": [
-      "7ba2fd4b4c525428c282c76743127cc4ed6e8a75",
+      "95b43b51d97570026a964956636c922e133fa0ec",
       [
        "webnn/conformance_tests/quantizeLinear.https.any.html?cpu",
        {
@@ -784387,7 +784994,7 @@
       ]
      ],
      "reciprocal.https.any.js": [
-      "f21ec78f850e1922eff65c55bd76b6465e7b413d",
+      "40a17940d0d99363c8a2b265b4cc8b58b908892d",
       [
        "webnn/conformance_tests/reciprocal.https.any.html?cpu",
        {
@@ -784498,7 +785105,7 @@
       ]
      ],
      "reduce_l1.https.any.js": [
-      "d59909f50c17d38bb4bd77a8fa14208e815d3aa7",
+      "9465777f206171392f0027460d86cd596327b466",
       [
        "webnn/conformance_tests/reduce_l1.https.any.html?cpu",
        {
@@ -784609,7 +785216,7 @@
       ]
      ],
      "reduce_l2.https.any.js": [
-      "9ccd350772d95e26e45ea65b5baf8e022b476545",
+      "2a4e94abe943a506787f179e6764709376bacf7c",
       [
        "webnn/conformance_tests/reduce_l2.https.any.html?cpu",
        {
@@ -784720,7 +785327,7 @@
       ]
      ],
      "reduce_log_sum.https.any.js": [
-      "714ba1c8b5f74f9ca30fb47569294b049851a58c",
+      "6d98832c072d24b5ad8bc588e6b25c465807300a",
       [
        "webnn/conformance_tests/reduce_log_sum.https.any.html?cpu",
        {
@@ -784831,7 +785438,7 @@
       ]
      ],
      "reduce_log_sum_exp.https.any.js": [
-      "298e143af9c55133724b8f53fefcc82ac968979e",
+      "6770b74475d0505f24696360ba5185668a4ce105",
       [
        "webnn/conformance_tests/reduce_log_sum_exp.https.any.html?cpu",
        {
@@ -784942,7 +785549,7 @@
       ]
      ],
      "reduce_max.https.any.js": [
-      "659641c5c5f28845ef80b98127d296e131937346",
+      "dc08e1c8c82b6078cda51e85f246db25ee9d72e0",
       [
        "webnn/conformance_tests/reduce_max.https.any.html?cpu",
        {
@@ -785053,7 +785660,7 @@
       ]
      ],
      "reduce_mean.https.any.js": [
-      "4851e51674c1b5de93cad461386676871bc62f9d",
+      "a402c253bd9c7b13904e5ee6f2299c2dc69b8b48",
       [
        "webnn/conformance_tests/reduce_mean.https.any.html?cpu",
        {
@@ -785164,7 +785771,7 @@
       ]
      ],
      "reduce_min.https.any.js": [
-      "42fc3e464d27d89229247d0d437828037b5aceac",
+      "8e1604558c85e5657a9cbd5ddbfb720ac92b7cb9",
       [
        "webnn/conformance_tests/reduce_min.https.any.html?cpu",
        {
@@ -785275,7 +785882,7 @@
       ]
      ],
      "reduce_product.https.any.js": [
-      "17ee27ed0e980db142d61fa4344190c7fa35e4db",
+      "cb1f16de53c2115e5e5e6f7fada76d3c94e4c621",
       [
        "webnn/conformance_tests/reduce_product.https.any.html?cpu",
        {
@@ -785386,7 +785993,7 @@
       ]
      ],
      "reduce_sum.https.any.js": [
-      "1d6f944f6166d10ab4aaa5862d46d693f68fcbc1",
+      "d4120ac88a2bc63e1ca53eb6979c1eee09cb75ae",
       [
        "webnn/conformance_tests/reduce_sum.https.any.html?cpu",
        {
@@ -785497,7 +786104,7 @@
       ]
      ],
      "reduce_sum_square.https.any.js": [
-      "73762e4b8dc877bf26ef5ff2c4b083a9150a389e",
+      "167f4f3a0ae59071bd972bdcc7357ba44297def2",
       [
        "webnn/conformance_tests/reduce_sum_square.https.any.html?cpu",
        {
@@ -785608,7 +786215,7 @@
       ]
      ],
      "relu.https.any.js": [
-      "05e9e32bf85aeaded7978198f3d965b8075aa797",
+      "d6fda23369d5dfd959c7fcbc9e359f238170167d",
       [
        "webnn/conformance_tests/relu.https.any.html?cpu",
        {
@@ -785719,7 +786326,7 @@
       ]
      ],
      "resample2d.https.any.js": [
-      "fe50b8ccb77b20d22b39c0469320861af3ca1910",
+      "7872bd247edf3a4586029ff2c3c40bf2a4d1d3d6",
       [
        "webnn/conformance_tests/resample2d.https.any.html?cpu",
        {
@@ -785830,7 +786437,7 @@
       ]
      ],
      "reshape.https.any.js": [
-      "e54d0f60be2f9f5542aef1821c17f9ffad132a83",
+      "d9fa87fa2f7b23ccaf690a69948df103bfde263c",
       [
        "webnn/conformance_tests/reshape.https.any.html?cpu",
        {
@@ -785941,7 +786548,7 @@
       ]
      ],
      "reverse.https.any.js": [
-      "3b1d8bf7efe0aa573a174e9aead1b31672982c20",
+      "9d6fccad266f5497e07ed73abba0df631bd84bc9",
       [
        "webnn/conformance_tests/reverse.https.any.html?cpu",
        {
@@ -786487,7 +787094,7 @@
       ]
      ],
      "scatterElements.https.any.js": [
-      "e76494b2f2f6469c33b0319ba13e677cd4fdefa3",
+      "a388ad13b99ab4532d46e059a488216421cf6147",
       [
        "webnn/conformance_tests/scatterElements.https.any.html?cpu",
        {
@@ -786598,7 +787205,7 @@
       ]
      ],
      "scatterND.https.any.js": [
-      "93b5ca52aa2de12850a43590fab77c446a266fc2",
+      "919639bc028c7ccf60ddca7dcb23bb7b102a9868",
       [
        "webnn/conformance_tests/scatterND.https.any.html?cpu",
        {
@@ -787072,7 +787679,7 @@
       ]
      ],
      "sigmoid.https.any.js": [
-      "7474fe98f654af81f053bb7bd3df383bfc62d753",
+      "a8a310e141e60b2398b7d983f406ab30d4158456",
       [
        "webnn/conformance_tests/sigmoid.https.any.html?cpu",
        {
@@ -787183,7 +787790,7 @@
       ]
      ],
      "sign.https.any.js": [
-      "004c03bdf1339d74a84c95d5b03b31b56876d0fe",
+      "d61ce38dedbef5b80457d400e98052e66038db28",
       [
        "webnn/conformance_tests/sign.https.any.html?cpu",
        {
@@ -787294,7 +787901,7 @@
       ]
      ],
      "sin.https.any.js": [
-      "a6148529b9956e06b86e6d87afb6f4839e111ee1",
+      "1f9a5eaac540218dce2a415ab87b34ac8c2bb6cf",
       [
        "webnn/conformance_tests/sin.https.any.html?cpu",
        {
@@ -787405,7 +788012,7 @@
       ]
      ],
      "slice.https.any.js": [
-      "7603e47c699a7163d740988a9d41f03fc5601b62",
+      "b1a30fc8106d96600703f1afc93e16d896ff2795",
       [
        "webnn/conformance_tests/slice.https.any.html?cpu",
        {
@@ -787516,7 +788123,7 @@
       ]
      ],
      "softmax.https.any.js": [
-      "33c2e1db9efd23499a0ea12826916b8a8b8a69b7",
+      "2d9f28dbf6a335f0961d2ff9c53750801a6af95f",
       [
        "webnn/conformance_tests/softmax.https.any.html?cpu",
        {
@@ -787627,7 +788234,7 @@
       ]
      ],
      "softplus.https.any.js": [
-      "36386c03378eabe3dd2baecb2cf6c46d92cadcc1",
+      "ba8b8f3001827f34b5186dd11b6bddf1117126bb",
       [
        "webnn/conformance_tests/softplus.https.any.html?cpu",
        {
@@ -787738,7 +788345,7 @@
       ]
      ],
      "softsign.https.any.js": [
-      "cf06bbc4fdb8c5e57d247955ba53a5dca7597941",
+      "9c7c4d10774221f622273e2d913165e881213713",
       [
        "webnn/conformance_tests/softsign.https.any.html?cpu",
        {
@@ -787849,7 +788456,7 @@
       ]
      ],
      "split.https.any.js": [
-      "925ba6244d03963fd64d14663d6d81fe3e8f3742",
+      "a6695e202d488c9079e81236efa20476120fd13b",
       [
        "webnn/conformance_tests/split.https.any.html?cpu",
        {
@@ -787960,7 +788567,7 @@
       ]
      ],
      "sqrt.https.any.js": [
-      "57cf5e89168ae8f9bfe30466e2dd395bc501caf1",
+      "f56dde65a1a18ac2319c6d2aa9f011d0c98ffbcb",
       [
        "webnn/conformance_tests/sqrt.https.any.html?cpu",
        {
@@ -788071,7 +788678,7 @@
       ]
      ],
      "sub.https.any.js": [
-      "31d5e9fb9f70ff4ffcf0a14dfa8ad883325f1e6a",
+      "d93acf5e30e7eb04360268735eba1c589bee64eb",
       [
        "webnn/conformance_tests/sub.https.any.html?cpu",
        {
@@ -788182,7 +788789,7 @@
       ]
      ],
      "subgraph.https.any.js": [
-      "8a0b7faa92f938282c7a6bb02ac61ef6730f021d",
+      "dd361692d3fdcbe0e585410a90c8aed60f3db312",
       [
        "webnn/conformance_tests/subgraph.https.any.html?cpu",
        {
@@ -788617,7 +789224,7 @@
       ]
      ],
      "tan.https.any.js": [
-      "054be65be8060c14d8e219e847b95969a08168b1",
+      "79194b34dd022ff33b2d4334f3954fe24126c309",
       [
        "webnn/conformance_tests/tan.https.any.html?cpu",
        {
@@ -788728,7 +789335,7 @@
       ]
      ],
      "tanh.https.any.js": [
-      "88d48e9eb79c8ef2306c262a0c10d1685b97aa54",
+      "6d61fd5d388712c17ab02ab6dbba26b9072ef359",
       [
        "webnn/conformance_tests/tanh.https.any.html?cpu",
        {
@@ -789322,7 +789929,7 @@
       ]
      ],
      "tile.https.any.js": [
-      "3e4ea39653b4fbd1dbc91f725a012c82dd86f62c",
+      "fae0c07ccdaffb8f6a91a8f6ac6400bbef628257",
       [
        "webnn/conformance_tests/tile.https.any.html?cpu",
        {
@@ -789433,7 +790040,7 @@
       ]
      ],
      "transpose.https.any.js": [
-      "27b7e743e800aae3a022bc7eebc55a948a4bc08a",
+      "e50317dcab941b0eb3ca54ffb511b924390b3a40",
       [
        "webnn/conformance_tests/transpose.https.any.html?cpu",
        {
@@ -789544,7 +790151,7 @@
       ]
      ],
      "triangular.https.any.js": [
-      "8006672f17d47da162864f0591028cabb1ed1c64",
+      "2e5ea0ddfffb8895994d7f1efb73a9625cbdb1f0",
       [
        "webnn/conformance_tests/triangular.https.any.html?cpu",
        {
@@ -789655,7 +790262,7 @@
       ]
      ],
      "where.https.any.js": [
-      "21975b4610389067d4b1e09062601f66af59a78a",
+      "1100fdda17caacd99d754bdcca0e3ac23c2025ef",
       [
        "webnn/conformance_tests/where.https.any.html?cpu",
        {
@@ -792169,7 +792776,7 @@
       ]
      ],
      "dequantizeLinear.https.any.js": [
-      "a3af5b8a59f032d7f4f58c1d28baa9d68480f97a",
+      "acd2b85b5f05f6ea91ae18fe5eb26d0f709b4b38",
       [
        "webnn/validation_tests/dequantizeLinear.https.any.html?cpu",
        {
@@ -802819,7 +803426,7 @@
       ]
      ],
      "quantizeLinear.https.any.js": [
-      "5c96cfe0c1662a26ed93b99d8faf649cc59382a0",
+      "518246a82810ef56b75a7269df4a3a0655a2d860",
       [
        "webnn/validation_tests/quantizeLinear.https.any.html?cpu",
        {
@@ -806434,7 +807041,7 @@
       ]
      ],
      "crypto-suite.https.html": [
-      "c3941e409ffa10f2a85fb0cd0cd7d59732fbf717",
+      "18c671724210cec47ed70264536973a78390bf87",
       [
        null,
        {}
@@ -846108,7 +846715,7 @@
        },
        "set_locale_override": {
         "contexts.py": [
-         "9cc395e4f20bc057381b64525f51e00c652f83f3",
+         "3a3fa527c4f208b93c0756be1ec2bb798eb7b5e4",
          [
           null,
           {}
diff --git a/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_special_names.https.any.js b/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_special_names.https.any.js
index 706eb16..36761b4 100644
--- a/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_special_names.https.any.js
+++ b/third_party/blink/web_tests/external/wpt/cookie-store/cookieStore_special_names.https.any.js
@@ -56,7 +56,8 @@
   }, `cookieStore.set with ${prefix} prefix a path option`);
 });
 
-['__HostHttp-', '__hosthttp-', '__Http-', '__http-'].forEach(prefix => {
+['__HostHttp-', '__hosthttp-', '__Http-', '__http-', '  __Http-', '\t__Http-',
+ '  __HostHttp-', '\t__HostHttp-'].forEach(prefix => {
   promise_test(async testCase => {
     await promise_rejects_js(testCase, TypeError,
         cookieStore.set({ name: `${prefix}cookie-name`, value: 'cookie-value'}));
@@ -74,32 +75,20 @@
     assert_true(exceptionThrown, "No exception thrown.");
 }, 'cookieStore.set with malformed name.');
 
-promise_test(async testCase => {
-  // Nameless cookies cannot have a __Host- prefix
-  await cookieStore.delete('');
+['__Host-', '__Secure-', '__Http-', '__HostHttp-', ' __Host-', '\t__Host-', ' __Secure-',
+ '\t__Secure-', ' __Http-', '\t__Http-', ' __HostHttp-', '\t__HostHttp-'].forEach(prefix => {
+  promise_test(async testCase => {
+    // Nameless cookies cannot have special prefixes
+    await cookieStore.delete('');
 
-  const currentUrl = new URL(self.location.href);
-  const currentDomain = currentUrl.hostname;
+    const currentUrl = new URL(self.location.href);
+    const currentDomain = currentUrl.hostname;
 
-  await promise_rejects_js(testCase, TypeError, cookieStore.set(
-      { name: '',
-        value: '__Host-nameless-cookie',
-        domain: `.${currentDomain}` }));
-  const cookie = await cookieStore.get('');
-  assert_equals(cookie, null);
-}, 'cookieStore.set a nameless cookie cannot have __Host- prefix');
-
-promise_test(async testCase => {
-  // Nameless cookies cannot have a __Secure- prefix
-  await cookieStore.delete('');
-
-  const currentUrl = new URL(self.location.href);
-  const currentDomain = currentUrl.hostname;
-
-  await promise_rejects_js(testCase, TypeError, cookieStore.set(
-      { name: '',
-        value: '__Secure-nameless-cookie',
-        domain: `.${currentDomain}` }));
-  const cookie = await cookieStore.get('');
-  assert_equals(cookie, null);
-}, 'cookieStore.set a nameless cookie cannot have __Secure- prefix');
+    await promise_rejects_js(testCase, TypeError, cookieStore.set(
+        { name: '',
+          value: `${prefix}nameless-cookie`,
+          domain: `.${currentDomain}` }));
+    const cookie = await cookieStore.get('');
+    assert_equals(cookie, null);
+  }, `cookieStore.set a nameless cookie cannot have ${prefix} prefix`);
+});
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-body-announcement-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-body-announcement-manual.html
deleted file mode 100644
index 83e5138..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-body-announcement-manual.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>ARIA Notify API Test: Body Element Announcement</title>
-  <link rel="help" href="https://github.com/w3c/aria/pull/2577">
-  <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
-  <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script>
-</head>
-<body>
-  <h1>ARIA Notify API Test: Body Element Announcement</h1>
-  <p>This test checks the behavior of the <code>ariaNotify</code> API with an announcement on the body element.</p>
-
-  <h2>Setup Instructions</h2>
-  <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that
-    supports the ARIA Notify API.</p>
-  <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p>
-
-  <div>
-    <h3>Test: Simple Announcement on Body Element</h3>
-    <p><strong>Expected:</strong> Screen reader should announce "Body notification test"</p>
-
-    <button onclick="test()">Run Test</button>
-    <div id="status"></div>
-
-    <script>
-      function test() {
-        document.getElementById('status').textContent = tryCallAriaNotify(document.body, 'Body notification test');
-      }
-    </script>
-  </div>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-document-announcement-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-document-announcement-manual.html
deleted file mode 100644
index 73cfd27..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-document-announcement-manual.html
+++ /dev/null
@@ -1,44 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>ARIA Notify API Test: Document Announcement</title>
-  <link rel="help" href="https://github.com/w3c/aria/pull/2577">
-  <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
-</head>
-<body>
-  <h1>ARIA Notify API Test: Document Announcement</h1>
-  <p>This test checks the behavior of the <code>ariaNotify</code> API with a
-    simple announcement on the document object.</p>
-
-  <h2>Setup Instructions</h2>
-  <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that
-    supports the ARIA Notify API.</p>
-  <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p>
-
-  <script>
-    function tryCallAriaNotify(element, message, options = {}) {
-      if (element.ariaNotify) {
-        element.ariaNotify(message, options);
-        return 'ariaNotify called' + ` with message: "${message}" and options: ${JSON.stringify(options)}`;
-      } else {
-        return 'the ariaNotify API is not supported in this browser';
-      }
-    }
-  </script>
-
-  <div>
-    <h3>Test: Simple Announcement</h3>
-    <p><strong>Expected:</strong> Screen reader should announce "Hello, world!" using default priority (normal).</p>
-
-    <button onclick="test()">Run Test</button>
-    <div id="status"></div>
-
-    <script>
-      function test() {
-        document.getElementById('status').textContent = tryCallAriaNotify(document, 'Hello, world!');
-      }
-    </script>
-  </div>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-element-announcement-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-element-announcement-manual.html
deleted file mode 100644
index 0a6d8d8..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-element-announcement-manual.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>ARIA Notify API Test: Element Announcement</title>
-  <link rel="help" href="https://github.com/w3c/aria/pull/2577">
-  <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
-  <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script>
-</head>
-<body>
-  <h1>ARIA Notify API Test: Element Announcement</h1>
-  <p>This test checks the behavior of the <code>ariaNotify</code> API with an announcement on a specific element.</p>
-
-  <h2>Setup Instructions</h2>
-  <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that
-    supports the ARIA Notify API.</p>
-  <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p>
-
-  <p><strong>Note:</strong> If the ariaNotify API is not supported in your browser, the test will show an appropriate
-    error message.</p>
-
-  <div>
-    <h3>Test: Simple Announcement on Specific Element</h3>
-    <p><strong>Expected:</strong> Screen reader should announce "Hello, world!" using the button element as context.</p>
-
-    <button id="test-button" onclick="test()">Run Test</button>
-    <div id="status"></div>
-
-    <script>
-      function test() {
-        const button = document.getElementById('test-button');
-        document.getElementById('status').textContent = tryCallAriaNotify(button, 'Hello, world!');
-      }
-    </script>
-  </div>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-default-permissions-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-default-permissions-manual.html
deleted file mode 100644
index 160358c..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-default-permissions-manual.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>ARIA Notify API Test: iframe Default Permissions Policy Manual</title>
-  <link rel="help" href="https://github.com/w3c/aria/pull/2577">
-  <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
-</head>
-<body>
-  <p>This test checks the behavior of the <code>ariaNotify</code> API when used within an iframe with default permissions policy settings.</p>
-
-  <h2>Setup Instructions</h2>
-  <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that supports the ARIA Notify API.</p>
-  <p><strong>Instructions:</strong> Listen for the announced text from your screen reader. The test will run automatically when the page loads.</p>
-
-  <div>
-    <h3>Test: iframe with Default Permissions Policy</h3>
-    <p><strong>Expected:</strong> Screen reader should announce "Announcement from iframe with default permissions".</p>
-    <iframe id="testIframe" src="resources/aria-notify-iframe-manual-test.html?message=Announcement from iframe with default permissions"></iframe>
-  </div>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-denied-permissions-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-denied-permissions-manual.html
deleted file mode 100644
index 633e0b3e..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-iframe-denied-permissions-manual.html
+++ /dev/null
@@ -1,23 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>ARIA Notify API Test: iframe Denied Permissions Policy Manual</title>
-  <link rel="help" href="https://github.com/w3c/aria/pull/2577">
-  <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
-</head>
-<body>
-  <p>This test checks the behavior of the <code>ariaNotify</code> API when used within an iframe with aria-notify explicitly denied by permissions policy.</p>
-
-  <h2>Setup Instructions</h2>
-  <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that supports the ARIA Notify API.</p>
-  <p><strong>Instructions:</strong> Listen for the announced text from your screen reader. The test will run automatically when the page loads.</p>
-
-  <div>
-    <h3>Test: iframe with aria-notify Denied by Permissions Policy</h3>
-    <p><strong>Expected:</strong> Screen reader should NOT announce: "This should not be announced".</p>
-
-    <iframe id="testIframe" src="resources/aria-notify-iframe-manual-test.html?message=This%20should%20not%20be%20announced" allow="aria-notify 'none'"></iframe>
-  </div>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-language-announcement-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-language-announcement-manual.html
deleted file mode 100644
index 5bd1514..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-language-announcement-manual.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<head>
-  <title>ARIA Notify API Test: Language Announcement</title>
-  <link rel="help" href="https://github.com/w3c/aria/pull/2577">
-  <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
-  <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script>
-</head>
-<html>
-<head>
-  <title>ARIA Notify API Test: Language-Specific Announcement</title>
-  <link rel="help" href="https://github.com/w3c/aria/pull/2577">
-  <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
-</head>
-<body>
-  <h1>ARIA Notify API Test: Language-Specific Announcement</h1>
-  <p>This test checks the behavior of the <code>ariaNotify</code> API with a language-specific announcement.</p>
-
-  <h2>Setup Instructions</h2>
-  <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that
-    supports the ARIA Notify API.</p>
-  <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p>
-
-  <h2>Test Expectations</h2>
-  <ul>
-    <li>Screen reader should announce "¡Hola mundo!" using Spanish pronunciation and the button element as context</li>
-  </ul>
-
-  <p><strong>Note:</strong> If the ariaNotify API is not supported in your browser, the test will show an appropriate
-    error message.</p>
-
-  <div>
-    <h3>Test: Simple Announcement on Specific Element with Specific Language</h3>
-    <p>A screen reader announcement against the button that triggers it, with no additional options but a lang attribute
-      on the button set to "es" for Spanish. The announcement text is "¡Hola mundo!".</p>
-    <p><strong>Expected:</strong> Screen reader should announce "¡Hola mundo!" using Spanish pronunciation and the
-      button element as context.</p>
-
-    <button id="test-button" lang="es" onclick="test()">Ejecutar Prueba</button>
-    <div id="status"></div>
-
-    <script>
-      function test() {
-        const button = document.getElementById('test-button');
-        document.getElementById('status').textContent = tryCallAriaNotify(button, '¡Hola mundo!');
-      }
-    </script>
-  </div>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-mixed-priorities-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-mixed-priorities-manual.html
deleted file mode 100644
index 3137b8c..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-mixed-priorities-manual.html
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>ARIA Notify API Test: Mixed Priorities</title>
-  <link rel="help" href="https://github.com/w3c/aria/pull/2577">
-  <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
-  <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script>
-</head>
-<body>
-  <h1>ARIA Notify API Test: Mixed Priorities</h1>
-  <p>This test checks the behavior of the <code>ariaNotify</code> API when a high priority message interrupts a normal
-    priority message.</p>
-
-  <h2>Setup Instructions</h2>
-  <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that
-    supports the ARIA Notify API.</p>
-  <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p>
-  <p><strong>Note:</strong> You may need to slow down your screen reader speech rate so that the second, higher priority
-    notification occurs while the first message is still being spoken.
-  </p>
-
-  <div>
-    <h3>Test: A Normal Priority Message Interrupted by a High Priority Message</h3>
-
-    <p><strong>Expected:</strong> Screen reader should start announcing the long message, then be interrupted after a
-      2 second delay by "This is a high priority notification!" at high priority. This second notification should occur mid-speech if the
-      speech rate is slow enough.
-    </p>
-
-    <button onclick="test()">Run Test</button>
-    <div id="status"></div>
-
-    <script>
-      function test() {
-        // Start the long message first
-        document.getElementById('status').textContent =
-          tryCallAriaNotify(document, 'This is a longer message that tests how well the ariaNotify API handles interruptions, it will repeat once for extra length. This is a longer message that tests how well the ariaNotify API handles interruptions.', { priority: 'normal' });
-
-        setTimeout(() => {
-          document.getElementById('status').textContent += ' ' +
-            tryCallAriaNotify(document, 'This is a high priority notification!', { priority: 'high' });
-        }, 2000);
-      }
-    </script>
-  </div>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-high-priority-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-high-priority-manual.html
deleted file mode 100644
index 124e271..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-high-priority-manual.html
+++ /dev/null
@@ -1,50 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>ARIA Notify API Test: Multiple High Priority Messages</title>
-  <link rel="help" href="https://github.com/w3c/aria/pull/2577">
-  <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
-  <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script>
-</head>
-<body>
-  <h1>ARIA Notify API Test: Multiple High Priority Messages</h1>
-  <p>This test checks the behavior of the <code>ariaNotify</code> API with multiple consecutive high priority messages.
-  </p>
-
-  <h2>Setup Instructions</h2>
-  <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that
-    supports the ARIA Notify API.</p>
-  <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p>
-
-  <h2>Test Expectations</h2>
-  <ul>
-    <li>Screen reader should announce "Loading..." followed by "Loading failed." in sequence, both at high priority with
-      potential for rapid delivery</li>
-  </ul>
-
-  <p><strong>Note:</strong> If the ariaNotify API is not supported in your browser, the test will show an appropriate
-    error message.</p>
-
-  <div>
-    <h3>Test: Multiple Consecutive High Priority Messages</h3>
-    <p>A "Loading..." message followed by a "Loading failed." message, both at high priority and fired against the
-      document.</p>
-    <p><strong>Expected:</strong> Screen reader should announce "Loading..." followed by "Loading failed." in sequence,
-      both at high priority with potential for rapid delivery.</p>
-
-    <button onclick="test()">Run Test</button>
-    <div id="status"></div>
-
-    <script>
-      function test() {
-        // Fire the first message
-        let status = tryCallAriaNotify(document, 'Loading...', { priority: 'high' });
-        // Fire the second message
-        status += ' ' + tryCallAriaNotify(document, 'Loading failed.', { priority: 'high' });
-        document.getElementById('status').textContent = status;
-      }
-    </script>
-  </div>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-normal-priority-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-normal-priority-manual.html
deleted file mode 100644
index 5c527c2..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-multiple-normal-priority-manual.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>ARIA Notify API Test: Multiple Normal Priority Messages</title>
-  <link rel="help" href="https://github.com/w3c/aria/pull/2577">
-  <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
-  <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script>
-</head>
-<body>
-  <h1>ARIA Notify API Test: Multiple Normal Priority Messages</h1>
-  <p>This test checks the behavior of the <code>ariaNotify</code> API with multiple consecutive normal priority
-    messages.</p>
-
-  <h2>Setup Instructions</h2>
-  <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that
-    supports the ARIA Notify API.</p>
-  <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p>
-
-  <div>
-    <h3>Test: Multiple Consecutive Normal Priority Messages</h3>
-    <p>A "Loading..." message followed by a "Loading failed." message, both at normal priority and fired against the
-      document.</p>
-    <p><strong>Expected:</strong> Screen reader should announce "Loading..." followed by "Loading failed." in sequence,
-      both at normal priority without interruption.</p>
-
-    <button onclick="test()">Run Test</button>
-    <div id="status"></div>
-
-    <script>
-      function test() {
-        // Fire the first message
-        let status = tryCallAriaNotify(document, 'Loading...', { priority: 'normal' });
-        // Fire the second message
-        status += ' ' + tryCallAriaNotify(document, 'Loading failed.', { priority: 'normal' });
-        document.getElementById('status').textContent = status;
-      }
-    </script>
-  </div>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-priority-queue-manual.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-priority-queue-manual.html
deleted file mode 100644
index 569f9650..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/aria-notify-priority-queue-manual.html
+++ /dev/null
@@ -1,41 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>ARIA Notify API Test: Priority Queue</title>
-  <link rel="help" href="https://github.com/w3c/aria/pull/2577">
-  <link rel="author" title="Jacques Newman" href="mailto:janewman@microsoft.com">
-  <script src="core-aam/arianotify/resources/aria-notify-helpers.js"></script>
-</head>
-<body>
-  <h1>ARIA Notify API Test: Priority Queue</h1>
-  <p>This test checks the behavior of the <code>ariaNotify</code> API with mixed priority messages to test queue
-    behavior.</p>
-
-  <h2>Setup Instructions</h2>
-  <p><strong>Setup:</strong> Use a screen reader (NVDA, JAWS, VoiceOver, etc.) or other assistive technology that
-    supports the ARIA Notify API.</p>
-  <p><strong>Instructions:</strong> Click the "Run Test" button and listen for the announced text from your screen reader.</p>
-
-  <div>
-    <h3>Test: A Normal Priority Message Followed by a High Priority Message</h3>
-    <p>A normal-priority "Loading..." message followed by a high-priority "Loading failed." message, both fired against
-      the document.</p>
-    <p><strong>Expected:</strong> Screen reader should announce "Loading..." at normal priority, then "Loading failed."
-      at high priority. The high priority message should be prioritized in the queue.</p>
-
-    <button onclick="test()">Run Test</button>
-    <div id="status"></div>
-
-    <script>
-      function test() {
-        // Fire the first message at normal priority
-        let status = tryCallAriaNotify(document, 'Loading...', { priority: 'normal' });
-        // Fire the second message at high priority
-        status += ' ' + tryCallAriaNotify(document, 'Loading failed.', { priority: 'high' });
-        document.getElementById('status').textContent = status;
-      }
-    </script>
-  </div>
-</body>
-
-</html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-helpers.js b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-helpers.js
deleted file mode 100644
index c1b3a53..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-helpers.js
+++ /dev/null
@@ -1,9 +0,0 @@
-// Helper for ariaNotify manual tests.
-function tryCallAriaNotify(element, message, options = {}) {
-  if (element.ariaNotify) {
-    element.ariaNotify(message, options);
-    return 'ariaNotify called' + ` with message: "${message}" and options: ${JSON.stringify(options)}`;
-  } else {
-    return 'the ariaNotify API is not supported in this browser';
-  }
-}
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-manual-test.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-manual-test.html
deleted file mode 100644
index f34c17e..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-manual-test.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-  <title>ARIA Notify iframe Manual Test</title>
-</head>
-<body>
-  <script>
-    'use strict';
-
-    function testAriaNotify() {
-      const resultDiv = document.getElementById('result');
-      const urlParams = new URLSearchParams(window.location.search);
-      const message = urlParams.get('message') || 'Default announcement message';
-
-      if (!document.ariaNotify) {
-        resultDiv.textContent = 'ariaNotify API is not supported in this browser';
-        return;
-      }
-
-      // Check if the feature is allowed by permissions policy
-      document.ariaNotify(message);
-      resultDiv.textContent = `ariaNotify called with message: "${message}"`;
-    }
-  </script>
-  <button onclick="testAriaNotify()">Make Announcement</button>
-  <div id="result"></div>
-
-</body>
-</html>
diff --git a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-test.html b/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-test.html
deleted file mode 100644
index 02f4396..0000000
--- a/third_party/blink/web_tests/external/wpt/core-aam/arianotify/resources/aria-notify-iframe-test.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<!DOCTYPE html>
-<script>
-'use strict';
-
-window.onload = function() {
-  let result = { };
-
-  if (document.ariaNotify) {
-    result.supportsAriaNotify = true;
-    result.allowsFeature = document.featurePolicy?.allowsFeature('aria-notify');
-  } else {
-    result.supportsAriaNotify = false;
-  }
-
-  parent.postMessage(result, '*');
-}
-</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-anchor-positioned.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-anchor-positioned.html
new file mode 100644
index 0000000..8cd341a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-anchor-positioned.html
@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+
+<title>Tests that anchors in anchor-positioned elements are discoverable</title>
+
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#determining">
+<link rel="author" title="Kiet Ho" href="mailto:kiet.ho@apple.com">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<script src="support/test-common.js"></script>
+
+<style>
+  .containing-block {
+    border: 1px solid black;
+
+    position: relative;
+    width: 200px;
+    height: 150px;
+  }
+
+  .box {
+    width: 50px;
+    height: 50px;
+  }
+
+  #anchor-1 {
+    position: absolute;
+    top: 50px;
+    left: 50px;
+
+    anchor-name: --anchor-1;
+
+    background: green;
+  }
+
+  #anchor-positioned-1 {
+    position: absolute;
+    position-anchor: --anchor-1;
+    position-area: top right;
+  }
+
+  #anchor-2 {
+    anchor-name: --anchor-2;
+    background: blue;
+  }
+
+  #anchor-positioned-2 {
+    position: absolute;
+    position-anchor: --anchor-2;
+    position-area: bottom right;
+
+    background: cyan;
+  }
+</style>
+
+<body onload="checkLayoutForAnchorPos('.target')">
+  <div class="containing-block">
+    <div class="box" id="anchor-1"></div>
+
+    <div class="box target" id="anchor-positioned-1" data-offset-x="100" data-offset-y="0">
+      <div class="box" id="anchor-2"></div>
+    </div>
+
+    <div class="box target" id="anchor-positioned-2" data-offset-x="150" data-offset-y="50"></div>
+  </div>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-popover.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-popover.html
new file mode 100644
index 0000000..97ae617
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-in-popover.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html>
+
+<title>Tests that anchors in a popover are discoverable</title>
+
+<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#determining">
+<link rel="author" title="Kiet Ho" href="mailto:kiet.ho@apple.com">
+
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+<script src="support/test-common.js"></script>
+
+<style>
+  body {
+    margin: 0;
+  }
+
+  #containing-block {
+    position: relative;
+    width: 100px;
+    height: 100px;
+
+    border: 1px black solid;
+  }
+
+  #anchor-1 {
+    width: 50px;
+    height: 50px;
+
+    position: absolute;
+    top: 25px;
+    left: 25px;
+
+    background: green;
+
+    anchor-name: --anchor-1;
+  }
+
+  #popover-1 {
+    margin: 0;
+    border: 1px black solid;
+    padding: 0;
+
+    width: 100px;
+    height: 100px;
+
+    position: absolute;
+    position-anchor: --anchor-1;
+    position-area: bottom right;
+  }
+
+  #anchor-2 {
+    width: 50px;
+    height: 50px;
+
+    position: absolute;
+    top: 25px;
+    left: 25px;
+
+    background: cyan;
+
+    anchor-name: --anchor-2;
+  }
+
+  #popover-2 {
+    margin: 0;
+    border: 1px black solid;
+    padding: 0;
+
+    width: 100px;
+    height: 100px;
+
+    position: absolute;
+    position-anchor: --anchor-2;
+    position-area: bottom right;
+  }
+</style>
+
+<body>
+  <div id="containing-block">
+    <div id="anchor-1"></div>
+  </div>
+
+  <!--
+    1px border of #containing-block
+  + 25px gap between #containing-block and #anchor-1
+  + 50px width of #anchor-1
+  = 76px
+  -->
+  <div class="target" id="popover-1" popover data-offset-x="76" data-offset-y="76">
+    <div id="anchor-2">
+      <!--
+        76px left offset of #anchor-1
+      + 1px border of #popover-2
+      + 25px gap between #popover-2 and #anchor-2
+      + 50px width of #anchor-2
+      = 152px
+      -->
+
+      <!-- #popover-2 has to be here to trigger a bug in Safari -->
+      <div class="target" id="popover-2" popover data-offset-x="152" data-offset-y="152"></div>
+    </div>
+  </div>
+
+
+  <script>
+    const popover1 = document.getElementById("popover-1");
+    const popover2 = document.getElementById("popover-2");
+
+    popover1.showPopover();
+    popover2.showPopover();
+
+    checkLayoutForAnchorPos('.target');
+  </script>
+</body>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-002.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-002.html
index 1e1f0a5..6ca4c22d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-002.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-position-multicol-002.html
@@ -24,14 +24,14 @@
 }
 .spacer {
   height: 10px;
-  background: pink;
+  background: silver;
 }
 .anchor1 {
   anchor-name: --a1;
   margin-left: 10px;
   width: 50px;
   height: 90px;
-  background: blue;
+  background: yellow;
 }
 .target {
   position: absolute;
@@ -44,26 +44,37 @@
   top: anchor(--a1 top);
   width: anchor-size(--a1 width);
   height: anchor-size(--a1 height);
-  background: lime;
-  opacity: .3;
+  border: dashed 4px aqua;
+  opacity: .2;
+  box-sizing: border-box;
 }
 .target1-rb {
   right: anchor(--a1 right);
   bottom: anchor(--a1 bottom);
   width: 10px;
   height: 10px;
+  background: teal;
+}
+
+.inner .target1 {
+  border-color: fuchsia;
+  border-style: solid;
+}
+.inner .target1-rb {
   background: purple;
 }
+
 </style>
 <body onload="checkLayoutForAnchorPos('.target')">
-  <p>The green box should be a union of blue boxes,
-    and the purple box should be at the right-bottom of the green box.
-  </p>
+  <p>The dashed aqua rectangle should encompass both yellow fragments,
+    and the teal box should be at the bottom-right of the aqua box.
+  <p>The fuchsia rectangle should match the edge of the yellow box except where it's split across columns,
+    and the purple box should be at the bottom-right of the fuchsia rectangle.
   <div class="spacer" style="height: 10px"></div>
-  <div class="cb">
+  <div class="cb outer">
     <div class="columns">
       <div class="spacer" style="height: 30px"></div>
-      <div class="cb">
+      <div class="cb inner">
         <!-- This spacer fills up to the middle of the 2nd column. -->
         <div class="spacer" style="height: 130px"></div>
         <div class="anchor1"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001-ref.html
new file mode 100644
index 0000000..a97d290
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001-ref.html
@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<title>anchor() resolution in position-area</title>
+
+<style>
+  .container {
+    width: 100px; height: 100px;
+    border: solid gray;
+    margin: 6px;
+    position: relative;
+    anchor-scope: all;
+    float: left;
+  }
+
+  .block {
+    background: silver;
+    height: 40px;
+    width: 40px;
+    margin: 10px;
+  }
+
+  .anchor {
+    position: absolute;
+    border: solid orange;
+    margin: 25px;
+  }
+  .controls .anchor,
+  .pull-up .anchor {
+    width: 5px;
+    height: 5px;
+  }
+  .push-down .anchor {
+    width: 40px;
+    height: 40px;
+  }
+
+  .anchored {
+    border: solid blue;
+    position: absolute;
+    inset: 0;
+    place-self: stretch;
+  }
+
+  body > div { clear: both; }
+</style>
+
+<div class=pull-up>
+  <div class=container>
+    <div class=anchor></div>
+    <div class=block></div>
+    <div class=anchored style="top: 36px; left: 36px;"></div>
+  </div>
+
+  <div class=container>
+    <div class=anchor></div>
+    <div class=block></div>
+    <div class=anchored style="top: 36px; left: 50px;"></div>
+  </div>
+</div>
+
+<div class=push-down>
+  <div class=container>
+    <div class=anchor></div>
+    <div class=block></div>
+    <div class=anchored style="top: 71px; left: 71px"></div>
+  </div>
+
+  <div class=container>
+    <div class=anchor></div>
+    <div class=block></div>
+    <div class=anchored style="top: 71px; left: 50px"></div>
+  </div>
+</div>
+
+<div class=controls>
+  <div class=container>
+    <div class=anchor></div>
+    <div class=block></div>
+    <div class=anchored style="top: 36px"></div>
+  </div>
+  <div class=container>
+    <div class=anchor></div>
+    <div class=block></div>
+    <div class=anchored style="top: 25px; left: 36px"></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001.html
new file mode 100644
index 0000000..24b9bbc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/position-area-anchor-001.html
@@ -0,0 +1,90 @@
+<!DOCTYPE html>
+<title>anchor() resolution in position-area</title>
+
+<link rel="help" href="https://www.w3.org/TR/css-anchor-position/#position-area">
+<link rel="match" href="position-area-anchor-001-ref.html">
+<link rel="author" name="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact">
+
+<style>
+  .container {
+    width: 100px; height: 100px;
+    border: solid gray;
+    margin: 6px;
+    position: relative;
+    anchor-scope: all;
+    float: left;
+  }
+
+  .block {
+    background: silver;
+    height: 40px;
+    width: 40px;
+    margin: 10px;
+  }
+
+  .anchor {
+    position: absolute;
+    border: solid orange;
+    margin: 25px;
+  }
+  .controls .anchor,
+  .pull-up .anchor {
+    width: 5px;
+    height: 5px;
+  }
+  .push-down .anchor {
+    width: 40px;
+    height: 40px;
+  }
+
+  .anchored {
+    border: solid blue;
+    position: absolute;
+    position-area: span-bottom right;
+    inset: 0;
+    place-self: stretch;
+  }
+
+  body > div { clear: both; }
+</style>
+
+<div class=pull-up>
+  <div class=container>
+    <div class=anchor style="anchor-name: --foo"></div>
+    <div class=block></div>
+    <div class=anchored style="top: anchor(bottom); position-anchor: --foo"></div>
+  </div>
+
+  <div class=container>
+    <div class=anchor style="anchor-name: --foo"></div>
+    <div class=block style="anchor-name: --bar"></div>
+    <div class=anchored style="top: anchor(--foo bottom); position-anchor: --bar"></div>
+  </div>
+</div>
+
+<div class=push-down>
+  <div class=container>
+    <div class=anchor style="anchor-name: --foo"></div>
+    <div class=block></div>
+    <div class=anchored style="top: anchor(bottom); position-anchor: --foo"></div>
+  </div>
+
+  <div class=container>
+    <div class=anchor style="anchor-name: --foo"></div>
+    <div class=block style="anchor-name: --bar"></div>
+    <div class=anchored style="top: anchor(--foo bottom); position-anchor: --bar"></div>
+  </div>
+</div>
+
+<div class=controls>
+  <div class=container>
+    <div class=anchor style="anchor-name: --foo"></div>
+    <div class=block></div>
+    <div class=anchored style="top: anchor(--foo bottom)"></div>
+  </div>
+  <div class=container>
+    <div class=anchor style="anchor-name: --foo"></div>
+    <div class=block></div>
+    <div class=anchored style="position-anchor: --foo"></div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/alignment/multiline-align-self.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/alignment/multiline-align-self.html
new file mode 100644
index 0000000..3b8f1ca2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/alignment/multiline-align-self.html
@@ -0,0 +1,1630 @@
+<html>
+<head>
+<link rel="help" href="https://drafts.csswg.org/css-flexbox-1/#align-items-property">
+<style>
+.flexbox {
+  position: relative;
+  display: flex;
+  background-color: grey;
+  max-width: 600px;
+  align-content: flex-start;
+}
+.title {
+  margin-top: 1em;
+}
+.ltr {
+  direction: ltr;
+}
+.rtl {
+  direction: rtl;
+}
+.horizontal-tb {
+  writing-mode: horizontal-tb;
+}
+.vertical-rl {
+  writing-mode: vertical-rl;
+}
+.vertical-lr {
+  writing-mode: vertical-lr;
+}
+.row {
+  flex-flow: row;
+}
+.row-reverse {
+  flex-flow: row-reverse;
+}
+.column {
+  flex-flow: column;
+}
+.column-reverse {
+  flex-flow: column-reverse;
+}
+.wrap {
+  flex-wrap: wrap;
+}
+.wrap-reverse {
+  flex-wrap: wrap-reverse;
+}
+.flexbox> :nth-child(1) {
+  background-color: #0f0;
+}
+.flexbox> :nth-child(2) {
+  background-color: #0d0;
+}
+.flexbox> :nth-child(3) {
+  background-color: #0b0;
+}
+.flexbox> :nth-child(4) {
+  background-color: #090;
+}
+.flexbox> :nth-child(5) {
+  background-color: #070;
+}
+.flexbox> :nth-child(6) {
+  background-color: #050;
+}
+.flexbox> :nth-child(7) {
+  background-color: #030;
+}
+.flexbox> :nth-child(8) {
+  background-color: #00f;
+}
+.flexbox> :nth-child(9) {
+  background-color: #00d;
+}
+.flexbox> :nth-child(10) {
+  background-color: #00b;
+}
+.flexbox> :nth-child(11) {
+  background-color: #009;
+}
+.flexbox> :nth-child(12) {
+  background-color: #007;
+}
+.flexbox> :nth-child(13) {
+  background-color: #005;
+}
+.flexbox> :nth-child(14) {
+  background-color: #003;
+}
+</style>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="/resources/check-layout-th.js"></script>
+</head>
+
+<body onload="checkLayout('.flexbox')">
+  <div class="title">horizontal-tb ltr row wrap</div>
+  <div class="flexbox horizontal-tb ltr row wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+  </div>
+  <div class="title">horizontal-tb ltr row wrap-reverse</div>
+  <div class="flexbox horizontal-tb ltr row wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+  </div>
+  <div class="title">horizontal-tb rtl row wrap</div>
+  <div class="flexbox horizontal-tb rtl row wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+  </div>
+  <div class="title">horizontal-tb rtl row wrap-reverse</div>
+  <div class="flexbox horizontal-tb rtl row wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+  </div>
+  <div class="title">horizontal-tb ltr column wrap</div>
+  <div class="flexbox horizontal-tb ltr column wrap" style="height: 70px" data-expected-width="600"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="5" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="5" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="35" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="35" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+  </div>
+  <div class="title">horizontal-tb ltr column wrap-reverse</div>
+  <div class="flexbox horizontal-tb ltr column wrap-reverse" style="height: 70px" data-expected-width="600"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="590" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="580" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="570" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="590" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="590" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="570" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="570" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="560" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="550" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="540" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="560" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="560" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="540" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="540" data-offset-y="60"></div>
+  </div>
+  <div class="title">horizontal-tb rtl column wrap</div>
+  <div class="flexbox horizontal-tb rtl column wrap" style="height: 70px" data-expected-width="600"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="590" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="580" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="570" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="585" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="585" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="570" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="570" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="560" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="550" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="540" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="555" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="555" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="540" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="540" data-offset-y="60"></div>
+  </div>
+  <div class="title">horizontal-tb rtl column wrap-reverse</div>
+  <div class="flexbox horizontal-tb rtl column wrap-reverse" style="height: 70px" data-expected-width="600"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="0" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="30" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+  </div>
+  <div class="title">horizontal-tb ltr row-reverse wrap</div>
+  <div class="flexbox horizontal-tb ltr row-reverse wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+  </div>
+  <div class="title">horizontal-tb ltr row-reverse wrap-reverse</div>
+  <div class="flexbox horizontal-tb ltr row-reverse wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+  </div>
+  <div class="title">horizontal-tb rtl row-reverse wrap</div>
+  <div class="flexbox horizontal-tb rtl row-reverse wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+  </div>
+  <div class="title">horizontal-tb rtl row-reverse wrap-reverse</div>
+  <div class="flexbox horizontal-tb rtl row-reverse wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+  </div>
+  <div class="title">horizontal-tb ltr column-reverse wrap</div>
+  <div class="flexbox horizontal-tb ltr column-reverse wrap" style="height: 70px" data-expected-width="600"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="5" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="5" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="35" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="35" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+  </div>
+  <div class="title">horizontal-tb ltr column-reverse wrap-reverse</div>
+  <div class="flexbox horizontal-tb ltr column-reverse wrap-reverse" style="height: 70px" data-expected-width="600"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="590" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="580" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="570" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="590" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="590" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="570" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="570" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="560" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="550" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="540" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="560" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="560" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="540" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="540" data-offset-y="0"></div>
+  </div>
+  <div class="title">horizontal-tb rtl column-reverse wrap</div>
+  <div class="flexbox horizontal-tb rtl column-reverse wrap" style="height: 70px" data-expected-width="600"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="590" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="580" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="570" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="585" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="585" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="570" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="570" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="560" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="550" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="540" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="555" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="555" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="540" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="540" data-offset-y="0"></div>
+  </div>
+  <div class="title">horizontal-tb rtl column-reverse wrap-reverse</div>
+  <div class="flexbox horizontal-tb rtl column-reverse wrap-reverse" style="height: 70px" data-expected-width="600"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-rl ltr row wrap</div>
+  <div class="flexbox vertical-rl ltr row wrap" style="height: 70px" data-expected-width="60" data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="45" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="45" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="15" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="15" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+  </div>
+  <div class="title">vertical-rl ltr row wrap-reverse</div>
+  <div class="flexbox vertical-rl ltr row wrap-reverse" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="0" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="30" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+  </div>
+  <div class="title">vertical-rl rtl row wrap</div>
+  <div class="flexbox vertical-rl rtl row wrap" style="height: 70px" data-expected-width="60" data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="45" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="45" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="15" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="15" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-rl rtl row wrap-reverse</div>
+  <div class="flexbox vertical-rl rtl row wrap-reverse" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-rl ltr column wrap</div>
+  <div class="flexbox vertical-rl ltr column wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+  </div>
+  <div class="title">vertical-rl ltr column wrap-reverse</div>
+  <div class="flexbox vertical-rl ltr column wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-rl rtl column wrap</div>
+  <div class="flexbox vertical-rl rtl column wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-rl rtl column wrap-reverse</div>
+  <div class="flexbox vertical-rl rtl column wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="15"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="15"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="45"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="45"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+  </div>
+  <div class="title">vertical-rl ltr row-reverse wrap</div>
+  <div class="flexbox vertical-rl ltr row-reverse wrap" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="45" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="45" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="15" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="15" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-rl ltr row-reverse wrap-reverse</div>
+  <div class="flexbox vertical-rl ltr row-reverse wrap-reverse" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-rl rtl row-reverse wrap</div>
+  <div class="flexbox vertical-rl rtl row-reverse wrap" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="45" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="45" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="15" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="15" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+  </div>
+  <div class="title">vertical-rl rtl row-reverse wrap-reverse</div>
+  <div class="flexbox vertical-rl rtl row-reverse wrap-reverse" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="0" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="30" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+  </div>
+  <div class="title">vertical-rl ltr column-reverse wrap</div>
+  <div class="flexbox vertical-rl ltr column-reverse wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+  </div>
+  <div class="title">vertical-rl ltr column-reverse wrap-reverse</div>
+  <div class="flexbox vertical-rl ltr column-reverse wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-rl rtl column-reverse wrap</div>
+  <div class="flexbox vertical-rl rtl column-reverse wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-rl rtl column-reverse wrap-reverse</div>
+  <div class="flexbox vertical-rl rtl column-reverse wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="15"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="15"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="45"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="45"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+  </div>
+  <div class="title">vertical-lr ltr row wrap</div>
+  <div class="flexbox vertical-lr ltr row wrap" style="height: 70px" data-expected-width="60" data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="5" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="5" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="35" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="35" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+  </div>
+  <div class="title">vertical-lr ltr row wrap-reverse</div>
+  <div class="flexbox vertical-lr ltr row wrap-reverse" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+  </div>
+  <div class="title">vertical-lr rtl row wrap</div>
+  <div class="flexbox vertical-lr rtl row wrap" style="height: 70px" data-expected-width="60" data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="5" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="5" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="35" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="35" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-lr rtl row wrap-reverse</div>
+  <div class="flexbox vertical-lr rtl row wrap-reverse" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="50" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-lr ltr column wrap</div>
+  <div class="flexbox vertical-lr ltr column wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+  </div>
+  <div class="title">vertical-lr ltr column wrap-reverse</div>
+  <div class="flexbox vertical-lr ltr column wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-lr rtl column wrap</div>
+  <div class="flexbox vertical-lr rtl column wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-lr rtl column wrap-reverse</div>
+  <div class="flexbox vertical-lr rtl column wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="15"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="15"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="45"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="40" data-offset-y="45"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="60" data-offset-y="30"></div>
+  </div>
+  <div class="title">vertical-lr ltr row-reverse wrap</div>
+  <div class="flexbox vertical-lr ltr row-reverse wrap" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="5" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="5" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="35" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="35" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-lr ltr row-reverse wrap-reverse</div>
+  <div class="flexbox vertical-lr ltr row-reverse wrap-reverse" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="50" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-lr rtl row-reverse wrap</div>
+  <div class="flexbox vertical-lr rtl row-reverse wrap" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="5" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="5" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="35" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="35" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+  </div>
+  <div class="title">vertical-lr rtl row-reverse wrap-reverse</div>
+  <div class="flexbox vertical-lr rtl row-reverse wrap-reverse" style="height: 70px" data-expected-width="60"
+    data-expected-height="70">
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="30" data-offset-y="60"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="10" data-offset-y="10"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="0" data-offset-y="20"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;width: 10px;align-self: baseline; margin-block-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="40"></div>
+    <div style="flex: 1 10px;width: auto;align-self: stretch" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="50"></div>
+    <div style="flex: 1 10px;width: 30px;align-self: flex-start" data-expected-width="30" data-expected-height="10"
+      data-offset-x="0" data-offset-y="60"></div>
+  </div>
+  <div class="title">vertical-lr ltr column-reverse wrap</div>
+  <div class="flexbox vertical-lr ltr column-reverse wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="5"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="35"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+  </div>
+  <div class="title">vertical-lr ltr column-reverse wrap-reverse</div>
+  <div class="flexbox vertical-lr ltr column-reverse wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-lr rtl column-reverse wrap</div>
+  <div class="flexbox vertical-lr rtl column-reverse wrap" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+  </div>
+  <div class="title">vertical-lr rtl column-reverse wrap-reverse</div>
+  <div class="flexbox vertical-lr rtl column-reverse wrap-reverse" style="width: 70px" data-expected-width="70"
+    data-expected-height="60">
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="10"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="20"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="15"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="15"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="0"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-start" data-expected-width="10" data-expected-height="10"
+      data-offset-x="60" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: center" data-expected-width="10" data-expected-height="10"
+      data-offset-x="50" data-offset-y="40"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: flex-end" data-expected-width="10" data-expected-height="10"
+      data-offset-x="40" data-offset-y="50"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline" data-expected-width="10" data-expected-height="10"
+      data-offset-x="30" data-offset-y="45"></div>
+    <div style="flex: 1 10px;height: 10px;align-self: baseline; margin-inline-start: 5px;" data-expected-width="10"
+      data-expected-height="10" data-offset-x="20" data-offset-y="45"></div>
+    <div style="flex: 1 10px;height: auto;align-self: stretch" data-expected-width="10" data-expected-height="30"
+      data-offset-x="10" data-offset-y="30"></div>
+    <div style="flex: 1 10px;height: 30px;align-self: flex-start" data-expected-width="10" data-expected-height="30"
+      data-offset-x="0" data-offset-y="30"></div>
+  </div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding-ref.html
new file mode 100644
index 0000000..7f2a5ad
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding-ref.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<style>
+.grid {
+  display: grid;
+  padding: 13px;
+  padding-bottom: 42px;
+  border: 23px solid black;
+  border-bottom-width: 45px;
+  width: 100px;
+  height: 100px;
+}
+.item {
+  width: 50px;
+  height: 50px;
+  background-color: green;
+  align-self: end;
+}
+</style>
+<body>
+<div class="grid">
+  <div class="item"></div>
+</div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding.html
new file mode 100644
index 0000000..09647be7
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-large-border-padding.html
@@ -0,0 +1,32 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos">
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#staticpos-rect">
+<link rel="match" href="grid-abspos-staticpos-align-self-end-large-border-padding-ref.html"
+<meta name="assert" content="Abspos child of grid is aligned to end of grid content box when statically positioned and end self alignment.">
+<style>
+.grid {
+  display: grid;
+  padding: 13px;
+  padding-bottom: 42px;
+  border: 23px solid black;
+  border-bottom-width: 45px;
+  width: 100px;
+  height: 100px;
+}
+.abspos {
+  position: absolute;
+  width: 50px;
+  height: 50px;
+  background-color: green;
+  align-self: end;
+}
+</style>
+</head>
+<body>
+<div class="grid">
+  <div class="abspos"></div>
+</div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-ref.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-ref.html
new file mode 100644
index 0000000..868717bc
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end-ref.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+<style>
+.grid {
+  display: grid;
+  border: 1px solid black;
+  width: 100px;
+  height: 100px;
+}
+.item {
+  width: 50px;
+  height: 50px;
+  background-color: green;
+  align-self: end;
+}
+</style>
+<body>
+<div class="grid">
+  <div class="item"></div>
+</div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end.html b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end.html
new file mode 100644
index 0000000..c8176f1
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/abspos/grid-abspos-staticpos-align-self-end.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+<link rel="help" href="https://drafts.csswg.org/css-align-3/#align-abspos">
+<link rel="help" href="https://www.w3.org/TR/css-position-3/#staticpos-rect">
+<link rel="match" href="grid-abspos-staticpos-align-self-end-ref.html"
+<meta name="assert" content="Abspos child of grid is aligned to end of grid content box when statically positioned and end self alignment.">
+<style>
+.grid {
+  display: grid;
+  border: 1px solid black;
+  width: 100px;
+  height: 100px;
+}
+.abspos {
+  position: absolute;
+  width: 50px;
+  height: 50px;
+  background-color: green;
+  align-self: end;
+}
+</style>
+</head>
+<body>
+<div class="grid">
+  <div class="abspos"></div>
+</div>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-computed.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-computed.html
index 5371c42..c078396 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-computed.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-computed.html
@@ -30,6 +30,9 @@
 
 test_computed_value("text-decoration", "underline dashed rgb(0, 255, 0)");
 
+// Test backwards compatibility of blink.
+test_computed_value("text-decoration", "underline overline line-through blink red", ["underline overline line-through rgb(255, 0, 0)", "underline overline line-through blink rgb(255, 0, 0)"]);
+
 // Add text-decoration-thickness in [css-text-decor-4].
 test_computed_value("text-decoration", "auto", currentColor);
 test_computed_value("text-decoration", "from-font", "from-font " + currentColor);
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid-expected.txt
new file mode 100644
index 0000000..bbee844
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] e.style['text-decoration'] = "underline overline line-through blink red" should set the property value
+  assert_in_array: serialization should be sound value "underline overline line-through blink red" not in array ["underline overline line-through rgb(255, 0, 0)", "underline overline line-through blink rgb(255, 0, 0)"]
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid.html b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid.html
index ad82dd20..35fd8f3 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-text-decor/parsing/text-decoration-valid.html
@@ -18,6 +18,8 @@
 
 test_valid_value("text-decoration", "double overline underline", "underline overline double");
 test_valid_value("text-decoration", "underline overline line-through red");
+test_valid_value("text-decoration", "underline overline line-through blink", ["underline overline line-through", "underline overline line-through blink"]);
+test_valid_value("text-decoration", "underline overline line-through blink red", ["underline overline line-through rgb(255, 0, 0)", "underline overline line-through blink rgb(255, 0, 0)"]);
 test_valid_value("text-decoration", "rgba(10, 20, 30, 0.4) dotted", "dotted rgba(10, 20, 30, 0.4)");
 test_valid_value("text-decoration", "overline green from-font", "overline from-font green");
 test_valid_value("text-decoration", "underline dashed green");
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical-expected.txt
index 5be521fe..72454f2c 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical-expected.txt
@@ -1,5 +1,11 @@
 This is a testharness.js-based test.
 [FAIL] Support for CSSPositionValue
   assert_false: expected false got true
+[FAIL] toRGB should not exist on CSSColorValue
+  assert_false: expected false got true
+[FAIL] toHSL should not exist on CSSColorValue
+  assert_false: expected false got true
+[FAIL] toHWB should not exist on CSSColorValue
+  assert_false: expected false got true
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical.html
index ceb4dfe..3c8ff65 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/historical.html
@@ -10,4 +10,14 @@
   // https://github.com/w3c/css-houdini-drafts/commit/5261c1a323ea062d69cb5a3f1e69734fd176948a
   assert_false("CSSPositionValue" in self);
 }, "Support for CSSPositionValue");
+
+// https://github.com/w3c/css-houdini-drafts/commit/5a1663db3f9c36ffa7b2013afdd345e98ae03d5e
+// https://github.com/w3c/css-houdini-drafts/commit/223258ea4c71aa60b1bd675602dddfbb414e0481
+const deprecatedProperties = ["toRGB", "toHSL", "toHWB", "toGray", "toLCH", "toLab", "toColor", "toDeviceCMYK", "to", "colorSpace"];
+for (const deprecatedProperty of deprecatedProperties) {
+  test(function() {
+    const cssColorValue = new CSSRGB(0, 0, 0);
+    assert_false(deprecatedProperty in cssColorValue);
+  }, `${deprecatedProperty} should not exist on CSSColorValue`);
+}
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssColorValue.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssColorValue.html
index 59a03c138..9a319a51 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssColorValue.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssColorValue.html
@@ -8,102 +8,10 @@
 <script>
 'use strict';
 
-const TEST_COLORS = [
-  {name: "magenta", rgb: [1, 0, 1], hsl: [300, 1, 0.5], hwb: [300, 0, 0]},
-  {name: "dark cyan", rgb: [0, 0.545, 0.545], hsl: [180, 1, 0.2725], hwb: [180, 0, 0.455]},
-  {name: "light goldenrod yellow", rgb: [1, 1, 0.82], hsl: [60, 1, 0.91], hwb: [60, 0.82, 0]},
-  {name: "medium purple", rgb: [0.58, 0.44, 0.86], hsl: [260, 0.5977, 0.649], hwb: [260, 0.44, 0.14]},
-]
 const rgb_attributes = ['r', 'g', 'b', 'alpha']
 const hsl_attributes = ['h', 's', 'l', 'alpha']
 const hwb_attributes = ['h', 'w', 'b', 'alpha']
 
-for (const color of TEST_COLORS) {
-  const hsl_color_degrees = new CSSHSL(CSS.deg(color.hsl[0]), color.hsl[1], color.hsl[2])
-  const hsl_color_radians = new CSSHSL(CSS.rad(color.hsl[0]/360 * 2 * Math.PI), color.hsl[1], color.hsl[2])
-  const hsl_color_gradians = new CSSHSL(CSS.grad(color.hsl[0]/360 * 400), color.hsl[1], color.hsl[2])
-
-  const hwb_color_degrees = new CSSHWB(CSS.deg(color.hwb[0]), color.hwb[1], color.hwb[2])
-  const hwb_color_radians = new CSSHWB(CSS.rad(color.hwb[0]/360 * 2 * Math.PI), color.hwb[1], color.hwb[2])
-  const hwb_color_gradians = new CSSHWB(CSS.grad(color.hwb[0]/360 * 400), color.hwb[1], color.hwb[2])
-
-  const rgb_color = new CSSRGB(color.rgb[0], color.rgb[1], color.rgb[2])
-
-  // Test conversion from CSSHSL to others.
-  test(() => {
-    const hsl_to_rgb = hsl_color_degrees.toRGB();
-    for (const attr of rgb_attributes) {
-      assert_color_channel_approx_equals(hsl_to_rgb[attr], rgb_color[attr]);
-    }
-  }, `Converting HSL using degrees to RGB works for ${color.name}.`);
-
-  test(() => {
-    const hsl_to_rgb = hsl_color_radians.toRGB();
-    for (const attr of rgb_attributes) {
-      assert_color_channel_approx_equals(hsl_to_rgb[attr], rgb_color[attr]);
-    }
-  }, `Converting HSL using radians to RGB works for ${color.name}.`);
-
-  test(() => {
-    const hsl_to_rgb = hsl_color_gradians.toRGB();
-    for (const attr of rgb_attributes) {
-      assert_color_channel_approx_equals(hsl_to_rgb[attr], rgb_color[attr]);
-    }
-  }, `Converting HSL using gradians to RGB works for ${color.name}.`);
-
-  test(() => {
-    const hsl_to_hwb = hsl_color_degrees.toHWB();
-    for (const attr of hwb_attributes) {
-      assert_color_channel_approx_equals(hwb_color_degrees[attr], hsl_to_hwb[attr]);
-    }
-  }, `Converting HSL to HWB works for ${color.name}.`);
-
-  // Test conversion from CSSHWB to others.
-  test(() => {
-    const hwb_to_rgb = hwb_color_degrees.toRGB();
-    for (const attr of rgb_attributes) {
-      assert_color_channel_approx_equals(hwb_to_rgb[attr], rgb_color[attr]);
-    }
-  }, `Converting HWB using degrees to RGB works for ${color.name}.`);
-
-  test(() => {
-    const hwb_to_rgb = hwb_color_radians.toRGB();
-    for (const attr of rgb_attributes) {
-      assert_color_channel_approx_equals(hwb_to_rgb[attr], rgb_color[attr]);
-    }
-  }, `Converting HWB using radians to RGB works for ${color.name}.`);
-
-  test(() => {
-    const hwb_to_rgb = hwb_color_gradians.toRGB();
-    for (const attr of rgb_attributes) {
-      assert_color_channel_approx_equals(hwb_to_rgb[attr], rgb_color[attr]);
-    }
-  }, `Converting HWB using gradians to RGB works for ${color.name}.`);
-
-  test(() => {
-    const hwb_to_hsl = hwb_color_degrees.toHSL();
-    for (const attr of hsl_attributes) {
-      assert_color_channel_approx_equals(hsl_color_degrees[attr], hwb_to_hsl[attr]);
-    }
-  }, `Converting HWB to HSL works for ${color.name}.`);
-
-  // Test conversion from CSSRGB to others
-  test(() => {
-    const rgb_to_hsl = rgb_color.toHSL();
-    for (const attr of hsl_attributes) {
-      assert_color_channel_approx_equals(hsl_color_degrees[attr], rgb_to_hsl[attr]);
-    }
-  }, `Converting RGB to HSL works for ${color.name}.`);
-
-  test(() => {
-
-    const rgb_to_hwb = rgb_color.toHWB();
-    for (const attr of hwb_attributes) {
-      assert_color_channel_approx_equals(hwb_color_degrees[attr], rgb_to_hwb[attr]);
-    }
-  }, `Converting RGB to HWB works for ${color.name}.`);
-}
-
 const PARSING_COLOR_TEST_CASES = [
   {
     value: 'rgb(255,255,255)',
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssRGB.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssRGB.html
index 8ec193d..ecd30d7 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssRGB.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/stylevalue-subclasses/cssRGB.html
@@ -84,33 +84,4 @@
     }, `CSSRGB.${attr} can be updated with ${testCase.desc}`);
   }
 }
-
-test(() => {
-  const color = new CSSRGB(
-    new CSSMathSum(CSS.percent(10), CSS.percent(20)),
-    new CSSMathProduct(CSS.percent(10), CSS.number(2)),
-    new CSSMathMax(CSS.percent(10), CSS.percent(50))
-  );
-  assert_color_channel_approx_equals(color.r, new CSSMathSum(CSS.percent(10), CSS.percent(20)));
-  assert_color_channel_approx_equals(color.g, new CSSMathProduct(CSS.percent(10), CSS.number(2)));
-  assert_color_channel_approx_equals(color.b, new CSSMathMax(CSS.percent(10), CSS.percent(50)));
-  let result = color.toRGB();
-  assert_color_channel_approx_equals(result.r, CSS.percent(30));
-  assert_color_channel_approx_equals(result.g, CSS.percent(20));
-  assert_color_channel_approx_equals(result.b, CSS.percent(50));
-}, `toRGB function evaluates sum, product and max objects.`);
-
-test(() => {
-  const color = new CSSRGB(1, 0.5, CSS.number(0.3), CSS.percent(50));
-  let result = color.toRGB();
-  assert_color_channel_approx_equals(result.r, CSS.percent(100));
-  assert_color_channel_approx_equals(result.g, CSS.percent(50));
-  assert_color_channel_approx_equals(result.b, CSS.percent(30));
-  assert_color_channel_approx_equals(result.alpha, CSS.percent(50));
-  for (const attr of ["r", "g", "b", "alpha"]) {
-    color[attr] = 0.7;
-    result = color.toRGB();
-    assert_color_channel_approx_equals(result[attr], CSS.percent(70));
-  }
-}, "toRGB() function works as expected and values can be updated.");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri-ref.html b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri-ref.html
new file mode 100644
index 0000000..07f7449d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri-ref.html
@@ -0,0 +1,24 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>CSS test reference</title>
+<style>
+  :root {
+    background-image: url("/images/blue.png");
+  }
+  .frame {
+    box-sizing: border-box;
+    width: 100px;
+    height: 100px;
+    background-color: purple;
+    padding: 8px; /* Matches default body margin */
+  }
+
+  .frame > div {
+    width: 50px;
+    height: 50px;
+    background-color: lime;
+  }
+</style>
+<div class="frame">
+  <div></div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.css b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.css
new file mode 100644
index 0000000..2efbfba
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.css
@@ -0,0 +1 @@
+div { background-color: red !important }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.html b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.html
new file mode 100644
index 0000000..9624905
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri.html
@@ -0,0 +1,28 @@
+<!doctype html>
+<meta charset="utf-8">
+<title>Test that base URIs are correct in presence of the same inline stylesheet</title>
+<link rel="author" href="mailto:emilio@crisal.io" title="Emilio Cobos Álvarez">
+<link rel="author" href="https://mozilla.org" title="Mozilla">
+<link rel="help" href="https://drafts.csswg.org/css-values-4/#relative-urls">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978217">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978555">
+<link rel="match" href="inline-cache-base-uri-ref.html">
+<!-- NOTE(emilio): inline-cache-base-uri.css is invalid from here -->
+<style>@import "inline-cache-base-uri.css";</style>
+<style>
+  :root {
+    background-image: url("../../images/blue.png");
+    background-color: purple;
+  }
+</style>
+<script>
+  // This script ensures that @import above has fully loaded
+</script>
+<style>@import "inline-cache-base-uri.css";</style>
+<script>
+  // Same, but this should make extra sure that we cache the @import before we start the frame load.
+  document.documentElement.getBoundingClientRect();
+</script>
+<iframe style="width: 100px; height: 100px; border: 0;" src="inline-cache-base-uri/inner.html"></iframe>
+<!-- This div makes sure that the inner inline-cache-base-uri.css is not loaded in this page (otherwise the test would fail) -->
+<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inline-cache-base-uri.css b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inline-cache-base-uri.css
new file mode 100644
index 0000000..df719dd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inline-cache-base-uri.css
@@ -0,0 +1,5 @@
+div {
+  width: 50px;
+  height: 50px;
+  background-color: lime;
+}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inner.html b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inner.html
new file mode 100644
index 0000000..7a23e13
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-values/inline-cache-base-uri/inner.html
@@ -0,0 +1,11 @@
+<!doctype html>
+<meta charset="utf-8">
+<!-- NOTE(emilio): It's important the text content of these matches exactly inline-cache-base-uri.html -->
+<style>@import "inline-cache-base-uri.css";</style>
+<style>
+  :root {
+    background-image: url("../../images/blue.png");
+    background-color: purple;
+  }
+</style>
+<div></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior-ref.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior-ref.html
index d5e8fa8..11246d7 100644
--- a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior-ref.html
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior-ref.html
@@ -3,9 +3,6 @@
 <title>backdrop-filter: Edge behavior</title>
 <link rel="author" href="mailto:masonf@chromium.org">
 
-
-
-
 <div>
   <p>Expected: The black box inside the red box should contain some red, despite being outside of the scroller's clip</p>
 </div>
@@ -18,6 +15,7 @@
 <style>
   html {
     scrollbar-width: none;
+    overflow: hidden;
   }
   #scroller {
     width: 250px;
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior.html
index 2123e76..7649bfd8 100644
--- a/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior.html
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/backdrop-filter-edge-behavior.html
@@ -17,6 +17,9 @@
 </div>
 
 <style>
+  html {
+    overflow: hidden;
+  }
   #scroller {
     width: 250px;
     height: 250px;
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-image-root-filter.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-image-root-filter.html
index 6df6eb2..c3d99d0 100644
--- a/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-image-root-filter.html
+++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/svg-image-root-filter.html
@@ -6,5 +6,6 @@
 <link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
 <link rel="author" title="Mozilla" href="https://mozilla.org">
 <link rel="match" href="svg-image-root-filter-ref.html">
+<meta name="fuzzy" content="maxDifference=0-1; totalPixels=0-400">
 <img id="image"
      src="data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' height='50px' width='50px' style='filter: hue-rotate(90deg)'><rect width='20px' height='20px' fill='red'></rect></svg>">
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document-expected.txt
deleted file mode 100644
index b68f94c..0000000
--- a/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] importNode on Document must construct a new custom element when importing a custom element into a window-less document
-  assert_array_equals: lengths differ, expected array ["constructed"] length 1, got [] length 0
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document.html b/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document.html
index da2ea0d..4c5d2eb 100644
--- a/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document.html
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/reactions/Document.html
@@ -23,8 +23,8 @@
     const newDoc = contentDocument.implementation.createHTMLDocument();
     newDoc.importNode(instance);
 
-    assert_array_equals(element.takeLog().types(), ['constructed']);
-}, 'importNode on Document must construct a new custom element when importing a custom element into a window-less document');
+    assert_array_equals(element.takeLog().types(), []);
+}, 'importNode on Document must not construct a new custom element when importing a custom element into a window-less document');
 
 test_with_window(function (contentWindow, contentDocument) {
     const element = define_custom_element_in_window(contentWindow, 'custom-element', []);
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/CustomElementRegistry-upgrade.html b/third_party/blink/web_tests/external/wpt/custom-elements/registries/CustomElementRegistry-upgrade.html
index c68bc37d..5a5d594 100644
--- a/third_party/blink/web_tests/external/wpt/custom-elements/registries/CustomElementRegistry-upgrade.html
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/CustomElementRegistry-upgrade.html
@@ -11,11 +11,11 @@
     <template shadowrootmode="closed" shadowrootclonable="true" shadowrootcustomelementregistry>
         <a-b>
             <template shadowrootmode="closed" shadowrootclonable="true" shadowrootcustomelementregistry>
-                <c-d/>
+                <c-d>
                     <template shadowrootmode="closed" shadowrootclonable="true">
                         <a-b></a-b>
                     </template>
-                <c-d>
+                </c-d>
             </template>
         </a-b>
     </template>
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window-expected.txt
new file mode 100644
index 0000000..359c67a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window-expected.txt
@@ -0,0 +1,27 @@
+This is a testharness.js-based test.
+[FAIL] Cloning with global registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Cloning with explicit global registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Cloning with scoped registry
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Cloning including shadow tree with global registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Cloning including shadow tree with explicit global registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Cloning including shadow tree with scoped registry
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Cloning with global registry (null registry target)
+  assert_equals: expected (object) null but got (undefined) undefined
+[FAIL] Cloning with explicit global registry (null registry target)
+  assert_equals: expected (object) null but got (undefined) undefined
+[FAIL] Cloning with scoped registry (null registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Cloning including shadow tree with global registry (null registry target)
+  assert_equals: expected (object) null but got (undefined) undefined
+[FAIL] Cloning including shadow tree with explicit global registry (null registry target)
+  assert_equals: expected (object) null but got (undefined) undefined
+[FAIL] Cloning including shadow tree with scoped registry (null registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window.js b/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window.js
new file mode 100644
index 0000000..0501e53
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/Document-importNode-cross-document.window.js
@@ -0,0 +1,116 @@
+// Target document has a global registry
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+
+  const element = document.createElement("div");
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.customElementRegistry, contentDocument.defaultView.customElements);
+}, "Cloning with global registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+
+  const element = document.createElement("div", { customElementRegistry: customElements });
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.customElementRegistry, contentDocument.defaultView.customElements);
+}, "Cloning with explicit global registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+
+  const scoped = new CustomElementRegistry();
+  const element = document.createElement("div", { customElementRegistry: scoped });
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.customElementRegistry, scoped);
+}, "Cloning with scoped registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+
+  const element = document.createElement("div");
+  const elementShadow = element.attachShadow({ mode: "open", clonable: true });
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.shadowRoot.customElementRegistry, contentDocument.defaultView.customElements);
+}, "Cloning including shadow tree with global registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+
+  const element = document.createElement("div");
+  const elementShadow = element.attachShadow({ mode: "open", clonable: true, customElementRegistry: customElements });
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.shadowRoot.customElementRegistry, contentDocument.defaultView.customElements);
+}, "Cloning including shadow tree with explicit global registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+
+  const scoped = new CustomElementRegistry();
+  const element = document.createElement("div");
+  const elementShadow = element.attachShadow({ mode: "open", clonable: true, customElementRegistry: scoped });
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.shadowRoot.customElementRegistry, scoped);
+}, "Cloning including shadow tree with scoped registry");
+
+
+// Target document has a null registry
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+
+  const element = document.createElement("div");
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.customElementRegistry, null);
+}, "Cloning with global registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+
+  const element = document.createElement("div", { customElementRegistry: customElements });
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.customElementRegistry, null);
+}, "Cloning with explicit global registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+
+  const scoped = new CustomElementRegistry();
+  const element = document.createElement("div", { customElementRegistry: scoped });
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.customElementRegistry, scoped);
+}, "Cloning with scoped registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+
+  const element = document.createElement("div");
+  const elementShadow = element.attachShadow({ mode: "open", clonable: true });
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.shadowRoot.customElementRegistry, null);
+}, "Cloning including shadow tree with global registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+
+  const element = document.createElement("div");
+  const elementShadow = element.attachShadow({ mode: "open", clonable: true, customElementRegistry: customElements });
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.shadowRoot.customElementRegistry, null);
+}, "Cloning including shadow tree with explicit global registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+
+  const scoped = new CustomElementRegistry();
+  const element = document.createElement("div");
+  const elementShadow = element.attachShadow({ mode: "open", clonable: true, customElementRegistry: scoped });
+  const clone = contentDocument.importNode(element);
+  assert_equals(clone.shadowRoot.customElementRegistry, scoped);
+}, "Cloning including shadow tree with scoped registry (null registry target)");
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window-expected.txt
new file mode 100644
index 0000000..834b0d8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window-expected.txt
@@ -0,0 +1,75 @@
+This is a testharness.js-based test.
+[FAIL] Adoption with global registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption with explicit global registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption with scoped registry
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption with global registry into a scoped registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption with explicit global registry into a scoped registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption with scoped registry into a scoped registry
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption including shadow root with global registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption including shadow root with explicit global registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption including shadow root with scoped registry
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption including shadow root with global registry into a scoped registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption including shadow root with explicit global registry into a scoped registry
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption including shadow root with scoped registry into a scoped registry
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption with global registry (null registry target)
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption with explicit global registry (null registry target)
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption with scoped registry (null registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption with global registry into a scoped registry (null registry target)
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption with explicit global registry into a scoped registry (null registry target)
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption with scoped registry into a scoped registry (null registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption including shadow root with global registry (null registry target)
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption including shadow root with explicit global registry (null registry target)
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption including shadow root with scoped registry (null registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption including shadow root with global registry into a scoped registry (null registry target)
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption including shadow root with explicit global registry into a scoped registry (null registry target)
+  assert_equals: expected (object) object "[object CustomElementRegistry]" but got (undefined) undefined
+[FAIL] Adoption including shadow root with scoped registry into a scoped registry (null registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption with global registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption with explicit global registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption with scoped registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption with global registry into a scoped registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption with explicit global registry into a scoped registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption with scoped registry into a scoped registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption including shadow root with global registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption including shadow root with explicit global registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption including shadow root with scoped registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption including shadow root with global registry into a scoped registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption including shadow root with explicit global registry into a scoped registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+[FAIL] Adoption including shadow root with scoped registry into a scoped registry (scoped registry target)
+  Failed to construct 'CustomElementRegistry': Illegal constructor
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window.js b/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window.js
new file mode 100644
index 0000000..6371b36
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/adoption.window.js
@@ -0,0 +1,496 @@
+// Target document has a global registry
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const element = document.createElement('div');
+  assert_equals(element.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(element.customElementRegistry, contentDocument.customElementRegistry);
+}, "Adoption with global registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const element = document.createElement('div', { customElementRegistry: customElements });
+  assert_equals(element.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(element.customElementRegistry, contentDocument.customElementRegistry);
+}, "Adoption with explicit global registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const scoped = new CustomElementRegistry();
+  const element = document.createElement('div', { customElementRegistry: scoped });
+  assert_equals(element.customElementRegistry, scoped);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(element.customElementRegistry, scoped);
+}, "Adoption with scoped registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const element = document.createElement('div');
+  assert_equals(element.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(element.customElementRegistry, contentDocument.customElementRegistry);
+}, "Adoption with global registry into a scoped registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const element = document.createElement('div', { customElementRegistry: customElements });
+  assert_equals(element.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(element.customElementRegistry, contentDocument.customElementRegistry);
+}, "Adoption with explicit global registry into a scoped registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const scoped = new CustomElementRegistry();
+  const element = document.createElement('div', { customElementRegistry: scoped });
+  assert_equals(element.customElementRegistry, scoped);
+
+  const scoped2 = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped2);
+  scopedElement.appendChild(element);
+  assert_equals(element.customElementRegistry, scoped);
+}, "Adoption with scoped registry into a scoped registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed" });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  // In certain implementations touching element.customElementRegistry can poison the results so we
+  // don't do that here.
+  assert_equals(elementShadow.customElementRegistry, contentDocument.customElementRegistry);
+}, "Adoption including shadow root with global registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, contentDocument.customElementRegistry);
+}, "Adoption including shadow root with explicit global registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const element = document.createElement('div');
+  const scoped = new CustomElementRegistry();
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped });
+  assert_equals(elementShadow.customElementRegistry, scoped);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, scoped);
+}, "Adoption including shadow root with scoped registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed" });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, contentDocument.customElementRegistry);
+}, "Adoption including shadow root with global registry into a scoped registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, contentDocument.customElementRegistry);
+}, "Adoption including shadow root with explicit global registry into a scoped registry");
+
+test(t => {
+  const contentDocument = document.body.appendChild(document.createElement('iframe')).contentDocument;
+  t.add_cleanup(() => contentDocument.defaultView.frameElement.remove());
+  const element = document.createElement('div');
+  const scoped = new CustomElementRegistry();
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped });
+  assert_equals(elementShadow.customElementRegistry, scoped);
+
+  const scoped2 = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped2);
+  scopedElement.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, scoped);
+}, "Adoption including shadow root with scoped registry into a scoped registry");
+
+
+// Target document has a null registry
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = document.createElement('div');
+  assert_equals(element.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(element.customElementRegistry, null);
+}, "Adoption with global registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = document.createElement('div', { customElementRegistry: customElements });
+  assert_equals(element.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(element.customElementRegistry, null);
+}, "Adoption with explicit global registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const scoped = new CustomElementRegistry();
+  const element = document.createElement('div', { customElementRegistry: scoped });
+  assert_equals(element.customElementRegistry, scoped);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(element.customElementRegistry, scoped);
+}, "Adoption with scoped registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = document.createElement('div');
+  assert_equals(element.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(element.customElementRegistry, null);
+}, "Adoption with global registry into a scoped registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = document.createElement('div', { customElementRegistry: customElements });
+  assert_equals(element.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(element.customElementRegistry, null);
+}, "Adoption with explicit global registry into a scoped registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const scoped = new CustomElementRegistry();
+  const element = document.createElement('div', { customElementRegistry: scoped });
+  assert_equals(element.customElementRegistry, scoped);
+
+  const scoped2 = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped2);
+  scopedElement.appendChild(element);
+  assert_equals(element.customElementRegistry, scoped);
+}, "Adoption with scoped registry into a scoped registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed" });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  // In certain implementations touching element.customElementRegistry can poison the results so we
+  // don't do that here.
+  assert_equals(elementShadow.customElementRegistry, null);
+}, "Adoption including shadow root with global registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, null);
+}, "Adoption including shadow root with explicit global registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = document.createElement('div');
+  const scoped = new CustomElementRegistry();
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped });
+  assert_equals(elementShadow.customElementRegistry, scoped);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, scoped);
+}, "Adoption including shadow root with scoped registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed" });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, null);
+}, "Adoption including shadow root with global registry into a scoped registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, null);
+}, "Adoption including shadow root with explicit global registry into a scoped registry (null registry target)");
+
+test(t => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = document.createElement('div');
+  const scoped = new CustomElementRegistry();
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped });
+  assert_equals(elementShadow.customElementRegistry, scoped);
+
+  const scoped2 = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped2);
+  scopedElement.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, scoped);
+}, "Adoption including shadow root with scoped registry into a scoped registry (null registry target)");
+
+
+// Target document has a scoped registry
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+  const element = document.createElement('div');
+  assert_equals(element.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(element.customElementRegistry, null);
+}, "Adoption with global registry (scoped registry target)");
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+
+  const element = document.createElement('div', { customElementRegistry: customElements });
+  assert_equals(element.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(element.customElementRegistry, null);
+}, "Adoption with explicit global registry (scoped registry target)");
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+
+  const scoped = new CustomElementRegistry();
+  const element = document.createElement('div', { customElementRegistry: scoped });
+  assert_equals(element.customElementRegistry, scoped);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(element.customElementRegistry, scoped);
+}, "Adoption with scoped registry (scoped registry target)");
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+
+  const element = document.createElement('div');
+  assert_equals(element.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(element.customElementRegistry, null);
+}, "Adoption with global registry into a scoped registry (scoped registry target)");
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+
+  const element = document.createElement('div', { customElementRegistry: customElements });
+  assert_equals(element.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(element.customElementRegistry, null);
+}, "Adoption with explicit global registry into a scoped registry (scoped registry target)");
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+
+  const scoped = new CustomElementRegistry();
+  const element = document.createElement('div', { customElementRegistry: scoped });
+  assert_equals(element.customElementRegistry, scoped);
+
+  const scoped2 = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped2);
+  scopedElement.appendChild(element);
+  assert_equals(element.customElementRegistry, scoped);
+}, "Adoption with scoped registry into a scoped registry (scoped registry target)");
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed" });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  // In certain implementations touching element.customElementRegistry can poison the results so we
+  // don't do that here.
+  assert_equals(elementShadow.customElementRegistry, null);
+}, "Adoption including shadow root with global registry (scoped registry target)");
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, null);
+}, "Adoption including shadow root with explicit global registry (scoped registry target)");
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+
+  const element = document.createElement('div');
+  const scoped = new CustomElementRegistry();
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped });
+  assert_equals(elementShadow.customElementRegistry, scoped);
+
+  contentDocument.body.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, scoped);
+}, "Adoption including shadow root with scoped registry (scoped registry target)");
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed" });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, null);
+}, "Adoption including shadow root with global registry into a scoped registry (scoped registry target)");
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+  const element = document.createElement('div');
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: customElements });
+  assert_equals(elementShadow.customElementRegistry, customElements);
+
+  const scoped = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped);
+  scopedElement.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, null);
+}, "Adoption including shadow root with explicit global registry into a scoped registry (scoped registry target)");
+
+test(t => {
+  const documentRegistry = new CustomElementRegistry();
+  const contentDocument = document.implementation.createHTMLDocument();
+  documentRegistry.initialize(contentDocument);
+  assert_equals(contentDocument.customElementRegistry, documentRegistry);
+  const element = document.createElement('div');
+  const scoped = new CustomElementRegistry();
+  const elementShadow = element.attachShadow({ mode: "closed", customElementRegistry: scoped });
+  assert_equals(elementShadow.customElementRegistry, scoped);
+
+  const scoped2 = new CustomElementRegistry();
+  const scopedElement = contentDocument.createElement('div', { customElementRegistry: scoped2 });
+  contentDocument.body.appendChild(scopedElement);
+  assert_equals(scopedElement.customElementRegistry, scoped2);
+  scopedElement.appendChild(element);
+  assert_equals(elementShadow.customElementRegistry, scoped);
+}, "Adoption including shadow root with scoped registry into a scoped registry (scoped registry target)");
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window-expected.txt
new file mode 100644
index 0000000..c848fee3
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window-expected.txt
@@ -0,0 +1,13 @@
+This is a testharness.js-based test.
+[FAIL] initialize() of global registry should throw for nodes from another document
+  assert_throws_dom: function "() => customElements.initialize(contentDocument)" threw object "TypeError: customElements.initialize is not a function" that is not a DOMException NotSupportedError: property "code" is equal to undefined, expected 9
+[FAIL] createElement() should throw with global registry from another document
+  assert_throws_dom: function "() => contentDocument.createElement("div", { customElementRegistry: customElements })" did not throw
+[FAIL] createElementNS() should throw with global registry from another document
+  assert_throws_dom: function "() => contentDocument.createElementNS("x", "div", { customElementRegistry: customElements })" did not throw
+[FAIL] attachShadow() should throw with global registry from another document
+  assert_throws_dom: function "() => element.attachShadow({ mode: "closed", customElementRegistry: customElements })" did not throw
+[FAIL] importNode() should throw with global registry from another document
+  assert_throws_dom: function "() => contentDocument.importNode(element, { customElementRegistry: customElements })" did not throw
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window.js b/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window.js
new file mode 100644
index 0000000..7993ccb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/global.window.js
@@ -0,0 +1,27 @@
+test(() => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  assert_throws_dom("NotSupportedError", () => customElements.initialize(contentDocument));
+  assert_throws_dom("NotSupportedError", () => customElements.initialize(contentDocument.createElement("x")));
+}, "initialize() of global registry should throw for nodes from another document");
+
+test(() => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  assert_throws_dom("NotSupportedError", () => contentDocument.createElement("div", { customElementRegistry: customElements }));
+}, "createElement() should throw with global registry from another document");
+
+test(() => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  assert_throws_dom("NotSupportedError", () => contentDocument.createElementNS("x", "div", { customElementRegistry: customElements }));
+}, "createElementNS() should throw with global registry from another document");
+
+test(() => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = contentDocument.createElement("div");
+  assert_throws_dom("NotSupportedError", () => element.attachShadow({ mode: "closed", customElementRegistry: customElements }));
+}, "attachShadow() should throw with global registry from another document");
+
+test(() => {
+  const contentDocument = document.implementation.createHTMLDocument();
+  const element = contentDocument.createElement("div");
+  assert_throws_dom("NotSupportedError", () => contentDocument.importNode(element, { customElementRegistry: customElements }));
+}, "importNode() should throw with global registry from another document");
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria-expected.txt
index 7d8ba8367..4b5efd5 100644
--- a/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria-expected.txt
@@ -14,7 +14,7 @@
 [FAIL] Adding definition to scoped registry affects associated shadow roots in all iframes
   Failed to construct 'CustomElementRegistry': Illegal constructor
 [FAIL] Adding definition to scoped registry affects associated shadow roots in other frame trees
-  assert_true: expected true got false
+  Failed to construct 'CustomElementRegistry': Illegal constructor
 [FAIL] Adding definition to scoped registry should not upgrade disconnected elements
   Failed to construct 'CustomElementRegistry': Illegal constructor
 [FAIL] Adding definition to scoped registry should not upgrade nodes in constructed documents
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria.html b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria.html
index 9c9b076a..f281f7f 100644
--- a/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria.html
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-define-upgrade-criteria.html
@@ -169,16 +169,18 @@
 test(t => {
   const name = nextCustomElementName();
 
+  const registry = new CustomElementRegistry;
+
   const newWindow = window.open('about:blank');
   t.add_cleanup(() => newWindow.close());
 
   const host = newWindow.document.createElement('div');
-  const shadow = host.attachShadow({mode: 'open', customElementRegistry: window.customElements});
+  const shadow = host.attachShadow({mode: 'open', customElementRegistry: registry});
   const node = shadow.appendChild(newWindow.document.createElement(name));
   newWindow.document.body.appendChild(host);
 
   class TestElement extends HTMLElement {};
-  window.customElements.define(name, TestElement);
+  registry.define(name, TestElement);
 
   assert_true(node instanceof TestElement);
 }, 'Adding definition to scoped registry affects associated shadow roots in other frame trees');
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/scoped-registry-initialize-expected.txt b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-initialize-expected.txt
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/custom-elements/scoped-registry-initialize-expected.txt
rename to third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-initialize-expected.txt
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/scoped-registry-initialize.html b/third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-initialize.html
similarity index 100%
rename from third_party/blink/web_tests/external/wpt/custom-elements/scoped-registry-initialize.html
rename to third_party/blink/web_tests/external/wpt/custom-elements/registries/scoped-registry-initialize.html
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/upgrading/Document-importNode.html b/third_party/blink/web_tests/external/wpt/custom-elements/upgrading/Document-importNode.html
index 9f960127..3f49d1f 100644
--- a/third_party/blink/web_tests/external/wpt/custom-elements/upgrading/Document-importNode.html
+++ b/third_party/blink/web_tests/external/wpt/custom-elements/upgrading/Document-importNode.html
@@ -16,9 +16,9 @@
   assert_equals(original.customElementRegistry, customElements);
 
   let imported = doc.importNode(original);
-  assert_true(imported instanceof MyElement);
-  assert_false(imported instanceof MyElement2);
-  assert_equals(imported.customElementRegistry, customElements);
+  assert_true(imported instanceof MyElement2);
+  assert_false(imported instanceof MyElement);
+  assert_equals(imported.customElementRegistry, w.customElements);
 }, 'autonomous: document.importNode() should import custom elements successfully');
 
 test_with_window((w, doc) => {
@@ -30,7 +30,7 @@
   assert_equals(original.customElementRegistry, customElements);
 
   let imported = doc.importNode(original);
-  assert_equals(imported.customElementRegistry, customElements);
+  assert_equals(imported.customElementRegistry, w.customElements);
 }, 'autonomous: document.importNode() should import "undefined" custom elements successfully');
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-after-input-setRangeText.html b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-after-input-setRangeText.html
new file mode 100644
index 0000000..ed33cdd5
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-after-input-setRangeText.html
@@ -0,0 +1,30 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<script>
+addEventListener("DOMContentLoaded", () => {
+  document.getElementById("input").setRangeText("A", 6, 134);
+  document.getElementById("center").replaceChild(
+    document.getElementById("label"),
+    document.getElementById("center").firstChild
+  );
+  document.designMode = "on";
+  document.execCommand("delete");
+}, {once: true});
+</script>
+</head>
+<body>
+<h5>
+AA
+<ruby>
+<rt hidden="">
+<label>
+</ruby>
+<label id="label" contenteditable="true">
+<input id="input" pattern="^\d+$">
+</h5>
+<center id="center">
+
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-in-xml-space-preserve.html b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-in-xml-space-preserve.html
new file mode 100644
index 0000000..017af10
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/editing/crashtests/delete-in-xml-space-preserve.html
@@ -0,0 +1,25 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<script>
+"use strict";
+
+addEventListener("load", () => {
+  document.designMode = "on";
+  getSelection().collapse(document.querySelector("hatchpath"), 2);
+  document.execCommand("delete");
+}, {once: true});
+</script>
+</head>
+<body>TEST
+  <svg xml:space="preserve">
+    <hatchpath>
+      <test>
+        <meshgradient>
+        </meshgradient>
+      </test>
+    </hatchpath>
+  </svg>
+</body>
+</html>
diff --git a/third_party/blink/web_tests/external/wpt/editing/crashtests/inserttext-with-empty-string-to-replace-selection.html b/third_party/blink/web_tests/external/wpt/editing/crashtests/inserttext-with-empty-string-to-replace-selection.html
new file mode 100644
index 0000000..4821d77
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/editing/crashtests/inserttext-with-empty-string-to-replace-selection.html
@@ -0,0 +1,29 @@
+<!doctype html>
+<html>
+<head>
+<meta charset="utf-8">
+<script>
+"use strict";
+
+addEventListener("load", async () => {
+  const slot = document.createElement("slot");
+  const mspace = document.getElementById("id_0");
+  const metadata = document.getElementById("id_1");
+  document.documentElement.appendChild(slot);
+  mspace.outerHTML = "<mark id='id_2' contenteditable='true'><meta id='id_3'></mark>";
+  try {
+    await timeout(metadata.requestFullScreen());
+  } catch (e) {}
+  getSelection().selectAllChildren(document.querySelector("#id_2"));
+  slot.contentEditable = "true";
+  getSelection().collapseToEnd();
+  getSelection().extend(document.querySelector("#id_3"), 0);
+  document.designMode = "on";
+  document.execCommand("insertText", false, "");
+});
+</script>
+</head><body><math>
+  <mspace id="id_0"></mspace>
+  <metadata id="id_1"></metadata>
+</math>
+</body></html>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/widgets/button-layout/input-fragmentation-crash.html b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/button-layout/input-fragmentation-crash.html
new file mode 100644
index 0000000..78fa40f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/button-layout/input-fragmentation-crash.html
@@ -0,0 +1,13 @@
+<!doctype html>
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1978487">
+<style>
+.parent {
+  columns: 2;
+}
+input {
+  float: inline-start;
+}
+</style>
+<div class="parent">
+  <input style="display: block" type="color">
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/radio-focused-and-scrolled-into-view.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/radio-focused-and-scrolled-into-view.html
new file mode 100644
index 0000000..b6584d8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-input-element/radio-focused-and-scrolled-into-view.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>Radio buttons should scroll into view when focused (if off-screen)</title>
+  <link rel="help" href="https://html.spec.whatwg.org/multipage/interaction.html#keyboard-accessibility-navigation-radios">
+  <script src="/resources/testharness.js"></script>
+  <script src="/resources/testharnessreport.js"></script>
+  <script src="/resources/testdriver.js"></script>
+  <script src="/resources/testdriver-actions.js"></script>
+  <script src="/resources/testdriver-vendor.js"></script>
+  <style>
+    input[type="radio"] {
+      display: block;
+    }
+    #offscreen-radio {
+      margin-top: 200vh;
+    }
+  </style>
+</head>
+<body>
+
+<h1>Radio buttons should scroll into view when focused (if off-screen)</h1>
+
+<form>
+  <input type="radio" name="group" id="radio1">
+  <input type="radio" name="group" id="radio2">
+  <input type="radio" name="group" id="offscreen-radio">
+</form>
+
+<script>
+  function simulateArrowDown() {
+    return new test_driver.Actions()
+      .keyDown("\uE015") // "ArrowDown" code point: https://www.w3.org/TR/webdriver2/#keyboard-actions
+      .send();
+  }
+
+  promise_test(async t => {
+    const firstRadio = document.getElementById("radio1");
+    const offscreenRadio = document.getElementById("offscreen-radio");
+    const focusPromise = new Promise(resolve =>
+      offscreenRadio.onfocus = () => t.step_timeout(resolve, 50)
+    );
+
+    firstRadio.focus();
+    await simulateArrowDown();
+    await simulateArrowDown();
+    await focusPromise;
+
+    const scrollTop = document.scrollingElement.scrollTop;
+
+    assert_equals(offscreenRadio, document.activeElement, 'offscreen radio is focused');
+    assert_greater_than(scrollTop, 500, `out-of-viewport radio should trigger scroll — scrollTop=${scrollTop}`);
+  }, 'Focusing offscreen radio via keyboard should scroll it into view');
+
+</script>
+
+</body>
+</html>
+
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-type.historical.html b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-type.historical.html
new file mode 100644
index 0000000..a6ded3b4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/a-type.historical.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<title>The type attribute is purely advisory</title>
+<link rel="help" href="https://html.spec.whatwg.org/multipage/links.html#attr-hyperlink-type">
+<script src=/resources/testharness.js></script>
+<script src=/resources/testharnessreport.js></script>
+
+<body>
+<iframe name="i"></iframe>
+<a id="link" href="resources/plain-text.unknown" target="i" type="text/html">click me</a>
+<script>
+async_test(t => {
+  let link = document.getElementById("link");
+  link.click();
+
+  let iframe = document.querySelector("iframe");
+  iframe.onload = t.step_func_done(() => {
+    assert_true(iframe.contentWindow.location.href.endsWith(".unknown"));
+    assert_equals(iframe.contentDocument.contentType, "text/plain");
+  });
+}, "type attribute on anchor doesn't cause document to be loaded as HTML");
+</script>
+</body>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown
new file mode 100644
index 0000000..efbf544a
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown
@@ -0,0 +1 @@
+Hello World!
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown.headers b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown.headers
new file mode 100644
index 0000000..036ddf96
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/text-level-semantics/the-a-element/resources/plain-text.unknown.headers
@@ -0,0 +1 @@
+Content-Type: */*
diff --git a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/spaces/space-like-003.html b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/spaces/space-like-003.html
index 5b693fb3..649dbe2 100644
--- a/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/spaces/space-like-003.html
+++ b/third_party/blink/web_tests/external/wpt/mathml/presentation-markup/spaces/space-like-003.html
@@ -90,7 +90,7 @@
     <math>
       <mn>X</mn>
       <mrow>
-        <mi class="testedElement">X</mi>
+        <mi class="testedElement" mathvariant="normal">X</mi>
         <mo lspace="1em" rspace="0em">X</mo>
       </mrow>
       <mn>X</mn>
diff --git a/third_party/blink/web_tests/external/wpt/navigation-api/focus-reset/autofocus.html b/third_party/blink/web_tests/external/wpt/navigation-api/focus-reset/autofocus.html
index 6044447..c40e2f6 100644
--- a/third_party/blink/web_tests/external/wpt/navigation-api/focus-reset/autofocus.html
+++ b/third_party/blink/web_tests/external/wpt/navigation-api/focus-reset/autofocus.html
@@ -120,7 +120,6 @@
   assert_equals(document.activeElement, decoy, "Focus stays on the initially-focused button during the transition");
 
   decoy.disabled = true;
-  assert_equals(document.activeElement, document.body, "Disabling the initially-focused button temporarily resets focus to the body");
 
   await finished;
   assert_equals(document.activeElement, autofocusTarget, "Focus moves to the second autofocused button after the transition");
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-accepted.https.html b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-accepted.https.html
index 4d8152b8..58b2510 100644
--- a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-accepted.https.html
+++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-accepted.https.html
@@ -14,7 +14,7 @@
 const kPayeeOrigin = 'https://merchant.com';
 const kInstrumentDisplayName = 'Troycard';
 
-async function triggerSpc(t, instrumentDetails) {
+async function triggerSpc(t, instrumentDetails, paymentEntitiesLogos) {
   const authenticator = await window.test_driver.add_virtual_authenticator(
       AUTHENTICATOR_OPTS);
   t.add_cleanup(() => {
@@ -44,6 +44,10 @@
     data.instrument.details = instrumentDetails;
   }
 
+  if (paymentEntitiesLogos !== undefined) {
+    data.paymentEntitiesLogos = paymentEntitiesLogos;
+  }
+
   const request = new PaymentRequest([{
     supportedMethods: 'secure-payment-confirmation', data
   }], PAYMENT_DETAILS);
@@ -90,9 +94,17 @@
 
 promise_test(async t => {
   const instrumentDetails = '***1234';
-  const clientDataJSON = await triggerSpc(t, instrumentDetails);
+  const paymentEntityLogoLabel = 'Sync Network';
+  const paymentEntitiesLogos = [{
+      url: PAYMENT_ENTITY_LOGO_URL,
+      label: paymentEntityLogoLabel,
+  }];
+  const clientDataJSON = await triggerSpc(t, instrumentDetails, paymentEntitiesLogos);
 
   // Payment-specific information.
   assert_equals(clientDataJSON.payment.instrument.details, instrumentDetails);
+  assert_equals(clientDataJSON.payment.paymentEntitiesLogos.length, 1);
+  assert_equals(clientDataJSON.payment.paymentEntitiesLogos[0].url, PAYMENT_ENTITY_LOGO_URL);
+  assert_equals(clientDataJSON.payment.paymentEntitiesLogos[0].label, paymentEntityLogoLabel);
 }, 'Successful SPC authentication - optional fields');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https-expected.txt b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https-expected.txt
new file mode 100644
index 0000000..4a77d491
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] SPC authentication with a PaymentEntityLogo that cannot be downloaded.
+  promise_test: Unhandled rejection with value: object "TypeError: Cannot read properties of undefined (reading 'length')"
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https.html b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https.html
new file mode 100644
index 0000000..e229fb2e
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/authentication-invalid-payment-entity-logo.https.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Test for the 'secure-payment-confirmation' payment method authentication - invalid payment entity logo</title>
+<link rel="help" href="https://w3c.github.io/secure-payment-confirmation#sctn-steps-to-check-if-a-payment-can-be-made">
+<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>
+<script src="utils.sub.js"></script>
+<script>
+'use strict';
+
+promise_test(async t => {
+  const authenticator = await window.test_driver.add_virtual_authenticator(
+    AUTHENTICATOR_OPTS);
+  t.add_cleanup(() => {
+    return window.test_driver.remove_virtual_authenticator(authenticator);
+  });
+
+  await window.test_driver.set_spc_transaction_mode("autoAccept");
+  t.add_cleanup(() => {
+    return window.test_driver.set_spc_transaction_mode("none");
+  });
+
+  const credential = await createCredential();
+
+  const challenge = 'server challenge';
+  const payeeOrigin = 'https://merchant.com';
+  const displayName = 'Troycard ***1234';
+
+  const paymentEntity1Label = 'Payment Entity #1';
+  const paymentEntity2Label = 'Payment Entity #2';
+
+  let request = new PaymentRequest([{
+    supportedMethods: 'secure-payment-confirmation',
+    data: {
+      credentialIds: [credential.rawId],
+      challenge: Uint8Array.from(challenge, c => c.charCodeAt(0)),
+      payeeOrigin,
+      rpId: window.location.hostname,
+      timeout: 60000,
+      instrument: {
+        displayName,
+        icon: ICON_URL,
+      },
+      paymentEntitiesLogos: [
+        {
+          url: NONEXISTENT_PAYMENT_ENTITY_LOGO_URL,
+          label: paymentEntity1Label,
+        },
+        {
+          url: PAYMENT_ENTITY_LOGO_URL,
+          label: paymentEntity2Label,
+        },
+      ],
+    }
+  }], PAYMENT_DETAILS);
+
+  await test_driver.bless('user activation');
+  const responsePromise = request.show();
+  const response = await responsePromise;
+  await response.complete('success');
+  const cred = response.details;
+  const clientDataJSON = JSON.parse(arrayBufferToString(cred.response.clientDataJSON));
+
+  // Both PaymentEntityLogos should still be present, but the non-existent url
+  // should have been replaced by an empty string.
+  assert_equals(clientDataJSON.payment.paymentEntitiesLogos.length, 2);
+  assert_equals(clientDataJSON.payment.paymentEntitiesLogos[0].url, '');
+  assert_equals(clientDataJSON.payment.paymentEntitiesLogos[0].label, paymentEntity1Label);
+  assert_equals(clientDataJSON.payment.paymentEntitiesLogos[1].url, PAYMENT_ENTITY_LOGO_URL);
+  assert_equals(clientDataJSON.payment.paymentEntitiesLogos[1].label, paymentEntity2Label);
+}, 'SPC authentication with a PaymentEntityLogo that cannot be downloaded.');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https-expected.txt b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https-expected.txt
index 0d94a62d..2b79dec2 100644
--- a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https-expected.txt
+++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https-expected.txt
@@ -1,5 +1,11 @@
 This is a testharness.js-based test.
 [FAIL] Empty instrument.details field throws exception.
   assert_throws_js: function "() => {\n    new PaymentRequest([{\n      supportedMethods: 'secure-payment-confirmation',\n      data: {\n        credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],\n        challenge: Uint8Array.from('x', c => c.charCodeAt(0)),\n        payeeOrigin: window.location.origin,\n        timeout: 60000,\n        instrument: {\n          displayName: 'X',\n          icon: 'https://example.test/icon.png',\n          // Details can be omitted, but if present cannot be empty.\n          details: '',\n        },\n        rpId: 'relying-party.example',\n      },\n    }], details);\n  }" did not throw
+[FAIL] Empty url field in a PaymentEntityLogo throws exception.
+  assert_throws_js: function "() => {\n    new PaymentRequest([{\n      supportedMethods: 'secure-payment-confirmation',\n      data: {\n        credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],\n        challenge: Uint8Array.from('x', c => c.charCodeAt(0)),\n        payeeOrigin: window.location.origin,\n        timeout: 60000,\n        instrument: {\n          displayName: 'X',\n          icon: 'https://example.test/icon.png',\n        },\n        rpId: 'relying-party.example',\n        paymentEntitiesLogos: [{\n          url: '',\n          label: 'Payment Entity Label',\n        }],\n      },\n    }], details);\n  }" did not throw
+[FAIL] Invalid url field in a PaymentEntityLogo throws exception.
+  assert_throws_js: function "() => {\n    new PaymentRequest([{\n      supportedMethods: 'secure-payment-confirmation',\n      data: {\n        credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],\n        challenge: Uint8Array.from('x', c => c.charCodeAt(0)),\n        payeeOrigin: window.location.origin,\n        timeout: 60000,\n        instrument: {\n          displayName: 'X',\n          icon: 'https://example.test/icon.png',\n        },\n        rpId: 'relying-party.example',\n        paymentEntitiesLogos: [{\n          url: 'thisisnotaurl',\n          label: 'Payment Entity Label',\n        }],\n      },\n    }], details);\n  }" did not throw
+[FAIL] Empty logo field in a PaymentEntityLogo throws exception.
+  assert_throws_js: function "() => {\n    new PaymentRequest([{\n      supportedMethods: 'secure-payment-confirmation',\n      data: {\n        credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],\n        challenge: Uint8Array.from('x', c => c.charCodeAt(0)),\n        payeeOrigin: window.location.origin,\n        timeout: 60000,\n        instrument: {\n          displayName: 'X',\n          icon: 'https://example.test/icon.png',\n        },\n        rpId: 'relying-party.example',\n        paymentEntitiesLogos: [{\n          url: 'https://example.test/logo.png',\n          label: '',\n        }],\n      },\n    }], details);\n  }" did not throw
 Harness: the test ran to completion.
 
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https.html b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https.html
index ecf432b2..5d34f68f 100644
--- a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https.html
+++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/constructor-validate-payment-method-data.https.html
@@ -376,4 +376,91 @@
     }], details);
   });
 }, 'Non-HTTPS payee origin throws exception.');
+
+test(() => {
+  new PaymentRequest([{
+    supportedMethods: 'secure-payment-confirmation',
+    data: {
+      credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],
+      challenge: Uint8Array.from('x', c => c.charCodeAt(0)),
+      payeeOrigin: window.location.origin,
+      timeout: 60000,
+      instrument: {
+        displayName: 'X',
+        icon: 'https://example.test/icon.png',
+      },
+      rpId: 'relying-party.example',
+      paymentEntitiesLogos: [],
+    },
+  }], details);
+}, 'Empty paymentEntitiesLogo field is valid.');
+
+test(() => {
+  assert_throws_js(TypeError, () => {
+    new PaymentRequest([{
+      supportedMethods: 'secure-payment-confirmation',
+      data: {
+        credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],
+        challenge: Uint8Array.from('x', c => c.charCodeAt(0)),
+        payeeOrigin: window.location.origin,
+        timeout: 60000,
+        instrument: {
+          displayName: 'X',
+          icon: 'https://example.test/icon.png',
+        },
+        rpId: 'relying-party.example',
+        paymentEntitiesLogos: [{
+          url: '',
+          label: 'Payment Entity Label',
+        }],
+      },
+    }], details);
+  });
+}, 'Empty url field in a PaymentEntityLogo throws exception.');
+
+test(() => {
+  assert_throws_js(TypeError, () => {
+    new PaymentRequest([{
+      supportedMethods: 'secure-payment-confirmation',
+      data: {
+        credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],
+        challenge: Uint8Array.from('x', c => c.charCodeAt(0)),
+        payeeOrigin: window.location.origin,
+        timeout: 60000,
+        instrument: {
+          displayName: 'X',
+          icon: 'https://example.test/icon.png',
+        },
+        rpId: 'relying-party.example',
+        paymentEntitiesLogos: [{
+          url: 'thisisnotaurl',
+          label: 'Payment Entity Label',
+        }],
+      },
+    }], details);
+  });
+}, 'Invalid url field in a PaymentEntityLogo throws exception.');
+
+test(() => {
+  assert_throws_js(TypeError, () => {
+    new PaymentRequest([{
+      supportedMethods: 'secure-payment-confirmation',
+      data: {
+        credentialIds: [Uint8Array.from('x', c => c.charCodeAt(0))],
+        challenge: Uint8Array.from('x', c => c.charCodeAt(0)),
+        payeeOrigin: window.location.origin,
+        timeout: 60000,
+        instrument: {
+          displayName: 'X',
+          icon: 'https://example.test/icon.png',
+        },
+        rpId: 'relying-party.example',
+        paymentEntitiesLogos: [{
+          url: 'https://example.test/logo.png',
+          label: '',
+        }],
+      },
+    }], details);
+  });
+}, 'Empty logo field in a PaymentEntityLogo throws exception.');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/sync-network-logo.png b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/sync-network-logo.png
new file mode 100644
index 0000000..91212531
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/sync-network-logo.png
Binary files differ
diff --git a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/utils.sub.js b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/utils.sub.js
index ab7407f..6d66a21 100644
--- a/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/utils.sub.js
+++ b/third_party/blink/web_tests/external/wpt/secure-payment-confirmation/utils.sub.js
@@ -15,6 +15,9 @@
 const ICON_DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAYAAADskT9PAAAAAXNSR0IArs4c6QAAA+lJREFUSEvtlmtQVGUYx3/n7I1dLgtSsIm4ss1EogM4Uanp6IeGqQ81Do0xECyWxKTkWAxDOkmCDYSOmUZjph8wyj7gTDT1oYnJC3ITYrSLkgMul1lCLsouugvs7tnd5pwJx6ZZ40NDfeg5H95z5rzzPv/n8v+/j2C1Wsubmpr26nQ6FQtoHo/Hn5mZWSmYTCbJ6XSqZmdnF9A96PV6jEajXzCbzcGhoaEFdT7nzGw28z+AkBmIioyguLCAXtsAX37zLcFg8B8vU8gSqFQiqSnLOXGkhkH7b+QV7USSJDRaDT6fhCAIqESRWY8HjSigFUU8gQAiAt5AAK1Wg0qlwu/34/X6lP06nVZZJZ+ET5KUYEICyFiVSumOIh6xWLjjcnHmQhtnW9rJ2fQ8Z1vbUKnUrExJpurAEfIS4ticEM9hm52Hw8M4OTRCbl4O6SnJ/HT1GsfrvyBx8UO8sa0Qg17HZ6e/or2z+/4ArNkvUJifTWR4BMNjo3R2/4hjcootuVncdk0jCkE6f+7hZt2nHEg2MyKIvHWlj/oUC7X2US6lpvP6ViujYzfJshbxZvGrvPjcMwwOj7J1Rym3Xa77AzAY9ByqKicjLZWyvdW0dHSxv3I3G9Y8wa+9NuobGhnp7+e75cswCAKbu69w3TXN92tXYdKoyR6+xa6DVQR9EiXl71K9p4xwg5491e9zrqX9bi+FLIFOp+N03VEWm+IpKC6hzzbAqU8+xGJOpKyyhjPNrcRpVfQ/u4HxGQ8Z57sQgMbVaayN1LP+hx62VVWSnLSU1o4uNq5bw8Xuy5S8vQ+P1/v3AIxRETTUHSM22khzRxefNzTy0f59+P0BNuUXMulwKo33cfqjFMQt4uWrNp56IJqC+BguuGbJar9Mbn4Or215iWAgiGPKyc5dFfT0Xv8Tk0JmQKNRU2TN5cnH0hHVao6fPMX2V/IZHZ+g9J0qhRGypRkjKU1K4OsJB9stS7jlclM7PEbzhIP1qx/n8HsVSmbOtV7kYO0xboxPzA+ATJfIiHCijVEIgojD6SR2UQwej1eJXvJLzMmCUaPGHwhiCtPi8PqwrFzBssQE0lNX8PTGdQwM2fng6AkmHVNc67PND4AoiiQtXYLBYFC4OzMzo/Da5Z5WgEAQr1dSKGqMivrj0CBut5uait2YHowlTKfD4bxDxf5DXPqlR9nj8/nmB0DepdFoFLGRHcvCISuhnE75W36XH7knRFFQQMqm1WgpLrQSYTBgH7nB+bYO+gftf3E878tIPlhxfM96bwhz8jwHQP4XE21UgHt9PtzT00iSP6SE/zduQ3kgmZqaUsl1Xki7O5D82yPZ7y210ZoMhOgBAAAAAElFTkSuQmCC';
 const INVALID_ICON_DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAUCAYAAADskT9PAAAAAXNSR0IArs4c6QAAA+lJREFUSEvtlmtQVGUYx3/n7I1dLgtSsIm4ss1EogM4Uanp6IeGqQ81Do0xECyWxKTkWAxDOkmCDYSOmUZjph8wyj7gTDT1oYnJC3ITYrSLkgMul1lCLsouugvs7tnd5pwJx6ZZ40NDfeg5H95z5rzzPv/n8v+/j2C1Wsubmpr26nQ6FQtoHo/Hn5mZWSmYTCbJ6XSqZmdnF9A96PV6jEajXzCbzcGhoaEFdT7nzGw28z+AkBmIioyguLCAXtsAX37zLcFg8B8vU8gSqFQiqSnLOXGkhkH7b+QV7USSJDRaDT6fhCAIqESRWY8HjSigFUU8gQAiAt5AAK1Wg0qlwu/34/X6lP06nVZZJZ+ET5KUYEICyFiVSumOIh6xWLjjcnHmQhtnW9rJ2fQ8Z1vbUKnUrExJpurAEfIS4ticEM9hm52Hw8M4OTRCbl4O6SnJ/HT1GsfrvyBx8UO8sa0Qg17HZ6e/or2z+/4ArNkvUJifTWR4BMNjo3R2/4hjcootuVncdk0jCkE6f+7hZt2nHEg2MyKIvHWlj/oUC7X2US6lpvP6ViujYzfJshbxZvGrvPjcThisIsNonsenseG9Y8wa+9NuobGhnp7+e75cswCAKbu69w3TXN92tXYdKoyR6+xa6DVQR9EiXl71K9p4xwg5491e9zrqX9bi+FLIFOp+N03VEWm+IpKC6hzzbAqU8+xGJOpKyyhjPNrcRpVfQ/u4HxGQ8Z57sQgMbVaayN1LP+hx62VVWSnLSU1o4uNq5bw8Xuy5S8vQ+P1/v3AIxRETTUHSM22khzRxefNzTy0f59+P0BNuUXMulwKo33cfqjFMQt4uWrNp56IJqC+BguuGbJar9Mbn4Or215iWAgiGPKyc5dFfT0Xv8Tk0JmQKNRU2TN5cnH0hHVao6fPMX2V/IZHZ+g9J0qhRGypRkjKU1K4OsJB9stS7jlclM7PEbzhIP1qx/n8HsVSmbOtV7kYO0xboxPzA+ATJfIiHCijVEIgojD6SR2UQwej1eJXvJLzMmCUaPGHwhiCtPi8PqwrFzBssQE0lNX8PTGdQwM2fng6AkmHVNc67PND4AoiiQtXYLBYFC4OzMzo/Da5Z5WgEAQr1dSKGqMivrj0CBut5uait2YHowlTKfD4bxDxf5DXPqlR9nj8/nmB0DepdFoFLGRHcvCISuhnE75W36XH7knRFFQQMqm1WgpLrQSYTBgH7nB+bYO+gftf3E878tIPlhxfM96bwhz8jwHQP4XE21UgHt9PtzT00iSP6SE/zduQ3kgmZqaUsl1Xki7O5D82yPZ7y210ZoMhOgBAAAAAElFTkSuQmCC';
 
+const PAYMENT_ENTITY_LOGO_URL = 'https://{{hosts[][www]}}:{{ports[https][0]}}/secure-payment-confirmation/sync-network-logo.png';
+const NONEXISTENT_PAYMENT_ENTITY_LOGO_URL = 'https://{{hosts[][www]}}:{{ports[https][0]}}/secure-payment-confirmation/nonexistent.png';
+
 // Creates and returns a WebAuthn credential, optionally with the payment
 // extension set.
 //
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/smoke/tentative/late-url-change.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/smoke/tentative/late-url-change.html
new file mode 100644
index 0000000..fbd0465
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/smoke/tentative/late-url-change.html
@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<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>
+<script src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script>
+
+<button id="navigateButton">Click here!</button>
+<div id="content"></div>
+
+<script>
+  promise_test(async t => {
+    const URL = '/late-url-change';
+
+    navigateButton.addEventListener("click", async () => {
+      content.innerHTML = '<img src="/images/lcp-256x256.png" elementtiming="test-image"></img>';
+
+      const entries = await new Promise(resolve => {
+        new PerformanceObserver((list, observer) => {
+          resolve(list.getEntries());
+          observer.disconnect();
+        }).observe({type: 'element', buffered: true});
+      });
+      assert_equals(
+          entries.length, 1, 'Expected exactly one ElementTiming entry');
+      assert_equals(
+          entries[0].identifier, 'test-image', 'Unexpected ElementTiming entry.');
+      history.pushState({}, '', URL);
+    }, {once: true});
+
+    const softNavPromise = SoftNavigationTestHelper.getPerformanceEntries(
+      /*type=*/ "soft-navigation",
+      /*include_soft_navigation_observations=*/ false,
+      /*min_num_entries=*/ 1,
+    );
+
+    if (test_driver) {
+      test_driver.click(navigateButton);
+    }
+
+    const helper = new SoftNavigationTestHelper(t);
+    const entries = await helper.withTimeoutMessage(
+        softNavPromise, "Soft navigation entry never arrived.", 3000);
+    assert_equals(entries.length, 1, 'Expected exactly one soft navigation.');
+    assert_true(
+        entries[0].name.endsWith(URL),
+        'Unexpected Soft Navigation URL.');
+  }, 'Soft Navigation Detection supports setting URL after paint');
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements-expected.txt b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements-expected.txt
new file mode 100644
index 0000000..b74a8cd
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements-expected.txt
@@ -0,0 +1,5 @@
+This is a testharness.js-based test.
+[FAIL] Get Bounding Client Rect
+  assert_equals: g1 expected 10 but got 45
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements.html b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements.html
index 41f3fb6..c45542d2 100644
--- a/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements.html
+++ b/third_party/blink/web_tests/external/wpt/svg/geometry/svg-get-bounding-client-rect-in-non-rendered-elements.html
@@ -22,6 +22,13 @@
   <g>
     <rect id="rect6" width="10" height="10" />
   </g>
+  <g id="g1">
+    <rect x="5" y="5" width="10" height="10"/>
+    <g>
+      <!-- This rect has neither fill, nor stroke so has no bounds. -->
+      <rect x="20" y="20" width="30" height="30" fill="none"/>
+    </g>
+  </g>
 </svg>
 <script>
   let rect1 = document.getElementById("rect1"),
@@ -30,7 +37,8 @@
     rect4 = document.getElementById("rect4");
     rect5 = document.getElementById("rect5"),
     rect6 = document.getElementById("rect6"),
-    symbol = document.getElementById("symbol");
+    symbol = document.getElementById("symbol"),
+    g1 = document.getElementById("g1");
 
   test(function () {
     assert_equals(rect1.getBoundingClientRect().width, 0, "rect1");
@@ -40,6 +48,7 @@
     assert_equals(rect5.getBoundingClientRect().width, 0, "rect5");
     assert_equals(rect6.getBoundingClientRect().width, 10, "rect6");
     assert_equals(symbol.getBoundingClientRect().width, 0, "symbol");
+    assert_equals(g1.getBoundingClientRect().width, 10, "g1");
 
     assert_equals(rect1.getBoundingClientRect().height, 0, "rect1");
     assert_equals(rect2.getBoundingClientRect().height, 0, "rect2");
@@ -48,5 +57,6 @@
     assert_equals(rect5.getBoundingClientRect().height, 0, "rect5");
     assert_equals(rect6.getBoundingClientRect().height, 10, "rect6");
     assert_equals(symbol.getBoundingClientRect().height, 0, "symbol");
+    assert_equals(g1.getBoundingClientRect().height, 10, "g1");
   }, "Get Bounding Client Rect");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html
index fee3f1e..6dabf07 100644
--- a/third_party/blink/web_tests/external/wpt/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html
+++ b/third_party/blink/web_tests/external/wpt/web-animations/timing-model/animations/setting-the-start-time-of-an-animation.html
@@ -325,5 +325,58 @@
 }, 'Setting the start time on a reverse running animation updates the play '
    + 'state');
 
+promise_test(async t => {
+  const make_animation = () => createDiv(t).animate(null, 100 * MS_PER_SEC);
+
+  // Wait for a couple of page rendering updates to run and record the timeline time.
+  await waitForAnimationFrames(2);
+  const timelineTimeForFirstPageRenderingUpdate = document.timeline.currentTime;
+
+  // Create a first animation that is created during the page rendering update.
+  // This animation should have its start time set to the current timeline time.
+  const animStartedDuringPageRenderingUpdate = make_animation();
+
+  // Wait for a new JS call frame and start another animation. This animation
+  // should have its start time set to the timeline time of the next page
+  // rendering update.
+  await new Promise(setTimeout);
+  const animStartedAfterTimeout = make_animation();
+
+  // Wait for another new JS call frame and start another animation. This
+  // animation, like the previous one, should have its start time set to
+  // the timeline time of the next page rendering update.
+  await new Promise(setTimeout);
+  const animStartedAfterAnotherTimeout = make_animation();
+
+  // Now wait until the next page rendering update and record the timeline time.
+  await waitForAnimationFrames(1);
+  const timelineTimeForSecondPageRenderingUpdate = document.timeline.currentTime;
+
+  // Create an animation that is created during this second page rendering update.
+  // This animation should have its start time set to the new timeline time.
+  const animStartedDuringSecondPageRenderingUpdate = make_animation();
+
+  // All animations should be ready by the next animation frame.
+  await waitForAnimationFrames(1);
+
+  const assert_start_time = (animation, expected, description) => {
+    assert_approx_equals(animation.startTime, expected, 0.0001,
+      `Start time of animation started ${description}`);
+  };
+
+  assert_start_time(animStartedDuringPageRenderingUpdate,
+    timelineTimeForFirstPageRenderingUpdate,
+    "during the first page rendering update");
+  assert_start_time(animStartedAfterTimeout,
+    timelineTimeForSecondPageRenderingUpdate,
+    "after waiting for a new JS call frame");
+  assert_start_time(animStartedAfterAnotherTimeout,
+    timelineTimeForSecondPageRenderingUpdate,
+    "after waiting for another new JS call frame");
+  assert_start_time(animStartedDuringSecondPageRenderingUpdate,
+    timelineTimeForSecondPageRenderingUpdate,
+    "during the second page rendering update");
+}, 'Checking the start time of animations started at various times between two page rendering updates');
+
 </script>
 </body>
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/emulation/set_locale_override/contexts.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/emulation/set_locale_override/contexts.py
index 9cc395e4..3a3fa52 100644
--- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/emulation/set_locale_override/contexts.py
+++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/emulation/set_locale_override/contexts.py
@@ -47,3 +47,46 @@
     # Assert the locale is restored to the initial one.
     assert await get_current_locale(new_tab) == default_locale
     assert await get_current_locale(new_context) == default_locale
+
+
+@pytest.mark.parametrize("domain", ["", "alt"], ids=["same_origin", "cross_origin"])
+async def test_iframe(
+    bidi_session,
+    new_tab,
+    get_current_locale,
+    some_locale,
+    domain,
+    inline,
+    another_locale,
+):
+    # Set locale override.
+    await bidi_session.emulation.set_locale_override(
+        contexts=[new_tab["context"]], locale=some_locale
+    )
+
+    # Assert locale emulated in the required context.
+    assert await get_current_locale(new_tab) == some_locale
+
+    iframe_url = inline("<div id='in-iframe'>foo</div>", domain=domain)
+    page_url = inline(f"<iframe src='{iframe_url}'></iframe>")
+
+    # Load the page with iframes.
+    await bidi_session.browsing_context.navigate(
+        context=new_tab["context"],
+        url=page_url,
+        wait="complete",
+    )
+
+    contexts = await bidi_session.browsing_context.get_tree(root=new_tab["context"])
+    iframe = contexts[0]["children"][0]
+
+    # Assert locale is emulated in the iframe context.
+    assert await get_current_locale(iframe) == some_locale
+
+    # Set another locale override.
+    await bidi_session.emulation.set_locale_override(
+        contexts=[new_tab["context"]], locale=another_locale
+    )
+
+    # Assert locale is emulated in the iframe context.
+    assert await get_current_locale(iframe) == another_locale
diff --git a/third_party/catapult b/third_party/catapult
index 5b2aa83..1addc95 160000
--- a/third_party/catapult
+++ b/third_party/catapult
@@ -1 +1 @@
-Subproject commit 5b2aa8309e962decb237aefa7e3c39df5f38dfcf
+Subproject commit 1addc95539476f179b854ae82c1ae6aa7bdffcbc
diff --git a/third_party/crashpad/crashpad/client/BUILD.gn b/third_party/crashpad/crashpad/client/BUILD.gn
index a3ccc71..e57e0e0c 100644
--- a/third_party/crashpad/crashpad/client/BUILD.gn
+++ b/third_party/crashpad/crashpad/client/BUILD.gn
@@ -221,8 +221,8 @@
     "../compat",
     "../snapshot",
     "../test",
+    "../third_party/googletest",
     "../third_party/googletest:googlemock",
-    "../third_party/googletest:googletest",
     "../util",
   ]
 
diff --git a/third_party/crashpad/crashpad/handler/BUILD.gn b/third_party/crashpad/crashpad/handler/BUILD.gn
index 99f47015..b3fc5d1 100644
--- a/third_party/crashpad/crashpad/handler/BUILD.gn
+++ b/third_party/crashpad/crashpad/handler/BUILD.gn
@@ -142,7 +142,7 @@
     "../snapshot",
     "../snapshot:test_support",
     "../test",
-    "../third_party/googletest:googletest",
+    "../third_party/googletest",
     "../third_party/mini_chromium:base",
     "../util",
   ]
@@ -285,7 +285,7 @@
     deps = [
       "../client",
       "../test",
-      "../third_party/googletest:googletest",
+      "../third_party/googletest",
       "../third_party/mini_chromium:base",
     ]
   }
diff --git a/third_party/crashpad/crashpad/handler/win/wer/BUILD.gn b/third_party/crashpad/crashpad/handler/win/wer/BUILD.gn
index 71c0126..084d209 100644
--- a/third_party/crashpad/crashpad/handler/win/wer/BUILD.gn
+++ b/third_party/crashpad/crashpad/handler/win/wer/BUILD.gn
@@ -40,9 +40,9 @@
   deps = [
     ":crashpad_wer",
     ":crashpad_wer_handler",
-    "../../../client:client",
-    "../../../test:test",
-    "../../../third_party/googletest:googletest",
+    "../../../client",
+    "../../../test",
+    "../../../third_party/googletest",
     "../../../util:util_registration_protocol",
   ]
 }
diff --git a/third_party/crashpad/crashpad/minidump/BUILD.gn b/third_party/crashpad/crashpad/minidump/BUILD.gn
index 6c4a1aa3..5b235aa 100644
--- a/third_party/crashpad/crashpad/minidump/BUILD.gn
+++ b/third_party/crashpad/crashpad/minidump/BUILD.gn
@@ -138,7 +138,7 @@
     "$mini_chromium_source_parent:base",
     "../snapshot:test_support",
     "../test",
-    "../third_party/googletest:googletest",
+    "../third_party/googletest",
     "../util",
   ]
 
@@ -182,7 +182,7 @@
     "$mini_chromium_source_parent:base",
     "../snapshot:test_support",
     "../test",
-    "../third_party/googletest:googletest",
+    "../third_party/googletest",
     "../util",
   ]
 
diff --git a/third_party/crashpad/crashpad/snapshot/BUILD.gn b/third_party/crashpad/crashpad/snapshot/BUILD.gn
index 2ae944c..5ae9c10 100644
--- a/third_party/crashpad/crashpad/snapshot/BUILD.gn
+++ b/third_party/crashpad/crashpad/snapshot/BUILD.gn
@@ -286,7 +286,7 @@
     deps = [
       ":snapshot",
       "$mini_chromium_source_parent:base",
-      "../util:util",
+      "../util",
     ]
     seed_corpus = "elf/elf_image_reader_fuzzer_corpus"
   }
@@ -436,8 +436,8 @@
     "../compat",
     "../minidump:format",
     "../test",
+    "../third_party/googletest",
     "../third_party/googletest:googlemock",
-    "../third_party/googletest:googletest",
     "../util",
   ]
 
diff --git a/third_party/crashpad/crashpad/test/BUILD.gn b/third_party/crashpad/crashpad/test/BUILD.gn
index 20ad67e..5d35284 100644
--- a/third_party/crashpad/crashpad/test/BUILD.gn
+++ b/third_party/crashpad/crashpad/test/BUILD.gn
@@ -135,7 +135,7 @@
   deps = [
     "$mini_chromium_source_parent:base",
     "../compat",
-    "../third_party/googletest:googletest",
+    "../third_party/googletest",
     "../util",
   ]
 
@@ -214,8 +214,8 @@
     ":test",
     "$mini_chromium_source_parent:base",
     "../compat",
+    "../third_party/googletest",
     "../third_party/googletest:googlemock",
-    "../third_party/googletest:googletest",
     "../util",
   ]
 
@@ -249,8 +249,8 @@
     ":test",
     "$mini_chromium_source_parent:base",
     "$mini_chromium_source_parent:base_test_support",
+    "../third_party/googletest",
     "../third_party/googletest:googlemock",
-    "../third_party/googletest:googletest",
   ]
   if (crashpad_is_android) {
     deps += [ "../util" ]
@@ -269,7 +269,7 @@
     ":test",
     "$mini_chromium_source_parent:base",
     "$mini_chromium_source_parent:base_test_support",
-    "../third_party/googletest:googletest",
+    "../third_party/googletest",
   ]
   if (crashpad_is_android) {
     deps += [ "../util" ]
diff --git a/third_party/crashpad/crashpad/test/ios/BUILD.gn b/third_party/crashpad/crashpad/test/ios/BUILD.gn
index 6b1deca..ba4c5271 100644
--- a/third_party/crashpad/crashpad/test/ios/BUILD.gn
+++ b/third_party/crashpad/crashpad/test/ios/BUILD.gn
@@ -58,7 +58,7 @@
     ":google_test_runner_shared_headers",
     "../$mini_chromium_source_parent:base",
     "../../build:apple_enable_arc",
-    "../../third_party/googletest:googletest",
+    "../../third_party/googletest",
   ]
   frameworks = [ "UIKit.framework" ]
 }
diff --git a/third_party/crashpad/crashpad/util/BUILD.gn b/third_party/crashpad/crashpad/util/BUILD.gn
index 31eb3d7..5c15d647 100644
--- a/third_party/crashpad/crashpad/util/BUILD.gn
+++ b/third_party/crashpad/crashpad/util/BUILD.gn
@@ -939,8 +939,8 @@
     "../client",
     "../compat",
     "../test",
+    "../third_party/googletest",
     "../third_party/googletest:googlemock",
-    "../third_party/googletest:googletest",
     "../third_party/zlib",
   ]
 
diff --git a/third_party/dawn b/third_party/dawn
index fb4d361..564c7c9 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit fb4d36177feeea4831be2d0ba5d845149ac4f105
+Subproject commit 564c7c94378c0ef081277fe57ca14a2d9dc35476
diff --git a/third_party/freetype/BUILD.gn b/third_party/freetype/BUILD.gn
index ee785cc..3762c0f 100644
--- a/third_party/freetype/BUILD.gn
+++ b/third_party/freetype/BUILD.gn
@@ -67,7 +67,7 @@
 }
 
 component("freetype") {
-  visibility = [ "//build/config/freetype:freetype" ]
+  visibility = [ "//build/config/freetype" ]
 
   defines = []
   include_dirs = []
diff --git a/third_party/google-truth/BUILD.gn b/third_party/google-truth/BUILD.gn
index bc47466..49269b2de 100644
--- a/third_party/google-truth/BUILD.gn
+++ b/third_party/google-truth/BUILD.gn
@@ -80,6 +80,6 @@
     "//third_party/android_deps:com_google_errorprone_error_prone_annotations_java",
     "//third_party/android_deps:guava_android_java",
     "//third_party/android_deps:org_checkerframework_checker_qual_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
   ]
 }
diff --git a/third_party/grpc/BUILD.gn b/third_party/grpc/BUILD.gn
index b4672217..065d164 100644
--- a/third_party/grpc/BUILD.gn
+++ b/third_party/grpc/BUILD.gn
@@ -1536,9 +1536,8 @@
     "//third_party/abseil-cpp:absl",
     "//third_party/boringssl",
     "//third_party/protobuf:protobuf_lite",
-    "//third_party/re2:re2",
+    "//third_party/re2",
     "//third_party/zlib",
-    "//third_party/zlib:zlib",
   ]
   allow_circular_includes_from = [ ":upb_reflection_internal_lib" ]
   public_configs = [ ":grpc_config" ]
@@ -2396,9 +2395,8 @@
     "//third_party/abseil-cpp:absl",
     "//third_party/boringssl",
     "//third_party/protobuf:protobuf_lite",
-    "//third_party/re2:re2",
+    "//third_party/re2",
     "//third_party/zlib",
-    "//third_party/zlib:zlib",
   ]
   public_configs = [ ":grpc_config" ]
   configs += [ ":grpc_config_private" ]
@@ -2504,9 +2502,8 @@
     "//third_party/abseil-cpp:absl",
     "//third_party/boringssl",
     "//third_party/protobuf:protobuf_lite",
-    "//third_party/re2:re2",
+    "//third_party/re2",
     "//third_party/zlib",
-    "//third_party/zlib:zlib",
   ]
   public_configs = [ ":grpc_config" ]
   configs += [ ":grpc_config_private" ]
@@ -2543,9 +2540,8 @@
     "//third_party/abseil-cpp:absl",
     "//third_party/boringssl",
     "//third_party/protobuf:protobuf_lite",
-    "//third_party/re2:re2",
+    "//third_party/re2",
     "//third_party/zlib",
-    "//third_party/zlib:zlib",
   ]
   public_configs = [ ":grpc_config" ]
   configs += [ ":grpc_config_private" ]
@@ -2567,9 +2563,8 @@
     "//third_party/abseil-cpp:absl",
     "//third_party/boringssl",
     "//third_party/protobuf:protobuf_lite",
-    "//third_party/re2:re2",
+    "//third_party/re2",
     "//third_party/zlib",
-    "//third_party/zlib:zlib",
   ]
   public_configs = [ ":grpc_config" ]
   configs += [ ":grpc_config_private" ]
@@ -2589,9 +2584,8 @@
     "//third_party/abseil-cpp:absl",
     "//third_party/boringssl",
     "//third_party/protobuf:protobuf_lite",
-    "//third_party/re2:re2",
+    "//third_party/re2",
     "//third_party/zlib",
-    "//third_party/zlib:zlib",
   ]
   public_configs = [ ":grpc_config" ]
   configs += [ ":grpc_config_private" ]
diff --git a/third_party/hunspell/BUILD.gn b/third_party/hunspell/BUILD.gn
index 533da3eb..0125a29 100644
--- a/third_party/hunspell/BUILD.gn
+++ b/third_party/hunspell/BUILD.gn
@@ -122,7 +122,7 @@
   ]
   deps = [
     ":hunspell",
-    "//base:base",
+    "//base",
   ]
 
   # This is a dictionary for the fuzzer, not a spellcheck dictionary.
@@ -136,7 +136,7 @@
   ]
   deps = [
     ":hunspell",
-    "//base:base",
+    "//base",
   ]
 
   # This is a dictionary for the fuzzer, not a spellcheck dictionary.
@@ -147,7 +147,7 @@
   sources = [ "fuzz/bdict_fuzzer.cc" ]
   deps = [
     ":hunspell",
-    "//base:base",
+    "//base",
   ]
   seed_corpus = "fuzz/bdict_corpus"
 }
diff --git a/third_party/jni_zero/java_refs.h b/third_party/jni_zero/java_refs.h
index 4b91ee6..b334639 100644
--- a/third_party/jni_zero/java_refs.h
+++ b/third_party/jni_zero/java_refs.h
@@ -155,7 +155,7 @@
   // Only defined for JavaRef<jobjectArray>.
   // You must pass the type of the array elements (usually jobject) as the
   // template parameter.
-  template <typename ElementType,
+  template <typename ElementType = jobject,
             typename T_ = T,
             typename = std::enable_if_t<std::is_same_v<T_, jobjectArray>>>
   JavaObjectArrayReader<ElementType> ReadElements() const {
diff --git a/third_party/libc++/src b/third_party/libc++/src
index ed0f32e..be9dd89 160000
--- a/third_party/libc++/src
+++ b/third_party/libc++/src
@@ -1 +1 @@
-Subproject commit ed0f32ee7a8d9481bfd26cfa6f5940b9f296f371
+Subproject commit be9dd89ffbfdf2b6cf6b9c5ec076d6adbc5d25a6
diff --git a/third_party/liburlpattern/BUILD.gn b/third_party/liburlpattern/BUILD.gn
index f68354922..eaed1d6e 100644
--- a/third_party/liburlpattern/BUILD.gn
+++ b/third_party/liburlpattern/BUILD.gn
@@ -12,9 +12,9 @@
 component("liburlpattern") {
   defines = [ "IS_LIBURLPATTERN_IMPL" ]
   public_deps = [
-    "//base:base",
+    "//base",
     "//third_party/abseil-cpp:absl",
-    "//third_party/icu:icu",
+    "//third_party/icu",
   ]
 
   configs += [ ":warnings" ]
@@ -43,7 +43,7 @@
     "//base/test:run_all_unittests",
     "//testing/gtest",
     "//third_party/abseil-cpp:absl",
-    "//third_party/icu:icu",
+    "//third_party/icu",
   ]
 
   # Note, also update the local modifications in README.chromium.
diff --git a/third_party/libwebp/BUILD.gn b/third_party/libwebp/BUILD.gn
index 6c577df3..003bc93 100644
--- a/third_party/libwebp/BUILD.gn
+++ b/third_party/libwebp/BUILD.gn
@@ -759,7 +759,7 @@
   deps = [
     ":libwebp_dsp_headers",
     ":libwebp_webp",
-    "//third_party/fuzztest:fuzztest",
+    "//third_party/fuzztest",
   ]
 }
 
@@ -769,7 +769,7 @@
     ":libwebp",
     ":libwebp_fuzz_utils",
     ":libwebp_webp",
-    "//third_party/fuzztest:fuzztest",
+    "//third_party/fuzztest",
     "//third_party/fuzztest:fuzztest_gtest_main",
   ]
   defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ]
@@ -784,7 +784,7 @@
     ":libwebp_fuzz_utils",
     ":libwebp_utils",
     ":libwebp_webp",
-    "//third_party/fuzztest:fuzztest",
+    "//third_party/fuzztest",
     "//third_party/fuzztest:fuzztest_gtest_main",
   ]
   defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ]
@@ -801,7 +801,7 @@
     ":libwebp_fuzz_utils",
     ":libwebp_utils",
     ":libwebp_webp",
-    "//third_party/fuzztest:fuzztest",
+    "//third_party/fuzztest",
     "//third_party/fuzztest:fuzztest_gtest_main",
   ]
   defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ]
@@ -814,7 +814,7 @@
     ":libwebp",
     ":libwebp_fuzz_utils",
     ":libwebp_webp",
-    "//third_party/fuzztest:fuzztest",
+    "//third_party/fuzztest",
     "//third_party/fuzztest:fuzztest_gtest_main",
   ]
   defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ]
@@ -828,7 +828,7 @@
     ":libwebp_dsp_headers",
     ":libwebp_fuzz_utils",
     ":libwebp_webp",
-    "//third_party/fuzztest:fuzztest",
+    "//third_party/fuzztest",
     "//third_party/fuzztest:fuzztest_gtest_main",
   ]
   defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ]
@@ -842,7 +842,7 @@
     ":libwebp_dsp_headers",
     ":libwebp_fuzz_utils",
     ":libwebp_webp",
-    "//third_party/fuzztest:fuzztest",
+    "//third_party/fuzztest",
     "//third_party/fuzztest:fuzztest_gtest_main",
   ]
   defines = [ "WEBP_MAX_IMAGE_SIZE=838860800" ]
@@ -857,7 +857,7 @@
     ":libwebp_fuzz_utils",
     ":libwebp_utils",
     ":libwebp_webp",
-    "//third_party/fuzztest:fuzztest",
+    "//third_party/fuzztest",
     "//third_party/fuzztest:fuzztest_gtest_main",
   ]
   configs += [ ":libwebp_config" ]
diff --git a/third_party/llvm-libc/BUILD.gn b/third_party/llvm-libc/BUILD.gn
index 91028fd..53fd4104 100644
--- a/third_party/llvm-libc/BUILD.gn
+++ b/third_party/llvm-libc/BUILD.gn
@@ -10,7 +10,7 @@
 
 group("llvm-libc-shared") {
   # llvm-libc is only used as a dependency of libc++.
-  visibility = [ "//buildtools/third_party/libc++:libc++" ]
+  visibility = [ "//buildtools/third_party/libc++" ]
 
   public_configs = [ ":config" ]
 }
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src
index 73cbf2b1..ebfb379 160000
--- a/third_party/llvm-libc/src
+++ b/third_party/llvm-libc/src
@@ -1 +1 @@
-Subproject commit 73cbf2b1662754e29ac2698830b7952c80f22b62
+Subproject commit ebfb379c5464568cd3961cdf60e55dee9f512098
diff --git a/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn b/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn
index b360426..f7ed8ef 100644
--- a/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn
+++ b/third_party/lzma_sdk/C/Util/SfxSetup/BUILD.gn
@@ -9,5 +9,5 @@
     ".",
     "../..",
   ]
-  public_deps = [ "//third_party/lzma_sdk:lzma_sdk" ]
+  public_deps = [ "//third_party/lzma_sdk" ]
 }
diff --git a/third_party/mockito/BUILD.gn b/third_party/mockito/BUILD.gn
index 607d37c..9beefdb 100644
--- a/third_party/mockito/BUILD.gn
+++ b/third_party/mockito/BUILD.gn
@@ -39,7 +39,7 @@
     # earlier in the classpath.
     "//third_party/android_deps:org_mockito_mockito_android_java",
     "//third_party/android_deps:org_mockito_mockito_core_java",
-    "//third_party/junit:junit",
+    "//third_party/junit",
   ]
   sources = [
     "local/src/main/java/org/mockito/internal/junit/ExceptionFactory.java",
diff --git a/third_party/mutter/BUILD.gn b/third_party/mutter/BUILD.gn
index ccb00c7..71364ca 100644
--- a/third_party/mutter/BUILD.gn
+++ b/third_party/mutter/BUILD.gn
@@ -206,7 +206,7 @@
   public_configs = [ ":mtk_public_config" ]
 
   public_deps = [
-    "//third_party/glib:glib",
+    "//third_party/glib",
     "//third_party/glib:gobject",
   ]
 }
diff --git a/third_party/nearby/BUILD.gn b/third_party/nearby/BUILD.gn
index 840fc4a..e3790616 100644
--- a/third_party/nearby/BUILD.gn
+++ b/third_party/nearby/BUILD.gn
@@ -539,7 +539,7 @@
     ":platform_base_logging",
     ":platform_public_types",
     "//third_party/abseil-cpp:absl",
-    "//third_party/boringssl:boringssl",
+    "//third_party/boringssl",
   ]
   configs -= [ "//build/config/compiler:chromium_code" ]
   configs += [ "//build/config/compiler:no_chromium_code" ]
@@ -589,9 +589,9 @@
   ]
   public_deps = [
     ":platform_base_logging",
-    "//base:base",
+    "//base",
     "//third_party/abseil-cpp:absl",
-    "//third_party/boringssl:boringssl",
+    "//third_party/boringssl",
   ]
   configs -= [ "//build/config/compiler:chromium_code" ]
   configs += [ "//build/config/compiler:no_chromium_code" ]
@@ -742,7 +742,7 @@
   public_deps = [
     ":platform_base",
     ":platform_impl_crypto",
-    "//crypto:crypto",
+    "//crypto",
     "//third_party/abseil-cpp:absl",
   ]
   configs -= [ "//build/config/compiler:chromium_code" ]
@@ -832,7 +832,7 @@
   public_deps = [
     ":platform_base",
     "//third_party/abseil-cpp:absl",
-    "//third_party/boringssl:boringssl",
+    "//third_party/boringssl",
   ]
   configs -= [ "//build/config/compiler:chromium_code" ]
   configs += [ "//build/config/compiler:no_chromium_code" ]
@@ -868,7 +868,7 @@
   public_deps = [
     ":platform_api_platform",
     ":platform_api_types",
-    "//base:base",
+    "//base",
   ]
   configs -= [ "//build/config/compiler:chromium_code" ]
   configs += [ "//build/config/compiler:no_chromium_code" ]
@@ -1007,7 +1007,7 @@
     ":platform_base_util",
     ":platform_mutex",
     ":platform_public_logging",
-    "//crypto:crypto",
+    "//crypto",
     "//third_party/abseil-cpp:absl",
   ]
   configs -= [ "//build/config/compiler:chromium_code" ]
@@ -1218,7 +1218,7 @@
     ":presence_mediums",
     ":presence_types",
     "//third_party/abseil-cpp:absl",
-    "//third_party/boringssl:boringssl",
+    "//third_party/boringssl",
   ]
   configs -= [ "//build/config/compiler:chromium_code" ]
   configs += [ "//build/config/compiler:no_chromium_code" ]
diff --git a/third_party/netty-tcnative/BUILD.gn b/third_party/netty-tcnative/BUILD.gn
index 883ee5b..0dc0b21 100644
--- a/third_party/netty-tcnative/BUILD.gn
+++ b/third_party/netty-tcnative/BUILD.gn
@@ -27,7 +27,7 @@
   configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
   deps = [
     "//third_party/apache-portable-runtime:apr",
-    "//third_party/boringssl:boringssl",
+    "//third_party/boringssl",
   ]
 }
 
diff --git a/third_party/perfetto b/third_party/perfetto
index 9231d0a..83bcbbb 160000
--- a/third_party/perfetto
+++ b/third_party/perfetto
@@ -1 +1 @@
-Subproject commit 9231d0a42f8fc75aa3ba973269f3ee9a0c195b95
+Subproject commit 83bcbbbf67ed17934ddd3b667ed19c120c9ed504
diff --git a/third_party/polymer/v3_0/components-chromium/iron-a11y-keys/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-a11y-keys/BUILD.gn
index 809696a8..c77990e 100644
--- a/third_party/polymer/v3_0/components-chromium/iron-a11y-keys/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/iron-a11y-keys/BUILD.gn
@@ -8,7 +8,7 @@
 
 js_library("iron-a11y-keys") {
   deps = [
-    "../iron-a11y-keys-behavior:iron-a11y-keys-behavior",
+    "../iron-a11y-keys-behavior",
     "../polymer:polymer_bundled",
   ]
 }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-collapse/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-collapse/BUILD.gn
index 6c372785..ac3e997 100644
--- a/third_party/polymer/v3_0/components-chromium/iron-collapse/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/iron-collapse/BUILD.gn
@@ -8,7 +8,7 @@
 
 js_library("iron-collapse") {
   deps = [
-    "../iron-resizable-behavior:iron-resizable-behavior",
+    "../iron-resizable-behavior",
     "../polymer:polymer_bundled",
   ]
 }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-dropdown/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-dropdown/BUILD.gn
index a55520a..fee0db8a 100644
--- a/third_party/polymer/v3_0/components-chromium/iron-dropdown/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/iron-dropdown/BUILD.gn
@@ -8,9 +8,9 @@
 
 js_library("iron-dropdown") {
   deps = [
-    "../iron-a11y-keys-behavior:iron-a11y-keys-behavior",
+    "../iron-a11y-keys-behavior",
     "../iron-behaviors:iron-control-state",
-    "../iron-overlay-behavior:iron-overlay-behavior",
+    "../iron-overlay-behavior",
     "../neon-animation:neon-animation-runner-behavior",
     "../polymer:polymer_bundled",
   ]
diff --git a/third_party/polymer/v3_0/components-chromium/iron-icon/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-icon/BUILD.gn
index b473919..d060f5d 100644
--- a/third_party/polymer/v3_0/components-chromium/iron-icon/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/iron-icon/BUILD.gn
@@ -8,7 +8,7 @@
 
 js_library("iron-icon") {
   deps = [
-    "../iron-meta:iron-meta",
+    "../iron-meta",
     "../polymer:polymer_bundled",
   ]
 }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-iconset-svg/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-iconset-svg/BUILD.gn
index 2a489069..b3a9155f 100644
--- a/third_party/polymer/v3_0/components-chromium/iron-iconset-svg/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/iron-iconset-svg/BUILD.gn
@@ -8,7 +8,7 @@
 
 js_library("iron-iconset-svg") {
   deps = [
-    "../iron-meta:iron-meta",
+    "../iron-meta",
     "../polymer:polymer_bundled",
   ]
 }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-list/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-list/BUILD.gn
index 6309941a2..79dc53e 100644
--- a/third_party/polymer/v3_0/components-chromium/iron-list/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/iron-list/BUILD.gn
@@ -8,9 +8,9 @@
 
 js_library("iron-list") {
   deps = [
-    "../iron-a11y-keys-behavior:iron-a11y-keys-behavior",
-    "../iron-resizable-behavior:iron-resizable-behavior",
-    "../iron-scroll-target-behavior:iron-scroll-target-behavior",
+    "../iron-a11y-keys-behavior",
+    "../iron-resizable-behavior",
+    "../iron-scroll-target-behavior",
     "../polymer:polymer_bundled",
   ]
 }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/BUILD.gn
index fc21821..51f03364 100644
--- a/third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/iron-overlay-behavior/BUILD.gn
@@ -19,8 +19,8 @@
     ".:iron-focusables-helper",
     ".:iron-overlay-manager",
     ".:iron-scroll-manager",
-    "../iron-fit-behavior:iron-fit-behavior",
-    "../iron-resizable-behavior:iron-resizable-behavior",
+    "../iron-fit-behavior",
+    "../iron-resizable-behavior",
     "../polymer:polymer_bundled",
   ]
 }
@@ -28,7 +28,7 @@
 js_library("iron-overlay-manager") {
   deps = [
     ".:iron-overlay-backdrop",
-    "../iron-a11y-keys-behavior:iron-a11y-keys-behavior",
+    "../iron-a11y-keys-behavior",
     "../polymer:polymer_bundled",
   ]
 }
diff --git a/third_party/polymer/v3_0/components-chromium/iron-pages/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-pages/BUILD.gn
index 01e9de66..a77e9e5 100644
--- a/third_party/polymer/v3_0/components-chromium/iron-pages/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/iron-pages/BUILD.gn
@@ -8,7 +8,7 @@
 
 js_library("iron-pages") {
   deps = [
-    "../iron-resizable-behavior:iron-resizable-behavior",
+    "../iron-resizable-behavior",
     "../iron-selector:iron-selectable",
     "../polymer:polymer_bundled",
   ]
diff --git a/third_party/polymer/v3_0/components-chromium/iron-scroll-threshold/BUILD.gn b/third_party/polymer/v3_0/components-chromium/iron-scroll-threshold/BUILD.gn
index 1a86799..f5c7c6d 100644
--- a/third_party/polymer/v3_0/components-chromium/iron-scroll-threshold/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/iron-scroll-threshold/BUILD.gn
@@ -8,7 +8,7 @@
 
 js_library("iron-scroll-threshold") {
   deps = [
-    "../iron-scroll-target-behavior:iron-scroll-target-behavior",
+    "../iron-scroll-target-behavior",
     "../polymer:polymer_bundled",
   ]
 }
diff --git a/third_party/polymer/v3_0/components-chromium/neon-animation/BUILD.gn b/third_party/polymer/v3_0/components-chromium/neon-animation/BUILD.gn
index a387a58..723a197cb 100644
--- a/third_party/polymer/v3_0/components-chromium/neon-animation/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/neon-animation/BUILD.gn
@@ -9,7 +9,7 @@
 js_library("neon-animatable") {
   deps = [
     ".:neon-animatable-behavior",
-    "../iron-resizable-behavior:iron-resizable-behavior",
+    "../iron-resizable-behavior",
     "../polymer:polymer_bundled",
   ]
 }
@@ -21,7 +21,7 @@
 js_library("neon-animated-pages") {
   deps = [
     ".:neon-animation-runner-behavior",
-    "../iron-resizable-behavior:iron-resizable-behavior",
+    "../iron-resizable-behavior",
     "../iron-selector:iron-selectable",
     "../polymer:polymer_bundled",
   ]
diff --git a/third_party/polymer/v3_0/components-chromium/paper-behaviors/BUILD.gn b/third_party/polymer/v3_0/components-chromium/paper-behaviors/BUILD.gn
index 6e8bfcf..77f82a5 100644
--- a/third_party/polymer/v3_0/components-chromium/paper-behaviors/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/paper-behaviors/BUILD.gn
@@ -8,7 +8,7 @@
 
 js_library("paper-ripple-mixin") {
   deps = [
-    "../paper-ripple:paper-ripple",
+    "../paper-ripple",
     "../polymer:polymer_bundled",
   ]
 }
diff --git a/third_party/polymer/v3_0/components-chromium/paper-progress/BUILD.gn b/third_party/polymer/v3_0/components-chromium/paper-progress/BUILD.gn
index 2f16584..07a675c 100644
--- a/third_party/polymer/v3_0/components-chromium/paper-progress/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/paper-progress/BUILD.gn
@@ -8,7 +8,7 @@
 
 js_library("paper-progress") {
   deps = [
-    "../iron-range-behavior:iron-range-behavior",
+    "../iron-range-behavior",
     "../polymer:polymer_bundled",
   ]
 }
diff --git a/third_party/polymer/v3_0/components-chromium/paper-ripple/BUILD.gn b/third_party/polymer/v3_0/components-chromium/paper-ripple/BUILD.gn
index 4119f96a..4834584c 100644
--- a/third_party/polymer/v3_0/components-chromium/paper-ripple/BUILD.gn
+++ b/third_party/polymer/v3_0/components-chromium/paper-ripple/BUILD.gn
@@ -8,7 +8,7 @@
 
 js_library("paper-ripple") {
   deps = [
-    "../iron-a11y-keys-behavior:iron-a11y-keys-behavior",
+    "../iron-a11y-keys-behavior",
     "../polymer:polymer_bundled",
   ]
 }
diff --git a/third_party/private_membership/BUILD.gn b/third_party/private_membership/BUILD.gn
index 5fdbfe8..bd0c9020 100644
--- a/third_party/private_membership/BUILD.gn
+++ b/third_party/private_membership/BUILD.gn
@@ -158,7 +158,7 @@
     public_deps = [
       ":private_membership",
       ":private_membership_proto",
-      "//testing/gmock:gmock",
+      "//testing/gmock",
       "//testing/gtest:gtest_main",
       "//third_party/shell-encryption:shell_encryption_test_library",
     ]
diff --git a/third_party/puffin/BUILD.gn b/third_party/puffin/BUILD.gn
index 8553b84..1a3ca305 100644
--- a/third_party/puffin/BUILD.gn
+++ b/third_party/puffin/BUILD.gn
@@ -120,6 +120,6 @@
     ":libpuffdiff",
     ":libpuffpatch",
     "//base",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
   ]
 }
diff --git a/third_party/shell-encryption/BUILD.gn b/third_party/shell-encryption/BUILD.gn
index d63ebe38..5ad10cf 100644
--- a/third_party/shell-encryption/BUILD.gn
+++ b/third_party/shell-encryption/BUILD.gn
@@ -106,9 +106,9 @@
     ]
     public_deps = [
       ":serialization_proto",
-      "//base:base",
+      "//base",
       "//third_party/abseil-cpp:absl",
-      "//third_party/boringssl:boringssl",
+      "//third_party/boringssl",
       "//third_party/protobuf:protobuf_lite",
     ]
   }
@@ -138,8 +138,8 @@
       ":coefficient_polynomial_proto",
       ":serialization_proto",
       ":shell_encryption",
-      "//testing/gmock:gmock",
-      "//testing/gtest:gtest",
+      "//testing/gmock",
+      "//testing/gtest",
     ]
   }
 
diff --git a/third_party/skia b/third_party/skia
index 768ace3..c15b236 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 768ace3fd14422db1cb326e1abc69f51efe2d74a
+Subproject commit c15b236c12edeb2ad43d650d6e0df5a4fec068ab
diff --git a/third_party/wayland/BUILD.gn b/third_party/wayland/BUILD.gn
index bce9108..d2a86c8 100644
--- a/third_party/wayland/BUILD.gn
+++ b/third_party/wayland/BUILD.gn
@@ -294,7 +294,7 @@
 
   deps = [
     ":wayland_util",
-    "//third_party/expat:expat",
+    "//third_party/expat",
   ]
 
   configs -= [ "//build/config/compiler:chromium_code" ]
diff --git a/third_party/webrtc_overrides/BUILD.gn b/third_party/webrtc_overrides/BUILD.gn
index 4b00340..d692a91 100644
--- a/third_party/webrtc_overrides/BUILD.gn
+++ b/third_party/webrtc_overrides/BUILD.gn
@@ -67,7 +67,7 @@
   "//third_party/webrtc/api/environment:environment_factory",
   "//third_party/webrtc/api/metronome",
   "//third_party/webrtc/api/rtc_event_log:rtc_event_log_factory",
-  "//third_party/webrtc/api/task_queue:task_queue",
+  "//third_party/webrtc/api/task_queue",
   "//third_party/webrtc/api/transport:ecn_marking",
   "//third_party/webrtc/api/transport:enums",
   "//third_party/webrtc/api/transport:field_trial_based_config",
@@ -90,7 +90,6 @@
   "//third_party/webrtc/api/video_codecs:video_codecs_api",
   "//third_party/webrtc/call:simulated_network",
   "//third_party/webrtc/common_video",
-  "//third_party/webrtc/common_video:common_video",
   "//third_party/webrtc/media:codec",
   "//third_party/webrtc/media:media_channel",
   "//third_party/webrtc/media:media_constants",
@@ -106,7 +105,6 @@
   "//third_party/webrtc/modules/audio_processing:api",
   "//third_party/webrtc/modules/audio_processing:audio_processing_statistics",
   "//third_party/webrtc/modules/audio_processing/aec_dump",
-  "//third_party/webrtc/modules/audio_processing/aec_dump:aec_dump",
   "//third_party/webrtc/modules/desktop_capture",
   "//third_party/webrtc/modules/desktop_capture:primitives",
   "//third_party/webrtc/modules/video_coding:video_codec_interface",
@@ -162,7 +160,6 @@
   "//third_party/webrtc/rtc_base/network:received_packet",
   "//third_party/webrtc/rtc_base/system:rtc_export",
   "//third_party/webrtc/rtc_base/third_party/sigslot",
-  "//third_party/webrtc/rtc_base/third_party/sigslot:sigslot",
   "//third_party/webrtc/stats",
   "//third_party/webrtc/stats:rtc_stats",
   "//third_party/webrtc/stats:rtc_stats_test_utils",
@@ -316,7 +313,7 @@
   deps = [
     ":webrtc_component",
     "//base/test:test_support",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
   ]
 }
 
@@ -334,7 +331,7 @@
     ":webrtc_component",
     "//base",
     "//base/test:test_support",
-    "//testing/gtest:gtest",
+    "//testing/gtest",
   ]
 }
 
diff --git a/tools/json_schema_compiler/idl_schema.py b/tools/json_schema_compiler/idl_schema.py
index 51a3624..eb998c99 100755
--- a/tools/json_schema_compiler/idl_schema.py
+++ b/tools/json_schema_compiler/idl_schema.py
@@ -420,9 +420,8 @@
         'type': 'string',
         'enum': enum
     }
-    for property_name in ['cpp_enum_prefix_override', 'nodoc']:
-      if self.node.GetProperty(property_name):
-        result[property_name] = self.node.GetProperty(property_name)
+    if self.node.GetProperty('nodoc'):
+      result['nodoc'] = self.node.GetProperty('nodoc')
     if self.node.GetProperty('deprecated'):
       result['deprecated'] = self.node.GetProperty('deprecated')
     return result
diff --git a/tools/json_schema_compiler/model.py b/tools/json_schema_compiler/model.py
index 9fc2ac8..6e7e0e5d 100644
--- a/tools/json_schema_compiler/model.py
+++ b/tools/json_schema_compiler/model.py
@@ -258,7 +258,6 @@
             'See crbug.com/472279' % (name, namespace.name))
       self.property_type = PropertyType.ENUM
       self.enum_values = [EnumValue(value, namespace) for value in json['enum']]
-      self.cpp_enum_prefix_override = json.get('cpp_enum_prefix_override', None)
     elif json_type == 'any':
       self.property_type = PropertyType.ANY
     elif json_type == 'binary':
diff --git a/tools/mac/icons/compile_car.py b/tools/mac/icons/compile_car.py
index 5dd340c..e2ff598 100755
--- a/tools/mac/icons/compile_car.py
+++ b/tools/mac/icons/compile_car.py
@@ -45,7 +45,7 @@
 
 
 _REQUIRED_OS_VERSION = _split_version('15.5')
-_REQUIRED_ACTOOL_VERSION = _split_version('16.4')
+_REQUIRED_ACTOOL_VERSION = _split_version('26.0')
 
 
 def _verify_os_version() -> None:
@@ -138,11 +138,37 @@
         source_dir = path.joinpath(os.pardir)
 
         command = [
-            'xcrun', 'actool', '--output-format=xml1', '--notices',
-            '--warnings', '--errors', '--platform=macosx',
-            '--target-device=mac', '--app-icon=AppIcon',
+            # The binary.
+            'xcrun',
+            'actool',
+
+            # Output and error handling.
+            '--output-format=xml1',
+            '--notices',
+            '--warnings',
+            '--errors',
+
+            # Platform.
+            '--platform=macosx',
+            '--target-device=mac',
+
+            # Correctness. This command-line argument is undocumented. It forces
+            # `actool` aka `ibtool` to use bundled versions of the asset catalog
+            # frameworks so that it generates consistent results no matter what
+            # OS release it is run on. Xcode 26+ includes this when invoking
+            # `actool`; see various copies of the `AssetCatalogCompiler.xcspec`
+            # file found in various places inside the Xcode package.
+            '--lightweight-asset-runtime-mode=enabled',
+
+            # Target information.
+            '--app-icon=AppIcon',
             f'--minimum-deployment-target={min_deployment_target}',
-            f'--output-partial-info-plist={tmp_plist}', f'--compile={tmp_dir}',
+
+            # Where to place the outputs.
+            f'--output-partial-info-plist={tmp_plist}',
+            f'--compile={tmp_dir}',
+
+            # What to compile.
             path
         ]
         if verbose:
diff --git a/tools/metrics/histograms/metadata/extensions/histograms.xml b/tools/metrics/histograms/metadata/extensions/histograms.xml
index 7432acdd..0479c93 100644
--- a/tools/metrics/histograms/metadata/extensions/histograms.xml
+++ b/tools/metrics/histograms/metadata/extensions/histograms.xml
@@ -328,21 +328,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.BackgroundPageType"
-    enum="ExtensionBackgroundPageType" expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    The type (if any) of background page the extension has. Recorded for
-    installed extensions on profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.BackgroundPageType2"
     enum="ExtensionBackgroundPageType" expires_after="never">
 <!-- expires-never: Used for monitoring user extension usage. -->
@@ -743,22 +728,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.CorruptExtensionTotalDisables" units="units"
-    expires_after="2023-07-07">
-  <owner>jlulejian@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    Logged once on profile open, this is the value of a counter that is
-    incremented anytime we disable a corrupted extension because its content
-    didn't match an expected content hash.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.CorruptExtensionTotalDisables2" units="units"
     expires_after="never">
 <!-- expires-never: Used for monitoring corrupt extensions. -->
@@ -1462,18 +1431,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.Disabled" units="units" expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of extensions that are disabled at browser profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.Disabled2" units="units" expires_after="never">
 <!-- expires-never: Used for monitoring user extension usage. -->
 
@@ -1486,20 +1443,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.DisabledForPermissions" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of extensions that are disabled at browser profile open due to
-    permissions increases.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.DisabledForPermissions2" units="units"
     expires_after="never">
 <!-- expires-never: Used for monitoring user extension usage. -->
@@ -1976,20 +1919,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.ExtensionLocation" enum="ExtensionLocation"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The install location for a given extension. Recorded once per enabled
-    extension on profile initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.ExtensionLocation2" enum="ExtensionLocation"
     expires_after="never">
 <!-- expires-never: Monitoring core extension usage. -->
@@ -2539,22 +2468,6 @@
   </token>
 </histogram>
 
-<histogram name="Extensions.FromWebstoreInconsistency"
-    enum="ExtensionFromWebstoreInconcistencyEnum" expires_after="2023-07-07">
-  <owner>anunoy@chromium.org</owner>
-  <summary>
-    Number of apps/extensions loaded on profile open with an inconsistent
-    &quot;from webstore&quot; state. This means an item that is flagged as
-    from_webstore, but with either a non-webstore update_url or an external
-    install location.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.FromWebstoreInconsistency2"
     enum="ExtensionFromWebstoreInconcistencyEnum" expires_after="2025-03-02">
   <owner>anunoy@chromium.org</owner>
@@ -2841,23 +2754,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.HasPermissions_Install3" enum="Boolean"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    Whether there were any permissions present in an extension when it was
-    installed . To find places where this histogram may be emitted, look for
-    calls to InstalledLoader::RecordPermissionMessagesHistogram with the
-    argument Install. For Sync users, this is reported for each device.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.HasPermissions_Install4" enum="Boolean"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -2874,23 +2770,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.HasPermissions_Load3" enum="Boolean"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    Whether there were any permissions present in an extension when it was
-    loaded (which happens at profile open or extension install). To find places
-    where this histogram may be emitted, look for calls to
-    InstalledLoader::RecordPermissionMessagesHistogram with the argument Load.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.HasPermissions_Load4" enum="Boolean"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -2907,21 +2786,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.HomepageOverrides" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>kelvinjiang@chromium.org</owner>
-  <summary>
-    The number of enabled extensions with a homepage override specified in their
-    manifest. Recorded once per profile at profile initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.HomepageOverrides2" units="units"
     expires_after="2025-11-02">
   <owner>rdevlin.cronin@chromium.org</owner>
@@ -2950,22 +2814,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.HostPermissions.GrantedAccess"
-    enum="HostPermissionsAccess" expires_after="2023-07-07">
-  <owner>emiliapaz@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    Records the host permissions access for a enabled extension as a result of
-    the RuntimeHostPermissions feature. Recorded once per extension at profile
-    initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.HostPermissions.GrantedAccess2"
     enum="HostPermissionsAccess" expires_after="never">
 <!-- expires-never: Monitors core extension usage. -->
@@ -2981,22 +2829,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.HostPermissions.GrantedAccessForBroadRequests"
-    enum="HostPermissionsAccess" expires_after="2023-07-07">
-  <owner>emiliapaz@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    Records the host permissions access for each enabled extension that
-    specifies a host permission that matches an effective TLD. Recorded once per
-    extension at profile initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.HostPermissions.GrantedAccessForBroadRequests2"
     enum="HostPermissionsAccess" expires_after="never">
 <!-- expires-never: Monitors core extension usage. -->
@@ -3012,22 +2844,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.HostPermissions.GrantedAccessForTargetedRequests"
-    enum="HostPermissionsAccess" expires_after="2023-07-07">
-  <owner>emiliapaz@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    Records the host permissions access for each enabled extension that
-    specifies hosts, but has no host permission that matches an effective TLD.
-    Recorded once per extension at profile initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.HostPermissions.GrantedAccessForTargetedRequests2"
     enum="HostPermissionsAccess" expires_after="never">
 <!-- expires-never: Monitors core extension usage. -->
@@ -3043,23 +2859,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.IncognitoAllowed" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of extensions (and friends) that could have been allowed in
-    incognito, and were, for users that have at least one extension that could
-    have been allowed. This excludes anything that doesn't show up in
-    chrome://extensions (platform apps, hosted apps, component extensions),
-    policy-installed extensions, and unpacked extensions.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.IncognitoAllowed2" units="units"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -3220,22 +3019,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.InstallSource" enum="ExtensionLocation"
-    expires_after="2025-11-30">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    Installs grouped by the location property in prefs. Emitted once per profile
-    open.
-
-    Histogram is in the process of being removed in favor of its new versions
-    (Extensions.InstallType.User2 and Extensions.InstallType.Nonuser2) that emit
-    only on profile open for &quot;user&quot; profiles (profiles where people
-    can install extensions, specifically profiles that can have non-component
-    extensions installed).
-  </summary>
-</histogram>
-
 <!-- TODO(crbug.com/40878021): Change all .NonUser/.User metrics to use histogram suffixes rather than be duplicated here. -->
 
 <histogram name="Extensions.InstallSource{UserType}2" enum="ExtensionLocation"
@@ -3251,21 +3034,6 @@
   <token key="UserType" variants="UserType"/>
 </histogram>
 
-<histogram name="Extensions.InstallType" enum="ExtensionType"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    Installs grouped by Extension::HistogramType emitted once per extension
-    install.
-
-    Histogram is in the process of being removed in favor of its new versions
-    (Extensions.InstallType.User and Extensions.InstallType.Nonuser) that emit
-    only on profile open for &quot;user&quot; profiles (profiles where people
-    can install extensions, specifically profiles that can have non-component
-    extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.InstallType{UserType}" enum="ExtensionType"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -3306,18 +3074,6 @@
   </token>
 </histogram>
 
-<histogram name="Extensions.LoadAll" units="units" expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of extensions and themes loaded at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadAll2" units="units" expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
 
@@ -3377,21 +3133,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadAllTime2" units="ms" expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    Time taken to load all non-component extensions at profile open and record
-    metrics. This happens as part of the total initialization time of
-    ExtensionService, measured in Extensions.ExtensionServiceInitTime.
-
-    Histogram is in the process of being removed in favor of its new versions
-    (Extensions.LoadAllTime2.NonUser and Extensions.LoadAllTime2.User) that emit
-    only on profile open for &quot;user&quot; profiles (profiles where people
-    can install extensions, specifically profiles that can have non-component
-    extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadAllTime2.NonUser" units="ms"
     expires_after="never">
 <!-- expires-never: Monitoring core extensions system performance. -->
@@ -3423,18 +3164,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadApp" units="units" expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of apps loaded by each user at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadApp2" units="units" expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
 
@@ -3447,20 +3176,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadAppExternal" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    The number of externally managed apps loaded by each user at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadAppExternal2" units="units"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -3473,19 +3188,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadAppUser" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of user-installed apps loaded by each user at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadAppUser2" units="units" expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
 
@@ -3498,19 +3200,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadBrowserAction" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of browser action extensions loaded at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadBrowserAction2" units="units"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -3524,19 +3213,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadExtension" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of extensions loaded at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadExtension2" units="units" expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
 
@@ -3549,20 +3225,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadExtensionExternal" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    The number of externally managed extensions loaded at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadExtensionExternal2" units="units"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -3597,19 +3259,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadHostedApp" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of hosted apps loaded by each user at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadHostedApp2" units="units" expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
 
@@ -3634,20 +3283,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadNoExtensionAction" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of extensions that had neither a page nor browser action
-    specified in their manifest. Recorded at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadNoExtensionAction2" units="units"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -3662,21 +3297,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadOffStoreItems" units="Number of items"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    The number of enabled extensions or apps the user has installed that do not
-    update from the Chrome Web Store. Recorded during profile initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadOffStoreItems2" units="Number of items"
     expires_after="never">
 <!-- expires-never: Monitoring core extension usage. -->
@@ -3691,19 +3311,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadPackagedApp" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of legacy packaged apps loaded by each user at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadPackagedApp2" units="units"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -3716,19 +3323,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadPlatformApp" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of platform apps loaded at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadPlatformApp2" units="units"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -3741,19 +3335,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadTheme" units="units" expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    The number of themes loaded at profile open.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadTheme2" units="units"
     expires_after="2025-12-14">
   <owner>rdevlin.cronin@chromium.org</owner>
@@ -3765,21 +3346,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.LoadType" enum="ExtensionType"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    The number of extensions loaded at profile open grouped by
-    Extension::HistogramType.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.LoadType2" enum="ExtensionType"
     expires_after="2026-01-18">
   <owner>rdevlin.cronin@chromium.org</owner>
@@ -4074,21 +3640,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.NewTabPageOverrides" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>kelvinjiang@chromium.org</owner>
-  <summary>
-    The number of enabled extensions with a New Tab Page override specified in
-    their manifest. Recorded once per profile at profile initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.NewTabPageOverrides2" units="units"
     expires_after="2025-12-01">
   <owner>rdevlin.cronin@chromium.org</owner>
@@ -4101,20 +3652,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.NonWebstoreLocation" enum="ExtensionLocation"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <summary>
-    The number of apps/extensions with a non-webstore update_url loaded on
-    profile open and grouped by Extension::Location.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.NonWebstoreLocation2" enum="ExtensionLocation"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -4149,20 +3686,6 @@
   <token key="ExtensionState" variants="ExtensionState"/>
 </histogram>
 
-<histogram name="Extensions.NonWebStoreNewTabPageOverrides" units="units"
-    expires_after="2023-07-07">
-  <owner>anunoy@chromium.org</owner>
-  <summary>
-    Number of non-WebStore extensions on profile open that override the new tab
-    page.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.NonWebStoreNewTabPageOverrides2" units="units"
     expires_after="2025-12-01">
   <owner>anunoy@chromium.org</owner>
@@ -4175,22 +3698,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.NotAllowlistedDisabled" units="extensions"
-    expires_after="2023-07-07">
-  <owner>jeffcyr@google.com</owner>
-  <owner>chrome-counter-abuse-alerts@google.com</owner>
-  <summary>
-    The total number of disabled extensions that are not present in the Enhanced
-    Safe Browsing CRX allowlist. Recorded for all users on profile
-    initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.NotAllowlistedDisabled2" units="extensions"
     expires_after="2025-01-01">
   <owner>jeffcyr@google.com</owner>
@@ -4203,22 +3710,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.NotAllowlistedDisabledAndEsbUser"
-    units="extensions" expires_after="2023-10-01">
-  <owner>jeffcyr@google.com</owner>
-  <owner>chrome-counter-abuse-alerts@google.com</owner>
-  <summary>
-    The total number of disabled extensions that are not present in the Enhanced
-    Safe Browsing CRX allowlist. Recorded for only for Enhanced Safe Browsing
-    users on profile initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.NotAllowlistedDisabledAndEsbUser2"
     units="extensions" expires_after="2025-01-01">
   <owner>jeffcyr@google.com</owner>
@@ -4232,22 +3723,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.NotAllowlistedEnabled" units="extensions"
-    expires_after="2023-10-01">
-  <owner>jeffcyr@google.com</owner>
-  <owner>chrome-counter-abuse-alerts@google.com</owner>
-  <summary>
-    The total number of enabled extensions that are not present in the Enhanced
-    Safe Browsing CRX allowlist. Recorded for all users on profile
-    initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.NotAllowlistedEnabled2" units="extensions"
     expires_after="2025-01-01">
   <owner>jeffcyr@google.com</owner>
@@ -4260,22 +3735,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.NotAllowlistedEnabledAndEsbUser" units="extensions"
-    expires_after="2023-10-01">
-  <owner>jeffcyr@google.com</owner>
-  <owner>chrome-counter-abuse-alerts@google.com</owner>
-  <summary>
-    The total number of enabled extensions that are not present in the Enhanced
-    Safe Browsing CRX allowlist. Recorded for only for Enhanced Safe Browsing
-    users on profile initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.NotAllowlistedEnabledAndEsbUser2"
     units="extensions" expires_after="2025-01-01">
   <owner>jeffcyr@google.com</owner>
@@ -4289,23 +3748,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.Permissions_Install3" enum="ExtensionPermission3"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    The permissions present in an extension when it was installed. To find
-    places where this histogram may be emitted, look for calls to
-    InstalledLoader::RecordPermissionMessagesHistogram with the argument
-    Install. For Sync users, this is reported for each device.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.Permissions_Install4" enum="ExtensionPermission3"
     expires_after="never">
 <!-- expires-never: Monitoring extension usage. -->
@@ -4323,23 +3765,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.Permissions_Load3" enum="ExtensionPermission3"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>extensions-core@chromium.org</owner>
-  <summary>
-    The permissions present in an extension when it was loaded (which happens at
-    profile open or extension install). To find places where this histogram may
-    be emitted, look for calls to
-    InstalledLoader::RecordPermissionMessagesHistogram with the argument Load.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.Permissions_Load4" enum="ExtensionPermission3"
     expires_after="never">
 <!-- expires-never: Monitoring core extension usage. -->
@@ -4376,24 +3801,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts"
-    enum="BooleanHasWithheldHosts" expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>src/extensions/OWNERS</owner>
-  <summary>
-    Whether an extension had host permissions withheld as a result of the
-    RuntimeHostPermissions feature. Recorded once per extension at profile
-    initialization if and only if the RuntimeHostPermissions feature is enabled
-    and the extension requests any host permissions (i.e., could be affected by
-    the feature).
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts2"
     enum="BooleanHasWithheldHosts" expires_after="never">
 <!-- expires-never: Monitors core extension usage. -->
@@ -4410,25 +3817,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.RuntimeHostPermissions.GrantedHostCount"
-    units="Granted hosts" expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>src/extensions/OWNERS</owner>
-  <summary>
-    The number of hosts an extension has been granted explicit access to that it
-    also requested (note that if the user granted unrequested hosts, those will
-    not be included in this count). Recorded once per extension at profile
-    initialization if and only if the RuntimeHostPermissions feature is enabled
-    and the extension has had host permissions withheld. See also
-    Extensions.RuntimeHostPermissions.ExtensionHasWithheldHosts.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.RuntimeHostPermissions.GrantedHostCount2"
     units="Granted hosts" expires_after="never">
 <!-- expires-never: Monitors core extension usage. -->
@@ -4470,21 +3858,6 @@
   <summary>Count the number of times a sandboxed CRX unpack succeeds.</summary>
 </histogram>
 
-<histogram name="Extensions.SearchEngineOverrides" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>kelvinjiang@chromium.org</owner>
-  <summary>
-    The number of enabled extensions with a search engine override specified in
-    their manifest. Recorded once per profile at profile initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.SearchEngineOverrides2" units="units"
     expires_after="2025-12-28">
   <owner>rdevlin.cronin@chromium.org</owner>
@@ -5002,21 +4375,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.StartupPagesOverrides" units="units"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>kelvinjiang@chromium.org</owner>
-  <summary>
-    The number of enabled extensions with startup page overrides specified in
-    their manifest. Recorded once per profile at profile initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.StartupPagesOverrides2" units="units"
     expires_after="2026-01-18">
   <owner>rdevlin.cronin@chromium.org</owner>
@@ -5431,23 +4789,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.WebRequestBlockingCount" units="extensions"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>src/extensions/OWNERS</owner>
-  <summary>
-    Number of enabled extensions which have requested the
-    &quot;webRequestBlocking&quot; permission. Includes all kinds of extensions,
-    including component and unpacked extensions. Recorded during profile
-    initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.WebRequestBlockingCount2" units="extensions"
     expires_after="never">
 <!-- expires-never: For monitoring Web request API usage. -->
@@ -5463,22 +4804,6 @@
   </summary>
 </histogram>
 
-<histogram name="Extensions.WebRequestCount" units="extensions"
-    expires_after="2023-07-07">
-  <owner>rdevlin.cronin@chromium.org</owner>
-  <owner>src/extensions/OWNERS</owner>
-  <summary>
-    Number of enabled extensions which have requested the &quot;webRequest&quot;
-    permission. Includes all kinds of extensions, including component and
-    unpacked extensions. Recorded during profile initialization.
-
-    Histogram is in the process of being removed in favor of its incremented
-    version that emits only on profile open for &quot;user&quot; profiles
-    (profiles where people can install extensions, specifically profiles that
-    can have non-component extensions installed).
-  </summary>
-</histogram>
-
 <histogram name="Extensions.WebRequestCount2" units="extensions"
     expires_after="never">
 <!-- expires-never: For monitoring Web request API usage. -->
diff --git a/tools/metrics/histograms/metadata/glic/histograms.xml b/tools/metrics/histograms/metadata/glic/histograms.xml
index edc4d9f..7b25462 100644
--- a/tools/metrics/histograms/metadata/glic/histograms.xml
+++ b/tools/metrics/histograms/metadata/glic/histograms.xml
@@ -484,8 +484,19 @@
   <owner>harringtond@chromium.org</owner>
   <owner>erikchen@chromium.org</owner>
   <summary>
-    Recorded when a page context gets screenshot (post-encoding and scaling).
-    Measure the time from start.
+    Recorded when a page context successfully gets a screenshot (post-encoding
+    and scaling). Measure the time from start.
+  </summary>
+</histogram>
+
+<histogram name="Glic.PageContextFetcher.GetEncodedScreenshot.Failure"
+    units="ms" expires_after="2026-01-15">
+  <owner>carlosk@chromium.org</owner>
+  <owner>harringtond@chromium.org</owner>
+  <owner>erikchen@chromium.org</owner>
+  <summary>
+    Recorded when a page context fails to get a screenshot. This includes any
+    kind of error, including timeout. Measure the time from start.
   </summary>
 </histogram>
 
diff --git a/tools/metrics/histograms/metadata/new_tab_page/enums.xml b/tools/metrics/histograms/metadata/new_tab_page/enums.xml
index 3b53ebc..f9f2a6d 100644
--- a/tools/metrics/histograms/metadata/new_tab_page/enums.xml
+++ b/tools/metrics/histograms/metadata/new_tab_page/enums.xml
@@ -38,6 +38,13 @@
   <int value="2" label="Discover Feed Bottom Sheet"/>
 </enum>
 
+<enum name="ComposeboxFileValidationError">
+  <int value="0" label="No error"/>
+  <int value="1" label="Too many files uploaded"/>
+  <int value="2" label="File is empty"/>
+  <int value="3" label="File size is too large"/>
+</enum>
+
 <enum name="Entry">
   <summary/>
   <int value="0" label="App Menu"/>
@@ -323,6 +330,12 @@
   <int value="1967788069" label="solidcolors_for_NTP">Colors for NTP</int>
 </enum>
 
+<enum name="NtpComposeboxMultimodalState">
+  <int value="1" label="Text Only"/>
+  <int value="2" label="File Only"/>
+  <int value="3" label="Text and File"/>
+</enum>
+
 <enum name="NTPCustomizeChromeBackgroundAction">
   <int value="0"
       label="Collection selected in the 'Chrome backgrounds' dialog."/>
diff --git a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
index 9ad67f4..529525e 100644
--- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
+++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -271,6 +271,32 @@
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.Composebox.File.Size.{ComposeboxFileTypes}"
+    units="bytes" expires_after="2026-01-20">
+  <owner>jennserrano@google.com</owner>
+  <owner>chrome-desktop-ntp@google.com</owner>
+  <owner>chrome-desktop-search@google.com</owner>
+  <summary>
+    The size of the file received by the browser from the WebUI. Recorded as
+    soon as the browser receives it.
+  </summary>
+  <token key="ComposeboxFileTypes" variants="ComposeboxFileTypes">
+    <variant name=""/>
+  </token>
+</histogram>
+
+<histogram name="NewTabPage.Composebox.File.WebUI.UploadAttemptFailure"
+    enum="ComposeboxFileValidationError" expires_after="2026-01-20">
+  <owner>jennserrano@google.com</owner>
+  <owner>chrome-desktop-ntp@google.com</owner>
+  <owner>chrome-desktop-search@google.com</owner>
+  <summary>
+    Records the validation error hit on the WebUI side when a file is uploaded.
+    If no error occurred, this is logged as &quot;No error.&quot; Recorded when
+    a file upload is attempted.
+  </summary>
+</histogram>
+
 <histogram name="NewTabPage.Composebox.FromNTPLoadToSessionStart" units="ms"
     expires_after="2026-06-17">
   <owner>niharm@google.com</owner>
@@ -284,6 +310,40 @@
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.Composebox.Query.FileCount" units="count"
+    expires_after="2026-01-20">
+  <owner>jennserrano@google.com</owner>
+  <owner>chrome-desktop-ntp@google.com</owner>
+  <owner>chrome-desktop-search@google.com</owner>
+  <summary>
+    Number of files included in a completed query. May be zero in the case that
+    the input was only text. Recorded after navigation to the AIM page occurs.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.Composebox.Query.Modality"
+    enum="NtpComposeboxMultimodalState" expires_after="2026-01-20">
+  <owner>jennserrano@google.com</owner>
+  <owner>chrome-desktop-ntp@google.com</owner>
+  <owner>chrome-desktop-search@google.com</owner>
+  <summary>
+    Records the combination of input types used to form the query. Recorded
+    after navigation to the AIM page occurs.
+  </summary>
+</histogram>
+
+<histogram name="NewTabPage.Composebox.Query.TextLength" units="characters"
+    expires_after="2026-01-20">
+  <owner>jennserrano@google.com</owner>
+  <owner>chrome-desktop-ntp@google.com</owner>
+  <owner>chrome-desktop-search@google.com</owner>
+  <summary>
+    Number of characters in the composebox submission request. May be zero in
+    the case that only a file was uploaded. Recorded after navigation to the AIM
+    page occurs.
+  </summary>
+</histogram>
+
 <histogram name="NewTabPage.Composebox.Query.Time.ToSubmission" units="ms"
     expires_after="2026-01-20">
   <owner>jennserrano@google.com</owner>
@@ -291,39 +351,10 @@
   <owner>chrome-desktop-search@google.com</owner>
   <summary>
     Tracks the duration from composebox session start time to the time a query
-    was submitted. A session starts when the compose button is clicked and the
-    composebox shown. There may be multiple query submission times recorded per
-    composebox shown. Recorded at the end of the session. Only recorded if the
-    user is redirected to the AIM page.
-  </summary>
-</histogram>
-
-<histogram name="NewTabPage.Composebox.Session.Duration.Abandoned" units="ms"
-    expires_after="2026-01-20">
-  <owner>jennserrano@google.com</owner>
-  <owner>chrome-desktop-ntp@google.com</owner>
-  <owner>chrome-desktop-search@google.com</owner>
-  <summary>
-    Tracks the duration from when a composebox session starts to its
-    abandonment. A session starts when the compose button is clicked and the
-    composebox shown. A composebox session is abandoned if the user ends the
-    session by closing the composebox or by closing the NTP without submitting a
-    query. Recorded at the end of the session.
-  </summary>
-</histogram>
-
-<histogram name="NewTabPage.Composebox.Session.Duration.Completed" units="ms"
-    expires_after="2026-01-20">
-  <owner>jennserrano@google.com</owner>
-  <owner>chrome-desktop-ntp@google.com</owner>
-  <owner>chrome-desktop-search@google.com</owner>
-  <summary>
-    Tracks the duration from composebox session start time to completion. A
-    session starts when the compose button is clicked and the composebox shown.
-    Completion is when the following happens: 1) user submits a query 2) user is
-    redirected to the AIM page 3) the composebox is closed. Duplicate session
-    durations may be recorded if multiple navigations occur. Recorded at the end
-    of the session.
+    was submitted. Recorded as soon as the query is submitted, but before
+    navigation. Note: A session starts when the compose button is clicked and
+    the composebox shown. There may be multiple query submission times recorded
+    per composebox shown.
   </summary>
 </histogram>
 
@@ -338,12 +369,30 @@
     clicked and the composebox shown. Completion is when the following happens:
     1) user submits a query 2) user is redirected to the AIM page 3) the
     composebox is closed. Abandonment is when a user closes the composebox or
-    closes the NTP without query submission. For completed sessions there may be
-    duplicate sessions recorded if multiple navigations occur. Recorded at the
-    end of the session.
+    closes the NTP without query submission. Recorded at the end of the session.
   </summary>
 </histogram>
 
+<histogram name="NewTabPage.Composebox.Session.Duration.{Status}" units="ms"
+    expires_after="2026-01-20">
+  <owner>jennserrano@google.com</owner>
+  <owner>chrome-desktop-ntp@google.com</owner>
+  <owner>chrome-desktop-search@google.com</owner>
+  <summary>
+    Tracks the duration of composebox sessions from start time to the end of the
+    session. Recorded at the end of the session. Note: A session starts when the
+    compose button is clicked and the composebox shown. A composebox session
+    ends 1) when it is abandoned 2) a query is submitted and the composebox is
+    closed. A session can be abandoned by the user closing the composebox or by
+    exiting out of the NTP while the composebox is open without having submitted
+    a query.
+  </summary>
+  <token key="Status">
+    <variant name="Abandoned"/>
+    <variant name="QuerySubmitted"/>
+  </token>
+</histogram>
+
 <histogram
     name="NewTabPage.Composebox.Session.File.Browser.UploadAttemptCount.{ComposeboxFileTypes}"
     units="count" expires_after="2026-01-20">
@@ -421,6 +470,18 @@
   </token>
 </histogram>
 
+<histogram name="NewTabPage.Composebox.Session.QueryCount" units="count"
+    expires_after="2026-01-20">
+  <owner>jennserrano@google.com</owner>
+  <owner>chrome-desktop-ntp@google.com</owner>
+  <owner>chrome-desktop-search@google.com</owner>
+  <summary>
+    Tracks the number of queries submitted per session. Multiple queries may be
+    submitted when the AIM page is opened in a new tab or window and the
+    composebox remains open. Recorded at the end of the session.
+  </summary>
+</histogram>
+
 <histogram name="NewTabPage.ComposeEntrypoint.Click.UserTextPresent"
     enum="Boolean" expires_after="2026-06-10">
   <owner>niharm@google.com</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 4024def..a48cbb0 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@
             "full_remote_path": "perfetto-luci-artifacts/361808c959b026d558c9948602ea38bf25d8981e/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "bb1e11cad5b2695a4bfd297148cfb02c621309f0",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/ab99948900d2ed4ae1a9ef40a462ed1f690b3d61/trace_processor_shell.exe"
+            "hash": "5a94d43415a11093bc3f54dc919844924f85a289",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/83bcbbbf67ed17934ddd3b667ed19c120c9ed504/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "ab1a0d9236a63649044414663b6ace711253648f",
@@ -21,8 +21,8 @@
             "full_remote_path": "perfetto-luci-artifacts/v51.2/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "ba35f0f44df2c0459f56dc20bb1922e1db88aa37",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/6b489d9b215629622d86698dcf5e463bd18a11c5/trace_processor_shell"
+            "hash": "44df4a1f45be831967a23f4485b234e255701313",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/83bcbbbf67ed17934ddd3b667ed19c120c9ed504/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java b/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java
index 20cfd16..56c38e1 100644
--- a/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java
+++ b/ui/android/java/src/org/chromium/ui/listmenu/BasicListMenu.java
@@ -4,13 +4,14 @@
 
 package org.chromium.ui.listmenu;
 
+import static org.chromium.ui.listmenu.ListMenuUtils.createAdapter;
+
 import android.content.Context;
 import android.content.Intent;
 import android.content.res.ColorStateList;
 import android.graphics.drawable.Drawable;
 import android.view.View;
-import android.widget.AdapterView;
-import android.widget.AdapterView.OnItemClickListener;
+import android.view.ViewGroup;
 import android.widget.ListView;
 
 import androidx.annotation.ColorRes;
@@ -21,7 +22,6 @@
 import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.R;
 import org.chromium.ui.UiUtils;
-import org.chromium.ui.modelutil.LayoutViewBuilder;
 import org.chromium.ui.modelutil.MVCListAdapter.ListItem;
 import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
 import org.chromium.ui.modelutil.ModelListAdapter;
@@ -29,13 +29,14 @@
 
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
 
 /**
  * An implementation of a list menu. Uses app_menu_layout as the default layout of menu and
  * list_menu_item as the default layout of a menu item.
  */
 @NullMarked
-public class BasicListMenu implements ListMenu, OnItemClickListener {
+public class BasicListMenu implements ListMenu {
 
     /**
      * Helper function to build a ListItem of a divider.
@@ -104,15 +105,15 @@
     private final ListView mListView;
     private final ModelListAdapter mAdapter;
     private final View mContentView;
-    private final List<Runnable> mClickRunnables;
-    private final Delegate mDelegate;
+    private final List<Runnable> mClickRunnables = new LinkedList<>();
 
     /**
      * @param context The {@link Context} to inflate the layout.
      * @param data Data representing the list items. All items in data are assumed to be enabled.
      * @param contentView The background of the list menu.
      * @param listView The {@link ListView} of the list menu.
-     * @param delegate The {@link Delegate} that would be called when the menu is clicked.
+     * @param delegate The {@link ListMenu.Delegate} used to handle menu clicks. If not provided,
+     *     the item's CLICK_LISTENER or listMenu's onMenuItemSelected method will be used.
      * @param backgroundTintColor The background tint color of the menu.
      */
     public BasicListMenu(
@@ -120,17 +121,24 @@
             ModelList data,
             View contentView,
             ListView listView,
-            Delegate delegate,
+            @Nullable Delegate delegate,
             @ColorRes int backgroundTintColor) {
-        mAdapter = new ListMenuItemAdapter(data);
-        registerListItemTypes();
+        mAdapter =
+                createAdapter(
+                        data,
+                        Set.of(),
+                        (model) -> {
+                            if (delegate != null) delegate.onItemSelected(model);
+                            // We will run the runnables that are registered by the time this lambda
+                            // is called.
+                            for (Runnable r : mClickRunnables) {
+                                r.run();
+                            }
+                        });
         mContentView = contentView;
         mListView = listView;
         mListView.setAdapter(mAdapter);
         mListView.setDivider(null);
-        mListView.setOnItemClickListener(this);
-        mDelegate = delegate;
-        mClickRunnables = new LinkedList<>();
 
         if (backgroundTintColor != 0) {
             ViewCompat.setBackgroundTintList(
@@ -154,14 +162,6 @@
     }
 
     @Override
-    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
-        mDelegate.onItemSelected(((ListItem) mAdapter.getItem(position)).model);
-        for (Runnable r : mClickRunnables) {
-            r.run();
-        }
-    }
-
-    @Override
     public int getMaxItemWidth() {
         return UiUtils.computeListAdapterContentDimensions(mAdapter, mListView)[0];
     }
@@ -180,18 +180,12 @@
         return result;
     }
 
-    private void registerListItemTypes() {
-        mAdapter.registerType(
-                ListItemType.MENU_ITEM,
-                new LayoutViewBuilder(R.layout.list_menu_item),
-                ListMenuItemViewBinder::binder);
-        mAdapter.registerType(
-                ListItemType.DIVIDER,
-                new LayoutViewBuilder(R.layout.list_section_divider),
-                ListSectionDividerViewBinder::bind);
-    }
-
     public ModelListAdapter getAdapterForTesting() {
         return mAdapter;
     }
+
+    public void clickItemForTesting(int i) {
+        mAdapter.getView(i, new View(mContentView.getContext()), (ViewGroup) mContentView)
+                .performClick();
+    }
 }
diff --git a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemAdapter.java b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemAdapter.java
index 0aafe9fe..46afb3c 100644
--- a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemAdapter.java
+++ b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuItemAdapter.java
@@ -4,14 +4,18 @@
 
 package org.chromium.ui.listmenu;
 
+import static org.chromium.ui.listmenu.ListMenuItemProperties.CLICK_LISTENER;
 import static org.chromium.ui.listmenu.ListMenuItemProperties.ENABLED;
 import static org.chromium.ui.listmenu.ListMenuItemProperties.MENU_ITEM_ID;
+import static org.chromium.ui.listmenu.ListMenuUtils.hasClickListener;
 
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.ListView;
 
 import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+import org.chromium.ui.listmenu.ListMenu.Delegate;
 import org.chromium.ui.modelutil.MVCListAdapter.ModelList;
 import org.chromium.ui.modelutil.ModelListAdapter;
 
@@ -24,10 +28,11 @@
 
     private static final int INVALID_ITEM_ID = -1;
     private final Collection<Integer> mDisabledTypes;
+    private final @Nullable Delegate mDelegate;
 
     /** Returns a {@link ListMenuItemAdapter} for a list containing {@param data}. */
     public ListMenuItemAdapter(ModelList data) {
-        this(data, Set.of());
+        this(data, Set.of(), /* delegate= */ null);
     }
 
     /**
@@ -38,10 +43,14 @@
      * @param data The {@link ModelList} whose data we should show.
      * @param disabledTypes The type enums which should be disabled in the adapter (i.e. not
      *     keyboard-focusable or interactable).
+     * @param delegate The {@link Delegate} used to handle menu clicks. If not provided, the item's
+     *     CLICK_LISTENER or listMenu's onMenuItemSelected method will be used.
      */
-    public ListMenuItemAdapter(ModelList data, Collection<Integer> disabledTypes) {
+    public ListMenuItemAdapter(
+            ModelList data, Collection<Integer> disabledTypes, @Nullable Delegate delegate) {
         super(data);
         mDisabledTypes = disabledTypes;
+        mDelegate = delegate;
     }
 
     @Override
@@ -70,19 +79,30 @@
 
     @Override
     public View getView(int position, View convertView, ViewGroup parent) {
+        ListItem item = ((ListItem) getItem(position));
+        if (canReuseView(convertView, item.type)) {
+            // If the view is going to be reused, strip existing onClickListeners before binding
+            convertView.setOnClickListener(null);
+        }
+
         View view = super.getView(position, convertView, parent);
 
-        ListItem item = ((ListItem) getItem(position));
-
         if (!view.hasOnClickListeners()) {
-            // https://crbug.copm/802284 Pre-Q only.
-            // The view needs to have an OnClickListener for TalkBack to announce the disabled
-            // state. In
-            // this case, we need to let the ListView handle the click.
             view.setOnClickListener(
                     (v) -> {
-                        long id = getItemId(position);
-                        ((ListView) parent).performItemClick(v, position, id);
+                        if (mDelegate != null) {
+                            // Delegate, if possible.
+                            mDelegate.onItemSelected(item.model);
+                        } else if (hasClickListener(item)) {
+                            // The item had a click listener in the model, but none was bound by the
+                            // ViewBinder, and there is no click delegate to use. In this case, call
+                            // the model click listener directly.
+                            item.model.get(CLICK_LISTENER).onClick(view);
+                        } else {
+                            // As a fallback, use ListView's performItemClick.
+                            long id = getItemId(position);
+                            ((ListView) parent).performItemClick(v, position, id);
+                        }
                     });
         }
         // some items have styles specific for disabled state
diff --git a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuUtils.java b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuUtils.java
index 0524773..a70e8ded 100644
--- a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuUtils.java
+++ b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuUtils.java
@@ -41,7 +41,7 @@
      */
     @NonNull
     public static ModelListAdapter createAdapter(ModelList listItems) {
-        return createAdapter(listItems, Set.of());
+        return createAdapter(listItems, Set.of(), /* delegate= */ null);
     }
 
     /**
@@ -53,12 +53,16 @@
      *
      * @param listItems The {@link ModelList} containing the items to be displayed in the menu.
      * @param disabledTypes Additional integer types which should not be enabled in the adapter.
+     * @param delegate The {@link ListMenu.Delegate} used to handle menu clicks. If not provided,
+     *     the item's CLICK_LISTENER or listMenu's onMenuItemSelected method will be used.
      * @return A configured {@link ModelListAdapter} ready to be set on the {@link ListView}.
      */
     @NonNull
     public static ModelListAdapter createAdapter(
-            ModelList listItems, Collection<Integer> disabledTypes) {
-        ModelListAdapter adapter = new ListMenuItemAdapter(listItems, disabledTypes);
+            ModelList listItems,
+            Collection<Integer> disabledTypes,
+            ListMenu.@Nullable Delegate delegate) {
+        ModelListAdapter adapter = new ListMenuItemAdapter(listItems, disabledTypes, delegate);
 
         adapter.registerType(
                 ListItemType.DIVIDER,
diff --git a/ui/gfx/render_text.h b/ui/gfx/render_text.h
index 55d05c7..1877ce66 100644
--- a/ui/gfx/render_text.h
+++ b/ui/gfx/render_text.h
@@ -1028,6 +1028,8 @@
   internal::StyleArray styles_;
   BreakList<bool> elidings_;
 
+  // Layout breaklists. These are used for eliding, and should not be manually
+  // cleared.
   mutable BreakList<SkColor> layout_colors_;
   mutable BreakList<BaselineStyle> layout_baselines_;
   mutable BreakList<int> layout_font_size_overrides_;
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc
index b3647af3..49bf7e2 100644
--- a/ui/gfx/render_text_harfbuzz.cc
+++ b/ui/gfx/render_text_harfbuzz.cc
@@ -1992,10 +1992,6 @@
     if (BuildResolvedTypefaceBreakList(run_list)) {
       ItemizeAndShapeTextImpl(&commonized_run_map, text, run_list);
     }
-
-    // Resolved typefaces are no longer used and can be cleared.
-    layout_resolved_typefaces().Reset();
-    resolved_typefaces().Reset();
   }
 
   // Now that potentially two passes to ItemizeAndShapeTextImpl have occurred,
diff --git a/ui/gfx/render_text_unittest.cc b/ui/gfx/render_text_unittest.cc
index 3b22479..b26414fd 100644
--- a/ui/gfx/render_text_unittest.cc
+++ b/ui/gfx/render_text_unittest.cc
@@ -2423,6 +2423,22 @@
   EXPECT_EQ(u"…ef", render_text->GetDisplayText());
 }
 
+TEST_F(RenderTextTest, ElideMissingGlyphs) {
+  constexpr int kGlyphWidth = 10;
+  SetGlyphWidth(kGlyphWidth);
+
+  RenderText* render_text = GetRenderText();
+  render_text->SetText(u"𪛗𪛗𪛗𪛗龭疆龭疆龭疆龭疆疆疆疆");
+  render_text->SetCursorEnabled(false);
+  render_text->SetDisplayRect(Rect(0, 0, 10 * kGlyphWidth, 100));
+
+  // Missing glyph state shouldn't change with elision.
+  const bool has_missing_glyphs = GetHarfBuzzRunList()->HasMissingGlyphs();
+  render_text->SetElideBehavior(ELIDE_TAIL);
+  EXPECT_EQ(u"𪛗𪛗𪛗𪛗龭疆龭疆龭…", render_text->GetDisplayText());
+  EXPECT_EQ(has_missing_glyphs, GetHarfBuzzRunList()->HasMissingGlyphs());
+}
+
 TEST_F(RenderTextTest, SetWhitespaceElision) {
   // This test requires glyphs to be the same width.
   constexpr int kGlyphWidth = 10;
diff --git a/v8 b/v8
index 6f17f338..5d83ccf 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit 6f17f338ff1df4623bfdca257fe911442c35f60f
+Subproject commit 5d83ccf80ddd9959325fde53ce0b9869e76505b8