diff --git a/DEPS b/DEPS
index 258c210..43df648 100644
--- a/DEPS
+++ b/DEPS
@@ -308,15 +308,15 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'src_internal_revision': '845011ccd348813cfca94dcb3e740a5c69b81b91',
+  'src_internal_revision': '9e5f666260cf9ec52730c2f7093c7966a21bb956',
   # 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': '5658e91de531f3a05ebb87fad3deed5da7ecb5b2',
+  'skia_revision': '011fb11ccea0a76aa59c4364fd75a1a3f02c38d6',
   # 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': 'a8abc94b36a98003ddfbbb07ca7e75da9c88bcf5',
+  'v8_revision': 'f2ffc34db63001d9cad025c2ac316701da0bd763',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
@@ -424,7 +424,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': 'dcd9e7437f2ebdbed778d697b1b2da88acdf7039',
+  'dawn_revision': '50eef863a70381fc2c3df62463ecc98c1c02e7bc',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -528,7 +528,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':    '402d919cf14e3c052a14dab8a9db3628c6e850f4',
+  'llvm_libc_revision':    'b4bdef8f8c6bdb155e204c303013b773131dbdbd',
   # 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.
@@ -1204,7 +1204,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm64',
-              'version': 'uMklE9XQ_eIuykEthBwwPG8akRMEZ8_TG0tqt41XB7gC',
+              'version': '6Hq4sLHB7EeQZbXZOml3Wxja3ftFK1hJ0DyOiQ99E3EC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1215,7 +1215,7 @@
       'packages': [
           {
               'package': 'chromium/android_webview/tools/orderfiles/arm',
-              'version': '3tUC56--r7plwRF75vw1TZS53CWyVbgLRLOy1Hdd-jgC',
+              'version': 'nPva3ZC746CQw49WodCgruTQ-Onb2MCzkWZwZNTWkPYC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1226,7 +1226,7 @@
       'packages': [
           {
               'package': 'chromium/android_webview/tools/orderfiles/arm64',
-              'version': 'Fhc839jVL58c5qjoN2UwrTVxACvm7q3fVGISpB__7ZkC',
+              'version': 'XEY6o6HqNGF3L4Lvj_ut6H6y9eTmdxBh8piyY1c6PLEC',
           },
       ],
       'condition': 'checkout_android and non_git_source',
@@ -1611,7 +1611,7 @@
     'packages': [
       {
         'package': 'chromium/chrome/test/data/variations/cipd',
-        'version': '3RsFECl7rGJN74okYOPMZMo9dz80FU0h3Cbfs-T6TxAC',
+        'version': 'iJm9mt1uNcE_l1t3v-5ULNWPfNDIOhszbu4Ry80N4xsC',
       },
     ],
     'dep_type': 'cipd',
@@ -1622,7 +1622,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    'f6e3ab4dc4a030cacc98eecaf3d1ecdb11607cd1',
+    'a33560958e4b27944324ad5010b7321066789c02',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -2026,7 +2026,7 @@
   # Tools used when building Chrome for Chrome OS. This affects both the Simple
   # Chrome workflow, as well as the chromeos-chrome ebuild.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '76e9ad3dad5fa5c46fbbcce0fea584b4e170baa4',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '8205aa10b208855bffdbd89ab1e9a26ee18b176c',
       'condition': 'checkout_chromeos',
   },
 
@@ -2927,11 +2927,11 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@ca45bb2eb74577abaf9c344d8a31700eb7b7f549',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@e58814db129a9b5e0f18a8f13b5fa3964d90b105',
   'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@ffcdd3ea9acf4fd70746250731e93c6c73f1cba3',
   'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3',
   'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@f2e4bd213104fe323a01e935df56557328d37ac8',
-  'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@fbe9605c516d4e9bc27aa621dc5edb195d100ef5',
+  'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@917617c93734a94446332fe62aed1f90cddcd61a',
   'src/third_party/vulkan-headers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Headers@766aaabe571fa32c53606085775340b78ab8d728',
   'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@6f557a4ff7dfc0f5eb58eb1f492d3d3de723b6c4',
   'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@5f090a13d0629694036efb104f8633af69ba3ce7',
@@ -2979,7 +2979,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'b488bbb11b4fee38df533fc0c7a5ed94d31f6e3b',
+    Var('webrtc_git') + '/src.git' + '@' + 'c06d073191ac510a65d72013124a18a7bd87ad01',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -3569,7 +3569,7 @@
 
   'src/chrome/common/request_header_integrity/internal': {
       'url': Var('chrome_git') + '/chrome/browser/request_header_integrity/internal.git' + '@' +
-        '1592aa7ba598a048f918f54735bcf056556532c3',
+        'f8540e200327c806b7434d1e6632bfd3f3673de8',
       'condition': 'checkout_src_internal',
   },
 
@@ -3749,7 +3749,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        '4102194b650c41229ac604fd91c57bad852df153',
+        '4c70012304bc82fac60d30099af72c309722ca86',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/WATCHLISTS b/WATCHLISTS
index ab281de..a9bd94b 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -1303,6 +1303,12 @@
     'gfx_image': {
       'filepath': 'ui/gfx/image/',
     },
+    'glic': {
+      'filepath': 'chrome/browser/glic|'\
+                  'chrome/test/data/webui/glic|'\
+                  'chrome/browser/resources/glic',
+
+    },
     'global_media_controls': {
       'filepath': 'chrome/browser/ui/global_media_controls|'\
                   'chrome/browser/ui/views/global_media_controls|'\
@@ -2905,8 +2911,7 @@
                 'mdjones+watch@chromium.org',
                 'yuezhanggg+watch@chromium.org'],
     'components_deps': ['droger+watchlist@chromium.org'],
-    'compose': ['dewittj+watch@chromium.org',
-                'petewil@chromium.org'],
+    'compose': ['petewil@chromium.org'],
     'compositor_animator': ['mdjones+watch@chromium.org'],
     'compute_pressure': ['arnaud.mandy@intel.com',
                          'wei4.wang@intel.com',
@@ -3027,6 +3032,7 @@
     'geolocation': ['mattreynolds+watch@chromium.org'],
     'gfx_geometry': ['cc-bugs@chromium.org'],
     'gfx_image': ['rsesek+watch@chromium.org'],
+    'glic': ['dewittj+watch@chromium.org'],
     'global_media_controls': ['steimel+watch-gmc@chromium.org'],
     'gn': ['agrieve+watch@chromium.org',
            'dpranke@chromium.org'],
diff --git a/agents/testing/README.md b/agents/testing/README.md
index e01d8bb..f09ca6e4 100644
--- a/agents/testing/README.md
+++ b/agents/testing/README.md
@@ -17,6 +17,19 @@
 configured via command line arguments, including use of stable releases via npm
 which will likely result in faster setup.
 
+### Filtering by tags
+
+Tests can be filtered by tags by passing the `--tag-filter` argument,
+followed by a comma-separated list of tags. Only tests that have at least one
+of the given tags will be run. Tags can be added to tests by adding a `tags`
+field to the test's metadata in its `promptfoo.yaml` file.
+
+```yaml
+tests:
+  - metadata:
+    tags: ['my-tag']
+```
+
 ### Running without a container runtime
 
 If you are running `eval_prompts.py` on a system without a container runtime
@@ -121,6 +134,7 @@
       - foo_unittests
       runs_per_test: 10 # The number of iterations to run
       pass_k_threshold: 5 # The number of iterations that must pass
+      tags: ['my-tag']
 ```
 
 ### Example Patch File
diff --git a/agents/testing/eval_config.py b/agents/testing/eval_config.py
index 929a6bfc..cf5e4bde6 100644
--- a/agents/testing/eval_config.py
+++ b/agents/testing/eval_config.py
@@ -24,6 +24,7 @@
     runs_per_test: int = 1
     pass_k_threshold: int = 1
     precompile_targets: list = dataclasses.field(default_factory=list)
+    tags: list[str] = dataclasses.field(default_factory=list)
 
     def __lt__(self, other: 'TestConfig') -> bool:
         return self.test_file < other.test_file
@@ -41,6 +42,10 @@
         if self.runs_per_test < self.pass_k_threshold:
             raise ValueError(f'runs_per_test in {self.test_file} must be >= '
                              'pass_k_threshold.')
+        if not isinstance(self.tags, list) or not all(
+                isinstance(t, str) for t in self.tags):
+            raise ValueError(
+                f'tags in {self.test_file} must be a list of strings.')
 
     @property
     def src_relative_test_file(self) -> pathlib.Path:
@@ -71,6 +76,7 @@
         runs_per_test = 1
         pass_k_threshold = 1
         precompile_targets = []
+        tags = []
         if len(config['tests']) > 1:
             logging.warning(
                 'Test settings can only be specified on the first test in a '
@@ -82,11 +88,13 @@
             runs_per_test = metadata.get('runs_per_test', 1)
             pass_k_threshold = metadata.get('pass_k_threshold', runs_per_test)
             precompile_targets = metadata.get('precompile_targets', [])
+            tags = metadata.get('tags', [])
 
         instance = cls(test_file=test_file,
                        runs_per_test=runs_per_test,
                        pass_k_threshold=pass_k_threshold,
-                       precompile_targets=precompile_targets)
+                       precompile_targets=precompile_targets,
+                       tags=tags)
         instance.validate()
         return instance
 
diff --git a/agents/testing/eval_config_unittest.py b/agents/testing/eval_config_unittest.py
index 7fb782b..c24df8f 100755
--- a/agents/testing/eval_config_unittest.py
+++ b/agents/testing/eval_config_unittest.py
@@ -77,6 +77,28 @@
         self.assertEqual(config.pass_k_threshold, 3)
         self.assertEqual(config.precompile_targets, ["target1", "target2"])
 
+    def test_with_tags(self):
+        """Tests that tags are read correctly."""
+        yaml_with_tags = """
+tests:
+  - metadata:
+      tags: ['tag1', 'tag2']
+"""
+        self.fs.create_file('test.yaml', contents=yaml_with_tags)
+        config = eval_config.TestConfig.from_file(pathlib.Path('test.yaml'))
+        self.assertEqual(config.tags, ['tag1', 'tag2'])
+
+    def test_empty_tags_list(self):
+        """Tests that an empty tags list is handled correctly."""
+        yaml_empty_tags = """
+tests:
+  - metadata:
+      tags: []
+"""
+        self.fs.create_file('test.yaml', contents=yaml_empty_tags)
+        config = eval_config.TestConfig.from_file(pathlib.Path('test.yaml'))
+        self.assertEqual(config.tags, [])
+
     def test_first_test_has_settings(self):
         """Tests that settings are read from the first test with metadata."""
         yaml_first_test_has_settings = """
@@ -253,6 +275,12 @@
                 pass_k_threshold=2)
             config.validate()
 
+    def test_invalid_tags_type(self):
+        with self.assertRaisesRegex(ValueError, 'must be a list of strings'):
+            config = eval_config.TestConfig(
+                test_file=pathlib.Path('/src/test.yaml'), tags=['valid', 123])
+            config.validate()
+
 
 if __name__ == '__main__':
     unittest.main()
diff --git a/agents/testing/eval_prompts.py b/agents/testing/eval_prompts.py
index 05ab5fb..030635e 100755
--- a/agents/testing/eval_prompts.py
+++ b/agents/testing/eval_prompts.py
@@ -150,6 +150,7 @@
     shard_index: int | None,
     total_shards: int | None,
     test_filter: str | None,
+    tag_filter: str | None = None,
 ) -> list[eval_config.TestConfig]:
     """Retrieves which tests should be run for this invocation.
 
@@ -161,6 +162,7 @@
         total_shards: The swarming shard total parsed from arguments.
         test_filter: The test filter parsed from arguments. Should be a string
             containing a ::-separated list of globs to use for filtering.
+        tag_filter: A comma-separated string of tags to filter tests by.
 
     Returns:
         A potentially empty list of TestConfigs, each pointing to a valid test
@@ -174,6 +176,11 @@
         configs_to_run = [
             c for c in configs_to_run if c.matches_filter(filters)
         ]
+    if tag_filter:
+        tag_list = tag_filter.split(',')
+        configs_to_run = [
+            c for c in configs_to_run if any(tag in c.tags for tag in tag_list)
+        ]
     configs_to_run.sort()
     configs_to_run = configs_to_run[shard_index::total_shards]
     return configs_to_run
@@ -278,7 +285,7 @@
         0 on success, a non-zero value on failure.
     """
     configs_to_run = _get_tests_to_run(args.shard_index, args.total_shards,
-                                       args.filter)
+                                       args.filter, args.tag_filter)
     configs_to_run = configs_to_run * (args.isolated_script_test_repeat + 1)
     if len(configs_to_run) == 0:
         logging.info('No tests to run after filtering and sharding')
@@ -481,6 +488,10 @@
               'is set.'))
 
     group = parser.add_argument_group('Test Selection Arguments')
+    group.add_argument(
+        '--tag-filter',
+        help='A comma-separated list of tags to filter tests by. Only tests '
+        'with at least one of these tags will be run.')
     filter_group = group.add_mutually_exclusive_group()
     filter_group.add_argument(
         '--filter', help='A ::-separated list of globs of tests to run.')
diff --git a/agents/testing/eval_prompts_unittest.py b/agents/testing/eval_prompts_unittest.py
index d438036..4e114aa 100755
--- a/agents/testing/eval_prompts_unittest.py
+++ b/agents/testing/eval_prompts_unittest.py
@@ -399,6 +399,43 @@
         result = eval_prompts._get_tests_to_run(None, None, None)
         self.assertEqual(len(result), 0)
 
+    def test_get_tests_to_run_with_tag_filter(self):
+        """Tests that tests are filtered correctly by metadata."""
+        self.mock_determine_shard_values.return_value = (0, 1)
+        test_configs = [
+            eval_config.TestConfig(test_file=pathlib.Path('/test/a.yaml'),
+                                   tags=['t1']),
+            eval_config.TestConfig(test_file=pathlib.Path('/test/b.yaml'),
+                                   tags=['t2']),
+            eval_config.TestConfig(test_file=pathlib.Path('/test/c.yaml'),
+                                   tags=['t1', 't3']),
+        ]
+        self.mock_discover_testcase_files.return_value = test_configs
+
+        result = eval_prompts._get_tests_to_run(None, None, None, 't1')
+        result_paths = [c.test_file for c in result]
+        self.assertEqual(len(result_paths), 2)
+        self.assertIn(pathlib.Path('/test/a.yaml'), result_paths)
+        self.assertIn(pathlib.Path('/test/c.yaml'), result_paths)
+
+        result = eval_prompts._get_tests_to_run(None, None, None, 't2')
+        result_paths = [c.test_file for c in result]
+        self.assertEqual(len(result_paths), 1)
+        self.assertIn(pathlib.Path('/test/b.yaml'), result_paths)
+
+        result = eval_prompts._get_tests_to_run(None, None, None, 't1,t2')
+        result_paths = [c.test_file for c in result]
+        self.assertEqual(len(result_paths), 3)
+
+        result = eval_prompts._get_tests_to_run(None, None, None, 't3')
+        result_paths = [c.test_file for c in result]
+        self.assertEqual(len(result_paths), 1)
+        self.assertIn(pathlib.Path('/test/c.yaml'), result_paths)
+
+        result = eval_prompts._get_tests_to_run(None, None, None, 't4')
+        result_paths = [c.test_file for c in result]
+        self.assertEqual(len(result_paths), 0)
+
 
 class PerformChromiumSetupUnittest(unittest.TestCase):
     """Unit tests for the `_perform_chromium_setup` function."""
@@ -543,6 +580,7 @@
         self.args.shard_index = None
         self.args.total_shards = None
         self.args.filter = None
+        self.args.tag_filter = None
         self.args.force = False
         self.args.no_build = False
         self.args.no_clean = False
diff --git a/agents/testing/results.py b/agents/testing/results.py
index 624ae7ae..b3de04e 100644
--- a/agents/testing/results.py
+++ b/agents/testing/results.py
@@ -106,17 +106,20 @@
     relative_path = test_result.config.test_file.relative_to(
         constants.CHROMIUM_SRC)
     posix_path = relative_path.as_posix()
-    result_sink_client.Post(
-        test_id=str(posix_path),
-        status=result_types.PASS if test_result.success else result_types.FAIL,
-        duration=test_result.total_duration * 1000,
-        test_log=test_result.combined_logs,
-        test_id_structured={
-            'coarseName': '',  # Leave blank for scheme 'flat'.
-            'fineName': '',  # Leave blank for scheme 'flat'.
-            'caseNameComponents': [str(posix_path)],
-        },
-        test_file=f'//{str(posix_path)}')
+    for iteration_result in test_result.iteration_results:
+        result_sink_client.Post(
+            test_id=str(posix_path),
+            status=(result_types.PASS
+                    if iteration_result.success else result_types.FAIL),
+            duration=iteration_result.duration * 1000,
+            test_log=iteration_result.test_log,
+            test_id_structured={
+                'coarseName': '',  # Leave blank for scheme 'flat'.
+                'fineName': '',  # Leave blank for scheme 'flat'.
+                'caseNameComponents': [str(posix_path)],
+            },
+            test_file=f'//{str(posix_path)}')
+
 
 
 class ResultThread(threading.Thread):
diff --git a/android_webview/browser/gfx/output_surface_provider_webview.cc b/android_webview/browser/gfx/output_surface_provider_webview.cc
index e30864b..80339f6 100644
--- a/android_webview/browser/gfx/output_surface_provider_webview.cc
+++ b/android_webview/browser/gfx/output_surface_provider_webview.cc
@@ -44,8 +44,6 @@
     std::pair<scoped_refptr<gl::GLSurface>, scoped_refptr<gl::GLContext>>;
 
 GLSurfaceContextPair GetRealContextForVulkan() {
-  // TODO(crbug.com/40155015): Remove all of this after code no longer expects
-  // GL to be present (eg for getting capabilities or calling glGetError).
   static base::NoDestructor<base::WeakPtr<gl::GLSurface>> cached_surface;
   static base::NoDestructor<base::WeakPtr<gl::GLContext>> cached_context;
 
diff --git a/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 6643e817..3e1d91a1 100644
--- a/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/android_webview/test/data/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -9219,6 +9219,7 @@
     getter updateCallbackDone
     method constructor
     method skipTransition
+    method waitUntil
 interface ViewTransitionTypeSet
     attribute @@toStringTag
     getter size
diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc
index ffd37a9..ce016be 100644
--- a/ash/app_list/views/apps_container_view.cc
+++ b/ash/app_list/views/apps_container_view.cc
@@ -600,9 +600,6 @@
 }
 
 void AppsContainerView::TransitionEnded() {
-  // TODO(crbug.com/1285184): Sometimes gradient mask is not removed because
-  // this function does not get called in some cases.
-
   // Gradient mask is no longer necessary once transition is finished.
   MaybeRemoveGradientMask();
 }
diff --git a/ash/app_list/views/recent_apps_view.cc b/ash/app_list/views/recent_apps_view.cc
index 92be191..ce0335e2 100644
--- a/ash/app_list/views/recent_apps_view.cc
+++ b/ash/app_list/views/recent_apps_view.cc
@@ -165,7 +165,6 @@
   layout_->set_cross_axis_alignment(
       views::BoxLayout::CrossAxisAlignment::kStart);
   GetViewAccessibility().SetRole(ax::mojom::Role::kGroup);
-  // TODO(https://crbug.com/1298211): This needs a designated string resource.
   GetViewAccessibility().SetName(
       l10n_util::GetStringUTF16(IDS_ASH_LAUNCHER_RECENT_APPS_A11Y_NAME),
       ax::mojom::NameFrom::kAttribute);
diff --git a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc
index 8b44928..7f70da8 100644
--- a/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc
+++ b/base/allocator/partition_allocator/src/partition_alloc/pointers/raw_ptr_unittest.cc
@@ -1179,8 +1179,7 @@
                               &x);
 }
 
-// TODO(crbug.com/448368929): Re-enable after the next clang roll
-TEST_F(RawPtrTest, DISABLED_SetLookupUsesGetForComparison) {
+TEST_F(RawPtrTest, SetLookupUsesGetForComparison) {
   int x = 123;
   CountingRawPtr<int> ptr(&x);
   std::set<CountingRawPtr<int>> set;
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn
index 11a53f8..4b13a3f 100644
--- a/base/test/BUILD.gn
+++ b/base/test/BUILD.gn
@@ -723,6 +723,7 @@
       "android/javatests/src/org/chromium/base/test/transit/ViewConditions.java",
       "android/javatests/src/org/chromium/base/test/transit/ViewElement.java",
       "android/javatests/src/org/chromium/base/test/transit/ViewElementMatchesCondition.java",
+      "android/javatests/src/org/chromium/base/test/transit/ViewFinder.java",
       "android/javatests/src/org/chromium/base/test/transit/ViewSpec.java",
     ]
   }
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/ViewConditions.java b/base/test/android/javatests/src/org/chromium/base/test/transit/ViewConditions.java
index b7f2444c..685bf9d 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/ViewConditions.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/ViewConditions.java
@@ -4,43 +4,32 @@
 
 package org.chromium.base.test.transit;
 
-import static androidx.test.espresso.Espresso.onView;
-import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
-import static androidx.test.espresso.matcher.RootMatchers.isDialog;
 import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
-import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
 
 import static org.hamcrest.CoreMatchers.allOf;
-import static org.hamcrest.CoreMatchers.any;
 
 import static org.chromium.build.NullUtil.assumeNonNull;
 
+import android.app.Activity;
 import android.view.View;
 
-import androidx.test.espresso.AmbiguousViewMatcherException;
-import androidx.test.espresso.NoMatchingRootException;
-import androidx.test.espresso.NoMatchingViewException;
-import androidx.test.espresso.UiController;
-import androidx.test.espresso.ViewAction;
-import androidx.test.espresso.ViewInteraction;
-import androidx.test.espresso.matcher.ViewMatchers;
+import androidx.test.espresso.Root;
 
 import org.hamcrest.Matcher;
 import org.hamcrest.StringDescription;
 
 import org.chromium.base.ApplicationStatus;
-import org.chromium.base.test.util.RawFailureHandler;
 import org.chromium.base.test.util.ViewPrinter;
 import org.chromium.build.annotations.NullMarked;
-import org.chromium.build.annotations.Nullable;
 
 import java.util.ArrayList;
-import java.util.function.Supplier;
+import java.util.List;
 
 /** {@link Condition}s related to Android {@link View}s. */
 @NullMarked
 public class ViewConditions {
 
+    private static final String TAG = "Transit";
     private static final ViewPrinter.Options PRINT_SHALLOW_WITH_BOUNDS =
             new ViewPrinter.Options()
                     .setPrintChildren(false)
@@ -58,7 +47,6 @@
         private final Matcher<View> mMatcher;
         private final Class<ViewT> mViewClass;
         private final Options mOptions;
-        private @Nullable View mViewMatched;
         private int mPreviousViewX = Integer.MIN_VALUE;
         private int mPreviousViewY = Integer.MIN_VALUE;
         private int mPreviousViewWidth = Integer.MIN_VALUE;
@@ -66,21 +54,13 @@
         private long mLastChangeMs = -1;
 
         public DisplayedCondition(Matcher<View> matcher, Class<ViewT> viewClass, Options options) {
-            super(/* isRunOnUiThread= */ false);
+            super(/* isRunOnUiThread= */ true);
             mMatcher = matcher;
             mViewClass = viewClass;
             mOptions = options;
         }
 
         @Override
-        public boolean shouldRunInPreCheck() {
-            // TODO(crbug.com/363308068): onView().inRoot(isDialog()) hangs for 60s waiting for a
-            // dialog root if there is no matching root, so only check when we actually expect a
-            // dialog to exist.
-            return !mOptions.mInDialogRoot;
-        }
-
-        @Override
         public String buildDescription() {
             StringBuilder description = new StringBuilder();
             description
@@ -115,74 +95,47 @@
             // more details later in this method.
             ArrayList<String> messages = new ArrayList<>();
 
-            Supplier<ViewAction> findViewActionFactory =
-                    () ->
-                            new ViewAction() {
-                                @Override
-                                public Matcher<View> getConstraints() {
-                                    return any(View.class);
-                                }
+            assert mOwnerState != null : "No owner state, cannot be a Transition Condition";
 
-                                @Override
-                                public String getDescription() {
-                                    return "check existence, visibility and displayed percentage";
-                                }
-
-                                @Override
-                                public void perform(UiController uiController, View view) {
-                                    mViewMatched = view;
-                                }
-                            };
-
-            ViewInteraction viewInteraction =
-                    onView(mMatcher).withFailureHandler(RawFailureHandler.getInstance());
-            if (mOptions.mInDialogRoot) {
-                viewInteraction = viewInteraction.inRoot(isDialog());
-            }
-
-            try {
-                viewInteraction.perform(findViewActionFactory.get());
-            } catch (NoMatchingViewException | NoMatchingRootException e) {
-                return notFulfilled(e.getClass().getSimpleName()).withoutResult();
-            } catch (AmbiguousViewMatcherException e) {
-                // Found 2+ Views. Try again, but filtering only by effectively visible Views.
-                // This avoids AmbiguousViewMatcherException when there is one VISIBLE but also
-                // GONE views that match |mMatcher|.
-                try {
-                    onView(
-                                    allOf(
-                                            mMatcher,
-                                            withEffectiveVisibility(
-                                                    ViewMatchers.Visibility.VISIBLE)))
-                            .withFailureHandler(RawFailureHandler.getInstance())
-                            .perform(findViewActionFactory.get());
-                } catch (NoMatchingViewException f) {
-                    // Report the AmbiguousViewMatcherException with the GONE views.
-                    return notFulfilled(
-                                    e.getClass().getSimpleName()
-                                            + " with GONE Views | "
-                                            + e.getMessage())
+            Activity activity;
+            ActivityElement<?> activityElement = mOwnerState.determineActivityElement();
+            if (activityElement == null) {
+                // TODO(crbug.com/456768907): Allow this only for dialogs.
+                activity = null;
+            } else {
+                activity = activityElement.get();
+                if (activity == null) {
+                    return awaiting("Waiting for Activity from %s", activityElement)
                             .withoutResult();
-                } catch (NoMatchingRootException f) {
-                    return notFulfilled(f.getClass().getSimpleName()).withoutResult();
-                } catch (AmbiguousViewMatcherException f) {
-                    return notFulfilled(f.getClass().getSimpleName() + " | " + f.getMessage())
+                }
+                if (activity.isDestroyed()) {
+                    return notFulfilled("Activity from %s is destroyed", activityElement)
+                            .withoutResult();
+                }
+                if (activity.isFinishing()) {
+                    return notFulfilled("Activity from %s is finishing", activityElement)
                             .withoutResult();
                 }
             }
 
-            // Assume found a View, or an exception would have been thrown above and
-            // |notFulfilled()| would have been returned.
-            assumeNonNull(mViewMatched);
-            boolean fulfilled = true;
-            messages.add(ViewPrinter.describeView(mViewMatched, PRINT_SHALLOW_WITH_BOUNDS));
+            List<Root> roots = ViewFinder.findRoots(activity);
 
-            View view = mViewMatched;
-            int visibility = view.getVisibility();
+            List<View> viewMatches = ViewFinder.findViews(roots, mMatcher);
+
+            if (viewMatches.size() != 1) {
+                return notFulfilled(writeMatchingViewsStatusMessage(viewMatches)).withoutResult();
+            }
+            View matchedView = viewMatches.get(0);
+
+            boolean fulfilled = true;
+            messages.add(ViewPrinter.describeView(matchedView, PRINT_SHALLOW_WITH_BOUNDS));
+
+            int visibility = matchedView.getVisibility();
             if (visibility != View.VISIBLE) {
                 fulfilled = false;
                 messages.add(String.format("visibility = %s", visibilityIntToString(visibility)));
             } else {
+                View view = matchedView;
                 while (view.getParent() instanceof View) {
                     view = (View) view.getParent();
                     visibility = view.getVisibility();
@@ -198,9 +151,8 @@
                 }
             }
 
-            // Since perform() above did not throw an Exception, mViewMatched is non-null.
             if (mOptions.mDisplayedPercentageRequired > 0) {
-                DisplayedPortion portion = DisplayedPortion.ofView(mViewMatched);
+                DisplayedPortion portion = DisplayedPortion.ofView(matchedView);
                 if (portion.mPercentage < mOptions.mDisplayedPercentageRequired) {
                     fulfilled = false;
                     messages.add(
@@ -214,12 +166,12 @@
             }
 
             if (mOptions.mExpectEnabled) {
-                if (!mViewMatched.isEnabled()) {
+                if (!matchedView.isEnabled()) {
                     fulfilled = false;
                     messages.add("disabled");
                 }
             } else if (mOptions.mExpectDisabled) {
-                if (mViewMatched.isEnabled()) {
+                if (matchedView.isEnabled()) {
                     fulfilled = false;
                     messages.add("enabled");
                 }
@@ -228,11 +180,11 @@
             if (mOptions.mSettleTimeMs > 0) {
                 long nowMs = System.currentTimeMillis();
                 int[] locationOnScreen = new int[2];
-                mViewMatched.getLocationOnScreen(locationOnScreen);
+                matchedView.getLocationOnScreen(locationOnScreen);
                 int newX = locationOnScreen[0];
                 int newY = locationOnScreen[1];
-                int newWidth = view.getWidth();
-                int newHeight = view.getHeight();
+                int newWidth = matchedView.getWidth();
+                int newHeight = matchedView.getHeight();
                 if (mPreviousViewX != newX
                         || mPreviousViewY != newY
                         || mPreviousViewWidth != newWidth
@@ -255,13 +207,13 @@
 
             ViewT typedView = null;
             try {
-                typedView = mViewClass.cast(mViewMatched);
+                typedView = mViewClass.cast(matchedView);
             } catch (ClassCastException e) {
                 fulfilled = false;
                 messages.add(
                         String.format(
                                 "Matched View was a %s which is not a %s",
-                                mViewMatched.getClass().getName(), mViewClass.getName()));
+                                matchedView.getClass().getName(), mViewClass.getName()));
             }
 
             String message = String.join("; ", messages);
@@ -338,7 +290,7 @@
     }
 
     /** Fulfilled when no matching Views exist and are displayed. */
-    public static class NotDisplayedAnymoreCondition extends InstrumentationThreadCondition {
+    public static class NotDisplayedAnymoreCondition extends UiThreadCondition {
         private final Matcher<View> mMatcher;
 
         private static final String VERBOSE_DESCRIPTION =
@@ -364,14 +316,34 @@
                 return fulfilled("No visible activities");
             }
 
-            try {
-                onView(mMatcher)
-                        .withFailureHandler(RawFailureHandler.getInstance())
-                        .check(doesNotExist());
+            // TODO(crbug.com/414438521): Search only in the respective Activity instead of all.
+            List<Root> roots = ViewFinder.findRoots(/* activity= */ null);
+
+            List<View> viewMatches = ViewFinder.findViews(roots, mMatcher);
+
+            if (viewMatches.isEmpty()) {
                 return fulfilled();
-            } catch (AssertionError e) {
-                return notFulfilled();
+            } else {
+                return notFulfilled(writeMatchingViewsStatusMessage(viewMatches));
             }
         }
     }
+
+    private static String writeMatchingViewsStatusMessage(List<View> viewMatches) {
+        // TODO(crbug.com/456770151): Print which root matches are in.
+        if (viewMatches.isEmpty()) {
+            return "No matching Views";
+        } else if (viewMatches.size() == 1) {
+            String viewDescription = ViewPrinter.describeView(viewMatches.get(0), PRINT_SHALLOW);
+            return String.format("1 matching View: %s", viewDescription);
+        } else {
+            String viewDescription1 = ViewPrinter.describeView(viewMatches.get(0), PRINT_SHALLOW);
+            String viewDescription2 = ViewPrinter.describeView(viewMatches.get(1), PRINT_SHALLOW);
+            String moreString = viewMatches.size() > 2 ? " and more" : "";
+
+            return String.format(
+                    "%d matching Views: %s, %s%s",
+                    viewMatches.size(), viewDescription1, viewDescription2, moreString);
+        }
+    }
 }
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/ViewElement.java b/base/test/android/javatests/src/org/chromium/base/test/transit/ViewElement.java
index 3145690da..89ab919 100644
--- a/base/test/android/javatests/src/org/chromium/base/test/transit/ViewElement.java
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/ViewElement.java
@@ -9,6 +9,7 @@
 import androidx.test.espresso.Espresso;
 import androidx.test.espresso.ViewAction;
 import androidx.test.espresso.ViewAssertion;
+import androidx.test.espresso.ViewInteraction;
 import androidx.test.espresso.action.ViewActions;
 import androidx.test.platform.app.InstrumentationRegistry;
 
@@ -153,12 +154,19 @@
     public TripBuilder performViewActionTo(ViewAction action) {
         return new TripBuilder()
                 .withContext(this)
-                .withTrigger(() -> Espresso.onView(mViewSpec.getViewMatcher()).perform(action));
+                .withTrigger(() -> newViewInteraction().perform(action));
     }
 
     /** Trigger an Espresso ViewAssertion on this View. */
     public void check(ViewAssertion assertion) {
-        Espresso.onView(mViewSpec.getViewMatcher()).check(assertion);
+        newViewInteraction().check(assertion);
+    }
+
+    private ViewInteraction newViewInteraction() {
+        // TODO(crbug.com/456785513): Ensure the View is still there rechecking DisplayedCondition,
+        // find the root and use inRoot() to avoid interacting with a matching View in a different
+        // window.
+        return Espresso.onView(mViewSpec.getViewMatcher());
     }
 
     /** Creates a Condition fulfilled if the View matches the |matcher|. */
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/ViewFinder.java b/base/test/android/javatests/src/org/chromium/base/test/transit/ViewFinder.java
new file mode 100644
index 0000000..f87a478
--- /dev/null
+++ b/base/test/android/javatests/src/org/chromium/base/test/transit/ViewFinder.java
@@ -0,0 +1,96 @@
+// 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.base.test.transit;
+
+import android.app.Activity;
+import android.os.IBinder;
+import android.view.View;
+import android.view.ViewGroup;
+import android.view.WindowManager;
+import android.view.inspector.WindowInspector;
+
+import androidx.test.espresso.Root;
+import androidx.test.espresso.matcher.RootMatchers;
+
+import com.google.common.collect.Lists;
+
+import org.hamcrest.Matcher;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@NullMarked
+/** Searches Android Windows for specific Views and root Views. */
+class ViewFinder {
+    /**
+     * Searches all Windows for root Views.
+     *
+     * @param activity If not null, restricts the search to that Activity's subwindows and dialogs.
+     *     If null, searches all focusable windows and dialogs.
+     * @return List of Roots found.
+     */
+    static List<Root> findRoots(@Nullable Activity activity) {
+        ThreadUtils.assertOnUiThread();
+
+        List<Root> matches = new ArrayList<>();
+
+        IBinder activityToken = null;
+        if (activity != null) {
+            activityToken = activity.getWindow().getDecorView().getWindowToken();
+        }
+        List<View> globalWindowViews = WindowInspector.getGlobalWindowViews();
+        for (View view : Lists.reverse(globalWindowViews)) {
+            if (!(view.getLayoutParams()
+                    instanceof WindowManager.LayoutParams windowLayoutParams)) {
+                continue;
+            }
+            if ((windowLayoutParams.flags & WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE) != 0) {
+                continue;
+            }
+
+            Root root =
+                    new Root.Builder()
+                            .withDecorView(view)
+                            .withWindowLayoutParams(windowLayoutParams)
+                            .build();
+
+            // Include both subwindows of the activity and focused dialogs
+            if ((activityToken == null || view.getApplicationWindowToken() == activityToken)
+                    || (RootMatchers.isDialog().matches(root) && view.hasWindowFocus())) {
+                matches.add(root);
+            }
+        }
+        return matches;
+    }
+
+    /** Searches multiple Roots for Views matching a |matcher|. */
+    static List<View> findViews(List<Root> roots, Matcher<View> matcher) {
+        ThreadUtils.assertOnUiThread();
+
+        List<View> matches = new ArrayList<>();
+        for (Root root : roots) {
+            findViewsRecursive(root.getDecorView(), matcher, matches);
+        }
+        return matches;
+    }
+
+    private static void findViewsRecursive(View root, Matcher<View> matcher, List<View> matches) {
+        ThreadUtils.assertOnUiThread();
+
+        if (matcher.matches(root)) {
+            matches.add(root);
+        }
+
+        if (root instanceof ViewGroup viewGroup) {
+            for (int i = 0; i < viewGroup.getChildCount(); i++) {
+                findViewsRecursive(viewGroup.getChildAt(i), matcher, matches);
+            }
+        }
+    }
+}
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index 90d9ff3..fe41a67b 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -900,6 +900,7 @@
     "tiles/tile_priority_unittest.cc",
     "trees/damage_tracker_unittest.cc",
     "trees/draw_properties_unittest.cc",
+    "trees/frame_data_unittest.cc",
     "trees/image_animation_controller_unittest.cc",
     "trees/layer_tree_frame_sink_unittest.cc",
     "trees/layer_tree_host_impl_unittest.cc",
diff --git a/cc/layers/picture_layer_impl.cc b/cc/layers/picture_layer_impl.cc
index 0e9321d8..46aa36c 100644
--- a/cc/layers/picture_layer_impl.cc
+++ b/cc/layers/picture_layer_impl.cc
@@ -1682,10 +1682,27 @@
          twin->ideal_contents_scale_key()});
   }
 
-  PictureLayerTilingSet* twin_set = twin ? twin->tilings_.get() : nullptr;
-  tilings_->CleanUpTilings(min_acceptable_high_res_scale,
-                           max_acceptable_high_res_scale, used_tilings,
-                           twin_set);
+  std::vector<PictureLayerTiling*> to_remove;
+  for (size_t i = 0; i < tilings_->num_tilings(); ++i) {
+    PictureLayerTiling* tiling = tilings_->tiling_at(i);
+    // Keep all tilings within the min/max scales.
+    if (tiling->contents_scale_key() >= min_acceptable_high_res_scale &&
+        tiling->contents_scale_key() <= max_acceptable_high_res_scale) {
+      continue;
+    }
+
+    // Don't remove tilings that are required.
+    if (base::Contains(used_tilings, tiling)) {
+      continue;
+    }
+
+    to_remove.push_back(tiling);
+  }
+
+  for (auto* tiling : to_remove) {
+    DCHECK_NE(HIGH_RESOLUTION, tiling->resolution());
+    tilings_->Remove(tiling);
+  }
 }
 
 float PictureLayerImpl::MinimumRasterContentsScaleForWillChangeTransform()
@@ -2176,6 +2193,13 @@
   return updates;
 }
 
+std::vector<float> PictureLayerImpl::TakeProposedTilingScalesForDeletion() {
+  std::vector<float> updates(proposed_tiling_scales_for_deletion_.begin(),
+                             proposed_tiling_scales_for_deletion_.end());
+  proposed_tiling_scales_for_deletion_.clear();
+  return updates;
+}
+
 PictureLayerImpl::TileUpdateSet PictureLayerImpl::TakeAllTiles() {
   DCHECK(layer_tree_impl()->settings().TreesInVizInClientProcess());
   DCHECK(layer_tree_impl()->IsActiveTree());
diff --git a/cc/layers/picture_layer_impl.h b/cc/layers/picture_layer_impl.h
index 5f887f8..ce6cb0ac 100644
--- a/cc/layers/picture_layer_impl.h
+++ b/cc/layers/picture_layer_impl.h
@@ -14,6 +14,7 @@
 #include <string>
 #include <vector>
 
+#include "base/containers/flat_set.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/raw_ptr_exclusion.h"
@@ -190,6 +191,8 @@
   using TileUpdateSet = std::map<float, std::set<TileIndex>>;
   TileUpdateSet TakeUpdatedTiles();
 
+  std::vector<float> TakeProposedTilingScalesForDeletion();
+
   // This is called in TreesInViz mode after context lost and all tiles need
   // to be re-wired to viz.
   TileUpdateSet TakeAllTiles();
@@ -277,6 +280,11 @@
   // Tracks tiles changed since the last call to TakeUpdatedTiles().
   TileUpdateSet updated_tiles_;
 
+  // Tracks all tiling contents-scale keys that this PictureLayerImpl has
+  // proposed for deletion since last call to TakeUpdatedScaleKeysToDelete().
+  // Used only in TreesInViz mode.
+  base::flat_set<float> proposed_tiling_scales_for_deletion_;
+
   // When true, tile updates for this layer are batched in |updated_tiles_|
   // instead of being sent to Viz immediately. This is necessary to prevent a
   // race condition in TreesInViz mode where tile updates could arrive at Viz
diff --git a/cc/layers/tile_display_layer_impl.cc b/cc/layers/tile_display_layer_impl.cc
index 6b8b0fe..8367eb9 100644
--- a/cc/layers/tile_display_layer_impl.cc
+++ b/cc/layers/tile_display_layer_impl.cc
@@ -207,6 +207,10 @@
     quad_offset = gfx::Vector2d(-visible_rect.x(), -visible_rect.y());
   }
 
+  // Keep track of the tilings that were used so that tilings that are
+  // unused can be considered for removal.
+  last_append_quads_scales_.clear();
+
   // TODO(crbug.com/40902346): Use scaled_cull_rect to set
   // append_quads_data->checkerboarded_needs_record.
   std::optional<gfx::Rect> scaled_cull_rect;
@@ -288,6 +292,14 @@
           render_pass->CreateAndAppendDrawQuad<viz::SolidColorDrawQuad>();
       quad->SetNew(shared_quad_state, offset_geometry_rect,
                    offset_visible_geometry_rect, color, false);
+      continue;
+    }
+
+    if (last_append_quads_scales_.empty() ||
+        last_append_quads_scales_.back() !=
+            iter.CurrentTiling()->contents_scale_key()) {
+      last_append_quads_scales_.push_back(
+          iter.CurrentTiling()->contents_scale_key());
     }
   }
 
@@ -371,4 +383,21 @@
       std::move(resource));
 }
 
+std::vector<float> TileDisplayLayerImpl::GetSafeToDeleteTilings() {
+  std::vector<float> safe_to_delete_scales;
+  for (float scale : proposed_tiling_scales_for_deletion_) {
+    // Check if a tiling corresponding to the candidate scale is present in
+    // |last_append_quads_scales_|.
+    auto it = std::find(last_append_quads_scales_.begin(),
+                        last_append_quads_scales_.end(), scale);
+    if (it == last_append_quads_scales_.end()) {
+      // If a tiling corresponding to the candidate scale is not present in
+      // |last_append_quads_scales_|, then its safe to delete.
+      safe_to_delete_scales.push_back(scale);
+    }
+  }
+  proposed_tiling_scales_for_deletion_.clear();
+  return safe_to_delete_scales;
+}
+
 }  // namespace cc
diff --git a/cc/layers/tile_display_layer_impl.h b/cc/layers/tile_display_layer_impl.h
index bfda56b..f6a8a9b 100644
--- a/cc/layers/tile_display_layer_impl.h
+++ b/cc/layers/tile_display_layer_impl.h
@@ -149,6 +149,10 @@
   }
   void SetRecordedBounds(const gfx::Rect& bounds) { recorded_bounds_ = bounds; }
   bool IsDirectlyCompositedImage() const override;
+  void SetProposedTilingScalesForDeletion(
+      std::vector<float> proposed_tiling_scales) {
+    proposed_tiling_scales_for_deletion_ = std::move(proposed_tiling_scales);
+  }
   bool nearest_neighbor() const { return nearest_neighbor_; }
 
   // LayerImpl overrides:
@@ -172,10 +176,18 @@
   const Tiling* GetTilingForTesting(float scale_key) const;
   void DiscardResource(viz::ResourceId resource);
 
+  // Returns a list of tiling scales that were proposed for deletion by
+  // renderer and were *not* used in the most recent frame, meaning they
+  // safe to clean up.
+  std::vector<float> GetSafeToDeleteTilings();
+
   // For testing
   std::optional<SkColor4f> solid_color_for_testing() const {
     return solid_color();
   }
+  std::vector<float>& LastAppendQuadsScalesForTesting() {
+    return last_append_quads_scales_;
+  }
 
  private:
   // TileBasedLayerImpl:
@@ -195,6 +207,27 @@
   // space.
   gfx::Rect damage_rect_;
   std::vector<std::unique_ptr<Tiling>> tilings_;
+
+  // List of tiling scales that were used last time we appended quads. This is
+  // used as an optimization not to remove tilings if they are still being
+  // drawn. The renderer will propose list of candidate tilings for deletion to
+  // Viz represented by |proposed_tiling_scales_for_deletion_|, and the
+  // Viz process will confirm which of those are safe to delete
+  // (i.e. not used in the last frame) before the renderer actually removes
+  // them. This keeps the renderer’s tile management logic close to its
+  // current behavior and prevents premature deletion of tiles still needed by
+  // Viz. Note that unlike PictureLayerImpl, we have last appended quads scales
+  // here instead of tiling ptr since its not needed in this case.
+  std::vector<float> last_append_quads_scales_;
+
+  // A list of tiling scale keys that the client has nominated for deletion.
+  // This allows the client to suggest cleanup, but Viz makes the final
+  // decision. After each frame, we determine which of these candidate scales
+  // were *not* used for drawing (by checking against
+  // `last_append_quads_scales_`). That final set of unused scales is then sent
+  // back to the client, confirming that the corresponding tilings can be safely
+  // destroyed.
+  std::vector<float> proposed_tiling_scales_for_deletion_;
 };
 
 }  // namespace cc
diff --git a/cc/layers/tile_display_layer_impl_unittest.cc b/cc/layers/tile_display_layer_impl_unittest.cc
index 7b7f9219..990f0b3 100644
--- a/cc/layers/tile_display_layer_impl_unittest.cc
+++ b/cc/layers/tile_display_layer_impl_unittest.cc
@@ -4,6 +4,8 @@
 
 #include "cc/layers/tile_display_layer_impl.h"
 
+#include <algorithm>
+
 #include "base/check_deref.h"
 #include "cc/layers/append_quads_context.h"
 #include "cc/layers/append_quads_data.h"
@@ -11,8 +13,11 @@
 #include "components/viz/client/client_resource_provider.h"
 #include "components/viz/common/quads/solid_color_draw_quad.h"
 #include "components/viz/common/quads/tile_draw_quad.h"
+#include "testing/gmock/include/gmock/gmock.h"
 #include "ui/gfx/geometry/rect.h"
 
+using testing::ElementsAre;
+
 namespace cc {
 
 class TileDisplayLayerImplTest : public TestLayerTreeHostBase {};
@@ -794,4 +799,164 @@
       tile->contents()));
 }
 
+// Verifies that last_append_quads_scales_ is correctly updated after
+// AppendQuads.
+TEST_F(TileDisplayLayerImplTest, LastAppendQuadsScalesUpdated) {
+  constexpr gfx::Size kLayerBounds(1300, 1900);
+  constexpr gfx::Rect kLayerRect(kLayerBounds);
+
+  auto layer = std::make_unique<TileDisplayLayerImpl>(
+      CHECK_DEREF(host_impl()->active_tree()), /*id=*/42);
+  auto* raw_layer = layer.get();
+  host_impl()->active_tree()->AddLayer(std::move(layer));
+
+  raw_layer->SetBounds(kLayerBounds);
+  raw_layer->SetRecordedBounds(kLayerRect);
+  raw_layer->draw_properties().visible_layer_rect = kLayerRect;
+  raw_layer->draw_properties().opacity = 1.0;
+
+  // Create two tilings with different scales.
+  auto& low_res_tiling = raw_layer->GetOrCreateTilingFromScaleKey(1.0);
+  low_res_tiling.SetTileSize(kLayerBounds);
+  low_res_tiling.SetTilingRect(kLayerRect);
+  auto& high_res_tiling = raw_layer->GetOrCreateTilingFromScaleKey(2.0);
+  high_res_tiling.SetTileSize(kLayerBounds);
+  high_res_tiling.SetTilingRect(kLayerRect);
+
+  // Set content for both tilings.
+  auto low_res_resource_id = host_impl()->resource_provider()->ImportResource(
+      viz::TransferableResource::Make(
+          gpu::ClientSharedImage::CreateForTesting(),
+          viz::TransferableResource::ResourceSource::kTest, gpu::SyncToken()),
+      base::DoNothing());
+  TileDisplayLayerImpl::TileContents low_res_contents =
+      TileDisplayLayerImpl::TileResource(low_res_resource_id, kLayerBounds,
+                                         /*is_checkered=*/false);
+  low_res_tiling.SetTileContents(TileIndex{0, 0}, low_res_contents,
+                                 /*update_damage=*/true);
+
+  auto high_res_resource_id = host_impl()->resource_provider()->ImportResource(
+      viz::TransferableResource::Make(
+          gpu::ClientSharedImage::CreateForTesting(),
+          viz::TransferableResource::ResourceSource::kTest, gpu::SyncToken()),
+      base::DoNothing());
+  TileDisplayLayerImpl::TileContents high_res_contents =
+      TileDisplayLayerImpl::TileResource(high_res_resource_id, kLayerBounds,
+                                         /*is_checkered=*/false);
+  high_res_tiling.SetTileContents(TileIndex{0, 0}, high_res_contents,
+                                  /*update_damage=*/true);
+
+  SetupRootProperties(host_impl()->active_tree()->root_layer());
+
+  auto render_pass = viz::CompositorRenderPass::Create();
+  AppendQuadsData data;
+  raw_layer->AppendQuads(AppendQuadsContext{DRAW_MODE_SOFTWARE, {}, false},
+                         render_pass.get(), &data);
+
+  // AppendQuads should use the ideal resolution tiling (1.0), so
+  // last_append_quads_scales_ should contain 1.0.
+  const auto& last_append_scales = raw_layer->LastAppendQuadsScalesForTesting();
+  ASSERT_EQ(last_append_scales.size(), 1u);
+  EXPECT_EQ(last_append_scales[0], 1.0f);
+}
+
+// Verifies that GetSafeToDeleteTilings returns the correct set of scales for
+// tilings that are safe to delete.
+TEST_F(TileDisplayLayerImplTest, GetSafeToDeleteTilingsBasic) {
+  auto layer = std::make_unique<TileDisplayLayerImpl>(
+      CHECK_DEREF(host_impl()->active_tree()), /*id=*/42);
+  auto* raw_layer = layer.get();
+  host_impl()->active_tree()->AddLayer(std::move(layer));
+
+  // Case 1: Basic scenario - some tilings used, some not.
+  raw_layer->LastAppendQuadsScalesForTesting() = {2.0f};
+  raw_layer->SetProposedTilingScalesForDeletion({1.0f, 2.0f, 3.0f});
+
+  std::vector<float> safe_to_delete = raw_layer->GetSafeToDeleteTilings();
+  EXPECT_THAT(safe_to_delete, ElementsAre(1.0f, 3.0f));
+
+  // Case 2: No tilings were used in the last frame.
+  raw_layer->LastAppendQuadsScalesForTesting().clear();
+  raw_layer->SetProposedTilingScalesForDeletion({1.0f, 2.0f, 3.0f});
+
+  safe_to_delete = raw_layer->GetSafeToDeleteTilings();
+  EXPECT_THAT(safe_to_delete, ElementsAre(1.0f, 2.0f, 3.0f));
+
+  // Case 3: All proposed tilings were used in the last frame.
+  raw_layer->LastAppendQuadsScalesForTesting() = {1.0f, 2.0f, 3.0f};
+  raw_layer->SetProposedTilingScalesForDeletion({1.0f, 2.0f, 3.0f});
+
+  safe_to_delete = raw_layer->GetSafeToDeleteTilings();
+  EXPECT_TRUE(safe_to_delete.empty());
+
+  // Case 4: Proposed tilings include some that don't exist in
+  // last_append_quads_scales_.
+  raw_layer->LastAppendQuadsScalesForTesting() = {2.0f};
+
+  // 4.0 is not in last_append_quads_scales_
+  raw_layer->SetProposedTilingScalesForDeletion({1.0f, 4.0f});
+
+  safe_to_delete = raw_layer->GetSafeToDeleteTilings();
+  EXPECT_THAT(safe_to_delete, ElementsAre(1.0f, 4.0f));
+}
+
+// Verifies that CleanUpTilings returns the correct set of scales for tilings
+// that are safe to delete. This is similar to above but more of an integration
+// style test since we are using ::AppendQuad() here and not directly using
+// LastAppendQuadsScalesForTesting().
+TEST_F(TileDisplayLayerImplTest, GetSafeToDeleteTilingsIntegration) {
+  constexpr gfx::Size kLayerBounds(100, 100);
+  constexpr gfx::Rect kLayerRect(kLayerBounds);
+
+  auto layer = std::make_unique<TileDisplayLayerImpl>(
+      CHECK_DEREF(host_impl()->active_tree()), /*id=*/42);
+  auto* raw_layer = layer.get();
+  host_impl()->active_tree()->AddLayer(std::move(layer));
+
+  raw_layer->SetBounds(kLayerBounds);
+  raw_layer->SetRecordedBounds(kLayerRect);
+  raw_layer->draw_properties().visible_layer_rect = kLayerRect;
+  raw_layer->draw_properties().opacity = 1.0;
+
+  // Create three tilings.
+  auto& tiling_1 = raw_layer->GetOrCreateTilingFromScaleKey(1.0);
+  tiling_1.SetTileSize(kLayerBounds);
+  tiling_1.SetTilingRect(kLayerRect);
+  tiling_1.SetTileContents(TileIndex{0, 0}, SkColors::kRed, true);
+
+  auto& tiling_2 = raw_layer->GetOrCreateTilingFromScaleKey(2.0);
+  tiling_2.SetTileSize(kLayerBounds);
+  tiling_2.SetTilingRect(kLayerRect);
+  tiling_2.SetTileContents(TileIndex{0, 0}, SkColors::kGreen, true);
+
+  auto& tiling_3 = raw_layer->GetOrCreateTilingFromScaleKey(3.0);
+  tiling_3.SetTileSize(kLayerBounds);
+  tiling_3.SetTilingRect(kLayerRect);
+  tiling_3.SetTileContents(TileIndex{0, 0}, SkColors::kBlue, true);
+
+  SetupRootProperties(host_impl()->active_tree()->root_layer());
+
+  auto render_pass = viz::CompositorRenderPass::Create();
+  AppendQuadsData data;
+  raw_layer->AppendQuads(AppendQuadsContext{DRAW_MODE_SOFTWARE, {}, false},
+                         render_pass.get(), &data);
+
+  // By default, the ideal resolution tiling (1.0) is used.
+  raw_layer->SetProposedTilingScalesForDeletion({1.0, 2.0});
+  std::vector<float> safe_to_delete = raw_layer->GetSafeToDeleteTilings();
+  EXPECT_THAT(safe_to_delete, ElementsAre(2.0f));
+
+  raw_layer->SetProposedTilingScalesForDeletion({1.0, 3.0});
+  safe_to_delete = raw_layer->GetSafeToDeleteTilings();
+  EXPECT_THAT(safe_to_delete, ElementsAre(3.0f));
+
+  raw_layer->SetProposedTilingScalesForDeletion({3.0});
+  safe_to_delete = raw_layer->GetSafeToDeleteTilings();
+  EXPECT_THAT(safe_to_delete, ElementsAre(3.0f));
+
+  raw_layer->SetProposedTilingScalesForDeletion({1.0, 2.0, 3.0});
+  safe_to_delete = raw_layer->GetSafeToDeleteTilings();
+  EXPECT_THAT(safe_to_delete, ElementsAre(2.0f, 3.0f));
+}
+
 }  // namespace cc
diff --git a/cc/mojo_embedder/viz_layer_context.cc b/cc/mojo_embedder/viz_layer_context.cc
index 9db294b..d491efb 100644
--- a/cc/mojo_embedder/viz_layer_context.cc
+++ b/cc/mojo_embedder/viz_layer_context.cc
@@ -952,6 +952,8 @@
           picture_layer.GetContentColorUsage();
       tile_display_extra->recorded_bounds =
           picture_layer.GetRasterSource()->recorded_bounds();
+      tile_display_extra->proposed_tiling_scales_for_deletion =
+          picture_layer.TakeProposedTilingScalesForDeletion();
       wire.layer_extra = viz::mojom::LayerExtra::NewTileDisplayLayerExtra(
           std::move(tile_display_extra));
       SerializePictureLayerTileUpdates(picture_layer, resource_provider,
@@ -1495,6 +1497,10 @@
 void VizLayerContext::OnRequestCommitForFrame(const viz::BeginFrameArgs& args) {
 }
 
+void VizLayerContext::OnTilingsReadyForCleanup(
+    int32_t layer_id,
+    const std::vector<float>& tiling_scales_to_clean_up) {}
+
 void VizLayerContext::SerializeAnimationUpdates(
     LayerTreeImpl& tree,
     viz::mojom::LayerTreeUpdate& update) {
diff --git a/cc/mojo_embedder/viz_layer_context.h b/cc/mojo_embedder/viz_layer_context.h
index ba9fe7d..ca9d2105 100644
--- a/cc/mojo_embedder/viz_layer_context.h
+++ b/cc/mojo_embedder/viz_layer_context.h
@@ -9,6 +9,7 @@
 #include <map>
 #include <set>
 #include <string>
+#include <vector>
 
 #include "base/memory/raw_ref.h"
 #include "cc/mojo_embedder/mojo_embedder_export.h"
@@ -55,6 +56,9 @@
 
   // viz::mojom::LayerContextClient:
   void OnRequestCommitForFrame(const viz::BeginFrameArgs& args) override;
+  void OnTilingsReadyForCleanup(
+      int32_t layer_id,
+      const std::vector<float>& tiling_scales_to_clean_up) override;
 
  private:
   // Serializes any changes to animation state on `tree` since the last push to
diff --git a/cc/tiles/picture_layer_tiling_set.cc b/cc/tiles/picture_layer_tiling_set.cc
index 7296b762..317fa47 100644
--- a/cc/tiles/picture_layer_tiling_set.cc
+++ b/cc/tiles/picture_layer_tiling_set.cc
@@ -237,33 +237,7 @@
 #endif
 }
 
-void PictureLayerTilingSet::CleanUpTilings(
-    float min_acceptable_high_res_scale_key,
-    float max_acceptable_high_res_scale_key,
-    const std::vector<raw_ptr<PictureLayerTiling, VectorExperimental>>&
-        needed_tilings,
-    PictureLayerTilingSet* twin_set) {
-  std::vector<PictureLayerTiling*> to_remove;
-  for (const auto& tiling : tilings_) {
-    // Keep all tilings within the min/max scales.
-    if (tiling->contents_scale_key() >= min_acceptable_high_res_scale_key &&
-        tiling->contents_scale_key() <= max_acceptable_high_res_scale_key) {
-      continue;
-    }
 
-    // Don't remove tilings that are required.
-    if (base::Contains(needed_tilings, tiling.get())) {
-      continue;
-    }
-
-    to_remove.push_back(tiling.get());
-  }
-
-  for (auto* tiling : to_remove) {
-    DCHECK_NE(HIGH_RESOLUTION, tiling->resolution());
-    Remove(tiling);
-  }
-}
 
 void PictureLayerTilingSet::RemoveNonIdealTilings() {
   std::erase_if(tilings_, [](const std::unique_ptr<PictureLayerTiling>& t) {
diff --git a/cc/tiles/picture_layer_tiling_set.h b/cc/tiles/picture_layer_tiling_set.h
index df879a7..9b0197d 100644
--- a/cc/tiles/picture_layer_tiling_set.h
+++ b/cc/tiles/picture_layer_tiling_set.h
@@ -55,12 +55,6 @@
 
   const PictureLayerTilingClient* client() const { return client_; }
 
-  void CleanUpTilings(
-      float min_acceptable_high_res_scale_key,
-      float max_acceptable_high_res_scale_key,
-      const std::vector<raw_ptr<PictureLayerTiling, VectorExperimental>>&
-          needed_tilings,
-      PictureLayerTilingSet* twin_set);
   void RemoveNonIdealTilings();
 
   // This function is called on the active tree during activation.
diff --git a/cc/trees/frame_data_unittest.cc b/cc/trees/frame_data_unittest.cc
new file mode 100644
index 0000000..cc86ace6
--- /dev/null
+++ b/cc/trees/frame_data_unittest.cc
@@ -0,0 +1,74 @@
+// 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 "cc/trees/frame_data.h"
+
+#include <utility>
+
+#include "base/test/trace_test_utils.h"
+#include "base/trace_event/trace_config.h"
+#include "base/trace_event/trace_log.h"
+#include "components/viz/common/quads/compositor_render_pass.h"
+#include "components/viz/common/quads/solid_color_draw_quad.h"
+#include "components/viz/common/quads/trees_in_viz_timing.h"
+#include "components/viz/test/begin_frame_args_test.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "ui/gfx/geometry/size.h"
+
+namespace cc {
+
+TEST(FrameDataTest, FrameDataAsValueTest) {
+  base::test::TracingEnvironment tracing_env;
+  base::trace_event::TraceLog::GetInstance()->SetEnabled(
+      base::trace_event::TraceConfig(TRACE_DISABLED_BY_DEFAULT("viz.quads"),
+                                     ""));
+  FrameData frame;
+  auto begin_frame_args = viz::CreateBeginFrameArgsForTesting(
+      BEGINFRAME_FROM_HERE, viz::BeginFrameArgs::kManualSourceId, 1,
+      base::TimeTicks() + base::Milliseconds(1));
+  frame.begin_frame_ack = viz::BeginFrameAck(begin_frame_args, true);
+  frame.origin_begin_main_frame_args = begin_frame_args;
+
+  // Create one fake render pass
+  auto render_pass = viz::CompositorRenderPass::Create();
+  viz::SharedQuadState* shared_quad_state =
+      render_pass->CreateAndAppendSharedQuadState();
+  gfx::Size content_bounds;
+  gfx::Rect quad_rect(content_bounds);
+  auto* quad = render_pass->CreateAndAppendDrawQuad<viz::SolidColorDrawQuad>();
+  quad->SetNew(shared_quad_state, quad_rect, quad_rect, SkColors::kTransparent,
+               false);
+
+  viz::CompositorRenderPassList render_pass_list;
+  render_pass_list.push_back(std::move(render_pass));
+  frame.render_passes = std::move(render_pass_list);
+  std::string frame_string = frame.ToString();
+
+  // Test that the frame has some strings set.
+  EXPECT_TRUE(base::Contains(frame_string, ("\"has_no_damage\": false")));
+  EXPECT_TRUE(base::Contains(frame_string, ("\"render_passes\": [ {")));
+
+  // Disable tracelog to avoid teardown failures.
+  base::trace_event::TraceLog::GetInstance()->SetDisabled();
+}
+
+TEST(FrameDataTest, FrameDataSetTreesInVizTimestamps) {
+  FrameData frame;
+  viz::TreesInVizTiming timing_details{
+      base::TimeTicks::Now(), base::TimeTicks::Now() + base::Milliseconds(1),
+      base::TimeTicks::Now() + base::Milliseconds(2),
+      base::TimeTicks::Now() + base::Milliseconds(3)};
+  frame.set_trees_in_viz_timestamps(timing_details);
+
+  ASSERT_EQ(frame.trees_in_viz_timing_details->start_update_display_tree,
+            timing_details.start_update_display_tree);
+  ASSERT_EQ(frame.trees_in_viz_timing_details->start_prepare_to_draw,
+            timing_details.start_prepare_to_draw);
+  ASSERT_EQ(frame.trees_in_viz_timing_details->start_draw_layers,
+            timing_details.start_draw_layers);
+  ASSERT_EQ(frame.trees_in_viz_timing_details->submit_compositor_frame,
+            timing_details.submit_compositor_frame);
+}
+
+}  // namespace cc
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni
index 69e4734..9cbeb5b 100644
--- a/chrome/android/chrome_java_sources.gni
+++ b/chrome/android/chrome_java_sources.gni
@@ -151,6 +151,7 @@
   "java/src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetViewBinder.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AndroidPaymentAppPreference.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AndroidPaymentAppsFragment.java",
+  "java/src/org/chromium/chrome/browser/autofill/settings/AutofillBuyNowPayLaterFragment.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AutofillCardBenefitsFragment.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AutofillCreditCardEditor.java",
   "java/src/org/chromium/chrome/browser/autofill/settings/AutofillDeletePaymentMethodConfirmationDialog.java",
diff --git a/chrome/android/java/res/layout/custom_tabs_toolbar.xml b/chrome/android/java/res/layout/custom_tabs_toolbar.xml
index 5906cc0e..dba6102 100644
--- a/chrome/android/java/res/layout/custom_tabs_toolbar.xml
+++ b/chrome/android/java/res/layout/custom_tabs_toolbar.xml
@@ -144,7 +144,7 @@
         <ViewStub
             android:id="@+id/optional_button_stub"
             android:inflatedId="@+id/optional_toolbar_button_container"
-            android:layout_gravity="top"
+            android:layout_gravity="center_vertical"
             android:visibility="gone"
             style="@style/ToolbarHoverableButton" />
     </LinearLayout>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillBuyNowPayLaterFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillBuyNowPayLaterFragment.java
new file mode 100644
index 0000000..897590c
--- /dev/null
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillBuyNowPayLaterFragment.java
@@ -0,0 +1,48 @@
+// 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.autofill.settings;
+
+import android.content.Context;
+import android.os.Bundle;
+
+import androidx.preference.PreferenceScreen;
+
+import org.chromium.base.supplier.ObservableSupplier;
+import org.chromium.base.supplier.ObservableSupplierImpl;
+import org.chromium.build.annotations.NullMarked;
+import org.chromium.build.annotations.Nullable;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.settings.ChromeBaseSettingsFragment;
+import org.chromium.components.browser_ui.settings.SettingsFragment;
+
+/** Preferences fragment to allow users to manage Buy Now Pay Later application settings. */
+@NullMarked
+public class AutofillBuyNowPayLaterFragment extends ChromeBaseSettingsFragment {
+
+    private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>();
+
+    @Override
+    public void onCreatePreferences(@Nullable Bundle savedInstanceState, @Nullable String rootKey) {
+        mPageTitle.set(getString(R.string.autofill_bnpl_settings_label));
+
+        // Create blank preference screen.
+        PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getStyledContext());
+        setPreferenceScreen(screen);
+    }
+
+    @Override
+    public ObservableSupplier<String> getPageTitle() {
+        return mPageTitle;
+    }
+
+    private Context getStyledContext() {
+        return getPreferenceManager().getContext();
+    }
+
+    @Override
+    public @SettingsFragment.AnimationType int getAnimationType() {
+        return SettingsFragment.AnimationType.PROPERTY;
+    }
+}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragment.java
index 5976e84..e4680fe 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragment.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragment.java
@@ -88,6 +88,7 @@
     static final String PREF_ADD_IBAN = "add_iban";
     static final String PREF_CARD = "card";
     static final String PREF_IBAN = "iban";
+    static final String PREF_BUY_NOW_PAY_LATER = "buy_now_pay_later";
     static final String PREF_CARD_BENEFITS = "card_benefits";
     static final String PREF_PAYMENT_APPS = "payment_apps";
     static final String PREF_LOYALTY_CARDS = "loyalty_cards";
@@ -350,6 +351,15 @@
                 cardBenefitsPref.setFragment(AutofillCardBenefitsFragment.class.getName());
                 getPreferenceScreen().addPreference(cardBenefitsPref);
             }
+
+            if (personalDataManager.isAutofillPaymentMethodsEnabled()
+                    && personalDataManager.shouldShowBnplSettings()) {
+                Preference buyNowPayLaterPref = new Preference(getStyledContext());
+                buyNowPayLaterPref.setTitle(R.string.autofill_bnpl_settings_label);
+                buyNowPayLaterPref.setKey(PREF_BUY_NOW_PAY_LATER);
+                buyNowPayLaterPref.setFragment(AutofillBuyNowPayLaterFragment.class.getName());
+                getPreferenceScreen().addPreference(buyNowPayLaterPref);
+            }
         }
 
         for (CreditCard card : personalDataManager.getCreditCardsForSettings()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
index f9a78a7..0c2677e 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -7,6 +7,8 @@
 import static org.chromium.build.NullUtil.assertNonNull;
 import static org.chromium.build.NullUtil.assumeNonNull;
 import static org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutUtils.ANIM_TAB_MOVE_MS;
+import static org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutUtils.BUTTON_BACKGROUND_SIZE_DP;
+import static org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutUtils.BUTTON_TOUCH_TARGET_SIZE_DP;
 import static org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutUtils.INVALID_TIME;
 import static org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutUtils.MAX_TAB_WIDTH_DP;
 import static org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutUtils.MIN_TAB_WIDTH_DP;
@@ -181,8 +183,6 @@
 
     // Visibility Constants
     private static final float NEW_TAB_BUTTON_BACKGROUND_Y_OFFSET_DP = 3.f;
-    private static final float NEW_TAB_BUTTON_BACKGROUND_WIDTH_DP = 32.f;
-    private static final float NEW_TAB_BUTTON_BACKGROUND_HEIGHT_DP = 32.f;
 
     // Desired spacing between new tab button and tabs when tab strip is not full.
     private static final float DESIRED_PADDING_BETWEEN_NEW_TAB_BUTTON_AND_TABS = 2.f;
@@ -193,10 +193,8 @@
 
     // Values adapt based on whether the device is desktop or tablet.
     private static final boolean IS_DESKTOP_DENSITY = StripLayoutUtils.shouldApplyMoreDensity();
-    private static final float BUTTON_DESIRED_TOUCH_TARGET_SIZE =
-            IS_DESKTOP_DENSITY ? NEW_TAB_BUTTON_BACKGROUND_WIDTH_DP : 48.f;
     private static final float NEW_TAB_BUTTON_CLICK_SLOP_DP =
-            (BUTTON_DESIRED_TOUCH_TARGET_SIZE - NEW_TAB_BUTTON_BACKGROUND_WIDTH_DP) / 2;
+            (BUTTON_TOUCH_TARGET_SIZE_DP - BUTTON_BACKGROUND_SIZE_DP) / 2;
     private static final float NEW_TAB_BUTTON_WITH_MODEL_SELECTOR_BUTTON_PADDING =
             IS_DESKTOP_DENSITY ? 24.f : 8.f;
 
@@ -711,7 +709,7 @@
             TabGroupListBottomSheetCoordinatorFactory tabGroupListBottomSheetCoordinatorFactory) {
         mGroupTitleDrawXOffset = TAB_OVERLAP_WIDTH_DP - FOLIO_FOOT_LENGTH_DP;
         mGroupTitleOverlapWidth = FOLIO_FOOT_LENGTH_DP - mGroupTitleDrawXOffset;
-        mNewTabButtonWidth = NEW_TAB_BUTTON_BACKGROUND_WIDTH_DP;
+        mNewTabButtonWidth = BUTTON_BACKGROUND_SIZE_DP;
         mModelSelectorButton = modelSelectorButton;
         mToolbarContainerView = toolbarContainerView;
         mTabStripDragHandler = tabStripDragHandler;
@@ -743,8 +741,8 @@
                         context,
                         ButtonType.NEW_TAB,
                         null,
-                        NEW_TAB_BUTTON_BACKGROUND_WIDTH_DP,
-                        NEW_TAB_BUTTON_BACKGROUND_HEIGHT_DP,
+                        BUTTON_BACKGROUND_SIZE_DP,
+                        BUTTON_BACKGROUND_SIZE_DP,
                         mToolbarContainerView::setTooltipText,
                         /* clickHandler= */ this,
                         /* keyboardFocusHandler= */ this,
@@ -1010,7 +1008,7 @@
      */
     protected float getNtbVisualOffsetHorizontal() {
         return Math.max(
-                (BUTTON_DESIRED_TOUCH_TARGET_SIZE - mNewTabButtonWidth) / 2
+                (BUTTON_TOUCH_TARGET_SIZE_DP - mNewTabButtonWidth) / 2
                         - DESIRED_PADDING_BETWEEN_NEW_TAB_BUTTON_AND_TABS,
                 0);
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
index 08d50ab..c27fdf9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
@@ -6,6 +6,9 @@
 
 import static org.chromium.build.NullUtil.assertNonNull;
 import static org.chromium.build.NullUtil.assumeNonNull;
+import static org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutUtils.BUTTON_TOUCH_TARGET_SIZE_DP;
+import static org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutUtils.MIN_TAB_WIDTH_DP;
+import static org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutUtils.TAB_OVERLAP_WIDTH_DP;
 
 import android.animation.Animator;
 import android.animation.AnimatorListenerAdapter;
@@ -1055,6 +1058,26 @@
                 ScrimProperties.INVALID_COLOR, mStripTransitionScrimOpacity);
     }
 
+    @Override
+    public int getFadeTransitionThresholdDp() {
+        if (mTabModelSelector == null) return 0;
+        TabModel incognitoTabModel = mTabModelSelector.getModel(/* incognito= */ true);
+        boolean hasIncognitoTabs = incognitoTabModel != null && incognitoTabModel.getCount() > 0;
+        boolean shouldShowMsb =
+                !ChromeFeatureList.sTabStripIncognitoMigration.isEnabled() && hasIncognitoTabs;
+
+        // Tablet: 284 = 2 * minTabWidth(108) - tabOverlap(28) + newTabButton (48) +
+        // [optional] modelSelectorButton(48).
+        // Desktop: 188 = 2 * minTabWidth(76) - tabOverlap(28) + newTabButton (32) +
+        // [optional] modelSelectorButton(32).
+        float thresholdDp =
+                (2 * MIN_TAB_WIDTH_DP)
+                        - TAB_OVERLAP_WIDTH_DP
+                        + BUTTON_TOUCH_TARGET_SIZE_DP
+                        + (shouldShowMsb ? BUTTON_TOUCH_TARGET_SIZE_DP : 0f);
+        return Math.round(thresholdDp);
+    }
+
     private boolean duringTabStripHeightTransition() {
         return mIsHeightTransitioning;
     }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutUtils.java
index 71af8cb..da611696 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutUtils.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutUtils.java
@@ -38,10 +38,17 @@
     // closeButtonEndPadding(10) + tabContainerEndPadding(16) + groupTitleStartMargin(13)
     //         - overlap(28-16) =
     public static final float TAB_GROUP_BOTTOM_INDICATOR_WIDTH_OFFSET = 27.f;
+
+    // Tab width constants.
     public static final float MIN_TAB_WIDTH_DP = shouldApplyMoreDensity() ? 76.f : 108.f;
     public static final float MAX_TAB_WIDTH_DP = TabUiThemeUtil.getMaxTabStripTabWidthDp();
     public static final float TAB_OVERLAP_WIDTH_DP = 28.f;
 
+    // Button size constants.
+    public static final float BUTTON_BACKGROUND_SIZE_DP = 32f;
+    public static final float BUTTON_TOUCH_TARGET_SIZE_DP =
+            shouldApplyMoreDensity() ? BUTTON_BACKGROUND_SIZE_DP : 48f;
+
     // Pinned tab width.
     public static final float PINNED_TAB_WIDTH_DP = MIN_TAB_WIDTH_DP;
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/desktop_windowing/AppHeaderCoordinatorBrowserTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/desktop_windowing/AppHeaderCoordinatorBrowserTest.java
index a4e101d..f387dbd3 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/desktop_windowing/AppHeaderCoordinatorBrowserTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/desktop_windowing/AppHeaderCoordinatorBrowserTest.java
@@ -171,13 +171,13 @@
         Assert.assertNotNull(
                 "Tab strip transition coordinator is null.", tabStripTransitionCoordinator);
 
+        var stripLayoutHelperManager = activity.getLayoutManager().getStripLayoutHelperManager();
+        int fadeTransitionThresholdDp = stripLayoutHelperManager.getFadeTransitionThresholdDp();
+
         // A small strip width should hide the strip by adding the strip fade transition scrim.
-        int smallStripWidth =
-                ViewUtils.dpToPx(
-                        activity, TabStripTransitionCoordinator.getFadeTransitionThresholdDp() - 1);
+        int smallStripWidth = ViewUtils.dpToPx(activity, fadeTransitionThresholdDp - 1);
         ThreadUtils.runOnUiThreadBlocking(() -> simulateResizeDesktopWindow(smallStripWidth));
 
-        var stripLayoutHelperManager = activity.getLayoutManager().getStripLayoutHelperManager();
         var stripAreaMotionEventFilter =
                 (AreaMotionEventFilter) stripLayoutHelperManager.getEventFilter();
         CriteriaHelper.pollUiThread(
@@ -193,9 +193,7 @@
                 });
 
         // A large strip width should show the strip by removing the strip transition scrim.
-        int largeStripWidth =
-                ViewUtils.dpToPx(
-                        activity, TabStripTransitionCoordinator.getFadeTransitionThresholdDp());
+        int largeStripWidth = ViewUtils.dpToPx(activity, fadeTransitionThresholdDp);
         ThreadUtils.runOnUiThreadBlocking(() -> simulateResizeDesktopWindow(largeStripWidth));
         CriteriaHelper.pollUiThread(
                 () -> {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsFragmentTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsFragmentTest.java
index 8df9f4c..7cbdedd 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsFragmentTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/privacy/settings/PrivacySettingsFragmentTest.java
@@ -63,6 +63,7 @@
 import org.chromium.base.test.util.UserActionTester;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.incognito.IncognitoUtils;
 import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthManager;
 import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthSettingUtils;
 import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
@@ -157,21 +158,20 @@
     }
 
     private View getIncognitoReauthSettingView(PrivacySettings privacySettings) {
-        String incognito_lock_title =
-                mSettingsActivityTestRule
-                        .getActivity()
-                        .getString(R.string.settings_incognito_tab_lock_title);
+        int titleResId =
+                IncognitoUtils.shouldOpenIncognitoAsWindow()
+                        ? R.string.settings_incognito_window_lock_title
+                        : R.string.settings_incognito_tab_lock_title;
+        String incognitoLockTitle = mSettingsActivityTestRule.getActivity().getString(titleResId);
         onView(withId(R.id.recycler_view))
-                .perform(
-                        RecyclerViewActions.scrollTo(
-                                hasDescendant(withText(incognito_lock_title))));
-        onView(withText(incognito_lock_title)).check(matches(isDisplayed()));
+                .perform(RecyclerViewActions.scrollTo(hasDescendant(withText(incognitoLockTitle))));
+        onView(withText(incognitoLockTitle)).check(matches(isDisplayed()));
         for (int i = 0; i < privacySettings.getListView().getChildCount(); ++i) {
             View view = privacySettings.getListView().getChildAt(i);
             TextView titleView = view.findViewById(android.R.id.title);
             if (titleView != null) {
                 String title = titleView.getText().toString();
-                if (TextUtils.equals(incognito_lock_title, title)) {
+                if (TextUtils.equals(incognitoLockTitle, title)) {
                     return view;
                 }
             }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java
index 7372a7a1..ff0b6a0f 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java
@@ -4,6 +4,9 @@
 
 package org.chromium.chrome.browser.webauth;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doAnswer;
+
 import androidx.test.filters.MediumTest;
 import androidx.test.platform.app.InstrumentationRegistry;
 
@@ -13,6 +16,9 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
 
 import org.chromium.base.ThreadUtils;
 import org.chromium.base.test.util.Batch;
@@ -20,6 +26,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.base.test.util.Restriction;
+import org.chromium.blink.mojom.AuthenticatorStatus;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
 import org.chromium.chrome.browser.tab.EmptyTabObserver;
 import org.chromium.chrome.browser.tab.Tab;
@@ -27,8 +34,10 @@
 import org.chromium.chrome.test.transit.ChromeTransitTestRules;
 import org.chromium.chrome.test.transit.FreshCtaTransitTestRule;
 import org.chromium.chrome.test.transit.page.WebPageStation;
+import org.chromium.components.webauthn.AuthenticatorErrorResponseCallback;
 import org.chromium.components.webauthn.AuthenticatorImpl;
-import org.chromium.components.webauthn.MockFido2CredentialRequest;
+import org.chromium.components.webauthn.Fido2CredentialRequest;
+import org.chromium.components.webauthn.IsUvpaaResponseCallback;
 import org.chromium.components.webauthn.WebauthnMode;
 import org.chromium.components.webauthn.WebauthnModeProvider;
 import org.chromium.content_public.common.ContentSwitches;
@@ -52,13 +61,15 @@
     public FreshCtaTransitTestRule mActivityTestRule =
             ChromeTransitTestRules.freshChromeTabbedActivityRule();
 
+    @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
+
     private static final String TEST_FILE = "/content/test/data/android/authenticator.html";
     private EmbeddedTestServer mTestServer;
     private String mUrl;
     private WebPageStation mPage;
     private Tab mTab;
     private AuthenticatorUpdateWaiter mUpdateWaiter;
-    private MockFido2CredentialRequest mMockCredentialRequest;
+    @Mock private Fido2CredentialRequest mMockCredentialRequest;
 
     /** Waits until the JavaScript code supplies a result. */
     private class AuthenticatorUpdateWaiter extends EmptyTabObserver {
@@ -97,7 +108,33 @@
         mUpdateWaiter = new AuthenticatorUpdateWaiter();
         ThreadUtils.runOnUiThreadBlocking(() -> mTab.addObserver(mUpdateWaiter));
         WebauthnModeProvider.getInstance().setGlobalWebauthnMode(WebauthnMode.CHROME);
-        mMockCredentialRequest = new MockFido2CredentialRequest();
+        doAnswer(
+                        invocation -> {
+                            AuthenticatorErrorResponseCallback errorCallback =
+                                    invocation.getArgument(6);
+                            errorCallback.onError(AuthenticatorStatus.NOT_IMPLEMENTED);
+                            return null;
+                        })
+                .when(mMockCredentialRequest)
+                .handleMakeCredentialRequest(
+                        any(), any(), any(), any(), any(), any(), any(), any());
+        doAnswer(
+                        invocation -> {
+                            AuthenticatorErrorResponseCallback errorCallback =
+                                    invocation.getArgument(5);
+                            errorCallback.onError(AuthenticatorStatus.NOT_IMPLEMENTED);
+                            return null;
+                        })
+                .when(mMockCredentialRequest)
+                .handleGetCredentialRequest(any(), any(), any(), any(), any(), any(), any());
+        doAnswer(
+                        invocation -> {
+                            IsUvpaaResponseCallback callback = invocation.getArgument(0);
+                            callback.onIsUserVerifyingPlatformAuthenticatorAvailableResponse(false);
+                            return null;
+                        })
+                .when(mMockCredentialRequest)
+                .handleIsUserVerifyingPlatformAuthenticatorAvailableRequest(any());
         AuthenticatorImpl.overrideFido2CredentialRequestForTesting(mMockCredentialRequest);
     }
 
diff --git a/chrome/android/junit/BUILD.gn b/chrome/android/junit/BUILD.gn
index 745125e..7978a31 100644
--- a/chrome/android/junit/BUILD.gn
+++ b/chrome/android/junit/BUILD.gn
@@ -302,6 +302,7 @@
       "//components/paint_preview/browser/android:java",
       "//components/paint_preview/player/android:java",
       "//components/password_manager/core/browser:password_manager_java_enums",
+      "//components/payments/content/android:full_java",
       "//components/payments/content/android:java",
       "//components/payments/content/android:service_java",
       "//components/payments/content/android/ui:java",
@@ -473,10 +474,12 @@
       "src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetCoordinatorTest.java",
       "src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetLifecycleTest.java",
       "src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetMediatorTest.java",
+      "src/org/chromium/chrome/browser/autofill/settings/AutofillBuyNowPayLaterFragmentTest.java",
       "src/org/chromium/chrome/browser/autofill/settings/AutofillDeletePaymentMethodConfirmationDialogTest.java",
       "src/org/chromium/chrome/browser/autofill/settings/AutofillDeleteSavedCvcsConfirmationDialogTest.java",
       "src/org/chromium/chrome/browser/autofill/settings/AutofillLocalCardEditorTest.java",
       "src/org/chromium/chrome/browser/autofill/settings/AutofillLocalIbanEditorTest.java",
+      "src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragmentBuyNowPayLaterTest.java",
       "src/org/chromium/chrome/browser/autofill/settings/AutofillServerCardEditorTest.java",
       "src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardEnrollmentDialogTest.java",
       "src/org/chromium/chrome/browser/autofill/settings/AutofillVirtualCardUnenrollmentDialogTest.java",
diff --git a/chrome/android/junit/DEPS b/chrome/android/junit/DEPS
index 6caa320b..7810d7c 100644
--- a/chrome/android/junit/DEPS
+++ b/chrome/android/junit/DEPS
@@ -37,6 +37,7 @@
   "+components/image_fetcher",
   "+components/offline_items_collection/core/android/java/src",
   "+components/omnibox/browser/android/java/src/org/chromium/components/omnibox",
+  "+components/payments/content/android/java/src/org/chromium/components/payments",
   "+components/payments/content/android/ui/java/src/org/chromium/components/payments/ui",
   "+components/regional_capabilities/android",
   "+components/saved_tab_groups/android/java/src/org/chromium/components/tab_group_sync",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillBuyNowPayLaterFragmentTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillBuyNowPayLaterFragmentTest.java
new file mode 100644
index 0000000..271dce9
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillBuyNowPayLaterFragmentTest.java
@@ -0,0 +1,59 @@
+// 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.autofill.settings;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import android.os.Bundle;
+
+import androidx.fragment.app.testing.FragmentScenario;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.chromium.base.ContextUtils;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.chrome.R;
+
+/** JUnit tests of the class {@link AutofillBuyNowPayLaterFragment} */
+@RunWith(BaseRobolectricTestRunner.class)
+public class AutofillBuyNowPayLaterFragmentTest {
+    private FragmentScenario<AutofillBuyNowPayLaterFragment> mScenario;
+
+    private AutofillBuyNowPayLaterFragment mAutofillBuyNowPayLaterFragment;
+
+    @Before
+    public void setUp() {
+        mScenario =
+                FragmentScenario.launchInContainer(
+                        AutofillBuyNowPayLaterFragment.class,
+                        Bundle.EMPTY,
+                        R.style.Theme_Chromium_Settings);
+        mScenario.onFragment(
+                fragment -> {
+                    assertNotNull(fragment.getPreferenceScreen());
+                    mAutofillBuyNowPayLaterFragment = (AutofillBuyNowPayLaterFragment) fragment;
+                });
+    }
+
+    @After
+    public void tearDown() {
+        if (mScenario != null) {
+            mScenario.close();
+        }
+    }
+
+    // Test to verify that the Preference screen is displayed and its title is visible as expected.
+    @Test
+    public void testBuyNowPayLaterPreferenceScreen_shownWithTitle() {
+        assertEquals(
+                ContextUtils.getApplicationContext()
+                        .getString(R.string.autofill_bnpl_settings_label),
+                mAutofillBuyNowPayLaterFragment.getPageTitle().get());
+    }
+}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragmentBuyNowPayLaterTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragmentBuyNowPayLaterTest.java
new file mode 100644
index 0000000..b942bd06
--- /dev/null
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragmentBuyNowPayLaterTest.java
@@ -0,0 +1,180 @@
+// 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.autofill.settings;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.when;
+
+import android.content.pm.ActivityInfo;
+import android.content.pm.ResolveInfo;
+import android.os.Bundle;
+
+import androidx.fragment.app.Fragment;
+import androidx.fragment.app.FragmentFactory;
+import androidx.fragment.app.testing.FragmentScenario;
+import androidx.preference.Preference;
+
+import org.jspecify.annotations.NonNull;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+
+import org.chromium.base.ContextUtils;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.Features.DisableFeatures;
+import org.chromium.chrome.R;
+import org.chromium.chrome.browser.autofill.PersonalDataManager;
+import org.chromium.chrome.browser.autofill.PersonalDataManager.Iban;
+import org.chromium.chrome.browser.autofill.PersonalDataManagerFactory;
+import org.chromium.chrome.browser.device_reauth.BiometricStatus;
+import org.chromium.chrome.browser.device_reauth.ReauthenticatorBridge;
+import org.chromium.chrome.browser.flags.ChromeFeatureList;
+import org.chromium.chrome.browser.profiles.Profile;
+import org.chromium.chrome.browser.profiles.ProfileManager;
+import org.chromium.components.autofill.payments.BankAccount;
+import org.chromium.components.payments.AndroidPaymentAppFactory;
+import org.chromium.components.payments.PackageManagerDelegate;
+import org.chromium.components.prefs.PrefService;
+import org.chromium.components.user_prefs.UserPrefs;
+import org.chromium.components.user_prefs.UserPrefsJni;
+
+import java.util.Collections;
+import java.util.List;
+
+/** JUnit tests of the class {@link AutofillPaymentMethodsFragment: Buy Now Pay Later} */
+@RunWith(BaseRobolectricTestRunner.class)
+@DisableFeatures({
+    ChromeFeatureList.AUTOFILL_ENABLE_SEPARATE_PIX_PREFERENCE_ITEM,
+    ChromeFeatureList.AUTOFILL_SYNC_EWALLET_ACCOUNTS,
+    ChromeFeatureList.AUTOFILL_ENABLE_CVC_STORAGE,
+    ChromeFeatureList.AUTOFILL_ENABLE_CARD_BENEFITS_FOR_AMERICAN_EXPRESS,
+    ChromeFeatureList.AUTOFILL_ENABLE_CARD_BENEFITS_FOR_BMO,
+    ChromeFeatureList.AUTOFILL_ENABLE_FLAT_RATE_CARD_BENEFITS_FROM_CURINOS,
+    ChromeFeatureList.AUTOFILL_ENABLE_LOYALTY_CARDS_FILLING,
+    ChromeFeatureList.THIRD_PARTY_DISABLE_CHROME_AUTOFILL_SETTINGS_SCREEN
+})
+public class AutofillPaymentMethodsFragmentBuyNowPayLaterTest {
+    @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
+
+    private static final String ALICEPAY_ACTIVITY_PACKAGE_NAME = "com.alicepay.app";
+    private static final String ALICEPAY_ACTIVITY_NAME = "com.alicepay.app.WebPaymentActivity";
+
+    private FragmentScenario<AutofillPaymentMethodsFragment> mScenario;
+    private Preference mBnplPreference;
+
+    @Mock private PersonalDataManager mPersonalDataManager;
+    @Mock private Profile mProfile;
+    @Mock private UserPrefs.Natives mUserPrefsNativesMock;
+    @Mock private PrefService mPrefServiceMock;
+    @Mock private ReauthenticatorBridge mReauthenticatorMock;
+    @Mock private PackageManagerDelegate mPackageManagerDelegate;
+
+    @Before
+    public void setUp() {
+        ProfileManager.setLastUsedProfileForTesting(mProfile);
+        PersonalDataManagerFactory.setInstanceForTesting(mPersonalDataManager);
+        UserPrefsJni.setInstanceForTesting(mUserPrefsNativesMock);
+        when(mUserPrefsNativesMock.get(mProfile)).thenReturn(mPrefServiceMock);
+        ReauthenticatorBridge.setInstanceForTesting(mReauthenticatorMock);
+        when(mReauthenticatorMock.getBiometricAvailabilityStatus())
+                .thenReturn(BiometricStatus.BIOMETRICS_AVAILABLE);
+        when(mPersonalDataManager.getIbansForSettings()).thenReturn(new Iban[0]);
+        when(mPersonalDataManager.shouldShowAddIbanButtonOnSettingsPage()).thenReturn(false);
+        when(mPersonalDataManager.getCreditCardsForSettings()).thenReturn(Collections.emptyList());
+        when(mPersonalDataManager.getMaskedBankAccounts()).thenReturn(new BankAccount[0]);
+        ResolveInfo alicePay = new ResolveInfo();
+        alicePay.activityInfo = new ActivityInfo();
+        alicePay.activityInfo.packageName = ALICEPAY_ACTIVITY_PACKAGE_NAME;
+        alicePay.activityInfo.name = ALICEPAY_ACTIVITY_NAME;
+        when(mPackageManagerDelegate.getActivitiesThatCanRespondToIntent(any()))
+                .thenReturn(List.of(alicePay));
+        AndroidPaymentAppFactory.setPackageManagerDelegateForTest(mPackageManagerDelegate);
+    }
+
+    @After
+    public void tearDown() {
+        if (mScenario != null) {
+            mScenario.close();
+        }
+    }
+
+    private void launchAutofillPaymentMethodsFragment() {
+        mScenario =
+                FragmentScenario.launchInContainer(
+                        AutofillPaymentMethodsFragment.class,
+                        Bundle.EMPTY,
+                        R.style.Theme_Chromium_Settings,
+                        new FragmentFactory() {
+                            @NonNull
+                            @Override
+                            public Fragment instantiate(
+                                    @NonNull ClassLoader classLoader, @NonNull String className) {
+                                Fragment fragment = super.instantiate(classLoader, className);
+                                if (fragment instanceof AutofillPaymentMethodsFragment) {
+                                    ((AutofillPaymentMethodsFragment) fragment)
+                                            .setProfile(mProfile);
+                                }
+                                return fragment;
+                            }
+                        });
+        mScenario.onFragment(
+                fragment -> {
+                    mBnplPreference =
+                            (Preference)
+                                    fragment.findPreference(
+                                            AutofillPaymentMethodsFragment.PREF_BUY_NOW_PAY_LATER);
+                });
+    }
+
+    // Test to verify that the buy now pay later preference is not displayed when autofill payment
+    // method is disabled.
+    @Test
+    public void testBuyNowPayLaterPref_whenAutofillIsDisabled_notShown() {
+        when(mPersonalDataManager.isAutofillPaymentMethodsEnabled()).thenReturn(false);
+        when(mPersonalDataManager.shouldShowBnplSettings()).thenReturn(true);
+
+        launchAutofillPaymentMethodsFragment();
+
+        assertThat(mBnplPreference).isNull();
+    }
+
+    // Test to verify that the buy now pay later preference is not displayed when
+    // `shouldShowBnplSettings` returns `false`.
+    @Test
+    public void testBuyNowPayLaterPref_whenShouldNotShowBnplSettings_notShown() {
+        when(mPersonalDataManager.isAutofillPaymentMethodsEnabled()).thenReturn(true);
+        when(mPersonalDataManager.shouldShowBnplSettings()).thenReturn(false);
+
+        launchAutofillPaymentMethodsFragment();
+
+        assertThat(mBnplPreference).isNull();
+    }
+
+    // Test to verify that the buy now pay later preference is displayed when autofill payment
+    // method is enabled and `shouldShowBnplSettings` returns `true`.
+    @Test
+    public void testBuyNowPayLaterPref_whenShouldShowBnplSettingsAndAutofillIsEnabled_shown() {
+        when(mPersonalDataManager.isAutofillPaymentMethodsEnabled()).thenReturn(true);
+        when(mPersonalDataManager.shouldShowBnplSettings()).thenReturn(true);
+
+        launchAutofillPaymentMethodsFragment();
+
+        assertEquals(
+                ContextUtils.getApplicationContext()
+                        .getString(R.string.autofill_bnpl_settings_label),
+                mBnplPreference.getTitle());
+        assertEquals(
+                AutofillPaymentMethodsFragment.PREF_BUY_NOW_PAY_LATER, mBnplPreference.getKey());
+        assertEquals(AutofillBuyNowPayLaterFragment.class.getName(), mBnplPreference.getFragment());
+    }
+}
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManagerTest.java
index 76fe84c9..bfe63d4d 100644
--- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManagerTest.java
+++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManagerTest.java
@@ -854,6 +854,30 @@
     }
 
     @Test
+    @DisableFeatures(ChromeFeatureList.TAB_STRIP_INCOGNITO_MIGRATION)
+    public void testGetFadeTransitionThresholdDp_MsbShown() {
+        when(mStandardTabModel.getCount()).thenReturn(1);
+        int expectedThresholdDp = 284;
+        assertEquals(expectedThresholdDp, mStripLayoutHelperManager.getFadeTransitionThresholdDp());
+    }
+
+    @Test
+    @EnableFeatures(ChromeFeatureList.TAB_STRIP_INCOGNITO_MIGRATION)
+    public void testGetFadeTransitionThresholdDp_MsbHide_IncognitoMigrationEnabled() {
+        when(mStandardTabModel.getCount()).thenReturn(1);
+        int expectedThresholdDp = 236;
+        assertEquals(expectedThresholdDp, mStripLayoutHelperManager.getFadeTransitionThresholdDp());
+    }
+
+    @Test
+    @DisableFeatures(ChromeFeatureList.TAB_STRIP_INCOGNITO_MIGRATION)
+    public void testGetFadeTransitionThresholdDp_MsbHide_NoIncognitoTabs() {
+        when(mStandardTabModel.getCount()).thenReturn(0);
+        int expectedThresholdDp = 236;
+        assertEquals(expectedThresholdDp, mStripLayoutHelperManager.getFadeTransitionThresholdDp());
+    }
+
+    @Test
     public void testGetVirtualViews() {
         List<VirtualView> views = new ArrayList<>();
         mStripLayoutHelperManager.getVirtualViews(views);
diff --git a/chrome/app/extensions_strings.grdp b/chrome/app/extensions_strings.grdp
index db573d2..68e97de5 100644
--- a/chrome/app/extensions_strings.grdp
+++ b/chrome/app/extensions_strings.grdp
@@ -763,6 +763,9 @@
   <message name="IDS_EXTENSIONS_ZERO_STATE_IPH_AI_PRODUCTIVITY_COLLECTION_LINK" desc="Link text for the button that opens the Chrome Web Store ai productivity collection page.">
     Enhance with AI
   </message>
+  <message name="IDS_EXTENSIONS_ZERO_STATE_IPH_WEB_STORE_LINK" desc="Link text for the button that opens the Chrome Web Store page.">
+    Visit Web Store
+  </message>
   <message name="IDS_EXTENSIONS_ZERO_STATE_IPH_DISMISS_BUTTON_TEXT" desc="Text on the button that dismisses the extensions zero state promo IPH.">
     Got it
   </message>
diff --git a/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_WEB_STORE_LINK.png.sha1 b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_WEB_STORE_LINK.png.sha1
new file mode 100644
index 0000000..8c3a8c7a
--- /dev/null
+++ b/chrome/app/extensions_strings_grdp/IDS_EXTENSIONS_ZERO_STATE_IPH_WEB_STORE_LINK.png.sha1
@@ -0,0 +1 @@
+bd7f4bd46afb779590e2fda16025c8f8054dcdd9
\ No newline at end of file
diff --git a/chrome/app/vector_icons/BUILD.gn b/chrome/app/vector_icons/BUILD.gn
index dbfde86..0de2c4a 100644
--- a/chrome/app/vector_icons/BUILD.gn
+++ b/chrome/app/vector_icons/BUILD.gn
@@ -21,6 +21,8 @@
     "add.icon",
     "add_chrome_refresh.icon",
     "add_circle.icon",
+    "add_photo_alternate.icon",
+    "attach_file.icon",
     "auto_tab_groups.icon",
     "autofill/local_offer_flipped_refresh.icon",
     "autofill/webauthn_dialog_header.icon",
@@ -212,6 +214,7 @@
     "translate.icon",
     "trash_can.icon",
     "trash_can_refresh.icon",
+    "travel_explore.icon",
     "tv.icon",
     "ungroup_refresh.icon",
     "user_account_avatar.icon",
diff --git a/chrome/app/vector_icons/add_photo_alternate.icon b/chrome/app/vector_icons/add_photo_alternate.icon
new file mode 100644
index 0000000..ae983c4
--- /dev/null
+++ b/chrome/app/vector_icons/add_photo_alternate.icon
@@ -0,0 +1,45 @@
+// 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.
+
+CANVAS_DIMENSIONS, 16,
+FILL_RULE_NONZERO,
+MOVE_TO, 3.63, 13.73,
+R_CUBIC_TO, -0.38, 0, -0.71, -0.13, -0.98, -0.4,
+R_ARC_TO, 1.34, 1.34, 0, 0, 1, -0.4, -0.98,
+V_LINE_TO, 3.65,
+R_CUBIC_TO, 0, -0.38, 0.13, -0.71, 0.4, -0.98,
+R_CUBIC_TO, 0.27, -0.27, 0.6, -0.4, 0.98, -0.4,
+R_H_LINE_TO, 5.03,
+R_V_LINE_TO, 1.38,
+H_LINE_TO, 3.63,
+R_V_LINE_TO, 8.7,
+R_H_LINE_TO, 8.7,
+V_LINE_TO, 7.32,
+R_H_LINE_TO, 1.38,
+R_V_LINE_TO, 5.03,
+R_CUBIC_TO, 0, 0.38, -0.13, 0.71, -0.4, 0.98,
+R_CUBIC_TO, -0.27, 0.27, -0.6, 0.4, -0.98, 0.4,
+CLOSE,
+MOVE_TO, 11.24, 6,
+V_LINE_TO, 4.74,
+H_LINE_TO, 9.98,
+V_LINE_TO, 3.48,
+R_H_LINE_TO, 1.26,
+V_LINE_TO, 2.22,
+R_H_LINE_TO, 1.26,
+R_V_LINE_TO, 1.26,
+R_H_LINE_TO, 1.26,
+R_V_LINE_TO, 1.26,
+H_LINE_TO, 12.5,
+V_LINE_TO, 6,
+CLOSE,
+R_MOVE_TO, -6.86, 5.2,
+R_H_LINE_TO, 7.2,
+LINE_TO, 9.17, 8,
+R_LINE_TO, -1.8, 2.4,
+R_LINE_TO, -1.2, -1.6,
+CLOSE,
+R_MOVE_TO, -0.75, -7.55,
+R_V_LINE_TO, 8.7,
+CLOSE
diff --git a/chrome/app/vector_icons/attach_file.icon b/chrome/app/vector_icons/attach_file.icon
new file mode 100644
index 0000000..b6f55f2
--- /dev/null
+++ b/chrome/app/vector_icons/attach_file.icon
@@ -0,0 +1,41 @@
+// 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.
+
+CANVAS_DIMENSIONS, 16,
+FILL_RULE_NONZERO,
+MOVE_TO, 11.81, 10.84,
+R_ARC_TO, 3.51, 3.51, 0, 0, 1, -1.11, 2.62,
+R_CUBIC_TO, -0.74, 0.72, -1.62, 1.08, -2.66, 1.08,
+R_CUBIC_TO, -1.05, 0, -1.94, -0.37, -2.67, -1.11,
+R_CUBIC_TO, -0.73, -0.74, -1.09, -1.64, -1.09, -2.7,
+R_V_LINE_TO, -6.57,
+R_CUBIC_TO, 0, -0.75, 0.27, -1.39, 0.8, -1.91,
+R_CUBIC_TO, 0.54, -0.52, 1.18, -0.78, 1.94, -0.78,
+R_CUBIC_TO, 0.77, 0, 1.41, 0.27, 1.94, 0.82,
+R_CUBIC_TO, 0.53, 0.55, 0.79, 1.21, 0.79, 1.99,
+R_V_LINE_TO, 6.17,
+R_CUBIC_TO, 0, 0.47, -0.16, 0.87, -0.5, 1.19,
+R_ARC_TO, 1.68, 1.68, 0, 0, 1, -1.21, 0.49,
+R_CUBIC_TO, -0.48, 0, -0.89, -0.17, -1.21, -0.51,
+R_ARC_TO, 1.73, 1.73, 0, 0, 1, -0.49, -1.24,
+V_LINE_TO, 4.04,
+H_LINE_TO, 7.68,
+R_V_LINE_TO, 6.4,
+R_CUBIC_TO, 0, 0.1, 0.04, 0.18, 0.1, 0.24,
+R_ARC_TO, 0.34, 0.34, 0, 0, 0, 0.25, 0.1,
+R_ARC_TO, 0.37, 0.37, 0, 0, 0, 0.26, -0.09,
+R_ARC_TO, 0.31, 0.31, 0, 0, 0, 0.11, -0.25,
+V_LINE_TO, 4.16,
+R_CUBIC_TO, 0, -0.38, -0.13, -0.7, -0.41, -0.96,
+R_ARC_TO, 1.37, 1.37, 0, 0, 0, -0.98, -0.39,
+R_CUBIC_TO, -0.38, 0, -0.71, 0.14, -0.98, 0.41,
+R_ARC_TO, 1.34, 1.34, 0, 0, 0, -0.41, 0.97,
+R_V_LINE_TO, 6.66,
+R_CUBIC_TO, 0, 0.66, 0.24, 1.22, 0.71, 1.66,
+R_CUBIC_TO, 0.48, 0.45, 1.05, 0.68, 1.71, 0.69,
+R_ARC_TO, 2.28, 2.28, 0, 0, 0, 1.72, -0.7,
+R_CUBIC_TO, 0.48, -0.48, 0.71, -1.05, 0.71, -1.74,
+V_LINE_TO, 3.88,
+R_H_LINE_TO, 1.34,
+CLOSE
diff --git a/chrome/app/vector_icons/travel_explore.icon b/chrome/app/vector_icons/travel_explore.icon
new file mode 100644
index 0000000..77fe83e
--- /dev/null
+++ b/chrome/app/vector_icons/travel_explore.icon
@@ -0,0 +1,60 @@
+// 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.
+
+CANVAS_DIMENSIONS, 16,
+FILL_RULE_NONZERO,
+MOVE_TO, 7.88, 14.53,
+R_ARC_TO, 6.33, 6.33, 0, 0, 1, -2.49, -0.54,
+R_ARC_TO, 6.6, 6.6, 0, 0, 1, -2.05, -1.41,
+R_ARC_TO, 6.61, 6.61, 0, 0, 1, -1.37, -2.07,
+R_ARC_TO, 6.38, 6.38, 0, 0, 1, -0.5, -2.52,
+R_CUBIC_TO, 0, -0.9, 0.17, -1.75, 0.51, -2.53,
+R_ARC_TO, 6.62, 6.62, 0, 0, 1, 3.49, -3.48,
+R_ARC_TO, 6.38, 6.38, 0, 0, 1, 2.54, -0.51,
+R_CUBIC_TO, 1.61, 0, 3.02, 0.51, 4.2, 1.52,
+R_ARC_TO, 6.49, 6.49, 0, 0, 1, 2.22, 3.81,
+R_H_LINE_TO, -1.41,
+R_ARC_TO, 4.91, 4.91, 0, 0, 0, -1.08, -2.13,
+R_ARC_TO, 5.1, 5.1, 0, 0, 0, -1.94, -1.41,
+R_V_LINE_TO, 0.38,
+R_CUBIC_TO, 0, 0.32, -0.12, 0.61, -0.35, 0.84,
+R_CUBIC_TO, -0.23, 0.23, -0.52, 0.35, -0.84, 0.35,
+H_LINE_TO, 7.21,
+R_V_LINE_TO, 0.79,
+R_ARC_TO, 0.77, 0.77, 0, 0, 1, -0.23, 0.57,
+R_ARC_TO, 0.77, 0.77, 0, 0, 1, -0.57, 0.23,
+R_H_LINE_TO, -0.78,
+R_V_LINE_TO, 1.59,
+R_H_LINE_TO, 0.77,
+V_LINE_TO, 9.57,
+R_H_LINE_TO, -0.78,
+R_LINE_TO, -2.65, -2.64,
+R_CUBIC_TO, -0.03, 0.18, -0.05, 0.35, -0.08, 0.52,
+R_ARC_TO, 4.09, 4.09, 0, 0, 0, -0.04, 0.54,
+R_CUBIC_TO, 0, 1.41, 0.49, 2.62, 1.46, 3.61,
+R_CUBIC_TO, 0.98, 1, 2.16, 1.51, 3.56, 1.54,
+CLOSE,
+R_MOVE_TO, 5.7, -0.37,
+R_LINE_TO, -2.06, -2.06,
+R_ARC_TO, 2.75, 2.75, 0, 0, 1, -1.46, 0.42,
+R_ARC_TO, 2.76, 2.76, 0, 0, 1, -2.03, -0.83,
+R_ARC_TO, 2.78, 2.78, 0, 0, 1, -0.84, -2.03,
+R_CUBIC_TO, 0, -0.8, 0.28, -1.47, 0.84, -2.03,
+ARC_TO, 2.77, 2.77, 0, 0, 1, 10.06, 6.8,
+R_CUBIC_TO, 0.8, 0, 1.47, 0.28, 2.03, 0.83,
+R_CUBIC_TO, 0.56, 0.55, 0.83, 1.23, 0.83, 2.02,
+R_CUBIC_TO, 0, 0.27, -0.04, 0.53, -0.1, 0.77,
+R_CUBIC_TO, -0.07, 0.25, -0.18, 0.48, -0.32, 0.7,
+R_LINE_TO, 2.06, 2.06,
+CLOSE,
+R_MOVE_TO, -3.52, -3.02,
+R_CUBIC_TO, 0.41, 0, 0.76, -0.14, 1.05, -0.43,
+R_CUBIC_TO, 0.29, -0.28, 0.43, -0.63, 0.43, -1.05,
+R_CUBIC_TO, 0, -0.41, -0.14, -0.76, -0.43, -1.05,
+R_ARC_TO, 1.42, 1.42, 0, 0, 0, -1.05, -0.43,
+R_CUBIC_TO, -0.41, 0, -0.76, 0.14, -1.05, 0.43,
+R_CUBIC_TO, -0.29, 0.29, -0.43, 0.63, -0.43, 1.05,
+R_CUBIC_TO, 0, 0.41, 0.14, 0.76, 0.43, 1.05,
+R_CUBIC_TO, 0.28, 0.29, 0.63, 0.43, 1.05, 0.43,
+CLOSE
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn
index 0226919..c3e8b9a6 100644
--- a/chrome/browser/BUILD.gn
+++ b/chrome/browser/BUILD.gn
@@ -2211,7 +2211,6 @@
     "//components/fingerprinting_protection_filter/browser",
     "//components/fingerprinting_protection_filter/common",
     "//components/fingerprinting_protection_filter/common:prefs",
-    "//components/fingerprinting_protection_filter/interventions/common:features",
     "//components/fingerprinting_protection_filter/mojom",
     "//components/gcm_driver",
     "//components/guest_view/buildflags",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc
index dcc661a..1f42a1c7 100644
--- a/chrome/browser/about_flags.cc
+++ b/chrome/browser/about_flags.cc
@@ -110,7 +110,6 @@
 #include "components/feature_engagement/public/feature_constants.h"
 #include "components/feature_engagement/public/feature_list.h"
 #include "components/feed/feed_feature_list.h"
-#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h"
 #include "components/heavy_ad_intervention/heavy_ad_features.h"
 #include "components/history/core/browser/features.h"
 #include "components/history_clusters/core/config.h"
@@ -1193,6 +1192,7 @@
     {"price_insights", "true"},
     {"price_tracking", "true"},
     {"pwa_install", "true"},
+    {"reading_mode", "true"},
     {"sharing_hub", "true"},
     {"translate", "true"},
     {"zoom", "true"},
@@ -4378,12 +4378,6 @@
              kStandardBoundSessionCredentialsFederatedSessionsForDevelopers),
          nullptr}};
 
-const FeatureEntry::FeatureParam kEnableCanvasNoiseInAllModes[] = {
-    {"enable_in_regular_mode", "true"}};
-const FeatureEntry::FeatureVariation kEnableCanvasNoiseVariations[] = {
-    {" - In all browsing modes", kEnableCanvasNoiseInAllModes,
-     std::size(kEnableCanvasNoiseInAllModes), nullptr}};
-
 // LINT.IfChange(AutofillVcnEnrollStrikeExpiryTime)
 const FeatureEntry::FeatureParam kAutofillVcnEnrollStrikeExpiryTime_120Days[] =
     {{"autofill_vcn_strike_expiry_time_days", "120"}};
@@ -12197,13 +12191,6 @@
      FEATURE_VALUE_TYPE(chromeos::features::kNotebookLmAppPreinstall)},
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
-    {"enable-canvas-noise", flag_descriptions::kEnableCanvasNoiseName,
-     flag_descriptions::kEnableCanvasNoiseDescription, kOsAll,
-     FEATURE_WITH_PARAMS_VALUE_TYPE(
-         fingerprinting_protection_interventions::features::kCanvasNoise,
-         kEnableCanvasNoiseVariations,
-         "EnableCanvasNoise")},
-
 #if !BUILDFLAG(IS_ANDROID)
     {"tab-capture-infobar-links",
      flag_descriptions::kTabCaptureInfobarLinksName,
@@ -13378,6 +13365,16 @@
      FEATURE_VALUE_TYPE(
          autofill::features::kAutofillDisableBnplCountryCheckForTesting)},
 
+    {"infobar-refresh", flag_descriptions::kInfobarRefreshName,
+     flag_descriptions::kInfobarRefreshDescription, kOsAll,
+     FEATURE_VALUE_TYPE(features::kInfobarRefresh)},
+
+#if BUILDFLAG(IS_ANDROID)
+    {"recently-closed-tabs-and-windows",
+     flag_descriptions::kRecentlyClosedTabsAndWindowsName,
+     flag_descriptions::kRecentlyClosedTabsAndWindowsDescription, kOsAndroid,
+     FEATURE_VALUE_TYPE(chrome::android::kRecentlyClosedTabsAndWindows)},
+#endif
     // Add new entries above this line.
     // NOTE: Adding a new flag requires adding a corresponding entry to enum
     // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag
diff --git a/chrome/browser/actor/BUILD.gn b/chrome/browser/actor/BUILD.gn
index 2055d1459..f66edfe 100644
--- a/chrome/browser/actor/BUILD.gn
+++ b/chrome/browser/actor/BUILD.gn
@@ -209,6 +209,8 @@
   ]
   deps = [
     "//chrome/common",
+    "//chrome/common:actor_webui_mojom",
+    "//components/password_manager/core/browser/actor_login:common",
     "//components/tabs:public",
     "//third_party/abseil-cpp:absl",
   ]
@@ -323,10 +325,12 @@
     "//chrome/test:test_support",
     "//chrome/test:test_support_ui",
     "//components/favicon/core/test:test_support",
+    "//components/javascript_dialogs",
     "//components/optimization_guide/core:bloomfilter",
     "//components/safe_browsing:buildflags",
     "//components/safe_browsing/core/common:features",
     "//components/safe_browsing/core/common:safe_browsing_prefs",
+    "//content/test:browsertest_support",
     "//testing/gtest",
   ]
 
@@ -335,6 +339,7 @@
       "actor_keyed_service_browsertest.cc",
       "actor_policy_checker_browsertest.cc",
       "execution_engine_browsertest.cc",
+      "execution_engine_origin_gating_browsertest.cc",
       "tools/attempt_login_tool_browsertest.cc",
       "tools/click_tool_browsertest.cc",
       "tools/drag_and_release_tool_browsertest.cc",
@@ -357,6 +362,7 @@
     ]
     deps += [
       "//chrome/browser/glic",
+      "//chrome/browser/glic/test_support",
       "//components/page_load_metrics/browser:test_support",
       "//ui/base:ozone_buildflags",
     ]
@@ -382,7 +388,6 @@
   ]
   if (enable_glic) {
     sources = [
-      "execution_engine_interactive_ui_test.cc",
       "tools/attempt_login_tool_interactive_ui_test.cc",
       "tools/select_tool_interactive_ui_test.cc",
     ]
diff --git a/chrome/browser/actor/actor_features.cc b/chrome/browser/actor/actor_features.cc
index a088e3d..3e8c9f34 100644
--- a/chrome/browser/actor/actor_features.cc
+++ b/chrome/browser/actor/actor_features.cc
@@ -50,6 +50,9 @@
 BASE_FEATURE(kGlicTabScreenshotPaintPreviewBackend,
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+BASE_FEATURE(kGlicSkipBeforeUnloadDialogAndNavigate,
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 const base::FeatureParam<bool> kFullPageScreenshot{
     &kGlicTabScreenshotPaintPreviewBackend, "full_page_screenshot", false};
 
diff --git a/chrome/browser/actor/actor_features.h b/chrome/browser/actor/actor_features.h
index 1554955..99942651 100644
--- a/chrome/browser/actor/actor_features.h
+++ b/chrome/browser/actor/actor_features.h
@@ -29,6 +29,11 @@
 
 BASE_DECLARE_FEATURE(kGlicCrossOriginNavigationGating);
 
+// When enabled, `beforeunload` dialog will not be displayed and the callback
+// indicating the dialog outcome will be called with `true`.
+// Warning: Enabling this feature can lead to data loss when navigating.
+BASE_DECLARE_FEATURE(kGlicSkipBeforeUnloadDialogAndNavigate);
+
 // When enabled, the actor will send a dialog request to the web client to
 // allow the user to select a credential to use for a site. When disabled, the
 // actor will automatically use the first credential.
diff --git a/chrome/browser/actor/actor_keyed_service.cc b/chrome/browser/actor/actor_keyed_service.cc
index 1af58ff..15d674dc 100644
--- a/chrome/browser/actor/actor_keyed_service.cc
+++ b/chrome/browser/actor/actor_keyed_service.cc
@@ -168,49 +168,6 @@
 }
 
 base::CallbackListSubscription
-ActorKeyedService::AddRequestToShowCredentialSelectionDialogSubscriberCallback(
-    RequestToShowCredentialSelectionDialogSubscriberCallback callback) {
-  return request_to_show_credential_selection_dialog_callback_list_.Add(
-      std::move(callback));
-}
-
-void ActorKeyedService::NotifyRequestToShowCredentialSelectionDialog(
-    TaskId task_id,
-    const base::flat_map<std::string, gfx::Image>& icons,
-    const std::vector<actor_login::Credential>& credentials) {
-  request_to_show_credential_selection_dialog_callback_list_.Notify(
-      task_id, icons, credentials,
-      base::BindRepeating(&ActorKeyedService::OnCredentialSelected,
-                          weak_ptr_factory_.GetWeakPtr(), task_id));
-}
-
-void ActorKeyedService::OnCredentialSelected(
-    TaskId request_task_id,
-    webui::mojom::SelectCredentialDialogResponsePtr response) {
-  TRACE_EVENT0("actor", "ActorKeyedService::OnCredentialSelected");
-  // TODO(crbug.com/440147814): Update the `UserGrantedPermissionDuration`
-  // if the user changes the permission.
-  TaskId response_task_id(response->task_id);
-  if (response_task_id != request_task_id) {
-    // TODO(crbug.com/441500534): We should also add error handling in
-    // glic_api_host.ts.
-    VLOG(1) << "SelectCredentialDialogResponse has a different task id "
-            << response_task_id << " than requested " << request_task_id;
-    // If the task ID mismatches, generate an empty response with the correct
-    // task ID and error value.
-    response->task_id = request_task_id.value();
-    response->selected_credential_id = std::nullopt;
-    // TODO(crbug.com/427817882): Explicit error reason (kMismatchedTaskId).
-    response->error_reason = std::nullopt;
-  }
-  if (auto* task = GetTask(request_task_id)) {
-    task->GetExecutionEngine()->OnCredentialSelected(std::move(response));
-  } else {
-    VLOG(1) << "Task not found for task id: " << request_task_id;
-  }
-}
-
-base::CallbackListSubscription
 ActorKeyedService::AddRequestToShowAutofillSuggestionsDialogSubscriberCallback(
     RequestToShowAutofillSuggestionsDialogSubscriberCallback callback) {
   return request_to_show_autofill_suggestions_dialog_callback_list_.Add(
@@ -233,59 +190,6 @@
   NOTIMPLEMENTED();
 }
 
-base::CallbackListSubscription
-ActorKeyedService::AddRequestToShowUserConfirmationDialogSubscriberCallback(
-    RequestToShowUserConfirmationDialogSubscriberCallback callback) {
-  return request_to_show_user_confirmation_dialog_callback_list_.Add(
-      std::move(callback));
-}
-
-void ActorKeyedService::NotifyRequestToShowUserConfirmationDialog(
-    TaskId task_id,
-    const url::Origin& navigation_origin) {
-  request_to_show_user_confirmation_dialog_callback_list_.Notify(
-      navigation_origin,
-      base::BindRepeating(&ActorKeyedService::OnUserConfirmationDialogDecision,
-                          weak_ptr_factory_.GetWeakPtr(), task_id));
-}
-
-void ActorKeyedService::OnUserConfirmationDialogDecision(
-    TaskId request_task_id,
-    webui::mojom::UserConfirmationDialogResponsePtr response) {
-  if (auto* task = GetTask(request_task_id)) {
-    task->GetExecutionEngine()->OnUserConfirmationDialogResponse(
-        std::move(response));
-  } else {
-    VLOG(1) << "Task not found for task id: " << request_task_id;
-  }
-}
-
-base::CallbackListSubscription
-ActorKeyedService::AddRequestToConfirmNavigationSubscriberCallback(
-    RequestToConfirmNavigationSubscriberCallback callback) {
-  return request_to_confirm_navigation_callback_list_.Add(std::move(callback));
-}
-
-void ActorKeyedService::NotifyRequestToConfirmNavigation(
-    const TaskId& task_id,
-    const url::Origin& navigation_origin) {
-  request_to_confirm_navigation_callback_list_.Notify(
-      task_id, navigation_origin,
-      base::BindRepeating(&ActorKeyedService::OnNavigationConfirmationDecision,
-                          weak_ptr_factory_.GetWeakPtr(), task_id));
-}
-
-void ActorKeyedService::OnNavigationConfirmationDecision(
-    TaskId request_task_id,
-    webui::mojom::NavigationConfirmationResponsePtr response) {
-  if (auto* task = GetTask(request_task_id)) {
-    task->GetExecutionEngine()->OnNavigationConfirmationResponse(
-        std::move(response));
-  } else {
-    VLOG(1) << "Task not found for task id: " << request_task_id;
-  }
-}
-
 void ActorKeyedService::OnActOnWebCapabilityChanged(bool can_act_on_web) {
   if (!can_act_on_web) {
     FailAllTasks();
diff --git a/chrome/browser/actor/actor_keyed_service.h b/chrome/browser/actor/actor_keyed_service.h
index 1a5e7a14..b1ee947 100644
--- a/chrome/browser/actor/actor_keyed_service.h
+++ b/chrome/browser/actor/actor_keyed_service.h
@@ -18,14 +18,10 @@
 #include "chrome/browser/actor/aggregated_journal.h"
 #include "chrome/common/actor/action_result.h"
 #include "chrome/common/actor/task_id.h"
-#include "chrome/common/actor_webui.mojom-forward.h"
 #include "chrome/common/buildflags.h"
 #include "components/autofill/core/browser/integrators/glic/actor_form_filling_types.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "components/password_manager/core/browser/actor_login/actor_login_types.h"
 #include "components/tabs/public/tab_interface.h"
-#include "ui/gfx/image/image.h"
-#include "url/gurl.h"
 
 class Profile;
 
@@ -45,7 +41,6 @@
 class ActorPolicyChecker;
 class ActorTask;
 class ActorTaskMetadata;
-class ActorTaskDelegate;
 class ToolRequest;
 
 // This class owns all ActorTasks for a given profile. ActorTasks are kept in
@@ -140,32 +135,6 @@
 
   void NotifyTaskStateChanged(const ActorTask& task);
 
-  // Allows the subscribers to get notified when a credential selection prompt
-  // is requested.
-  using CredentialSelectedCallback = base::RepeatingCallback<void(
-      webui::mojom::SelectCredentialDialogResponsePtr)>;
-  using RequestToShowCredentialSelectionDialogSubscriberCallback =
-      base::RepeatingCallback<void(
-          TaskId,
-          const base::flat_map<std::string, gfx::Image>& icons,
-          const std::vector<actor_login::Credential>&,
-          CredentialSelectedCallback)>;
-  base::CallbackListSubscription
-  AddRequestToShowCredentialSelectionDialogSubscriberCallback(
-      RequestToShowCredentialSelectionDialogSubscriberCallback callback);
-
-  // Notifies the subscribers that a credential selection prompt is requested
-  // for the given task.
-  void NotifyRequestToShowCredentialSelectionDialog(
-      TaskId task_id,
-      const base::flat_map<std::string, gfx::Image>& icons,
-      const std::vector<actor_login::Credential>& credentials);
-
-  // Callback for when a credential is selected.
-  void OnCredentialSelected(
-      TaskId request_task_id,
-      webui::mojom::SelectCredentialDialogResponsePtr response);
-
   // Allows the subscribers to be notified when an autofill suggestion prompt
   // is requested by a tool.
   using AutofillSuggestionsSelectedCallback = base::RepeatingCallback<void(
@@ -190,61 +159,6 @@
       TaskId request_task_id,
       webui::mojom::SelectAutofillSuggestionsDialogResponsePtr response);
 
-  using UserConfirmationDialogCallback = base::RepeatingCallback<void(
-      webui::mojom::UserConfirmationDialogResponsePtr)>;
-  using RequestToShowUserConfirmationDialogSubscriberCallback =
-      base::RepeatingCallback<void(const url::Origin&,
-                                   UserConfirmationDialogCallback)>;
-
-  base::CallbackListSubscription
-  AddRequestToShowUserConfirmationDialogSubscriberCallback(
-      RequestToShowUserConfirmationDialogSubscriberCallback callback);
-
-  // Notifies the subscribers that the browser is requesting user confirmation
-  // for the actor to continue.
-  void NotifyRequestToShowUserConfirmationDialog(
-      TaskId task_id,
-      const url::Origin& navigation_origin);
-
-  void OnUserConfirmationDialogDecision(
-      TaskId request_task_id,
-      webui::mojom::UserConfirmationDialogResponsePtr response);
-
-  // Callback for GlicPageHandler::RequestToConfirmNavigation. The page handler
-  // method forwards the response of the IPC to the web client to its own
-  // callback.
-  using NavigationConfirmationCallback = base::RepeatingCallback<void(
-      webui::mojom::NavigationConfirmationResponsePtr)>;
-
-  // Callback invoked whenever the subscriber receives a new request, which are
-  // created when GlicPageHandler::RequestToConfirmNavigation is invoked. This
-  // callback is immediately invoked when
-  // GlicPageHandler::RequestToConfirmNavigation is called, unlike
-  // NavigationConfirmationCallback, which is invoked when the IPC receives a
-  // response.
-  using RequestToConfirmNavigationSubscriberCallback =
-      base::RepeatingCallback<void(const TaskId&,
-                                   const url::Origin& navigation_origin,
-                                   NavigationConfirmationCallback)>;
-
-  // This is called when GlicPageHandler::CreateWebClient is invoked. It
-  // returns a subscription to requests by the browser to confirm
-  // navigations the actor makes to new origins.
-  // TODO(crbug.com/439672418): Make sure this works when kGlicMultiInstance is
-  // enabled.
-  base::CallbackListSubscription
-  AddRequestToConfirmNavigationSubscriberCallback(
-      RequestToConfirmNavigationSubscriberCallback callback);
-
-  // Notifies the subscribers that the browser is requesting the actor confirm
-  // navigation to a novel origin.
-  void NotifyRequestToConfirmNavigation(const TaskId& task_id,
-                                        const url::Origin& navigation_origin);
-
-  void OnNavigationConfirmationDecision(
-      TaskId request_task_id,
-      webui::mojom::NavigationConfirmationResponsePtr response);
-
   void OnActOnWebCapabilityChanged(bool can_act_on_web);
 
   using ActOnWebCapabilityChangedCallback = base::RepeatingCallback<void(bool)>;
@@ -289,21 +203,9 @@
       tab_state_change_callback_list_;
 
   base::RepeatingCallbackList<
-      RequestToShowCredentialSelectionDialogSubscriberCallback::RunType>
-      request_to_show_credential_selection_dialog_callback_list_;
-
-  base::RepeatingCallbackList<
       RequestToShowAutofillSuggestionsDialogSubscriberCallback::RunType>
       request_to_show_autofill_suggestions_dialog_callback_list_;
 
-  base::RepeatingCallbackList<
-      RequestToShowUserConfirmationDialogSubscriberCallback::RunType>
-      request_to_show_user_confirmation_dialog_callback_list_;
-
-  base::RepeatingCallbackList<
-      RequestToConfirmNavigationSubscriberCallback::RunType>
-      request_to_confirm_navigation_callback_list_;
-
   base::RepeatingCallbackList<ActOnWebCapabilityChangedCallback::RunType>
       act_on_web_capability_changed_callback_list_;
 
diff --git a/chrome/browser/actor/actor_keyed_service_browsertest.cc b/chrome/browser/actor/actor_keyed_service_browsertest.cc
index c35502d..31af26e7 100644
--- a/chrome/browser/actor/actor_keyed_service_browsertest.cc
+++ b/chrome/browser/actor/actor_keyed_service_browsertest.cc
@@ -237,75 +237,5 @@
   EXPECT_FALSE(actions_result->tabs()[0].has_screenshot());
 }
 
-class ActorKeyedServiceOriginGatingBrowserTest
-    : public ActorKeyedServiceBrowserTest {
- public:
-  ActorKeyedServiceOriginGatingBrowserTest() {
-    scoped_feature_list_.InitWithFeatures(
-        /*enabled_features=*/{features::kGlic, features::kTabstripComboButton,
-                              features::kGlicActor,
-                              kGlicCrossOriginNavigationGating},
-        /*disabled_features=*/{features::kGlicWarming});
-  }
-
-  void CreateMockNavigationIPCResponse(TaskId expected_task_id,
-                                       url::Origin expected_navigation_origin,
-                                       bool permission_granted) {
-    navigation_confirmation_subscription_ =
-        actor_keyed_service()->AddRequestToConfirmNavigationSubscriberCallback(
-            base::BindLambdaForTesting(
-                [expected_task_id, expected_navigation_origin,
-                 permission_granted](
-                    const TaskId& got_task_id,
-                    const url::Origin& got_navigation_origin,
-                    ActorKeyedService::NavigationConfirmationCallback
-                        callback) {
-                  EXPECT_EQ(got_task_id, expected_task_id);
-                  EXPECT_EQ(got_navigation_origin, expected_navigation_origin);
-                  // Send a mock IPC response.
-                  std::move(callback).Run(
-                      webui::mojom::NavigationConfirmationResponse::New(
-                          webui::mojom::ConfirmationRequestResult::
-                              NewPermissionGranted(permission_granted)));
-                }));
-  }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_;
-  base::CallbackListSubscription navigation_confirmation_subscription_;
-};
-
-IN_PROC_BROWSER_TEST_F(ActorKeyedServiceOriginGatingBrowserTest,
-                       AddWritableMainframeOrigins) {
-  const GURL cross_origin_url =
-      embedded_https_test_server().GetURL("bar.com", "/actor/blank.html");
-  const GURL link_page_url = embedded_https_test_server().GetURL(
-      "foo.com", base::StrCat({"/actor/link_full_page.html?href=",
-                               EncodeURI(cross_origin_url.spec())}));
-
-  // Navigate the active tab to the link page.
-  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), link_page_url));
-  TaskId task_id = actor_keyed_service()->CreateTask();
-
-  CreateMockNavigationIPCResponse(task_id,
-                                  url::Origin::Create(cross_origin_url),
-                                  /*permission_granted=*/false);
-
-  PerformActionsFuture result1;
-  actor_keyed_service()->PerformActions(
-      task_id, ToRequestList(MakeClickRequest(*active_tab(), gfx::Point(1, 1))),
-      ActorTaskMetadata(), result1.GetCallback());
-  ExpectErrorResult(result1,
-                    mojom::ActionResultCode::kTriggeredNavigationBlocked);
-
-  PerformActionsFuture result2;
-  actor_keyed_service()->PerformActions(
-      task_id, ToRequestList(MakeClickRequest(*active_tab(), gfx::Point(1, 1))),
-      ActorTaskMetadata::WithAddedWritableMainframeOriginsForTesting(
-          {url::Origin::Create(cross_origin_url)}),
-      result2.GetCallback());
-  ExpectOkResult(result2);
-}
-
 }  // namespace
 }  // namespace actor
diff --git a/chrome/browser/actor/actor_policy_checker.cc b/chrome/browser/actor/actor_policy_checker.cc
index aecda64..7af5ffa1 100644
--- a/chrome/browser/actor/actor_policy_checker.cc
+++ b/chrome/browser/actor/actor_policy_checker.cc
@@ -9,6 +9,7 @@
 #include "chrome/browser/actor/actor_keyed_service.h"
 #include "chrome/browser/actor/aggregated_journal.h"
 #include "chrome/browser/actor/site_policy.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/enterprise/browser_management/browser_management_service.h"
 #include "chrome/browser/enterprise/browser_management/management_service_factory.h"
 #include "chrome/browser/glic/glic_pref_names.h"
@@ -17,6 +18,7 @@
 #include "chrome/common/buildflags.h"
 #include "chrome/common/chrome_features.h"
 #include "components/prefs/pref_service.h"
+#include "components/variations/service/variations_service.h"
 #include "content/public/browser/web_contents.h"
 
 namespace actor {
@@ -47,6 +49,12 @@
   }
   NOTREACHED();
 }
+
+bool IsLikelyDogfoodClient() {
+  variations::VariationsService* variations_service =
+      g_browser_process->variations_service();
+  return variations_service && variations_service->IsLikelyDogfoodClient();
+}
 #endif  // BUILDFLAG(ENABLE_GLIC)
 
 bool HasActuationCapability(Profile* profile) {
@@ -68,6 +76,7 @@
       features::kGlicActorEnterprisePrefDefault.Get();
   const int capability_pref =
       profile->GetPrefs()->GetInteger(glic::prefs::kGlicActuationOnWeb);
+  bool is_likely_dogfood_client = IsLikelyDogfoodClient();
 
   VLOG(1) << "Is browser managed: " << is_managed;
   VLOG(1) << "kGlicActorEnterprisePrefDefault value: "
@@ -76,8 +85,9 @@
           << profile->GetPrefs()->IsManagedPreference(
                  glic::prefs::kGlicActuationOnWeb)
           << " value: " << GlicActuationOnWebPrefToString(capability_pref);
+  VLOG(1) << "is_likely_dogfood_client: " << is_likely_dogfood_client;
 
-  if (!is_managed) {
+  if (!is_managed || is_likely_dogfood_client) {
     return true;
   }
 
diff --git a/chrome/browser/actor/actor_task.cc b/chrome/browser/actor/actor_task.cc
index 32083e7..dd1b737 100644
--- a/chrome/browser/actor/actor_task.cc
+++ b/chrome/browser/actor/actor_task.cc
@@ -597,4 +597,10 @@
   return os << ToString(state);
 }
 
+void ActorTask::SetExecutionEngineForTesting(
+    std::unique_ptr<ExecutionEngine> engine) {
+  execution_engine_.reset(std::move(engine.release()));
+  execution_engine_->SetOwner(this);
+}
+
 }  // namespace actor
diff --git a/chrome/browser/actor/actor_task.h b/chrome/browser/actor/actor_task.h
index 02b0fe1b..b9a771a 100644
--- a/chrome/browser/actor/actor_task.h
+++ b/chrome/browser/actor/actor_task.h
@@ -73,6 +73,7 @@
   void SetIdForTesting(int id);
 
   const std::string& title() const { return title_; }
+  base::WeakPtr<ActorTaskDelegate> delegate() const { return delegate_; }
 
   // Once `state_` leaves kCreated it should never go back. Once `state_` enters
   // kFinished or kCancelled it should never change. These states are granular,
@@ -163,6 +164,8 @@
   // The set of tabs that were acted on by the last call to Act.
   TabHandleSet GetLastActedTabs() const;
 
+  void SetExecutionEngineForTesting(std::unique_ptr<ExecutionEngine> engine);
+
  private:
   class ActorControlledTabState : public content::WebContentsObserver {
    public:
diff --git a/chrome/browser/actor/actor_task_delegate.h b/chrome/browser/actor/actor_task_delegate.h
index 830a86e..21427ff 100644
--- a/chrome/browser/actor/actor_task_delegate.h
+++ b/chrome/browser/actor/actor_task_delegate.h
@@ -5,8 +5,13 @@
 #ifndef CHROME_BROWSER_ACTOR_ACTOR_TASK_DELEGATE_H_
 #define CHROME_BROWSER_ACTOR_ACTOR_TASK_DELEGATE_H_
 
+#include "base/functional/callback.h"
 #include "chrome/common/actor/task_id.h"
+#include "chrome/common/actor_webui.mojom.h"
+#include "components/password_manager/core/browser/actor_login/actor_login_types.h"
 #include "components/tabs/public/tab_interface.h"
+#include "ui/gfx/image/image.h"
+#include "url/origin.h"
 
 namespace actor {
 
@@ -21,6 +26,28 @@
   virtual void OnTabAddedToTask(
       TaskId task_id,
       const tabs::TabInterface::Handle& tab_handle) = 0;
+
+  using CredentialSelectedCallback =
+      base::OnceCallback<void(webui::mojom::SelectCredentialDialogResponsePtr)>;
+  virtual void RequestToShowCredentialSelectionDialog(
+      TaskId task_id,
+      const base::flat_map<std::string, gfx::Image>& icons,
+      const std::vector<actor_login::Credential>& credentials,
+      CredentialSelectedCallback callback) = 0;
+
+  using UserConfirmationDialogCallback =
+      base::OnceCallback<void(webui::mojom::UserConfirmationDialogResponsePtr)>;
+  virtual void RequestToShowUserConfirmationDialog(
+      TaskId task_id,
+      const url::Origin& navigation_origin,
+      UserConfirmationDialogCallback callback) = 0;
+
+  using NavigationConfirmationCallback =
+      base::OnceCallback<void(webui::mojom::NavigationConfirmationResponsePtr)>;
+  virtual void RequestToConfirmNavigation(
+      TaskId task_id,
+      const url::Origin& navigation_origin,
+      NavigationConfirmationCallback callback) = 0;
 };
 
 }  // namespace actor
diff --git a/chrome/browser/actor/execution_engine.cc b/chrome/browser/actor/execution_engine.cc
index 9a5153d..aad18e8 100644
--- a/chrome/browser/actor/execution_engine.cc
+++ b/chrome/browser/actor/execution_engine.cc
@@ -313,24 +313,14 @@
 void ExecutionEngine::SendNavigationConfirmationRequest(
     const url::Origin& navigation_origin,
     ExecutionEngine::NavigationDecisionCallback callback) {
-  if (navigation_confirmation_callback_) {
-    std::move(navigation_confirmation_callback_)
-        .Run(webui::mojom::NavigationConfirmationResponse::New(
-            webui::mojom::ConfirmationRequestResult::NewErrorReason(
-                webui::mojom::ConfirmationRequestErrorReason::
-                    kPreemptedByNewRequest)));
+  if (!task_->delegate()) {
+    std::move(callback).Run(/*may_continue=*/false);
+    return;
   }
-  navigation_confirmation_callback_ =
+  task_->delegate()->RequestToConfirmNavigation(
+      task_->id(), navigation_origin,
       base::BindOnce(&ExecutionEngine::OnNavigationConfirmationDecision,
-                     GetWeakPtr(), navigation_origin, std::move(callback));
-  ActorKeyedService::Get(profile_)->NotifyRequestToConfirmNavigation(
-      task_->id(), navigation_origin);
-}
-
-void ExecutionEngine::OnNavigationConfirmationResponse(
-    webui::mojom::NavigationConfirmationResponsePtr response) {
-  CHECK(navigation_confirmation_callback_);
-  std::move(navigation_confirmation_callback_).Run(std::move(response));
+                     GetWeakPtr(), navigation_origin, std::move(callback)));
 }
 
 void ExecutionEngine::OnNavigationConfirmationDecision(
@@ -357,24 +347,14 @@
 void ExecutionEngine::SendUserConfirmationDialogRequest(
     const url::Origin& navigation_origin,
     ExecutionEngine::NavigationDecisionCallback callback) {
-  if (user_confirmation_callback_) {
-    std::move(user_confirmation_callback_)
-        .Run(webui::mojom::UserConfirmationDialogResponse::New(
-            webui::mojom::ConfirmationRequestResult::NewErrorReason(
-                webui::mojom::ConfirmationRequestErrorReason::
-                    kPreemptedByNewRequest)));
+  if (!task_->delegate()) {
+    std::move(callback).Run(/*may_continue=*/false);
+    return;
   }
-  user_confirmation_callback_ =
+  task_->delegate()->RequestToShowUserConfirmationDialog(
+      task_->id(), navigation_origin,
       base::BindOnce(&ExecutionEngine::OnPromptUserToConfirmNavigationDecision,
-                     GetWeakPtr(), navigation_origin, std::move(callback));
-  ActorKeyedService::Get(profile_)->NotifyRequestToShowUserConfirmationDialog(
-      task_->id(), navigation_origin);
-}
-
-void ExecutionEngine::OnUserConfirmationDialogResponse(
-    webui::mojom::UserConfirmationDialogResponsePtr response) {
-  CHECK(user_confirmation_callback_);
-  std::move(user_confirmation_callback_).Run(std::move(response));
+                     GetWeakPtr(), navigation_origin, std::move(callback)));
 }
 
 void ExecutionEngine::OnPromptUserToConfirmNavigationDecision(
@@ -743,19 +723,14 @@
   TRACE_EVENT0("actor", "ExecutionEngine::PromptToSelectCredential");
   CHECK(!credentials.empty());
 
-  // In the same task, another login attempt is made before the previous one
-  // responds. Cancel the previous one.
-  if (credential_selected_callback_) {
+  if (!task_->delegate()) {
     // TODO(crbug.com/427817882): Explicit error reason (kNewLonginAttempt).
-    std::move(credential_selected_callback_)
-        .Run(/*selected_credential=*/webui::mojom::
-                 SelectCredentialDialogResponse::New());
+    std::move(callback).Run(/*selected_credential=*/webui::mojom::
+                                SelectCredentialDialogResponse::New());
+    return;
   }
-  credential_selected_callback_ = std::move(callback);
-
-  ActorKeyedService::Get(profile_)
-      ->NotifyRequestToShowCredentialSelectionDialog(task_->id(), icons,
-                                                     credentials);
+  task_->delegate()->RequestToShowCredentialSelectionDialog(
+      task_->id(), icons, credentials, std::move(callback));
 }
 
 void ExecutionEngine::SetUserSelectedCredential(
@@ -774,14 +749,6 @@
   return it->second;
 }
 
-void ExecutionEngine::OnCredentialSelected(
-    webui::mojom::SelectCredentialDialogResponsePtr response) {
-  TRACE_EVENT0("actor", "ExecutionEngine::OnCredentialSelected");
-  if (credential_selected_callback_) {
-    std::move(credential_selected_callback_).Run(std::move(response));
-  }
-}
-
 void ExecutionEngine::AddWritableMainframeOrigins(
     const absl::flat_hash_set<url::Origin>& added_writable_mainframe_origins) {
   if (!base::FeatureList::IsEnabled(kGlicCrossOriginNavigationGating)) {
diff --git a/chrome/browser/actor/execution_engine.h b/chrome/browser/actor/execution_engine.h
index 5c7bd4f..dfba33a 100644
--- a/chrome/browser/actor/execution_engine.h
+++ b/chrome/browser/actor/execution_engine.h
@@ -116,11 +116,6 @@
   const std::optional<CredentialWithPermission> GetUserSelectedCredential(
       const url::Origin& request_origin) const override;
 
-  // Callback for when a credential is selected, in response to
-  // `ToolDelegate::PromptToSelectCredential()`.
-  void OnCredentialSelected(
-      webui::mojom::SelectCredentialDialogResponsePtr response);
-
   void AddWritableMainframeOrigins(
       const absl::flat_hash_set<url::Origin>& added_writable_mainframe_origins);
 
@@ -135,14 +130,6 @@
   bool ShouldGateNavigation(content::NavigationHandle& navigation_handle,
                             NavigationDecisionCallback callback);
 
-  // Callback for when the user responds to a confirmation dialog.
-  void OnUserConfirmationDialogResponse(
-      webui::mojom::UserConfirmationDialogResponsePtr response);
-
-  // Callback when the server responds when asked to confirm navigation.
-  void OnNavigationConfirmationResponse(
-      webui::mojom::NavigationConfirmationResponsePtr response);
-
   static std::string StateToString(State state);
 
   void UserTakeover(mojom::ActionResultCode takeover_response_code,
@@ -288,13 +275,6 @@
   // those initiated by the renderer with web content.
   absl::flat_hash_set<url::Origin> allowed_navigation_origins_;
 
-  ToolDelegate::CredentialSelectedCallback credential_selected_callback_;
-
-  base::OnceCallback<void(webui::mojom::UserConfirmationDialogResponsePtr)>
-      user_confirmation_callback_;
-  base::OnceCallback<void(webui::mojom::NavigationConfirmationResponsePtr)>
-      navigation_confirmation_callback_;
-
   // For multi-step login, this is the credential that the user has chosen to
   // allow the actor to use. The key is the
   // `Credential::request_origin`.
diff --git a/chrome/browser/actor/execution_engine_browsertest.cc b/chrome/browser/actor/execution_engine_browsertest.cc
index f3aa28ea..2aca882 100644
--- a/chrome/browser/actor/execution_engine_browsertest.cc
+++ b/chrome/browser/actor/execution_engine_browsertest.cc
@@ -9,8 +9,10 @@
 
 #include "base/files/file_util.h"
 #include "base/files/scoped_temp_dir.h"
+#include "base/strings/stringprintf.h"
 #include "base/test/bind.h"
 #include "base/test/metrics/histogram_tester.h"
+#include "base/test/run_until.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_file_util.h"
 #include "base/test/test_future.h"
@@ -22,12 +24,16 @@
 #include "chrome/browser/actor/ui/event_dispatcher.h"
 #include "chrome/browser/chrome_content_browser_client.h"
 #include "chrome/browser/glic/public/glic_keyed_service.h"
+#include "chrome/browser/glic/test_support/non_interactive_glic_test.h"
 #include "chrome/browser/optimization_guide/browser_test_util.h"
 #include "chrome/browser/optimization_guide/mock_optimization_guide_keyed_service.h"
 #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.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_navigator.h"
+#include "chrome/browser/ui/browser_navigator_params.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/ui_features.h"
 #include "chrome/browser/ui/views/file_system_access/file_system_access_test_utils.h"
 #include "chrome/browser/ui/views/frame/browser_view.h"
@@ -39,21 +45,32 @@
 #include "chrome/test/base/chrome_test_utils.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/javascript_dialogs/app_modal_dialog_controller.h"
+#include "components/javascript_dialogs/app_modal_dialog_queue.h"
 #include "components/keyed_service/content/browser_context_dependency_manager.h"
 #include "components/optimization_guide/content/browser/page_content_proto_provider.h"
 #include "components/optimization_guide/core/filters/optimization_hints_component_update_listener.h"
 #include "components/optimization_guide/proto/features/actions_data.pb.h"
 #include "content/public/browser/render_frame_host.h"
+#include "content/public/browser/web_contents.h"
 #include "content/public/common/content_client.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
 #include "content/public/test/prerender_test_util.h"
 #include "content/public/test/test_frame_navigation_observer.h"
+#include "content/public/test/test_navigation_observer.h"
+#include "content/public/test/test_utils.h"
+#include "net/base/features.h"
 #include "net/dns/mock_host_resolver.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/input/web_mouse_event.h"
 #include "ui/shell_dialogs/select_file_dialog.h"
+#include "url/gurl.h"
 
 using ::base::test::TestFuture;
 using ::optimization_guide::proto::ClickAction;
+using ::testing::_;
 
 namespace actor {
 
@@ -543,377 +560,106 @@
                          ExecutionEngineDangerousContentBrowserTest,
                          testing::Bool());
 
-class ExecutionEngineOriginGatingBrowserTest
+class ExecutionEngineSkipBeforeUnloadBrowserTest
     : public ExecutionEngineBrowserTest,
-      public testing::WithParamInterface<bool> {
+      public testing::WithParamInterface<std::tuple<bool, bool>> {
  public:
-  ExecutionEngineOriginGatingBrowserTest() {
-    scoped_feature_list_.InitWithFeatureState(kGlicCrossOriginNavigationGating,
-                                              origin_gating_enabled());
+  ExecutionEngineSkipBeforeUnloadBrowserTest() {
+    if (IsSkipFeatureEnabled()) {
+      scoped_feature_list_.InitAndEnableFeature(
+          kGlicSkipBeforeUnloadDialogAndNavigate);
+    } else {
+      scoped_feature_list_.InitAndDisableFeature(
+          kGlicSkipBeforeUnloadDialogAndNavigate);
+    }
   }
 
-  bool origin_gating_enabled() { return GetParam(); }
+  bool IsActorActive() const { return std::get<0>(GetParam()); }
+  bool IsSkipFeatureEnabled() const { return std::get<1>(GetParam()); }
 
-  void CreateMockNavigationConfirmationResponse(
-      std::optional<TaskId> expected_task_id,
-      url::Origin expected_navigation_origin,
-      bool permission_granted) {
-    navigation_confirmation_subscription_ =
-        actor_keyed_service()->AddRequestToConfirmNavigationSubscriberCallback(
-            base::BindLambdaForTesting(
-                [expected_task_id, expected_navigation_origin,
-                 permission_granted](
-                    const TaskId& got_task_id,
-                    const url::Origin& got_navigation_origin,
-                    ActorKeyedService::NavigationConfirmationCallback
-                        callback) {
-                  if (expected_task_id) {
-                    EXPECT_EQ(got_task_id, *expected_task_id);
-                  }
-                  EXPECT_EQ(got_navigation_origin, expected_navigation_origin);
-                  // Send a mock IPC response.
-                  std::move(callback).Run(
-                      webui::mojom::NavigationConfirmationResponse::New(
-                          webui::mojom::ConfirmationRequestResult::
-                              NewPermissionGranted(permission_granted)));
-                }));
+  void WaitForAppModalDialogToClose() {
+    ASSERT_TRUE(base::test::RunUntil([] {
+      return !javascript_dialogs::AppModalDialogQueue::GetInstance()
+                  ->HasActiveDialog();
+    }));
   }
 
-  void CreateMockUserConfirmationDialogResponse(
-      url::Origin expected_navigation_origin,
-      bool permission_granted) {
-    user_confirmation_dialog_subscription_ =
-        actor_keyed_service()
-            ->AddRequestToShowUserConfirmationDialogSubscriberCallback(
-                base::BindLambdaForTesting(
-                    [expected_navigation_origin, permission_granted](
-                        const url::Origin& got_navigation_origin,
-                        ActorKeyedService::UserConfirmationDialogCallback
-                            callback) {
-                      // Verify the request is what the IPC expects.
-                      EXPECT_EQ(got_navigation_origin,
-                                expected_navigation_origin);
-                      // Send a mock IPC response.
-                      std::move(callback).Run(
-                          webui::mojom::UserConfirmationDialogResponse::New(
-                              webui::mojom::ConfirmationRequestResult::
-                                  NewPermissionGranted(permission_granted)));
-                    }));
+  void CancelActiveAppModalDialog() {
+    auto* dialog_queue = javascript_dialogs::AppModalDialogQueue::GetInstance();
+    ASSERT_TRUE(javascript_dialogs::AppModalDialogQueue::GetInstance()
+                    ->HasActiveDialog());
+    javascript_dialogs::AppModalDialogController* dialog =
+        dialog_queue->active_dialog();
+    dialog->OnCancel(true);
+    WaitForAppModalDialogToClose();
   }
 
- protected:
-  base::HistogramTester histogram_tester_;
-
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
-  base::CallbackListSubscription navigation_confirmation_subscription_;
-  base::CallbackListSubscription user_confirmation_dialog_subscription_;
 };
 
-IN_PROC_BROWSER_TEST_P(ExecutionEngineOriginGatingBrowserTest,
-                       ConfirmNavigationToNewOrigin_Denied) {
-  const GURL start_url =
-      embedded_https_test_server().GetURL("example.com", "/actor/link.html");
-  const GURL second_url =
-      embedded_https_test_server().GetURL("foo.com", "/actor/blank.html");
-
-  CreateMockNavigationConfirmationResponse(actor_task().id(),
-                                           url::Origin::Create(second_url),
-                                           /*permission_granted=*/false);
-
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", start_url)));
-
-  ClickTarget("#link", mojom::ActionResultCode::kOk);
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", second_url)));
-
-  ClickTarget("#link",
-              origin_gating_enabled()
-                  ? mojom::ActionResultCode::kTriggeredNavigationBlocked
-                  : mojom::ActionResultCode::kOk);
-
-  // The first navigation should log that gating was not applied. The second
-  // should log that gating was applied.
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.AppliedGate",
-                                      false, origin_gating_enabled() ? 1 : 0);
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.AppliedGate",
-                                      true, origin_gating_enabled() ? 1 : 0);
-  // Should log that there was one same-site navigation and one cross-site
-  // navigation.
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.CrossOrigin",
-                                      false, origin_gating_enabled() ? 1 : 0);
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.CrossOrigin",
-                                      true, origin_gating_enabled() ? 1 : 0);
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.CrossSite", false,
-                                      origin_gating_enabled() ? 1 : 0);
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.CrossSite", true,
-                                      origin_gating_enabled() ? 1 : 0);
-  // Should log that permission was *denied* once.
-  histogram_tester_.ExpectBucketCount(
-      "Actor.NavigationGating.PermissionGranted", false,
-      origin_gating_enabled() ? 1 : 0);
-}
-
-IN_PROC_BROWSER_TEST_P(ExecutionEngineOriginGatingBrowserTest,
-                       ConfirmNavigationToNewOrigin_Granted) {
-  const GURL start_url = embedded_https_test_server().GetURL(
-      "www.example.com", "/actor/link.html");
-  const GURL second_url = embedded_https_test_server().GetURL(
-      "sub.example.com", "/actor/blank.html");
-
-  CreateMockNavigationConfirmationResponse(actor_task().id(),
-                                           url::Origin::Create(second_url),
-                                           /*permission_granted=*/true);
-
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", start_url)));
-
-  ClickTarget("#link", mojom::ActionResultCode::kOk);
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", second_url)));
-
-  ClickTarget("#link", mojom::ActionResultCode::kOk);
-
-  // The first navigation should log that gating was not applied. The second
-  // should log that gating was applied.
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.AppliedGate",
-                                      false, origin_gating_enabled() ? 1 : 0);
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.AppliedGate",
-                                      true, origin_gating_enabled() ? 1 : 0);
-  // Should log that there was only a cross-origin navigation and not a
-  // cross-site navigation.
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.CrossOrigin",
-                                      false, origin_gating_enabled() ? 1 : 0);
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.CrossOrigin",
-                                      true, origin_gating_enabled() ? 1 : 0);
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.CrossSite", false,
-                                      origin_gating_enabled() ? 2 : 0);
-  // Should log that permission was *granted* once.
-  histogram_tester_.ExpectBucketCount(
-      "Actor.NavigationGating.PermissionGranted", true,
-      origin_gating_enabled() ? 1 : 0);
-}
-
-IN_PROC_BROWSER_TEST_P(ExecutionEngineOriginGatingBrowserTest,
-                       ConfirmBlockedOriginWithUser_Denied) {
-  const GURL start_url =
-      embedded_https_test_server().GetURL("example.com", "/actor/link.html");
-  const GURL blocked_url = embedded_https_test_server().GetURL(
-      "blocked.example.com", "/actor/blank.html");
-
-  CreateMockUserConfirmationDialogResponse(url::Origin::Create(blocked_url),
-                                           /*permission_granted=*/false);
-
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", start_url)));
-
-  ClickTarget("#link", mojom::ActionResultCode::kOk);
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", blocked_url)));
-
-  // The navigation will be blocked by the Optimization Guide blocklist.
-  ClickTarget("#link", mojom::ActionResultCode::kTriggeredNavigationBlocked);
-}
-
-IN_PROC_BROWSER_TEST_P(ExecutionEngineOriginGatingBrowserTest,
-                       ConfirmBlockedOriginWithUser_Granted) {
-  const GURL start_url =
-      embedded_https_test_server().GetURL("example.com", "/actor/link.html");
-  const GURL blocked_url = embedded_https_test_server().GetURL(
-      "blocked.example.com", "/actor/blank.html");
-
-  CreateMockUserConfirmationDialogResponse(url::Origin::Create(blocked_url),
-                                           /*permission_granted=*/true);
-
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", start_url)));
-
-  ClickTarget("#link", mojom::ActionResultCode::kOk);
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", blocked_url)));
-
-  // The IPC will only allow navigation if kGlicCrossOriginNavigationGating is
-  // enabled.
-  ClickTarget("#link",
-              origin_gating_enabled()
-                  ? mojom::ActionResultCode::kOk
-                  : mojom::ActionResultCode::kTriggeredNavigationBlocked);
-}
-
-IN_PROC_BROWSER_TEST_P(ExecutionEngineOriginGatingBrowserTest,
-                       AddWritableMainframeOrigins) {
-  // This test is not meaningful if origin gating is disabled.
-  if (!origin_gating_enabled()) {
-    return;
+// This test is to ensure that the beforeunload dialog is skipped when the
+//  kGlicSkipBeforeUnloadDialogAndNavigate feature is enabled and the actor is
+//  active on the renderer.
+IN_PROC_BROWSER_TEST_P(ExecutionEngineSkipBeforeUnloadBrowserTest,
+                       SkipBeforeUnloadDialogAndNavigate) {
+  if (IsActorActive()) {
+    base::test::TestFuture<mojom::ActionResultPtr> future;
+    actor_task().AddTab(active_tab()->GetHandle(), future.GetCallback());
+    mojom::ActionResultPtr result = future.Take();
+    ASSERT_TRUE(IsOk(*result));
+  } else {
+    actor_keyed_service()->ResetForTesting();
   }
 
-  const GURL cross_origin_url =
-      embedded_https_test_server().GetURL("bar.com", "/actor/blank.html");
-  const GURL link_page_url = embedded_https_test_server().GetURL(
-      "foo.com", base::StrCat({"/actor/link_full_page.html?href=",
-                               EncodeURI(cross_origin_url.spec())}));
+  const GURL beforeunload_url =
+      embedded_test_server()->GetURL("/actor/beforeunload.html");
+  ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), beforeunload_url));
 
-  // Mock IPC response waill always reject navigation.
-  CreateMockNavigationConfirmationResponse(
-      actor_task().id(), url::Origin::Create(cross_origin_url),
-      /*permission_granted=*/false);
+  content::WebContents* web_contents =
+      browser()->tab_strip_model()->GetActiveWebContents();
+  content::PrepContentsForBeforeUnloadTest(web_contents);
+  ASSERT_EQ(beforeunload_url, web_contents->GetLastCommittedURL());
 
-  // Start on link page on foo.com.
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), link_page_url));
-  // Click on full-page link to bar.com only.
-  std::unique_ptr<ToolRequest> click_link =
-      MakeClickRequest(*active_tab(), gfx::Point(1, 1));
-  ActResultFuture result1;
-  actor_task().Act(ToRequestList(click_link), result1.GetCallback());
-  // Expect the navigation to be blocked by origin gating.
-  ExpectErrorResult(result1,
-                    mojom::ActionResultCode::kTriggeredNavigationBlocked);
+  const GURL target_url = embedded_test_server()->GetURL("/title1.html");
 
-  // Add bar.com's origin to writable mainframe origins.
-  actor_task().GetExecutionEngine()->AddWritableMainframeOrigins(
-      {url::Origin::Create(cross_origin_url)});
+  bool should_skip_dialog = IsActorActive() && IsSkipFeatureEnabled();
 
-  // Click on full-page link to bar.com only.
-  std::unique_ptr<ToolRequest> click_link_again =
-      MakeClickRequest(*active_tab(), gfx::Point(1, 1));
-  ActResultFuture result2;
-  actor_task().Act(ToRequestList(click_link_again), result2.GetCallback());
-  // Now the navigation should not be blocked.
-  ExpectOkResult(result2);
-}
+  if (should_skip_dialog) {
+    ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), target_url));
+    content::WaitForLoadStop(web_contents);
 
-IN_PROC_BROWSER_TEST_P(ExecutionEngineOriginGatingBrowserTest,
-                       OriginGatingNavigateAction) {
-  // This test is not meaningful if origin gating is disabled.
-  if (!origin_gating_enabled()) {
-    return;
+    EXPECT_EQ(target_url, web_contents->GetLastCommittedURL());
+    EXPECT_FALSE(web_contents->NeedToFireBeforeUnloadOrUnloadEvents());
+
+  } else {
+    // Expect navigation to be blocked by beforeunload dialogs and no navigation
+    // to occur.
+    web_contents->GetController().LoadURL(target_url, content::Referrer(),
+                                          ::ui::PAGE_TRANSITION_TYPED,
+                                          std::string());
+
+    ui_test_utils::WaitForAppModalDialog();
+    EXPECT_EQ(beforeunload_url, web_contents->GetLastCommittedURL());
+    CancelActiveAppModalDialog();
   }
-
-  const GURL start_url =
-      embedded_https_test_server().GetURL("foo.com", "/actor/blank.html");
-  const GURL cross_origin_url =
-      embedded_https_test_server().GetURL("bar.com", "/actor/blank.html");
-  const GURL link_page_url = embedded_https_test_server().GetURL(
-      "foo.com", base::StrCat({"/actor/link_full_page.html?href=",
-                               EncodeURI(cross_origin_url.spec())}));
-
-  // Mock IPC response waill always reject navigation.
-  // Task ID is not constant throughout this test so we do not check the IPC
-  // request for the ID.
-  CreateMockNavigationConfirmationResponse(
-      /*expected_task_id=*/std::nullopt, url::Origin::Create(cross_origin_url),
-      /*permission_granted=*/false);
-
-  // Start on foo.com.
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
-  // Navigate to bar.com.
-  std::unique_ptr<ToolRequest> navigate_x_origin =
-      MakeNavigateRequest(*active_tab(), cross_origin_url.spec());
-  // Navigate to foo.com page with a link to bar.com.
-  std::unique_ptr<ToolRequest> navigate_to_link_page =
-      MakeNavigateRequest(*active_tab(), link_page_url.spec());
-  // Clicks on full-page link to bar.com.
-  std::unique_ptr<ToolRequest> click_link =
-      MakeClickRequest(*active_tab(), gfx::Point(1, 1));
-
-  ActResultFuture result1;
-  actor_task().Act(
-      ToRequestList(navigate_x_origin, navigate_to_link_page, click_link),
-      result1.GetCallback());
-  ExpectOkResult(result1);
-
-  // Test that navigation allowlist is not persisted across separate tasks.
-  auto previous_id = actor_task().id();
-  actor_keyed_service()->ResetForTesting();
-  StartNewTask();
-  ASSERT_NE(previous_id, actor_task().id());
-
-  // Start on link page on foo.com.
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), link_page_url));
-  // Click on full-page link to bar.com only.
-  std::unique_ptr<ToolRequest> click_link_only =
-      MakeClickRequest(*active_tab(), gfx::Point(1, 1));
-
-  ActResultFuture result2;
-  actor_task().Act(ToRequestList(click_link_only), result2.GetCallback());
-  // Expect the navigation to be blocked by origin gating.
-  ExpectErrorResult(result2,
-                    mojom::ActionResultCode::kTriggeredNavigationBlocked);
-
-  // All but the last navigation should not have gating applied.
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.AppliedGate",
-                                      false, 3);
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.AppliedGate",
-                                      true, 1);
-  // Should log that permission was denied the one time it was prompted.
-  histogram_tester_.ExpectBucketCount(
-      "Actor.NavigationGating.PermissionGranted", false, 1);
-  // Should log the allow-list has 2 entries at the end of the first task.
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.AllowListSize", 2,
-                                      1);
 }
 
-IN_PROC_BROWSER_TEST_P(ExecutionEngineOriginGatingBrowserTest,
-                       BlockedNavigationNotAddedToAllowlist) {
-  const GURL start_url =
-      embedded_https_test_server().GetURL("example.com", "/actor/blank.html");
-  const GURL blocked_origin_url = embedded_https_test_server().GetURL(
-      "blocked.example.com", "/actor/blank.html");
-
-  CreateMockUserConfirmationDialogResponse(
-      url::Origin::Create(blocked_origin_url),
-      /*permission_granted=*/true);
-
-  // Start on example.com.
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
-  // Navigate to blocked
-  std::unique_ptr<ToolRequest> navigate_to_blocked =
-      MakeNavigateRequest(*active_tab(), blocked_origin_url.spec());
-  // Navigate from back to start
-  std::unique_ptr<ToolRequest> navigate_back_to_start =
-      MakeNavigateRequest(*active_tab(), start_url.spec());
-  // Navigate from back to blocked
-  std::unique_ptr<ToolRequest> navigate_back_to_blocked =
-      MakeNavigateRequest(*active_tab(), blocked_origin_url.spec());
-
-  ActResultFuture result;
-  actor_task().Act(ToRequestList(navigate_to_blocked, navigate_back_to_start,
-                                 navigate_back_to_blocked),
-                   result.GetCallback());
-  if (!origin_gating_enabled()) {
-    ExpectErrorResult(result, mojom::ActionResultCode::kUrlBlocked);
-    return;
+struct SkipBeforeUnloadTestNameGenerator {
+  template <class ParamType>
+  std::string operator()(const testing::TestParamInfo<ParamType>& info) const {
+    return base::StringPrintf(
+        "%s_%s", std::get<0>(info.param) ? "ActorActive" : "ActorInactive",
+        std::get<1>(info.param) ? "SkipFeatureEnabled" : "SkipFeatureDisabled");
   }
+};
 
-  ExpectOkResult(result);
-  actor_keyed_service()->ResetForTesting();
-
-  // We should have applied the gate twice. Once for each navigation to blocked.
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.AppliedGate",
-                                      false, 1);
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.AppliedGate",
-                                      true, 2);
-  // Permission should have been explicitly granted twice. Once for each
-  // navigation to blocked.
-  histogram_tester_.ExpectBucketCount(
-      "Actor.NavigationGating.PermissionGranted", true, 2);
-  // The allow-list should have 2 entries at the end of the task.
-  histogram_tester_.ExpectBucketCount("Actor.NavigationGating.AllowListSize", 2,
-                                      1);
-}
-
-INSTANTIATE_TEST_SUITE_P(All,
-                         ExecutionEngineOriginGatingBrowserTest,
-                         testing::Bool());
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    ExecutionEngineSkipBeforeUnloadBrowserTest,
+    testing::Combine(testing::Bool(),   // IsActorActive
+                     testing::Bool()),  // IsSkipFeatureEnabled
+    SkipBeforeUnloadTestNameGenerator());
 
 }  // namespace
 
diff --git a/chrome/browser/actor/execution_engine_interactive_ui_test.cc b/chrome/browser/actor/execution_engine_interactive_ui_test.cc
deleted file mode 100644
index 3826c35..0000000
--- a/chrome/browser/actor/execution_engine_interactive_ui_test.cc
+++ /dev/null
@@ -1,321 +0,0 @@
-// 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 "base/test/bind.h"
-#include "base/test/scoped_feature_list.h"
-#include "base/test/test_future.h"
-#include "chrome/browser/actor/actor_features.h"
-#include "chrome/browser/actor/actor_test_util.h"
-#include "chrome/browser/actor/execution_engine.h"
-#include "chrome/browser/actor/ui/event_dispatcher.h"
-#include "chrome/browser/glic/test_support/interactive_glic_test.h"
-#include "chrome/browser/glic/test_support/interactive_test_util.h"
-#include "chrome/browser/optimization_guide/browser_test_util.h"
-#include "components/optimization_guide/core/filters/optimization_hints_component_update_listener.h"
-#include "content/public/test/browser_test.h"
-#include "content/public/test/browser_test_utils.h"
-#include "content/public/test/content_browser_test_utils.h"
-#include "net/dns/mock_host_resolver.h"
-
-namespace actor {
-
-namespace {
-
-constexpr char kHandleUserConfirmationDialogTempl[] =
-    R"js(
-  (() => {
-    window.userConfirmationDialogRequestData = new Promise(resolve => {
-      client.browser.selectUserConfirmationDialogRequestHandler().subscribe(
-        request => {
-          // Response will be verified in C++ callback below.
-          request.onDialogClosed({
-            response: {
-              permissionGranted: $1,
-            },
-          });
-          // Resolve the promise with the request data to be verified.
-          resolve({
-            navigationOrigin: request.navigationOrigin,
-          });
-        }
-      );
-    });
-  })();
-)js";
-
-constexpr char kHandleNavigationConfirmationTempl[] =
-    R"js(
-  (() => {
-    window.navigationConfirmationRequestData = new Promise(resolve => {
-      client.browser.selectNavigationConfirmationRequestHandler()
-          .subscribe(
-            request => {
-              // Response will be verified in C++ callback below.
-              request.onConfirmationDecision({
-                response: {
-                  permissionGranted: $1,
-                },
-              });
-              // Resolve the promise with the request data to be verified.
-              resolve({
-                navigationOrigin: request.navigationOrigin,
-              });
-            }
-          );
-    });
-  })();
-)js";
-
-}  // namespace
-
-class ExecutionEngineInteractiveUiTest
-    : public glic::test::InteractiveGlicTest {
- public:
-  ExecutionEngineInteractiveUiTest() {
-    scoped_feature_list_.InitWithFeatures(
-        /*enabled_features=*/{features::kGlic, features::kTabstripComboButton,
-                              features::kGlicActor,
-                              kGlicCrossOriginNavigationGating},
-        /*disabled_features=*/{features::kGlicWarming});
-  }
-  ~ExecutionEngineInteractiveUiTest() override = default;
-
-  void SetUpOnMainThread() override {
-    glic::test::InteractiveGlicTest::SetUpOnMainThread();
-    ASSERT_TRUE(embedded_https_test_server().Start());
-    host_resolver()->AddRule("*", "127.0.0.1");
-    auto execution_engine =
-        std::make_unique<ExecutionEngine>(browser()->profile());
-    auto event_dispatcher = ui::NewUiEventDispatcher(
-        ActorKeyedService::Get(browser()->profile())->GetActorUiStateManager());
-    auto actor_task = std::make_unique<ActorTask>(browser()->profile(),
-                                                  std::move(execution_engine),
-                                                  std::move(event_dispatcher));
-    task_id_ = ActorKeyedService::Get(browser()->profile())
-                   ->AddActiveTask(std::move(actor_task));
-
-    // Optimization guide uses this histogram to signal initialization in tests.
-    optimization_guide::RetryForHistogramUntilCountReached(
-        &histogram_tester_for_init_,
-        "OptimizationGuide.HintsManager.HintCacheInitialized", 1);
-    // Simulate the component loading, as the implementation checks it, but the
-    // actual list is set via the command line.
-    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
-    optimization_guide::OptimizationHintsComponentUpdateListener::GetInstance()
-        ->MaybeUpdateHintsComponent(
-            {base::Version("123"),
-             temp_dir_.GetPath().Append(FILE_PATH_LITERAL("dont_care"))});
-  }
-
-  void SetUpCommandLine(base::CommandLine* command_line) override {
-    glic::test::InteractiveGlicTest::SetUpCommandLine(command_line);
-    SetUpBlocklist(command_line, "blocked.example.com");
-  }
-
-  content::WebContents* web_contents() {
-    return browser()->tab_strip_model()->GetActiveWebContents();
-  }
-  TaskId task_id() { return task_id_; }
-
-  ActorTask* GetActorTask() {
-    return ActorKeyedService::Get(browser()->profile())->GetTask(task_id_);
-  }
-
-  InteractiveTestApi::MultiStep CreateMockWebClientRequest(
-      const std::string_view handle_dialog_js) {
-    return InAnyContext(WithElement(
-        glic::test::kGlicContentsElementId,
-        [handle_dialog_js](::ui::TrackedElement* el) mutable {
-          content::WebContents* glic_contents =
-              AsInstrumentedWebContents(el)->web_contents();
-          ASSERT_TRUE(content::ExecJs(glic_contents, handle_dialog_js));
-        }));
-  }
-
-  InteractiveTestApi::MultiStep VerifyUserConfirmationDialogRequest(
-      const base::Value::Dict& expected_request) {
-    static constexpr char kGetUserConfirmationDialogRequest[] =
-        R"js(
-          (() => {
-            return window.userConfirmationDialogRequestData;
-          })();
-        )js";
-    return VerifyWebClientRequest(kGetUserConfirmationDialogRequest,
-                                  expected_request);
-  }
-
-  InteractiveTestApi::MultiStep VerifyNavigationConfirmationRequest(
-      const base::Value::Dict& expected_request) {
-    static constexpr char kGetNavigationConfirmationRequestData[] =
-        R"js(
-          (() => {
-            return window.navigationConfirmationRequestData;
-          })();
-        )js";
-    return VerifyWebClientRequest(kGetNavigationConfirmationRequestData,
-                                  expected_request);
-  }
-
-  content::RenderFrameHost* main_frame() {
-    return web_contents()->GetPrimaryMainFrame();
-  }
-  ActorTask& actor_task() {
-    return *ActorKeyedService::Get(browser()->profile())->GetTask(task_id_);
-  }
-
-  void ClickTarget(
-      std::string_view query_selector,
-      mojom::ActionResultCode expected_code = mojom::ActionResultCode::kOk) {
-    std::optional<int> dom_node_id =
-        content::GetDOMNodeId(*main_frame(), query_selector);
-    ASSERT_TRUE(dom_node_id);
-    std::unique_ptr<ToolRequest> click =
-        MakeClickRequest(*main_frame(), dom_node_id.value());
-    ActResultFuture result;
-    actor_task().Act(ToRequestList(click), result.GetCallback());
-    if (expected_code == mojom::ActionResultCode::kOk) {
-      ExpectOkResult(result);
-    } else {
-      ExpectErrorResult(result, expected_code);
-    }
-  }
-
-  InteractiveTestApi::MultiStep VerifyWebClientRequest(
-      const std::string_view get_request_js,
-      const base::Value::Dict& expected_request) {
-    return InAnyContext(WithElement(
-        glic::test::kGlicContentsElementId,
-        [&, get_request_js](::ui::TrackedElement* el) {
-          content::WebContents* glic_contents =
-              AsInstrumentedWebContents(el)->web_contents();
-          auto eval_result = content::EvalJs(glic_contents, get_request_js);
-          const auto& actual_request = eval_result.ExtractDict();
-          ASSERT_EQ(expected_request, actual_request);
-        }));
-  }
-
- private:
-  TaskId task_id_;
-  base::HistogramTester histogram_tester_for_init_;
-  base::ScopedTempDir temp_dir_;
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-IN_PROC_BROWSER_TEST_F(ExecutionEngineInteractiveUiTest,
-                       ConfirmNavigationToNewOrigin_Granted) {
-  if (base::FeatureList::IsEnabled(features::kGlicMultiInstance)) {
-    // TODO(b/453696965): Broken in multi-instance.
-    GTEST_SKIP() << "Skipping for kGlicMultiInstance";
-  }
-  const GURL start_url =
-      embedded_https_test_server().GetURL("example.com", "/actor/link.html");
-  const GURL second_url =
-      embedded_https_test_server().GetURL("foo.com", "/actor/blank.html");
-
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
-  RunTestSequence(OpenGlicWindow(GlicWindowMode::kDetached),
-                  CreateMockWebClientRequest(content::JsReplace(
-                      kHandleNavigationConfirmationTempl, true)));
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", start_url)));
-  ClickTarget("#link", mojom::ActionResultCode::kOk);
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", second_url)));
-
-  ClickTarget("#link", mojom::ActionResultCode::kOk);
-  auto expected_request = base::Value::Dict().Set(
-      "navigationOrigin", url::Origin::Create(second_url).GetDebugString());
-  RunTestSequence(VerifyNavigationConfirmationRequest(expected_request));
-}
-
-IN_PROC_BROWSER_TEST_F(ExecutionEngineInteractiveUiTest,
-                       ConfirmNavigationToNewOrigin_Denied) {
-  if (base::FeatureList::IsEnabled(features::kGlicMultiInstance)) {
-    // TODO(b/453696965): Broken in multi-instance.
-    GTEST_SKIP() << "Skipping for kGlicMultiInstance";
-  }
-  const GURL start_url =
-      embedded_https_test_server().GetURL("example.com", "/actor/link.html");
-  const GURL second_url =
-      embedded_https_test_server().GetURL("foo.com", "/actor/blank.html");
-
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
-  RunTestSequence(OpenGlicWindow(GlicWindowMode::kDetached),
-                  CreateMockWebClientRequest(content::JsReplace(
-                      kHandleNavigationConfirmationTempl, false)));
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", start_url)));
-  ClickTarget("#link", mojom::ActionResultCode::kOk);
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", second_url)));
-
-  ClickTarget("#link", mojom::ActionResultCode::kTriggeredNavigationBlocked);
-  auto expected_request = base::Value::Dict().Set(
-      "navigationOrigin", url::Origin::Create(second_url).GetDebugString());
-  RunTestSequence(VerifyNavigationConfirmationRequest(expected_request));
-}
-
-IN_PROC_BROWSER_TEST_F(ExecutionEngineInteractiveUiTest,
-                       ConfirmBlockedOriginWithUser_Granted) {
-  if (base::FeatureList::IsEnabled(features::kGlicMultiInstance)) {
-    // TODO(b/453696965): Broken in multi-instance.
-    GTEST_SKIP() << "Skipping for kGlicMultiInstance";
-  }
-  const GURL start_url =
-      embedded_https_test_server().GetURL("example.com", "/actor/link.html");
-  const GURL blocked_url = embedded_https_test_server().GetURL(
-      "blocked.example.com", "/actor/blank.html");
-
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
-  RunTestSequence(OpenGlicWindow(GlicWindowMode::kDetached),
-                  CreateMockWebClientRequest(content::JsReplace(
-                      kHandleUserConfirmationDialogTempl, true)));
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", start_url)));
-  ClickTarget("#link", mojom::ActionResultCode::kOk);
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", blocked_url)));
-
-  ClickTarget("#link", mojom::ActionResultCode::kOk);
-  auto expected_request = base::Value::Dict().Set(
-      "navigationOrigin", url::Origin::Create(blocked_url).GetDebugString());
-  RunTestSequence(VerifyUserConfirmationDialogRequest(expected_request));
-}
-
-IN_PROC_BROWSER_TEST_F(ExecutionEngineInteractiveUiTest,
-                       ConfirmBlockedOriginWithUser_Denied) {
-  if (base::FeatureList::IsEnabled(features::kGlicMultiInstance)) {
-    // TODO(b/453696965): Broken in multi-instance.
-    GTEST_SKIP() << "Skipping for kGlicMultiInstance";
-  }
-  const GURL start_url =
-      embedded_https_test_server().GetURL("example.com", "/actor/link.html");
-  const GURL blocked_url = embedded_https_test_server().GetURL(
-      "blocked.example.com", "/actor/blank.html");
-
-  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
-  RunTestSequence(OpenGlicWindow(GlicWindowMode::kDetached),
-                  CreateMockWebClientRequest(content::JsReplace(
-                      kHandleUserConfirmationDialogTempl, false)));
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", start_url)));
-  ClickTarget("#link", mojom::ActionResultCode::kOk);
-
-  EXPECT_TRUE(content::ExecJs(web_contents(),
-                              content::JsReplace("setLink($1);", blocked_url)));
-
-  ClickTarget("#link", mojom::ActionResultCode::kTriggeredNavigationBlocked);
-  auto expected_request = base::Value::Dict().Set(
-      "navigationOrigin", url::Origin::Create(blocked_url).GetDebugString());
-  RunTestSequence(VerifyUserConfirmationDialogRequest(expected_request));
-}
-
-}  // namespace actor
diff --git a/chrome/browser/actor/execution_engine_origin_gating_browsertest.cc b/chrome/browser/actor/execution_engine_origin_gating_browsertest.cc
new file mode 100644
index 0000000..760adeb
--- /dev/null
+++ b/chrome/browser/actor/execution_engine_origin_gating_browsertest.cc
@@ -0,0 +1,530 @@
+// 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 "base/test/bind.h"
+#include "base/test/scoped_feature_list.h"
+#include "base/test/test_future.h"
+#include "chrome/browser/actor/actor_features.h"
+#include "chrome/browser/actor/actor_task_metadata.h"
+#include "chrome/browser/actor/actor_test_util.h"
+#include "chrome/browser/actor/execution_engine.h"
+#include "chrome/browser/actor/ui/event_dispatcher.h"
+#include "chrome/browser/glic/host/glic.mojom.h"
+#include "chrome/browser/glic/host/glic_features.mojom.h"
+#include "chrome/browser/glic/test_support/interactive_test_util.h"
+#include "chrome/browser/glic/test_support/non_interactive_glic_test.h"
+#include "chrome/browser/optimization_guide/browser_test_util.h"
+#include "components/optimization_guide/core/filters/optimization_hints_component_update_listener.h"
+#include "content/public/test/browser_test.h"
+#include "content/public/test/browser_test_utils.h"
+#include "content/public/test/content_browser_test_utils.h"
+#include "net/dns/mock_host_resolver.h"
+
+namespace actor {
+
+namespace {
+
+constexpr char kHandleUserConfirmationDialogTempl[] =
+    R"js(
+  (() => {
+    window.userConfirmationDialogRequestData = new Promise(resolve => {
+      client.browser.selectUserConfirmationDialogRequestHandler().subscribe(
+        request => {
+          // Response will be verified in C++ callback below.
+          request.onDialogClosed({
+            response: {
+              permissionGranted: $1,
+            },
+          });
+          // Resolve the promise with the request data to be verified.
+          resolve({
+            navigationOrigin: request.navigationOrigin,
+          });
+        }
+      );
+    });
+  })();
+)js";
+
+constexpr char kHandleNavigationConfirmationTempl[] =
+    R"js(
+  (() => {
+    window.navigationConfirmationRequestData = new Promise(resolve => {
+      client.browser.selectNavigationConfirmationRequestHandler()
+          .subscribe(
+            request => {
+              // Response will be verified in C++ callback below.
+              request.onConfirmationDecision({
+                response: {
+                  permissionGranted: $1,
+                },
+              });
+              // Resolve the promise with the request data to be verified.
+              resolve({
+                navigationOrigin: request.navigationOrigin,
+              });
+            }
+          );
+    });
+  })();
+)js";
+
+}  // namespace
+
+class ExecutionEngineInteractiveUiTest
+    : public glic::NonInteractiveGlicTest,
+      public testing::WithParamInterface<bool> {
+ public:
+  ExecutionEngineInteractiveUiTest() {
+    if (multi_instance_enabled()) {
+      scoped_feature_list_.InitWithFeatures(
+          /*enabled_features=*/{features::kGlic, features::kTabstripComboButton,
+                                features::kGlicActor,
+                                features::kGlicMultiInstance,
+                                kGlicCrossOriginNavigationGating,
+                                glic::mojom::features::kGlicMultiTab},
+          /*disabled_features=*/{features::kGlicWarming});
+    } else {
+      scoped_feature_list_.InitWithFeatures(
+          /*enabled_features=*/{features::kGlic, features::kTabstripComboButton,
+                                features::kGlicActor,
+                                kGlicCrossOriginNavigationGating,
+                                glic::mojom::features::kGlicMultiTab},
+          /*disabled_features=*/{features::kGlicWarming,
+                                 features::kGlicMultiInstance});
+    }
+  }
+  ~ExecutionEngineInteractiveUiTest() override = default;
+
+  bool multi_instance_enabled() { return GetParam(); }
+
+  void SetUpOnMainThread() override {
+    glic::test::InteractiveGlicTest::SetUpOnMainThread();
+    ASSERT_TRUE(embedded_https_test_server().Start());
+    host_resolver()->AddRule("*", "127.0.0.1");
+
+    // Optimization guide uses this histogram to signal initialization in tests.
+    optimization_guide::RetryForHistogramUntilCountReached(
+        &histogram_tester_for_init_,
+        "OptimizationGuide.HintsManager.HintCacheInitialized", 1);
+    // Simulate the component loading, as the implementation checks it, but the
+    // actual list is set via the command line.
+    ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
+    optimization_guide::OptimizationHintsComponentUpdateListener::GetInstance()
+        ->MaybeUpdateHintsComponent(
+            {base::Version("123"),
+             temp_dir_.GetPath().Append(FILE_PATH_LITERAL("dont_care"))});
+  }
+
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    glic::test::InteractiveGlicTest::SetUpCommandLine(command_line);
+    SetUpBlocklist(command_line, "blocked.example.com");
+  }
+
+  content::WebContents* web_contents() {
+    return browser()->tab_strip_model()->GetActiveWebContents();
+  }
+
+  InteractiveTestApi::MultiStep CreateMockWebClientRequest(
+      const std::string_view handle_dialog_js) {
+    return InAnyContext(WithElement(
+        glic::test::kGlicContentsElementId,
+        [handle_dialog_js](::ui::TrackedElement* el) mutable {
+          content::WebContents* glic_contents =
+              AsInstrumentedWebContents(el)->web_contents();
+          ASSERT_TRUE(content::ExecJs(glic_contents, handle_dialog_js));
+        }));
+  }
+
+  InteractiveTestApi::MultiStep VerifyUserConfirmationDialogRequest(
+      const base::Value::Dict& expected_request) {
+    static constexpr char kGetUserConfirmationDialogRequest[] =
+        R"js(
+          (() => {
+            return window.userConfirmationDialogRequestData;
+          })();
+        )js";
+    return VerifyWebClientRequest(kGetUserConfirmationDialogRequest,
+                                  expected_request);
+  }
+
+  InteractiveTestApi::MultiStep VerifyNavigationConfirmationRequest(
+      const base::Value::Dict& expected_request) {
+    static constexpr char kGetNavigationConfirmationRequestData[] =
+        R"js(
+          (() => {
+            return window.navigationConfirmationRequestData;
+          })();
+        )js";
+    return VerifyWebClientRequest(kGetNavigationConfirmationRequestData,
+                                  expected_request);
+  }
+
+  content::RenderFrameHost* main_frame() {
+    return web_contents()->GetPrimaryMainFrame();
+  }
+  ActorKeyedService& actor_keyed_service() {
+    return *ActorKeyedService::Get(browser()->profile());
+  }
+  ActorTask& actor_task() { return *actor_keyed_service().GetTask(task_id_); }
+  tabs::TabInterface* active_tab() {
+    return browser()->tab_strip_model()->GetActiveTab();
+  }
+
+  void ClickTarget(
+      std::string_view query_selector,
+      mojom::ActionResultCode expected_code = mojom::ActionResultCode::kOk) {
+    std::optional<int> dom_node_id =
+        content::GetDOMNodeId(*main_frame(), query_selector);
+    ASSERT_TRUE(dom_node_id);
+    std::unique_ptr<ToolRequest> click =
+        MakeClickRequest(*main_frame(), dom_node_id.value());
+    ActResultFuture result;
+    actor_task().Act(ToRequestList(click), result.GetCallback());
+    if (expected_code == mojom::ActionResultCode::kOk) {
+      ExpectOkResult(result);
+    } else {
+      ExpectErrorResult(result, expected_code);
+    }
+  }
+
+  InteractiveTestApi::MultiStep VerifyWebClientRequest(
+      const std::string_view get_request_js,
+      const base::Value::Dict& expected_request) {
+    return InAnyContext(WithElement(
+        glic::test::kGlicContentsElementId,
+        [&, get_request_js](::ui::TrackedElement* el) {
+          content::WebContents* glic_contents =
+              AsInstrumentedWebContents(el)->web_contents();
+          auto eval_result = content::EvalJs(glic_contents, get_request_js);
+          const auto& actual_request = eval_result.ExtractDict();
+          ASSERT_EQ(expected_request, actual_request);
+        }));
+  }
+
+  void OpenGlicAndCreateTask() {
+    RunTestSequence(OpenGlicWindow(GlicWindowMode::kDetached));
+    TrackGlicInstanceWithTabIndex(
+        InProcessBrowserTest::browser()->tab_strip_model()->active_index());
+    base::test::TestFuture<
+        base::expected<int32_t, glic::mojom::CreateTaskErrorReason>>
+        create_task_future;
+    if (multi_instance_enabled()) {
+      ASSERT_TRUE(GetGlicInstanceImpl());
+      GetGlicInstanceImpl()->CreateTask(nullptr, nullptr,
+                                        create_task_future.GetCallback());
+    } else {
+      glic::GlicKeyedService* service = glic::GlicKeyedService::Get(
+          InProcessBrowserTest::browser()->profile());
+      service->CreateTask(service->GetWeakPtr(), nullptr,
+                          create_task_future.GetCallback());
+    }
+    auto result = create_task_future.Get();
+    ASSERT_TRUE(result.has_value());
+    task_id_ = TaskId(result.value());
+  }
+
+ protected:
+  base::HistogramTester histogram_tester_for_init_;
+
+ private:
+  TaskId task_id_;
+  base::ScopedTempDir temp_dir_;
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_P(ExecutionEngineInteractiveUiTest,
+                       ConfirmNavigationToNewOrigin_Granted) {
+  const GURL start_url =
+      embedded_https_test_server().GetURL("example.com", "/actor/link.html");
+  const GURL second_url =
+      embedded_https_test_server().GetURL("foo.com", "/actor/blank.html");
+
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
+  OpenGlicAndCreateTask();
+
+  RunTestSequence(CreateMockWebClientRequest(
+      content::JsReplace(kHandleNavigationConfirmationTempl, true)));
+
+  EXPECT_TRUE(content::ExecJs(web_contents(),
+                              content::JsReplace("setLink($1);", start_url)));
+  ClickTarget("#link", mojom::ActionResultCode::kOk);
+
+  EXPECT_TRUE(content::ExecJs(web_contents(),
+                              content::JsReplace("setLink($1);", second_url)));
+
+  ClickTarget("#link", mojom::ActionResultCode::kOk);
+  auto expected_request = base::Value::Dict().Set(
+      "navigationOrigin", url::Origin::Create(second_url).GetDebugString());
+  RunTestSequence(VerifyNavigationConfirmationRequest(expected_request));
+
+  // The first navigation should log that gating was not applied. The second
+  // should log that gating was applied.
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.AppliedGate", false, 1);
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.AppliedGate", true, 1);
+  // Should log that there was a cross-origin navigation and a cross-site
+  // navigation.
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.CrossOrigin", false, 1);
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.CrossOrigin", true, 1);
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.CrossSite", false, 1);
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.CrossSite", true, 1);
+  // Should log that permission was *granted* once.
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.PermissionGranted", true, 1);
+}
+
+IN_PROC_BROWSER_TEST_P(ExecutionEngineInteractiveUiTest,
+                       ConfirmNavigationToNewOrigin_Denied) {
+  const GURL start_url =
+      embedded_https_test_server().GetURL("example.com", "/actor/link.html");
+  const GURL second_url =
+      embedded_https_test_server().GetURL("foo.com", "/actor/blank.html");
+
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
+  OpenGlicAndCreateTask();
+
+  RunTestSequence(CreateMockWebClientRequest(
+      content::JsReplace(kHandleNavigationConfirmationTempl, false)));
+
+  EXPECT_TRUE(content::ExecJs(web_contents(),
+                              content::JsReplace("setLink($1);", start_url)));
+  ClickTarget("#link", mojom::ActionResultCode::kOk);
+
+  EXPECT_TRUE(content::ExecJs(web_contents(),
+                              content::JsReplace("setLink($1);", second_url)));
+
+  ClickTarget("#link", mojom::ActionResultCode::kTriggeredNavigationBlocked);
+  auto expected_request = base::Value::Dict().Set(
+      "navigationOrigin", url::Origin::Create(second_url).GetDebugString());
+  RunTestSequence(VerifyNavigationConfirmationRequest(expected_request));
+
+  // Should log that permission was *denied* once.
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.PermissionGranted", false, 1);
+}
+
+IN_PROC_BROWSER_TEST_P(ExecutionEngineInteractiveUiTest,
+                       ConfirmBlockedOriginWithUser_Granted) {
+  const GURL start_url =
+      embedded_https_test_server().GetURL("example.com", "/actor/link.html");
+  const GURL blocked_url = embedded_https_test_server().GetURL(
+      "blocked.example.com", "/actor/blank.html");
+
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
+  OpenGlicAndCreateTask();
+
+  RunTestSequence(CreateMockWebClientRequest(
+      content::JsReplace(kHandleUserConfirmationDialogTempl, true)));
+
+  EXPECT_TRUE(content::ExecJs(web_contents(),
+                              content::JsReplace("setLink($1);", start_url)));
+  ClickTarget("#link", mojom::ActionResultCode::kOk);
+
+  EXPECT_TRUE(content::ExecJs(web_contents(),
+                              content::JsReplace("setLink($1);", blocked_url)));
+
+  ClickTarget("#link", mojom::ActionResultCode::kOk);
+  auto expected_request = base::Value::Dict().Set(
+      "navigationOrigin", url::Origin::Create(blocked_url).GetDebugString());
+  RunTestSequence(VerifyUserConfirmationDialogRequest(expected_request));
+
+  // The first navigation should log that gating was not applied. The second
+  // should log that gating was applied.
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.AppliedGate", false, 1);
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.AppliedGate", true, 1);
+  // Should log that there was a cross-origin navigation and a cross-site
+  // navigation.
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.CrossOrigin", false, 1);
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.CrossOrigin", true, 1);
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.CrossSite", false, 2);
+  // Should log that permission was *granted* once.
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.PermissionGranted", true, 1);
+}
+
+IN_PROC_BROWSER_TEST_P(ExecutionEngineInteractiveUiTest,
+                       ConfirmBlockedOriginWithUser_Denied) {
+  const GURL start_url =
+      embedded_https_test_server().GetURL("example.com", "/actor/link.html");
+  const GURL blocked_url = embedded_https_test_server().GetURL(
+      "blocked.example.com", "/actor/blank.html");
+
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
+  OpenGlicAndCreateTask();
+
+  RunTestSequence(CreateMockWebClientRequest(
+      content::JsReplace(kHandleUserConfirmationDialogTempl, false)));
+
+  EXPECT_TRUE(content::ExecJs(web_contents(),
+                              content::JsReplace("setLink($1);", start_url)));
+  ClickTarget("#link", mojom::ActionResultCode::kOk);
+
+  EXPECT_TRUE(content::ExecJs(web_contents(),
+                              content::JsReplace("setLink($1);", blocked_url)));
+
+  ClickTarget("#link", mojom::ActionResultCode::kTriggeredNavigationBlocked);
+  auto expected_request = base::Value::Dict().Set(
+      "navigationOrigin", url::Origin::Create(blocked_url).GetDebugString());
+  RunTestSequence(VerifyUserConfirmationDialogRequest(expected_request));
+
+  // Should log that permission was *denied* once.
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.PermissionGranted", false, 1);
+}
+
+IN_PROC_BROWSER_TEST_P(ExecutionEngineInteractiveUiTest,
+                       OriginGatingNavigateAction) {
+  const GURL start_url =
+      embedded_https_test_server().GetURL("foo.com", "/actor/blank.html");
+  const GURL cross_origin_url =
+      embedded_https_test_server().GetURL("bar.com", "/actor/blank.html");
+  const GURL link_page_url = embedded_https_test_server().GetURL(
+      "foo.com", base::StrCat({"/actor/link_full_page.html?href=",
+                               EncodeURI(cross_origin_url.spec())}));
+
+  // Start on foo.com.
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
+  OpenGlicAndCreateTask();
+
+  RunTestSequence(CreateMockWebClientRequest(
+      content::JsReplace(kHandleNavigationConfirmationTempl, false)));
+
+  // Navigate to bar.com.
+  std::unique_ptr<ToolRequest> navigate_x_origin =
+      MakeNavigateRequest(*active_tab(), cross_origin_url.spec());
+  // Navigate to foo.com page with a link to bar.com.
+  std::unique_ptr<ToolRequest> navigate_to_link_page =
+      MakeNavigateRequest(*active_tab(), link_page_url.spec());
+  // Clicks on full-page link to bar.com.
+  std::unique_ptr<ToolRequest> click_link =
+      MakeClickRequest(*active_tab(), gfx::Point(1, 1));
+
+  ActResultFuture result1;
+  actor_task().Act(
+      ToRequestList(navigate_x_origin, navigate_to_link_page, click_link),
+      result1.GetCallback());
+  ExpectOkResult(result1);
+
+  // Test that navigation allowlist is not persisted across separate tasks.
+  auto previous_id = actor_task().id();
+  RunTestSequence(CloseGlic());
+  actor_keyed_service().ResetForTesting();
+  OpenGlicAndCreateTask();
+  ASSERT_NE(previous_id, actor_task().id());
+
+  // Start on link page on foo.com.
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), link_page_url));
+  // Click on full-page link to bar.com only.
+  std::unique_ptr<ToolRequest> click_link_only =
+      MakeClickRequest(*active_tab(), gfx::Point(1, 1));
+
+  ActResultFuture result2;
+  actor_task().Act(ToRequestList(click_link_only), result2.GetCallback());
+  // Expect the navigation to be blocked by origin gating.
+  ExpectErrorResult(result2,
+                    mojom::ActionResultCode::kTriggeredNavigationBlocked);
+}
+
+IN_PROC_BROWSER_TEST_P(ExecutionEngineInteractiveUiTest,
+                       AddWritableMainframeOrigins) {
+  const GURL cross_origin_url =
+      embedded_https_test_server().GetURL("bar.com", "/actor/blank.html");
+  const GURL link_page_url = embedded_https_test_server().GetURL(
+      "foo.com", base::StrCat({"/actor/link_full_page.html?href=",
+                               EncodeURI(cross_origin_url.spec())}));
+
+  // Start on foo.com.
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), link_page_url));
+  OpenGlicAndCreateTask();
+
+  RunTestSequence(CreateMockWebClientRequest(
+      content::JsReplace(kHandleNavigationConfirmationTempl, false)));
+
+  PerformActionsFuture result1;
+  actor_keyed_service().PerformActions(
+      actor_task().id(),
+      ToRequestList(MakeClickRequest(*active_tab(), gfx::Point(1, 1))),
+      ActorTaskMetadata(), result1.GetCallback());
+  ExpectErrorResult(result1,
+                    mojom::ActionResultCode::kTriggeredNavigationBlocked);
+
+  PerformActionsFuture result2;
+  actor_keyed_service().PerformActions(
+      actor_task().id(),
+      ToRequestList(MakeClickRequest(*active_tab(), gfx::Point(1, 1))),
+      ActorTaskMetadata::WithAddedWritableMainframeOriginsForTesting(
+          {url::Origin::Create(cross_origin_url)}),
+      result2.GetCallback());
+  ExpectOkResult(result2);
+}
+
+IN_PROC_BROWSER_TEST_P(ExecutionEngineInteractiveUiTest,
+                       BlockedNavigationNotAddedToAllowlist) {
+  const GURL start_url =
+      embedded_https_test_server().GetURL("example.com", "/actor/blank.html");
+  const GURL blocked_origin_url = embedded_https_test_server().GetURL(
+      "blocked.example.com", "/actor/blank.html");
+
+  OpenGlicAndCreateTask();
+
+  // Start on example.com.
+  ASSERT_TRUE(content::NavigateToURL(web_contents(), start_url));
+  // Navigate to blocked
+  std::unique_ptr<ToolRequest> navigate_to_blocked =
+      MakeNavigateRequest(*active_tab(), blocked_origin_url.spec());
+  // Navigate from back to start
+  std::unique_ptr<ToolRequest> navigate_back_to_start =
+      MakeNavigateRequest(*active_tab(), start_url.spec());
+  // Navigate from back to blocked
+  std::unique_ptr<ToolRequest> navigate_back_to_blocked =
+      MakeNavigateRequest(*active_tab(), blocked_origin_url.spec());
+
+  RunTestSequence(CreateMockWebClientRequest(
+      content::JsReplace(kHandleUserConfirmationDialogTempl, true)));
+  ActResultFuture result;
+  actor_task().Act(ToRequestList(navigate_to_blocked, navigate_back_to_start,
+                                 navigate_back_to_blocked),
+                   result.GetCallback());
+  ExpectOkResult(result);
+
+  VerifyUserConfirmationDialogRequest(base::Value::Dict().Set(
+      "navigationOrigin",
+      url::Origin::Create(blocked_origin_url).GetDebugString()));
+
+  actor_keyed_service().ResetForTesting();
+
+  // We should have applied the gate twice. Once for each navigation to blocked.
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.AppliedGate", false, 1);
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.AppliedGate", true, 2);
+  // Permission should have been explicitly granted twice. Once for each
+  // navigation to blocked.
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.PermissionGranted", true, 2);
+  // The allow-list should have 2 entries at the end of the task.
+  histogram_tester_for_init_.ExpectBucketCount(
+      "Actor.NavigationGating.AllowListSize", 2, 1);
+}
+
+INSTANTIATE_TEST_SUITE_P(All,
+                         ExecutionEngineInteractiveUiTest,
+                         testing::Bool(),
+                         [](auto& info) {
+                           return info.param ? "MultiInstance"
+                                             : "SingleInstance";
+                         });
+
+}  // namespace actor
diff --git a/chrome/browser/actor/resources/browser_resources.grd b/chrome/browser/actor/resources/browser_resources.grd
index 70955ee..9213fee 100644
--- a/chrome/browser/actor/resources/browser_resources.grd
+++ b/chrome/browser/actor/resources/browser_resources.grd
@@ -37,5 +37,9 @@
         Give task back
       </message>
     </messages>
+
+    <includes>
+      <include name="IDR_ACTOR_OVERLAY_MAGIC_CURSOR" file="magic_cursor.svg" type="BINDATA" compress="brotli" />
+    </includes>
   </release>
 </grit>
diff --git a/chrome/browser/resources/actor_overlay/magic_cursor.svg b/chrome/browser/actor/resources/magic_cursor.svg
similarity index 100%
rename from chrome/browser/resources/actor_overlay/magic_cursor.svg
rename to chrome/browser/actor/resources/magic_cursor.svg
diff --git a/chrome/browser/actor/tools/attempt_login_tool_interactive_ui_test.cc b/chrome/browser/actor/tools/attempt_login_tool_interactive_ui_test.cc
index 7330286..8f9113b0 100644
--- a/chrome/browser/actor/tools/attempt_login_tool_interactive_ui_test.cc
+++ b/chrome/browser/actor/tools/attempt_login_tool_interactive_ui_test.cc
@@ -10,6 +10,7 @@
 #include "chrome/browser/actor/actor_test_util.h"
 #include "chrome/browser/actor/execution_engine.h"
 #include "chrome/browser/actor/tools/tools_test_util.h"
+#include "chrome/browser/glic/host/glic_features.mojom.h"
 #include "chrome/browser/glic/test_support/interactive_glic_test.h"
 #include "chrome/browser/glic/test_support/interactive_test_util.h"
 #include "chrome/browser/ui/browser_element_identifiers.h"
@@ -56,21 +57,58 @@
 // typescript.
 class AttemptLoginToolInteractiveUiTest
     : public glic::test::InteractiveGlicTestMixin<
-          AttemptLoginToolInteractiveUiTestBase> {
+          AttemptLoginToolInteractiveUiTestBase>,
+      public testing::WithParamInterface<bool> {
  public:
   AttemptLoginToolInteractiveUiTest() {
-    scoped_feature_list_.InitWithFeatures(
-        /*enabled_features=*/{password_manager::features::kActorLogin,
-                              actor::kGlicEnableAutoLoginDialogs},
-        /*disabled_features=*/{});
+    if (multi_instance_enabled()) {
+      scoped_feature_list_.InitWithFeatures(
+          /*enabled_features=*/{password_manager::features::kActorLogin,
+                                actor::kGlicEnableAutoLoginDialogs,
+                                features::kGlicMultiInstance,
+                                glic::mojom::features::kGlicMultiTab},
+          /*disabled_features=*/{});
+    } else {
+      scoped_feature_list_.InitWithFeatures(
+          /*enabled_features=*/{password_manager::features::kActorLogin,
+                                actor::kGlicEnableAutoLoginDialogs},
+          /*disabled_features=*/{features::kGlicMultiInstance,
+                                 glic::mojom::features::kGlicMultiTab});
+    }
   }
   ~AttemptLoginToolInteractiveUiTest() override = default;
 
+  bool multi_instance_enabled() { return GetParam(); }
+
   void SetUpOnMainThread() override {
     glic::test::InteractiveGlicTestMixin<
         AttemptLoginToolInteractiveUiTestBase>::SetUpOnMainThread();
     ASSERT_TRUE(embedded_https_test_server().Start());
 
+    // Open glic window and track instance.
+    RunTestSequence(OpenGlicWindow(GlicWindowMode::kDetached));
+    TrackGlicInstanceWithTabIndex(
+        InProcessBrowserTest::browser()->tab_strip_model()->active_index());
+    // Create new task with instance as ActorTaskDelegate.
+    base::test::TestFuture<
+        base::expected<int32_t, glic::mojom::CreateTaskErrorReason>>
+        create_task_future;
+    if (multi_instance_enabled()) {
+      ASSERT_TRUE(GetGlicInstanceImpl());
+      GetGlicInstanceImpl()->CreateTask(nullptr, nullptr,
+                                        create_task_future.GetCallback());
+    } else {
+      glic::GlicKeyedService* service = glic::GlicKeyedService::Get(
+          InProcessBrowserTest::browser()->profile());
+      service->CreateTask(service->GetWeakPtr(), nullptr,
+                          create_task_future.GetCallback());
+    }
+    auto create_task_result = create_task_future.Get();
+    ASSERT_TRUE(create_task_result.has_value());
+    task_id_ = TaskId(create_task_result.value());
+    actor_task().SetExecutionEngineForTesting(
+        CreateExecutionEngine(InProcessBrowserTest::browser()->profile()));
+
     ON_CALL(mock_execution_engine(), GetActorLoginService())
         .WillByDefault(ReturnRef(mock_login_service_));
 
@@ -113,13 +151,14 @@
 
   const SkBitmap& red_bitmap() { return red_bitmap_; }
 
+ protected:
+  MockActorLoginService mock_login_service_;
+  favicon::MockFaviconService mock_favicon_service_;
+
  private:
   const SkBitmap red_bitmap_ = GenerateSquareBitmap(/*size=*/10, SK_ColorRED);
   const gfx::Image red_image_ = gfx::Image::CreateFrom1xBitmap(red_bitmap_);
 
-  MockActorLoginService mock_login_service_;
-  favicon::MockFaviconService mock_favicon_service_;
-
   base::test::ScopedFeatureList scoped_feature_list_;
 
   actor_login::Credential::Id::Generator credential_id_generator_;
@@ -127,10 +166,18 @@
 
 }  // namespace
 
-IN_PROC_BROWSER_TEST_F(AttemptLoginToolInteractiveUiTest, SmokeTest) {
+// TODO(https://crbug.com/456675144):
+// AttemptLoginToolInteractiveUiTest.SmokeTest is flaky on asan.
+#if defined(ADDRESS_SANITIZER)
+#define MAYBE_SmokeTest DISABLED_SmokeTest
+#else
+#define MAYBE_SmokeTest SmokeTest
+#endif
+IN_PROC_BROWSER_TEST_P(AttemptLoginToolInteractiveUiTest, MAYBE_SmokeTest) {
   const GURL url =
       embedded_https_test_server().GetURL("example.com", "/actor/blank.html");
   ASSERT_TRUE(content::NavigateToURL(web_contents(), url));
+
   const bool immediately_available_to_login = true;
   mock_login_service().SetCredentials(std::vector{
       MakeTestCredential(u"username1", url, immediately_available_to_login),
@@ -140,7 +187,6 @@
 
   // Toggle the glic window.
   RunTestSequence(
-      OpenGlicWindow(GlicWindowMode::kDetached),
       InAnyContext(WithElement(
           glic::test::kGlicContentsElementId,
           [](::ui::TrackedElement* el) mutable {
@@ -270,4 +316,8 @@
   EXPECT_TRUE(mock_login_service().last_permission_was_permanent());
 }
 
+INSTANTIATE_TEST_SUITE_P(All,
+                         AttemptLoginToolInteractiveUiTest,
+                         testing::Bool());
+
 }  // namespace actor
diff --git a/chrome/browser/actor/ui/actor_overlay_ui.cc b/chrome/browser/actor/ui/actor_overlay_ui.cc
index 06379cc..aa1c8c3d 100644
--- a/chrome/browser/actor/ui/actor_overlay_ui.cc
+++ b/chrome/browser/actor/ui/actor_overlay_ui.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/actor/ui/actor_overlay_ui.h"
 
+#include "chrome/browser/actor/resources/grit/actor_browser_resources.h"
 #include "chrome/browser/actor/ui/actor_overlay_handler.h"
 #include "chrome/browser/actor/ui/actor_ui_tab_controller.h"
 #include "chrome/browser/actor/ui/actor_ui_tab_controller_interface.h"
@@ -34,6 +35,7 @@
                      features::kGlicActorUiOverlayMagicCursor.Get());
   source->AddBoolean("isStandaloneBorderGlowEnabled",
                      features::kGlicActorUiStandaloneBorderGlow.Get());
+  source->AddResourcePath("magic_cursor.svg", IDR_ACTOR_OVERLAY_MAGIC_CURSOR);
 }
 
 WEB_UI_CONTROLLER_TYPE_IMPL(ActorOverlayUI)
diff --git a/chrome/browser/actor/ui/actor_ui_window_controller.cc b/chrome/browser/actor/ui/actor_ui_window_controller.cc
index 7e9a4b4..ace97eb 100644
--- a/chrome/browser/actor/ui/actor_ui_window_controller.cc
+++ b/chrome/browser/actor/ui/actor_ui_window_controller.cc
@@ -42,11 +42,23 @@
 
 void ActorUiContentsContainerController::OnViewBoundsChanged(
     views::View* observed_view) {
-  if (auto* tab = tabs::TabInterface::GetFromContents(
-          contents_container_view_->web_contents())) {
-    if (auto* tab_controller = ActorUiTabControllerInterface::From(tab)) {
-      tab_controller->OnViewBoundsChanged();
-    }
+  CHECK(observed_view == contents_container_view_);
+  content::WebContents* contents = contents_container_view_->web_contents();
+  if (!contents) {
+    return;
+  }
+
+  tabs::TabInterface* tab = tabs::TabInterface::MaybeGetFromContents(
+      contents_container_view_->web_contents());
+
+  // There are some cases where a webcontents may no longer be associated with
+  // a tab.
+  if (!tab) {
+    return;
+  }
+
+  if (auto* tab_controller = ActorUiTabControllerInterface::From(tab)) {
+    tab_controller->OnViewBoundsChanged();
   }
 }
 
diff --git a/chrome/browser/android/compositor/layer/toolbar_layer.cc b/chrome/browser/android/compositor/layer/toolbar_layer.cc
index fe6fd3db..f2c7fdb7 100644
--- a/chrome/browser/android/compositor/layer/toolbar_layer.cc
+++ b/chrome/browser/android/compositor/layer/toolbar_layer.cc
@@ -20,6 +20,12 @@
 #include "ui/android/resources/resource_manager.h"
 #include "ui/gfx/geometry/rounded_corners_f.h"
 
+namespace {
+// LINT.IfChange(InvalidContentOffset)
+const float kInvalidContentOffset = -10001.f;
+// LINT.ThenChange(//chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java:InvalidContentOffset)
+}  // namespace
+
 namespace android {
 
 // static
@@ -122,7 +128,12 @@
   // always at the bottom of the browser controls. This is no longer the case
   // as for 2025.
   // TODO(https://crbug.com/454338286): Rename / remove in favor of y_Offset.
-  y_offset = legacy_content_offset - layer_->bounds().height();
+  if (!base::FeatureList::IsEnabled(chrome::android::kTopControlsRefactor) ||
+      !base::FeatureList::IsEnabled(chrome::android::kTopControlsRefactorV2) ||
+      kInvalidContentOffset != legacy_content_offset) {
+    y_offset = legacy_content_offset - layer_->bounds().height();
+  }
+
   layer_->SetPosition(gfx::PointF(x_offset, y_offset));
 
   if (features::IsAndroidAnimatedProgressBarInVizEnabled()) {
diff --git a/chrome/browser/ash/policy/remote_commands/crd/crd_admin_session_controller.cc b/chrome/browser/ash/policy/remote_commands/crd/crd_admin_session_controller.cc
index 2f540bc4..61f5bfa 100644
--- a/chrome/browser/ash/policy/remote_commands/crd/crd_admin_session_controller.cc
+++ b/chrome/browser/ash/policy/remote_commands/crd/crd_admin_session_controller.cc
@@ -253,29 +253,24 @@
   base::OnceClosure launch_done_;
 };
 
-class SessionDurationObserver : public CrdSessionObserver {
+class SessionDisconnectObserver : public CrdSessionObserver {
  public:
-  explicit SessionDurationObserver(SessionEndCallback callback)
+  explicit SessionDisconnectObserver(SessionEndCallback callback)
       : callback_(std::move(callback)) {}
-  SessionDurationObserver(const SessionDurationObserver&) = delete;
-  SessionDurationObserver& operator=(const SessionDurationObserver&) = delete;
-  ~SessionDurationObserver() override = default;
+  SessionDisconnectObserver(const SessionDisconnectObserver&) = delete;
+  SessionDisconnectObserver& operator=(const SessionDisconnectObserver&) =
+      delete;
+  ~SessionDisconnectObserver() override = default;
 
   // `CrdSessionObserver` implementation:
-  void OnClientConnected() override {
-    session_connected_time_ = base::Time::Now();
-  }
-
   void OnClientDisconnected() override {
-    if (session_connected_time_.has_value() && callback_) {
-      std::move(callback_).Run(base::Time::Now() -
-                               session_connected_time_.value());
+    if (callback_) {
+      std::move(callback_).Run();
     }
   }
 
  private:
   SessionEndCallback callback_;
-  std::optional<base::Time> session_connected_time_;
 };
 
 // Rejects incoming sessions when there is more than 10 minutes between
@@ -767,7 +762,7 @@
 
   active_session_->AddOwnedObserver(std::make_unique<AccessCodeObserver>(
       std::move(success_callback), std::move(error_callback)));
-  active_session_->AddOwnedObserver(std::make_unique<SessionDurationObserver>(
+  active_session_->AddOwnedObserver(std::make_unique<SessionDisconnectObserver>(
       std::move(session_finished_callback)));
 
   active_session_->Launch(std::make_unique<NewSessionLauncher>(
diff --git a/chrome/browser/ash/policy/remote_commands/crd/crd_admin_session_controller_unittest.cc b/chrome/browser/ash/policy/remote_commands/crd/crd_admin_session_controller_unittest.cc
index eb7b13ec..cc96d626 100644
--- a/chrome/browser/ash/policy/remote_commands/crd/crd_admin_session_controller_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/crd/crd_admin_session_controller_unittest.cc
@@ -15,6 +15,8 @@
 #include "ash/shell.h"
 #include "base/check_deref.h"
 #include "base/functional/bind.h"
+#include "base/functional/callback_forward.h"
+#include "base/functional/callback_helpers.h"
 #include "base/memory/raw_ref.h"
 #include "base/run_loop.h"
 #include "base/strings/to_string.h"
@@ -285,29 +287,17 @@
         result_.GetCallback());
   }
 
-  auto session_finished_callback() {
-    return base::BindOnce(
-        [](base::OnceCallback<void(base::TimeDelta)> setter,
-           base::TimeDelta session_duration) {
-          std::move(setter).Run(session_duration);
-        },
-        session_finish_result_.GetCallback());
-  }
-
   // Waits until either the success or error callback is invoked,
   // and returns the response.
   Response WaitForResponse() { return result_.Take(); }
 
-  base::TimeDelta WaitForSessionFinishResult() {
-    return session_finish_result_.Take();
-  }
-
   // Calls StartCrdHostAndGetCode() and waits until the `SupportHostObserver` is
   // bound. This observer is used by the CRD host code to inform our delegate of
   // status updates, and is returned by this method so we can spoof these status
   // updates during our tests.
   SupportHostObserver& StartCrdHostAndBindObserver(
-      SessionParameters session_parameters = SessionParameters{}) {
+      SessionParameters session_parameters = SessionParameters{},
+      base::OnceClosure session_finished_callback = base::DoNothing()) {
     EXPECT_CALL(remoting_service(), StartSession)
         .WillOnce(
             [&](SupportSessionParamsPtr params,
@@ -319,7 +309,7 @@
 
     delegate().StartCrdHostAndGetCode(session_parameters, success_callback(),
                                       error_callback(),
-                                      session_finished_callback());
+                                      std::move(session_finished_callback));
 
     EXPECT_TRUE(observer_.is_bound()) << "StartSession() was not called";
     return *observer_;
@@ -419,7 +409,6 @@
     session_controller_.emplace(
         std::make_unique<RemotingServiceWrapper>(&remoting_service_));
     result_.Clear();
-    session_finish_result_.Clear();
   }
 
   void FinishLockAccountRecoveryRequestWithSuccess() {
@@ -463,7 +452,6 @@
       user_manager_{std::make_unique<ash::FakeChromeUserManager>()};
   testing::NiceMock<ash::MockLoginDisplayHost> mock_login_display_host_;
   TestFuture<Response> result_;
-  TestFuture<base::TimeDelta> session_finish_result_;
   mojo::Remote<SupportHostObserver> observer_;
   testing::StrictMock<RemotingServiceMock> remoting_service_;
   SecurityCurtainControllerFake curtain_controller_fake_;
@@ -483,9 +471,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(SessionParameters{}, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      SessionParameters{}, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   ASSERT_FALSE(actual_parameters.is_null());
   EXPECT_EQ(actual_parameters->oauth_access_token, "<the-oauth-token>");
@@ -500,9 +488,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   ASSERT_FALSE(actual_parameters.is_null());
   EXPECT_EQ(actual_parameters->user_name, "<the-user-name>");
@@ -518,9 +506,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.connection_auto_accept_timeout,
             kAutoAcceptTimeout);
@@ -536,9 +524,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.connection_auto_accept_timeout,
             base::TimeDelta());
@@ -554,9 +542,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_NE(actual_parameters.suppress_notifications, GetParam());
   EXPECT_NE(actual_parameters.suppress_user_dialogs, GetParam());
@@ -573,9 +561,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.terminate_upon_input, GetParam());
 }
@@ -589,9 +577,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters->authorized_helper, "the.admin@email.com");
 }
@@ -607,9 +595,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.request_origin,
             remoting::ChromeOsEnterpriseRequestOrigin::kEnterpriseAdmin);
@@ -626,9 +614,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.request_origin,
             remoting::ChromeOsEnterpriseRequestOrigin::kClassManagement);
@@ -645,9 +633,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.audio_playback,
             remoting::ChromeOsEnterpriseAudioPlayback::kRemoteOnly);
@@ -663,9 +651,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.curtain_local_user_session, GetParam());
 }
@@ -680,9 +668,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.allow_troubleshooting_tools, GetParam());
 }
@@ -697,9 +685,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.show_troubleshooting_tools, GetParam());
 }
@@ -714,9 +702,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.allow_file_transfer, GetParam());
 }
@@ -731,9 +719,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.allow_remote_input, GetParam());
 }
@@ -748,9 +736,9 @@
   EXPECT_CALL(remoting_service(), StartSession)
       .WillOnce(SaveParamAndInvokeCallback(&actual_parameters));
 
-  delegate().StartCrdHostAndGetCode(parameters, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      parameters, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   EXPECT_EQ(actual_parameters.allow_clipboard_sync, GetParam());
 }
@@ -767,9 +755,9 @@
         std::move(callback).Run(std::move(response));
       });
 
-  delegate().StartCrdHostAndGetCode(SessionParameters{}, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      SessionParameters{}, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   Response response = WaitForResponse();
   ASSERT_TRUE(response.HasError());
@@ -820,9 +808,9 @@
 
   EXPECT_NO_CALLS(remoting_service(), StartSession);
 
-  delegate().StartCrdHostAndGetCode(SessionParameters{}, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      SessionParameters{}, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   Response response = WaitForResponse();
   ASSERT_TRUE(response.HasError());
@@ -943,9 +931,9 @@
         std::move(callback).Run(std::move(response));
       });
 
-  delegate().StartCrdHostAndGetCode(SessionParameters{}, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      SessionParameters{}, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   WaitForResponse();
 
@@ -966,9 +954,9 @@
 
   EXPECT_NE(GetCrdCrashKeyValue(), "");
 
-  delegate().StartCrdHostAndGetCode(SessionParameters{}, success_callback(),
-                                    error_callback(),
-                                    session_finished_callback());
+  delegate().StartCrdHostAndGetCode(
+      SessionParameters{}, success_callback(), error_callback(),
+      /*session_finished_callback=*/base::DoNothing());
 
   WaitForResponse();
 
@@ -1016,17 +1004,16 @@
 }
 
 TEST_F(CrdAdminSessionControllerTest,
-       ShouldReportSessionTerminationAfterActiveSessionEnds) {
+       ShouldInvokeSessionFinishedCallbackOnSessionTermination) {
   InitWithNoReconnectableSession(session_controller());
-  SupportHostObserver& observer = StartCrdHostAndBindObserver();
-  constexpr auto duration = base::Seconds(2);
+  TestFuture<void> session_finished_callback;
+  SupportHostObserver& observer =
+      StartCrdHostAndBindObserver({}, session_finished_callback.GetCallback());
 
   SimulateClientConnects(observer);
-  task_environment()->FastForwardBy(duration);
   observer.OnHostStateDisconnected("the-disconnect-reason");
 
-  base::TimeDelta session_duration = WaitForSessionFinishResult();
-  EXPECT_EQ(duration, session_duration);
+  EXPECT_TRUE(session_finished_callback.Wait());
 }
 
 TEST_F(
diff --git a/chrome/browser/ash/policy/remote_commands/crd/device_command_start_crd_session_job.cc b/chrome/browser/ash/policy/remote_commands/crd/device_command_start_crd_session_job.cc
index 57d82fb..2848d7d0 100644
--- a/chrome/browser/ash/policy/remote_commands/crd/device_command_start_crd_session_job.cc
+++ b/chrome/browser/ash/policy/remote_commands/crd/device_command_start_crd_session_job.cc
@@ -15,6 +15,7 @@
 #include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "base/functional/callback_helpers.h"
 #include "base/json/json_reader.h"
 #include "base/json/json_writer.h"
 #include "base/memory/raw_ref.h"
@@ -174,13 +175,6 @@
   return static_cast<CrdSessionType>(int_value.value());
 }
 
-void OnCrdSessionFinished(CrdSessionType crd_session_type,
-                          UserSessionType user_session_type,
-                          base::TimeDelta session_duration) {
-  // TODO(b:446670622): Remove redundant `OnCrdSessionFinished`'s method
-  // usage.
-}
-
 bool IsKioskSession(UserSessionType session_type) {
   return session_type == UserSessionType::AUTO_LAUNCHED_KIOSK_SESSION ||
          session_type == UserSessionType::MANUALLY_LAUNCHED_KIOSK_SESSION;
@@ -341,8 +335,7 @@
                      weak_factory_.GetWeakPtr()),
       base::BindOnce(&DeviceCommandStartCrdSessionJob::FinishWithError,
                      weak_factory_.GetWeakPtr()),
-      base::BindOnce(&OnCrdSessionFinished, GetCrdSessionType(),
-                     GetCurrentUserSessionType()));
+      /*session_finished_callback=*/base::DoNothing());
 }
 
 void DeviceCommandStartCrdSessionJob::FinishWithSuccess(
diff --git a/chrome/browser/ash/policy/remote_commands/crd/fake_start_crd_session_job_delegate.cc b/chrome/browser/ash/policy/remote_commands/crd/fake_start_crd_session_job_delegate.cc
index 76c38d80..1945085 100644
--- a/chrome/browser/ash/policy/remote_commands/crd/fake_start_crd_session_job_delegate.cc
+++ b/chrome/browser/ash/policy/remote_commands/crd/fake_start_crd_session_job_delegate.cc
@@ -15,10 +15,9 @@
 FakeStartCrdSessionJobDelegate::FakeStartCrdSessionJobDelegate() = default;
 FakeStartCrdSessionJobDelegate::~FakeStartCrdSessionJobDelegate() = default;
 
-void FakeStartCrdSessionJobDelegate::TerminateCrdSession(
-    const base::TimeDelta& session_duration) {
+void FakeStartCrdSessionJobDelegate::TerminateCrdSession() {
   if (session_finished_callback_.has_value()) {
-    std::move(session_finished_callback_.value()).Run(session_duration);
+    std::move(session_finished_callback_.value()).Run();
   }
 }
 
diff --git a/chrome/browser/ash/policy/remote_commands/crd/fake_start_crd_session_job_delegate.h b/chrome/browser/ash/policy/remote_commands/crd/fake_start_crd_session_job_delegate.h
index 9f60195..81eb862 100644
--- a/chrome/browser/ash/policy/remote_commands/crd/fake_start_crd_session_job_delegate.h
+++ b/chrome/browser/ash/policy/remote_commands/crd/fake_start_crd_session_job_delegate.h
@@ -23,7 +23,7 @@
   void FailWithError(ExtendedStartCrdSessionResultCode error) {
     error_ = error;
   }
-  void TerminateCrdSession(const base::TimeDelta& session_duration);
+  void TerminateCrdSession();
 
   // Returns if TerminateSession() was called to terminate the active session.
   bool IsActiveSessionTerminated() const { return terminate_session_called_; }
diff --git a/chrome/browser/ash/policy/remote_commands/crd/shared_crd_session_impl.cc b/chrome/browser/ash/policy/remote_commands/crd/shared_crd_session_impl.cc
index f1ac0da..3a9238c3 100644
--- a/chrome/browser/ash/policy/remote_commands/crd/shared_crd_session_impl.cc
+++ b/chrome/browser/ash/policy/remote_commands/crd/shared_crd_session_impl.cc
@@ -32,12 +32,6 @@
   return account_id.ToString();
 }
 
-// Logs the session length and type to UMA. Also allows consumers of
-// `policy::SharedCrdSession` to provide their own callback for session end.
-void OnCrdSessionFinished(base::OnceClosure session_finished_callback,
-                          base::TimeDelta session_duration) {
-  std::move(session_finished_callback).Run();
-}
 }  // namespace
 
 SharedCrdSessionImpl::SharedCrdSessionImpl(Delegate& delegate)
@@ -80,9 +74,7 @@
   CRD_VLOG(1) << "Starting CRD host and retrieving CRD access code";
   delegate_->StartCrdHostAndGetCode(
       session_parameters, std::move(success_callback),
-      std::move(error_callback),
-      base::BindOnce(&OnCrdSessionFinished,
-                     std::move(session_finished_callback)));
+      std::move(error_callback), std::move(session_finished_callback));
 }
 
 void SharedCrdSessionImpl::TerminateSession() {
diff --git a/chrome/browser/ash/policy/remote_commands/crd/shared_crd_session_impl_unittest.cc b/chrome/browser/ash/policy/remote_commands/crd/shared_crd_session_impl_unittest.cc
index 89b21866..2aafaa4 100644
--- a/chrome/browser/ash/policy/remote_commands/crd/shared_crd_session_impl_unittest.cc
+++ b/chrome/browser/ash/policy/remote_commands/crd/shared_crd_session_impl_unittest.cc
@@ -158,7 +158,7 @@
                                     error_callback_future.GetCallback(),
                                     session_finished_future.GetCallback());
 
-  delegate().TerminateCrdSession(base::Seconds(0));
+  delegate().TerminateCrdSession();
   EXPECT_TRUE(session_finished_future.Wait());
 }
 
diff --git a/chrome/browser/ash/policy/remote_commands/crd/start_crd_session_job_delegate.h b/chrome/browser/ash/policy/remote_commands/crd/start_crd_session_job_delegate.h
index 838e6d66..995dcc3 100644
--- a/chrome/browser/ash/policy/remote_commands/crd/start_crd_session_job_delegate.h
+++ b/chrome/browser/ash/policy/remote_commands/crd/start_crd_session_job_delegate.h
@@ -22,7 +22,7 @@
   using ErrorCallback =
       base::OnceCallback<void(ExtendedStartCrdSessionResultCode,
                               const std::string&)>;
-  using SessionEndCallback = base::OnceCallback<void(base::TimeDelta)>;
+  using SessionEndCallback = base::OnceClosure;
 
   // The caller who initiated the request.
   enum class RequestOrigin {
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
index ef23d50..694b4347 100644
--- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
+++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
@@ -1140,6 +1140,12 @@
         return mPrefService.getBoolean(Pref.FACILITATED_PAYMENTS_A2A_TRIGGERED_ONCE);
     }
 
+    /** Returns whether the BNPL preference should be shown on the settings page. */
+    public boolean shouldShowBnplSettings() {
+        ThreadUtils.assertOnUiThread();
+        return PersonalDataManagerJni.get().shouldShowBnplSettings(mPersonalDataManagerAndroid);
+    }
+
     @NativeMethods
     @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
     public interface Natives {
@@ -1250,5 +1256,7 @@
 
         boolean isCardEligibleForBenefits(
                 long nativePersonalDataManagerAndroid, @JniType("std::string") String guid);
+
+        boolean shouldShowBnplSettings(long nativePersonalDataManagerAndroid);
     }
 }
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.cc b/chrome/browser/autofill/android/personal_data_manager_android.cc
index baadc2d..9657de3 100644
--- a/chrome/browser/autofill/android/personal_data_manager_android.cc
+++ b/chrome/browser/autofill/android/personal_data_manager_android.cc
@@ -845,4 +845,8 @@
   return false;
 }
 
+jboolean PersonalDataManagerAndroid::ShouldShowBnplSettings(JNIEnv* env) {
+  return payments_data_manager().ShouldShowBnplSettings();
+}
+
 }  // namespace autofill
diff --git a/chrome/browser/autofill/android/personal_data_manager_android.h b/chrome/browser/autofill/android/personal_data_manager_android.h
index 6923959..c6faeeb 100644
--- a/chrome/browser/autofill/android/personal_data_manager_android.h
+++ b/chrome/browser/autofill/android/personal_data_manager_android.h
@@ -251,6 +251,9 @@
   // benefits.
   jboolean IsCardEligibleForBenefits(JNIEnv* env, const std::string& guid);
 
+  // Returns whether the BNPL preference should be shown on the settings page.
+  jboolean ShouldShowBnplSettings(JNIEnv* env);
+
  private:
   ~PersonalDataManagerAndroid() override;
 
diff --git a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsUtils.java b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsUtils.java
index 61f383b..583a23c8 100644
--- a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsUtils.java
+++ b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsUtils.java
@@ -31,6 +31,12 @@
                 && ChromeFeatureList.sTopControlsRefactor.isEnabled();
     }
 
+    /** Whether use TopControlsStacker to drive the y offset for top control layers. */
+    public static boolean isTopControlsRefactorOffsetEnabled() {
+        return ChromeFeatureList.sTopControlsRefactor.isEnabled()
+                && ChromeFeatureList.sTopControlsRefactorV2.isEnabled();
+    }
+
     /**
      * @return True if the browser controls are completely off screen.
      */
diff --git a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/TopControlsStacker.java b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/TopControlsStacker.java
index 2385743..cc9ce0c 100644
--- a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/TopControlsStacker.java
+++ b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/TopControlsStacker.java
@@ -318,8 +318,7 @@
             int initialTopControlsMinHeightOffset,
             boolean requestNewFrame,
             boolean offsetsAppliedByBrowser) {
-        if (!ChromeFeatureList.sTopControlsRefactor.isEnabled()
-                || !ChromeFeatureList.sTopControlsRefactorV2.isEnabled()) return;
+        if (!BrowserControlsUtils.isTopControlsRefactorOffsetEnabled()) return;
 
         if (sDumpStatusForTesting) {
             Log.d(
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 2cb452ad..50bf54f 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -238,7 +238,6 @@
 #include "components/error_page/common/error_page_switches.h"
 #include "components/error_page/common/localized_error.h"
 #include "components/fingerprinting_protection_filter/common/fingerprinting_protection_filter_features.h"
-#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h"
 #include "components/google/core/common/google_switches.h"
 #include "components/heap_profiling/in_process/heap_profiler_controller.h"
 #include "components/keep_alive_registry/keep_alive_types.h"
@@ -505,6 +504,7 @@
 #if !BUILDFLAG(IS_ANDROID)
 #include "chrome/browser/actor/actor_features.h"
 #include "chrome/browser/actor/actor_keyed_service.h"
+#include "chrome/browser/actor/actor_keyed_service_factory.h"
 #include "chrome/browser/contextual_tasks/contextual_tasks_ui_service.h"
 #include "chrome/browser/contextual_tasks/contextual_tasks_ui_service_factory.h"
 #include "chrome/browser/devtools/chrome_devtools_manager_delegate.h"
@@ -8750,25 +8750,6 @@
   return std::nullopt;
 }
 
-bool ChromeContentBrowserClient::ShouldEnableCanvasNoise(
-    content::BrowserContext* browser_context,
-    const GURL& url) {
-  Profile* profile = Profile::FromBrowserContext(browser_context);
-  bool feature_enable = fingerprinting_protection_interventions::features::
-      IsCanvasInterventionsEnabledForIncognitoState(
-          profile->IsIncognitoProfile());
-  // System profiles are considered incognito, but will not query from
-  // ProfileKeyedServices and will return nullptr. We should only check user
-  // bypass if the profile returns TrackingProtectionSettings.
-  privacy_sandbox::TrackingProtectionSettings* tracking_protections_settings =
-      TrackingProtectionSettingsFactory::GetForProfile(profile);
-  if (tracking_protections_settings) {
-    return feature_enable &&
-           !tracking_protections_settings->HasTrackingProtectionException(url);
-  }
-  return feature_enable;
-}
-
 bool ChromeContentBrowserClient::UsePrefetchPrerenderIntegration() {
   return base::FeatureList::IsEnabled(features::kBookmarkTriggerForPrefetch) ||
          base::FeatureList::IsEnabled(features::kNewTabPageTriggerForPrefetch);
@@ -8798,3 +8779,23 @@
 #endif
   return true;
 }
+
+bool ChromeContentBrowserClient::ShouldSkipBeforeUnloadDialog(
+    content::RenderFrameHost* rfh) {
+#if !BUILDFLAG(IS_ANDROID)
+  if (!base::FeatureList::IsEnabled(
+          actor::kGlicSkipBeforeUnloadDialogAndNavigate)) {
+    return false;
+  }
+
+  auto* web_contents = content::WebContents::FromRenderFrameHost(rfh);
+  if (!web_contents) {
+    return false;
+  }
+
+  return IsActorActingOnWebContents(web_contents);
+
+#else
+  return false;
+#endif
+}
diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h
index 4d56bf1..2887613c 100644
--- a/chrome/browser/chrome_content_browser_client.h
+++ b/chrome/browser/chrome_content_browser_client.h
@@ -1070,6 +1070,8 @@
 
   bool ShouldUseFirstPartyStorageKey(const url::Origin& origin) override;
 
+  bool ShouldSkipBeforeUnloadDialog(content::RenderFrameHost* rfh) override;
+
   std::unique_ptr<content::ResponsivenessCalculatorDelegate>
   CreateResponsivenessCalculatorDelegate() override;
 
@@ -1197,9 +1199,6 @@
   std::optional<std::vector<std::u16string>> GetClipboardTypesIfPolicyApplied(
       const ui::ClipboardSequenceNumberToken& seqno) override;
 
-  bool ShouldEnableCanvasNoise(content::BrowserContext* browser_context,
-                               const GURL& origin) override;
-
   bool UsePrefetchPrerenderIntegration() override;
   bool UsePreloadServingMetrics() override;
 #if !BUILDFLAG(IS_ANDROID)
diff --git a/chrome/browser/chrome_content_browser_client_unittest.cc b/chrome/browser/chrome_content_browser_client_unittest.cc
index 26c73ea5..dd999c1 100644
--- a/chrome/browser/chrome_content_browser_client_unittest.cc
+++ b/chrome/browser/chrome_content_browser_client_unittest.cc
@@ -20,7 +20,6 @@
 #include "base/metrics/field_trial_params.h"
 #include "base/run_loop.h"
 #include "base/strings/strcat.h"
-#include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/gmock_callback_support.h"
 #include "base/test/gtest_util.h"
@@ -57,7 +56,6 @@
 #include "components/content_settings/core/common/pref_names.h"
 #include "components/file_access/scoped_file_access.h"
 #include "components/file_access/test/mock_scoped_file_access_delegate.h"
-#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h"
 #include "components/network_session_configurator/common/network_switches.h"
 #include "components/policy/core/common/policy_pref_names.h"
 #include "components/prefs/testing_pref_service.h"
@@ -1704,83 +1702,6 @@
 #endif
 }
 
-class CanvasInterventionsContentBrowserClientTest
-    : public ChromeContentBrowserClientTest,
-      public testing::WithParamInterface<std::tuple<bool, bool, bool>> {
- public:
-  CanvasInterventionsContentBrowserClientTest() {
-    std::tie(enable_canvas_interventions_, feature_enabled_in_regular_mode_,
-             run_in_regular_mode_) = GetParam();
-    SetFeatureFlags(enable_canvas_interventions_,
-                    feature_enabled_in_regular_mode_);
-  }
-
-  void SetFeatureFlags(bool is_canvas_interventions_feature_enabled,
-                       bool enable_in_regular_mode) {
-    if (is_canvas_interventions_feature_enabled) {
-      scoped_feature_list_.InitWithFeaturesAndParameters(
-          {
-              {fingerprinting_protection_interventions::features::kCanvasNoise,
-               {{"enable_in_regular_mode",
-                 base::ToString(enable_in_regular_mode)}}},
-          },
-          {});
-    } else {
-      scoped_feature_list_.InitWithFeatures(
-          /*enabled_features=*/{},
-          /*disabled_features=*/{
-              fingerprinting_protection_interventions::features::kCanvasNoise});
-    }
-  }
-
-  static std::string DescribeParams(
-      const testing::TestParamInfo<ParamType>& info) {
-    auto [enable_canvas_interventions_, feature_enabled_in_regular_mode_,
-          run_in_regular_mode_] = info.param;
-    return base::StringPrintf(
-        "%s_%s_%s",
-        enable_canvas_interventions_ ? "CanvasInterventionsEnabled"
-                                     : "CanvasInterventionsDisabled",
-        feature_enabled_in_regular_mode_ ? "EnabledInRegularMode"
-                                         : "DisabledInRegularMode",
-        run_in_regular_mode_ ? "RunInRegularMode" : "RunInIncognitoMode");
-  }
-
- protected:
-  bool enable_canvas_interventions_;
-  bool feature_enabled_in_regular_mode_;
-  bool run_in_regular_mode_;
-
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-static auto kCanvasInterventionsTestParams =
-    testing::Combine(testing::Bool(), testing::Bool(), testing::Bool());
-
-INSTANTIATE_TEST_SUITE_P(
-    All,
-    CanvasInterventionsContentBrowserClientTest,
-    kCanvasInterventionsTestParams,
-    CanvasInterventionsContentBrowserClientTest::DescribeParams);
-
-TEST_P(CanvasInterventionsContentBrowserClientTest,
-       InterventionsNavigationPropagatesCanvasInterventionsFeature) {
-  ChromeContentBrowserClient client;
-  const GURL some_url("http://example.test");
-
-  if (run_in_regular_mode_) {
-    EXPECT_EQ(enable_canvas_interventions_ && feature_enabled_in_regular_mode_,
-              client.ShouldEnableCanvasNoise(profile_.GetOriginalProfile(),
-                                             some_url));
-  } else {
-    EXPECT_EQ(enable_canvas_interventions_,
-              client.ShouldEnableCanvasNoise(
-                  profile_.GetOriginalProfile()->GetPrimaryOTRProfile(
-                      /*create_if_needed=*/true),
-                  some_url));
-  }
-}
-
 class WillComputeSiteForNavigationTest : public ChromeContentBrowserClientTest {
  public:
   // Returns true if the origin is among the origins that are isolated; false
diff --git a/chrome/browser/contextual_tasks/contextual_tasks_side_panel_coordinator.cc b/chrome/browser/contextual_tasks/contextual_tasks_side_panel_coordinator.cc
index b6916fa..87a7c17 100644
--- a/chrome/browser/contextual_tasks/contextual_tasks_side_panel_coordinator.cc
+++ b/chrome/browser/contextual_tasks/contextual_tasks_side_panel_coordinator.cc
@@ -15,6 +15,7 @@
 #include "chrome/browser/ui/views/side_panel/side_panel_entry_scope.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/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/sessions/content/session_tab_helper.h"
 #include "components/strings/grit/components_strings.h"
@@ -29,7 +30,6 @@
 END_METADATA
 
 namespace {
-inline constexpr char kContextualTasksUrl[] = "chrome://contextual-tasks/";
 inline constexpr int kSidePanelPreferredDefaultWidth = 440;
 
 std::unique_ptr<content::WebContents> CreateWebContents(
@@ -38,7 +38,7 @@
   std::unique_ptr<content::WebContents> web_contents =
       content::WebContents::Create(create_params);
   web_contents->GetController().LoadURL(
-      GURL(kContextualTasksUrl), content::Referrer(),
+      GURL(chrome::kChromeUIContextualTasksURL), content::Referrer(),
       ui::PAGE_TRANSITION_AUTO_TOPLEVEL, std::string());
   return web_contents;
 }
@@ -49,6 +49,20 @@
 
 DEFINE_USER_DATA(ContextualTasksSidePanelCoordinator);
 
+class ContextualTasksWebView : public views::WebView {
+ public:
+  explicit ContextualTasksWebView(content::BrowserContext* browser_context)
+      : views::WebView(browser_context) {}
+  ~ContextualTasksWebView() override = default;
+
+  base::WeakPtr<ContextualTasksWebView> GetWeakPtr() {
+    return weak_ptr_factory_.GetWeakPtr();
+  }
+
+ private:
+  base::WeakPtrFactory<ContextualTasksWebView> weak_ptr_factory_{this};
+};
+
 ContextualTasksSidePanelCoordinator::ContextualTasksSidePanelCoordinator(
     BrowserWindowInterface* browser_window,
     SidePanelCoordinator* side_panel_coordinator)
@@ -141,8 +155,8 @@
 std::unique_ptr<views::View>
 ContextualTasksSidePanelCoordinator::CreateSidePanelView(
     SidePanelEntryScope& scope) {
-  std::unique_ptr<views::WebView> web_view =
-      std::make_unique<views::WebView>(browser_window_->GetProfile());
+  std::unique_ptr<ContextualTasksWebView> web_view =
+      std::make_unique<ContextualTasksWebView>(browser_window_->GetProfile());
 
   content::WebContents* web_contents =
       MaybeGetOrCreateSidePanelWebContentsForActiveTab();
@@ -150,7 +164,7 @@
     web_view->SetWebContents(web_contents);
   }
 
-  web_view_ = web_view.get();
+  web_view_ = web_view->GetWeakPtr();
   web_view->SetProperty(views::kElementIdentifierKey,
                         kContextualTasksSidePanelWebViewElementId);
   return web_view;
diff --git a/chrome/browser/contextual_tasks/contextual_tasks_side_panel_coordinator.h b/chrome/browser/contextual_tasks/contextual_tasks_side_panel_coordinator.h
index ffc45dc3..1bfe7f7 100644
--- a/chrome/browser/contextual_tasks/contextual_tasks_side_panel_coordinator.h
+++ b/chrome/browser/contextual_tasks/contextual_tasks_side_panel_coordinator.h
@@ -5,6 +5,7 @@
 #define CHROME_BROWSER_CONTEXTUAL_TASKS_CONTEXTUAL_TASKS_SIDE_PANEL_COORDINATOR_H_
 
 #include "base/memory/raw_ptr.h"
+#include "base/memory/weak_ptr.h"
 #include "chrome/browser/contextual_tasks/contextual_tasks_ui.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "ui/base/unowned_user_data/scoped_unowned_user_data.h"
@@ -26,6 +27,7 @@
 namespace contextual_tasks {
 
 class ContextualTasksContextController;
+class ContextualTasksWebView;
 
 class ContextualTasksSidePanelCoordinator {
  public:
@@ -85,9 +87,10 @@
   // Context controller to query task information.
   const raw_ptr<ContextualTasksContextController> context_controller_;
 
-  // WebView for the current side panel. The WebContents in the WebView is owned
-  // by the cache and can change based on active task change.
-  raw_ptr<views::WebView> web_view_ = nullptr;
+  // WebView of the current side panel. It's owned by side panel framework so
+  // weak pointer is needed in case it's destroyed. The WebContents in the
+  // WebView is owned by the cache and can change based on active task change.
+  base::WeakPtr<ContextualTasksWebView> web_view_ = nullptr;
 
   // WebContents cache for each task.
   // It's okay to assume there is only 1 WebContents per task per window.
diff --git a/chrome/browser/contextual_tasks/contextual_tasks_ui.cc b/chrome/browser/contextual_tasks/contextual_tasks_ui.cc
index ab143009..0f8d7ba 100644
--- a/chrome/browser/contextual_tasks/contextual_tasks_ui.cc
+++ b/chrome/browser/contextual_tasks/contextual_tasks_ui.cc
@@ -13,6 +13,7 @@
 #include "chrome/browser/contextual_tasks/contextual_tasks_ui_service_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/webui/searchbox/searchbox_handler.h"
+#include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/branded_strings.h"
 #include "chrome/grit/contextual_tasks_resources.h"
 #include "chrome/grit/contextual_tasks_resources_map.h"
@@ -35,7 +36,8 @@
       nav_observer_(
           std::make_unique<FrameNavObserver>(web_ui->GetWebContents(), this)) {
   content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd(
-      web_ui->GetWebContents()->GetBrowserContext(), kContextualTasksUiHost);
+      web_ui->GetWebContents()->GetBrowserContext(),
+      chrome::kChromeUIContextualTasksHost);
   webui::SetupWebUIDataSource(source, kContextualTasksResources,
                               IDR_CONTEXTUAL_TASKS_CONTEXTUAL_TASKS_HTML);
 
diff --git a/chrome/browser/contextual_tasks/contextual_tasks_ui.h b/chrome/browser/contextual_tasks/contextual_tasks_ui.h
index 5fa797a..6226f8d 100644
--- a/chrome/browser/contextual_tasks/contextual_tasks_ui.h
+++ b/chrome/browser/contextual_tasks/contextual_tasks_ui.h
@@ -13,6 +13,7 @@
 #include "chrome/browser/contextual_tasks/contextual_tasks_page_handler.h"
 #include "chrome/browser/ui/webui/top_chrome/top_chrome_web_ui_controller.h"
 #include "chrome/browser/ui/webui/top_chrome/top_chrome_webui_config.h"
+#include "chrome/common/webui_url_constants.h"
 #include "content/public/browser/navigation_handle.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "content/public/browser/web_ui_controller.h"
@@ -30,9 +31,6 @@
 class ContextualTasksUiService;
 }  // namespace contextual_tasks
 
-inline constexpr char kContextualTasksUiHost[] = "contextual-tasks";
-inline constexpr char kContextualTasksUiUrl[] = "chrome://contextual-tasks/";
-
 class ContextualTasksComposeboxHandler;
 
 class ContextualTasksUI : public TopChromeWebUIController,
@@ -123,7 +121,7 @@
  public:
   ContextualTasksUIConfig()
       : DefaultTopChromeWebUIConfig(content::kChromeUIScheme,
-                                    kContextualTasksUiHost) {}
+                                    chrome::kChromeUIContextualTasksHost) {}
 
   bool IsWebUIEnabled(content::BrowserContext* browser_context) override;
 
diff --git a/chrome/browser/contextual_tasks/contextual_tasks_ui_service.cc b/chrome/browser/contextual_tasks/contextual_tasks_ui_service.cc
index e140613..8972b7b0 100644
--- a/chrome/browser/contextual_tasks/contextual_tasks_ui_service.cc
+++ b/chrome/browser/contextual_tasks/contextual_tasks_ui_service.cc
@@ -19,6 +19,7 @@
 #include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
 #include "chrome/browser/ui/tabs/tab_enums.h"
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/common/webui_url_constants.h"
 #include "components/contextual_tasks/public/contextual_task.h"
 #include "components/contextual_tasks/public/features.h"
 #include "components/sessions/content/session_tab_helper.h"
@@ -39,7 +40,7 @@
 
 bool IsContextualTasksHost(const GURL& url) {
   return url.scheme() == content::kChromeUIScheme &&
-         url.host() == kContextualTasksUiHost;
+         url.host() == chrome::kChromeUIContextualTasksHost;
 }
 
 GURL AppendCommonUrlParams(GURL url) {
@@ -100,8 +101,7 @@
   }
   task_id_to_creation_url_[task.GetTaskId()] = stripped_query_url;
 
-  // Build a URL for contextual tasks that includes the task ID.
-  GURL ui_url(kContextualTasksUiUrl);
+    GURL ui_url(chrome::kChromeUIContextualTasksURL);
   ui_url = net::AppendQueryParameter(ui_url, kTaskQueryParam,
                                      task.GetTaskId().AsLowercaseString());
 
diff --git a/chrome/browser/contextual_tasks/contextual_tasks_ui_service_unittest.cc b/chrome/browser/contextual_tasks/contextual_tasks_ui_service_unittest.cc
index 7b37509..ccc2d07 100644
--- a/chrome/browser/contextual_tasks/contextual_tasks_ui_service_unittest.cc
+++ b/chrome/browser/contextual_tasks/contextual_tasks_ui_service_unittest.cc
@@ -9,6 +9,7 @@
 #include "chrome/browser/contextual_tasks/contextual_tasks_context_controller.h"
 #include "chrome/browser/contextual_tasks/contextual_tasks_ui.h"
 #include "chrome/browser/contextual_tasks/mock_contextual_tasks_context_controller.h"
+#include "chrome/common/webui_url_constants.h"
 #include "chrome/test/base/testing_profile.h"
 #include "components/sessions/content/session_tab_helper.h"
 #include "content/public/test/browser_task_environment.h"
@@ -89,9 +90,8 @@
 }
 
 TEST_F(ContextualTasksUiServiceTest, LinkFromWebUiIntercepted) {
-  std::string webui_url = "chrome://" + std::string(kContextualTasksUiHost);
   GURL navigated_url(kTestUrl);
-  GURL host_web_content_url("chrome://" + std::string(kContextualTasksUiHost));
+  GURL host_web_content_url(chrome::kChromeUIContextualTasksURL);
 
   EXPECT_CALL(*service_for_nav_, OnThreadLinkClicked(navigated_url, _))
       .Times(1);
@@ -147,13 +147,13 @@
 
 // The AI page is allowed to load as long as it is part of the WebUI.
 TEST_F(ContextualTasksUiServiceTest, AiPageNotIntercepted) {
-  std::string webui_url = "chrome://" + std::string(kContextualTasksUiHost);
+  GURL webui_url(chrome::kChromeUIContextualTasksURL);
 
   EXPECT_CALL(*service_for_nav_, OnThreadLinkClicked(_, _)).Times(0);
   EXPECT_CALL(*service_for_nav_, OnNavigationToAiPageIntercepted(_, _, _))
       .Times(0);
-  EXPECT_FALSE(service_for_nav_->HandleNavigation(
-      GURL(kAiPageUrl), GURL(webui_url), nullptr, false));
+  EXPECT_FALSE(service_for_nav_->HandleNavigation(GURL(kAiPageUrl), webui_url,
+                                                  nullptr, false));
   task_environment()->RunUntilIdle();
 }
 
diff --git a/chrome/browser/download/download_browsertest.cc b/chrome/browser/download/download_browsertest.cc
index a52e43a9..c31ef34 100644
--- a/chrome/browser/download/download_browsertest.cc
+++ b/chrome/browser/download/download_browsertest.cc
@@ -87,6 +87,7 @@
 #include "components/download/public/common/download_features.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
 #include "components/download/public/common/download_item.h"
+#include "components/download/public/common/download_item_impl.h"
 #include "components/download/public/common/in_progress_download_manager.h"
 #include "components/history/content/browser/download_conversions.h"
 #include "components/history/core/browser/download_constants.h"
diff --git a/chrome/browser/download/download_target_determiner.cc b/chrome/browser/download/download_target_determiner.cc
index 9e019f4..970cb914 100644
--- a/chrome/browser/download/download_target_determiner.cc
+++ b/chrome/browser/download/download_target_determiner.cc
@@ -72,9 +72,11 @@
 #include "chrome/browser/chromeos/policy/dlp/dlp_file_destination.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager.h"
 #include "chrome/browser/chromeos/policy/dlp/dlp_rules_manager_factory.h"
+#include "components/download/public/common/base_file.h"
 #endif
 
 #if BUILDFLAG(IS_ANDROID)
+#include "components/download/public/common/download_file.h"
 #include "components/safe_browsing/android/safe_browsing_api_handler_bridge.h"
 #endif
 
diff --git a/chrome/browser/download/offline_item_utils.cc b/chrome/browser/download/offline_item_utils.cc
index 57aa7b9..6c05bc5 100644
--- a/chrome/browser/download/offline_item_utils.cc
+++ b/chrome/browser/download/offline_item_utils.cc
@@ -9,6 +9,7 @@
 #include "build/build_config.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/grit/generated_resources.h"
+#include "components/download/public/common/download_item_impl.h"
 #include "components/download/public/common/download_utils.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/download_item_utils.h"
diff --git a/chrome/browser/extensions/extension_context_menu_model.cc b/chrome/browser/extensions/extension_context_menu_model.cc
index 7a814d8..5d184f1 100644
--- a/chrome/browser/extensions/extension_context_menu_model.cc
+++ b/chrome/browser/extensions/extension_context_menu_model.cc
@@ -15,6 +15,7 @@
 #include "base/notimplemented.h"
 #include "base/notreached.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/types/pass_key.h"
 #include "chrome/browser/extensions/context_menu_matcher.h"
 #include "chrome/browser/extensions/extension_management.h"
 #include "chrome/browser/extensions/extension_tab_util.h"
@@ -58,6 +59,8 @@
 #include "extensions/common/manifest_url_handlers.h"
 #include "extensions/common/permissions/api_permission.h"
 #include "extensions/common/permissions/permissions_data.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
 #include "ui/base/base_window.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/models/image_model.h"
@@ -386,6 +389,9 @@
   } else {
     InitMenu(extension, can_show_icon_in_toolbar);
   }
+
+  RecordUkmForExtension(extension->url(),
+                        ExtensionUsageAction::kContextMenuInit);
 }
 
 bool ExtensionContextMenuModel::IsCommandIdChecked(int command_id) const {
@@ -489,6 +495,16 @@
   }
 }
 
+void ExtensionContextMenuModel::RecordUkmForExtension(
+    const GURL& extension_url,
+    ExtensionUsageAction action) {
+  ukm::builders::Extensions_ExtensionUsage(
+      ukm::UkmRecorder::GetSourceIdForExtensionUrl(
+          base::PassKey<ExtensionContextMenuModel>(), extension_url))
+      .SetAction(static_cast<int64_t>(action))
+      .Record(ukm::UkmRecorder::Get());
+}
+
 void ExtensionContextMenuModel::ExecuteCommand(int command_id,
                                                int event_flags) {
   const Extension* extension = GetExtension();
@@ -520,6 +536,9 @@
       ToolbarActionsModel::Get(profile_)->SetActionVisibility(extension->id(),
                                                               visible);
       LogToggleVisibility(visible);
+      RecordUkmForExtension(extension->url(),
+                            visible ? ExtensionUsageAction::kPinned
+                                    : ExtensionUsageAction::kUnpinned);
       break;
     }
     case UNINSTALL: {
diff --git a/chrome/browser/extensions/extension_context_menu_model.h b/chrome/browser/extensions/extension_context_menu_model.h
index 1613ddb2..7ab9251d 100644
--- a/chrome/browser/extensions/extension_context_menu_model.h
+++ b/chrome/browser/extensions/extension_context_menu_model.h
@@ -100,6 +100,15 @@
   // GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.extensions
   enum class ContextMenuSource { kToolbarAction = 0, kMenuItem = 1 };
 
+  // Actions tracked by Chrome Web Store team for monitoring extension usage.
+  // Do not re-order entries, as these are used in UKM.
+  // Exposed for testing purposes.
+  enum class ExtensionUsageAction {
+    kPinned,
+    kUnpinned,
+    kContextMenuInit,
+  };
+
   // Delegate to handle showing an ExtensionAction popup.
   class PopupDelegate {
    public:
@@ -164,6 +173,11 @@
   void CreatePageAccessItems(const Extension* extension,
                              content::WebContents* web_contents);
 
+  // Emits a UKM record for the extension associated with `extension_url` and
+  // the corresponding `action`.
+  void RecordUkmForExtension(const GURL& extension_url,
+                             ExtensionUsageAction action);
+
   // Gets the extension we are displaying the menu for. Returns NULL if the
   // extension has been uninstalled and no longer exists.
   const Extension* GetExtension() const;
diff --git a/chrome/browser/extensions/extension_context_menu_model_browsertest.cc b/chrome/browser/extensions/extension_context_menu_model_browsertest.cc
index adb7f91e..44d7332 100644
--- a/chrome/browser/extensions/extension_context_menu_model_browsertest.cc
+++ b/chrome/browser/extensions/extension_context_menu_model_browsertest.cc
@@ -34,6 +34,7 @@
 #include "components/policy/core/browser/browser_policy_connector.h"
 #include "components/policy/core/common/mock_configuration_policy_provider.h"
 #include "components/policy/policy_constants.h"
+#include "components/ukm/test_ukm_recorder.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
 #include "content/public/test/browser_test_utils.h"
@@ -56,6 +57,8 @@
 #include "extensions/common/permissions/permissions_data.h"
 #include "extensions/test/permissions_manager_waiter.h"
 #include "net/dns/mock_host_resolver.h"
+#include "services/metrics/public/cpp/ukm_builders.h"
+#include "services/metrics/public/cpp/ukm_recorder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "url/origin.h"
@@ -289,9 +292,17 @@
   void SetUpOnMainThread() override;
   void SetUpInProcessBrowserTestFixture() override;
 
+  ukm::TestAutoSetUkmRecorder& ukm_recorder() { return *ukm_recorder_; }
+
+  void ResetUkmRecorder() {
+    ukm_recorder_.reset();
+    ukm_recorder_.emplace();
+  }
+
  private:
   base::test::ScopedFeatureList feature_list_;
   testing::NiceMock<policy::MockConfigurationPolicyProvider> policy_provider_;
+  std::optional<ukm::TestAutoSetUkmRecorder> ukm_recorder_;
 };
 
 ExtensionContextMenuModelTest::ExtensionContextMenuModelTest() {
@@ -457,6 +468,7 @@
 void ExtensionContextMenuModelTest::SetUpOnMainThread() {
   ExtensionBrowserTest::SetUpOnMainThread();
   host_resolver()->AddRule("*", "127.0.0.1");
+  ukm_recorder_.emplace();
   ASSERT_TRUE(embedded_test_server()->Start());
 }
 
@@ -771,6 +783,14 @@
     std::optional<size_t> index = menu.GetIndexOfCommandId(visibility_command);
     ASSERT_TRUE(index.has_value());
     EXPECT_EQ(unpin_string, menu.GetLabelAt(index.value()));
+
+    auto ukm_entries = ukm_recorder().GetEntriesByName(
+        ukm::builders::Extensions_ExtensionUsage::kEntryName);
+    auto* entry = ukm_entries.front().get();
+    ukm_recorder().ExpectEntryMetric(
+        entry, ukm::builders::Extensions_ExtensionUsage::kActionName,
+        static_cast<int64_t>(
+            ExtensionContextMenuModel::ExtensionUsageAction::kContextMenuInit));
   }
 
   {
@@ -781,10 +801,21 @@
     ASSERT_TRUE(index.has_value());
     EXPECT_EQ(unpin_string, menu.GetLabelAt(index.value()));
 
+    ResetUkmRecorder();
     // Pin before unpinning.
     ToolbarActionsModel::Get(profile())->SetActionVisibility(
         browser_action->id(), true);
     menu.ExecuteCommand(visibility_command, 0);
+
+    auto ukm_entries = ukm_recorder().GetEntriesByName(
+        ukm::builders::Extensions_ExtensionUsage::kEntryName);
+
+    ASSERT_EQ(1u, ukm_entries.size());
+    auto* entry = ukm_entries.front().get();
+    ukm_recorder().ExpectEntryMetric(
+        entry, ukm::builders::Extensions_ExtensionUsage::kActionName,
+        static_cast<int64_t>(
+            ExtensionContextMenuModel::ExtensionUsageAction::kUnpinned));
   }
 
   {
@@ -796,6 +827,25 @@
     ASSERT_TRUE(index.has_value());
     EXPECT_EQ(pin_string, menu.GetLabelAt(index.value()));
   }
+
+  {
+    ExtensionContextMenuModel menu(browser_action, browser_window,
+                                   /*is_pinned=*/false, nullptr, true,
+                                   ContextMenuSource::kToolbarAction);
+    ResetUkmRecorder();
+    // Pin the extension
+    menu.ExecuteCommand(visibility_command, 0);
+
+    auto ukm_entries = ukm_recorder().GetEntriesByName(
+        ukm::builders::Extensions_ExtensionUsage::kEntryName);
+
+    ASSERT_EQ(1u, ukm_entries.size());
+    auto* entry = ukm_entries.front().get();
+    ukm_recorder().ExpectEntryMetric(
+        entry, ukm::builders::Extensions_ExtensionUsage::kActionName,
+        static_cast<int64_t>(
+            ExtensionContextMenuModel::ExtensionUsageAction::kPinned));
+  }
 }
 
 // Test that the "pin" and "unpin" menu items is disabled when the extension is
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index 90b29b1..446ee352 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -5958,6 +5958,11 @@
     "expiry_milestone": 130
   },
   {
+    "name": "infobar-refresh",
+    "owners": [ "top-chrome-desktop-ui@google.com","musalmaan@chromium.org","koretadaniel@chromium.org" ],
+    "expiry_milestone": 150
+  },
+  {
     "name": "input-on-viz",
     "owners": [ "woa-performance-team@google.com", "amanvr@google.com", "jonross@chromium.org", "kartarsingh@google.com", "nuskos@chromium.org" ],
     "expiry_milestone": 150
@@ -6075,6 +6080,11 @@
     "expiry_milestone": 141
   },
   {
+    "name": "ios-fusebox",
+    "owners": [ "christianxu@chromium.org", "bling-search@google.com" ],
+    "expiry_milestone": 149
+  },
+  {
     "name": "ios-interruptible-coordinator-always-dismissed",
     "owners": [
       "arthurmilchior@google.com",
@@ -8717,6 +8727,11 @@
     "expiry_milestone": 120
   },
   {
+    "name": "recently-closed-tabs-and-windows",
+    "owners": ["aishwaryarj@google.com", "zheliooo@google.com", "clank-large-form-factors@google.com"],
+    "expiry_milestone": 148
+  },
+  {
     "name": "record-web-app-debug-info",
     "owners": [ "pwa-team@google.com" ],
     // This flag is used for in-the-field debugging of preinstalled web apps on
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h
index f00f54cee..45975cd 100644
--- a/chrome/browser/flag_descriptions.h
+++ b/chrome/browser/flag_descriptions.h
@@ -1734,12 +1734,6 @@
     "https://github.com/WICG/controlled-frame/blob/main/EXPLAINER.md "
     "for more information.";
 
-inline constexpr char kEnableCanvasNoiseName[] =
-    "Enable noise for canvas readbacks in Incognito";
-inline constexpr char kEnableCanvasNoiseDescription[] =
-    "Enable noising pixels when the contents of a canvas are read back by a "
-    "script.";
-
 inline constexpr char kEnablePeripheralCustomizationName[] =
     "Enable peripheral customization";
 inline constexpr char kEnablePeripheralCustomizationDescription[] =
@@ -2489,6 +2483,10 @@
     "Overrides the built-in software rendering list and enables "
     "GPU-acceleration on unsupported system configurations.";
 
+inline constexpr char kInfobarRefreshName[] = "Infobar Refresh";
+inline constexpr char kInfobarRefreshDescription[] =
+    "Renders infobars with a refreshed UI.";
+
 inline constexpr char kIncognitoScreenshotName[] = "Incognito Screenshot";
 inline constexpr char kIncognitoScreenshotDescription[] =
     "Enables Incognito screenshots on Android. It will also make Incognito "
@@ -5579,6 +5577,12 @@
     "Enables storing successful query/match in the omnibox shortcut database "
     "on Android";
 
+inline constexpr char kRecentlyClosedTabsAndWindowsName[] =
+    "Recently Closed Tabs And Windows";
+inline constexpr char kRecentlyClosedTabsAndWindowsDescription[] =
+    "Enables the new Recently Closed feature to restore both closed tabs and "
+    "windows from the Recent Tabs surface, or via a keyboard shortcut.";
+
 inline constexpr char kRefreshFeedOnRestartName[] =
     "Enable refreshing feed on restart";
 inline constexpr char kRefreshFeedOnRestartDescription[] =
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc
index 447ea5cd..c03c478 100644
--- a/chrome/browser/flags/android/chrome_feature_list.cc
+++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -110,6 +110,7 @@
     &autofill::features::kAutofillAndroidDesktopKeyboardAccessoryRevamp,
     &autofill::features::kAutofillAndroidDesktopSuppressAccessoryOnEmpty,
     &autofill::features::kAutofillDeepLinkAutofillOptions,
+    &autofill::features::kAutofillEnableBuyNowPayLater,
     &autofill::features::kAutofillEnableCardBenefitsForAmericanExpress,
     &autofill::features::kAutofillEnableCardBenefitsForBmo,
     &autofill::features::kAutofillEnableCvcStorageAndFilling,
@@ -394,6 +395,7 @@
     &kReadAloudInOverflowMenuInCCT,
     &kReadAloudPlayback,
     &kReadAloudTapToSeek,
+    &kRecentlyClosedTabsAndWindows,
     &kRecordSuppressionMetrics,
     &kReengagementNotification,
     &kRelatedSearchesAllLanguage,
@@ -587,7 +589,7 @@
 BASE_FEATURE(kAndroidWindowPopupLargeScreen, base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kAndroidWindowPopupPredictFinalBounds, base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kAndroidWindowPopupResizeAfterSpawn, base::FEATURE_DISABLED_BY_DEFAULT);
-BASE_FEATURE(kAndroidXRUsesSurfaceControl, base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kAndroidXRUsesSurfaceControl, base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kAndroidZoomIndicator, base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kAnimatedGifRefactor, base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kAnimatedImageDragShadow, base::FEATURE_DISABLED_BY_DEFAULT);
@@ -746,6 +748,7 @@
 BASE_FEATURE(kReadAloudPlayback, base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kReadAloudServerExperiments, base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kReadAloudTapToSeek, base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kRecentlyClosedTabsAndWindows, base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kRecordSuppressionMetrics, base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kReengagementNotification, base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kRelatedSearchesAllLanguage, base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h
index 77ce7881..1049c6d 100644
--- a/chrome/browser/flags/android/chrome_feature_list.h
+++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -231,6 +231,7 @@
 BASE_DECLARE_FEATURE(kReadAloudPlayback);
 BASE_DECLARE_FEATURE(kReadAloudServerExperiments);
 BASE_DECLARE_FEATURE(kReadAloudTapToSeek);
+BASE_DECLARE_FEATURE(kRecentlyClosedTabsAndWindows);
 BASE_DECLARE_FEATURE(kRecordSuppressionMetrics);
 BASE_DECLARE_FEATURE(kReengagementNotification);
 BASE_DECLARE_FEATURE(kRelatedSearchesAllLanguage);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
index 5c64457c..0fbcef8 100644
--- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
+++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -255,6 +255,7 @@
             "AutofillAndroidDesktopSuppressAccessoryOnEmpty";
     public static final String AUTOFILL_DEEP_LINK_AUTOFILL_OPTIONS =
             "AutofillDeepLinkAutofillOptions";
+    public static final String AUTOFILL_ENABLE_BUY_NOW_PAY_LATER = "AutofillEnableBuyNowPayLater";
     public static final String AUTOFILL_ENABLE_CARD_BENEFITS_FOR_AMERICAN_EXPRESS =
             "AutofillEnableCardBenefitsForAmericanExpress";
     public static final String AUTOFILL_ENABLE_CARD_BENEFITS_FOR_BMO =
@@ -564,6 +565,7 @@
             "ReadAloudIPHMenuButtonHighlightCCT";
     public static final String READALOUD_PLAYBACK = "ReadAloudPlayback";
     public static final String READALOUD_TAP_TO_SEEK = "ReadAloudTapToSeek";
+    public static final String RECENTLY_CLOSED_TABS_AND_WINDOWS = "RecentlyClosedTabsAndWindows";
     public static final String RECORD_SUPPRESSION_METRICS = "RecordSuppressionMetrics";
     public static final String REENGAGEMENT_NOTIFICATION = "ReengagementNotification";
     public static final String RELATED_SEARCHES_ALL_LANGUAGE = "RelatedSearchesAllLanguage";
diff --git a/chrome/browser/glic/host/glic_page_handler.cc b/chrome/browser/glic/host/glic_page_handler.cc
index 141e0ce..dcc02c6 100644
--- a/chrome/browser/glic/host/glic_page_handler.cc
+++ b/chrome/browser/glic/host/glic_page_handler.cc
@@ -697,13 +697,6 @@
         // when this object is destructed.
         // TODO(crbug.com/445224605): Right now this code assumes that
         //   ActorKeyedService only owns a single Execution engine instance.
-        request_to_show_credential_selection_dialog_subscription_ =
-            actor_service
-                ->AddRequestToShowCredentialSelectionDialogSubscriberCallback(
-                    base::BindRepeating(
-                        &GlicWebClientHandler::
-                            RequestToShowCredentialSelectionDialog,
-                        base::Unretained(this)));
         request_to_show_autofill_suggestions_dialog_subscription_ =
             actor_service
                 ->AddRequestToShowAutofillSuggestionsDialogSubscriberCallback(
@@ -711,17 +704,6 @@
                         &GlicWebClientHandler::
                             RequestToShowAutofillSuggestionsDialog,
                         base::Unretained(this)));
-        request_to_show_user_confirmation_dialog_subscription_ =
-            actor_service
-                ->AddRequestToShowUserConfirmationDialogSubscriberCallback(
-                    base::BindRepeating(&GlicWebClientHandler::
-                                            RequestToShowUserConfirmationDialog,
-                                        base::Unretained(this)));
-        request_to_confirm_navigation_subscription_ =
-            actor_service->AddRequestToConfirmNavigationSubscriberCallback(
-                base::BindRepeating(
-                    &GlicWebClientHandler::RequestToConfirmNavigation,
-                    base::Unretained(this)));
         act_on_web_capability_changed_subscription_ =
             actor_service->AddActOnWebCapabilityChangedCallback(
                 base::BindRepeating(
@@ -1649,10 +1631,7 @@
     focus_changed_subscription_ = {};
     pinned_tabs_changed_subscription_ = {};
     pinned_tab_data_changed_subscription_ = {};
-    request_to_show_credential_selection_dialog_subscription_ = {};
     request_to_show_autofill_suggestions_dialog_subscription_ = {};
-    request_to_show_user_confirmation_dialog_subscription_ = {};
-    request_to_confirm_navigation_subscription_ = {};
     browser_attach_observation_.reset();
     if (glic_service_->zero_state_suggestions_manager()) {
       glic_service_->zero_state_suggestions_manager()->Reset();
@@ -1782,8 +1761,7 @@
       actor::TaskId task_id,
       const base::flat_map<std::string, gfx::Image>& icons,
       const std::vector<actor_login::Credential>& credentials,
-      actor::ActorKeyedService::CredentialSelectedCallback
-          on_credential_selected) {
+      actor::ActorTaskDelegate::CredentialSelectedCallback callback) override {
     // Note: mojom::<Type>Ptr is not copyable, meaning it can't be passed to the
     // argument of base::RepeatingCallbackList::Notify (who makes a copy of the
     // argument). All of the mojom::<Type>Ptr will be constructed locally before
@@ -1808,12 +1786,14 @@
             std::move(mojo_icons));
 
     web_client_->RequestToShowCredentialSelectionDialog(
-        std::move(dialog_request), std::move(on_credential_selected));
+        std::move(dialog_request), std::move(callback));
   }
 
   void RequestToShowUserConfirmationDialog(
+      actor::TaskId task_id,
       const url::Origin& navigation_origin,
-      actor::ActorKeyedService::UserConfirmationDialogCallback callback) {
+      actor::ActorTaskDelegate::UserConfirmationDialogCallback callback)
+      override {
     actor::webui::mojom::UserConfirmationDialogPayloadPtr payload = nullptr;
     payload =
         actor::webui::mojom::UserConfirmationDialogPayload::NewNavigationOrigin(
@@ -1825,9 +1805,10 @@
   }
 
   void RequestToConfirmNavigation(
-      const actor::TaskId& task_id,
+      actor::TaskId task_id,
       const url::Origin& navigation_origin,
-      actor::ActorKeyedService::NavigationConfirmationCallback callback) {
+      actor::ActorTaskDelegate::NavigationConfirmationCallback callback)
+      override {
     web_client_->RequestToConfirmNavigation(
         actor::webui::mojom::NavigationConfirmationRequest::New(
             task_id.value(), navigation_origin),
@@ -1852,12 +1833,7 @@
   base::CallbackListSubscription active_browser_changed_subscription_;
   base::CallbackListSubscription actor_task_state_changed_subscription_;
   base::CallbackListSubscription
-      request_to_show_credential_selection_dialog_subscription_;
-  base::CallbackListSubscription
       request_to_show_autofill_suggestions_dialog_subscription_;
-  base::CallbackListSubscription
-      request_to_show_user_confirmation_dialog_subscription_;
-  base::CallbackListSubscription request_to_confirm_navigation_subscription_;
   base::CallbackListSubscription act_on_web_capability_changed_subscription_;
   mojo::Receiver<glic::mojom::WebClientHandler> receiver_;
   mojo::Remote<glic::mojom::WebClient> web_client_;
diff --git a/chrome/browser/glic/host/glic_region_capture_controller.cc b/chrome/browser/glic/host/glic_region_capture_controller.cc
index 565b7a48..f24a051 100644
--- a/chrome/browser/glic/host/glic_region_capture_controller.cc
+++ b/chrome/browser/glic/host/glic_region_capture_controller.cc
@@ -4,9 +4,9 @@
 
 #include "chrome/browser/glic/host/glic_region_capture_controller.h"
 
+#include "chrome/browser/glic/host/context/glic_tab_data.h"
 #include "chrome/browser/glic/host/glic.mojom.h"
 #include "chrome/browser/lens/region_search/lens_region_search_controller.h"
-#include "components/sessions/content/session_tab_helper.h"
 #include "content/public/browser/web_contents.h"
 #include "ui/views/widget/widget.h"
 
@@ -92,7 +92,7 @@
     return;
   }
   auto result = mojom::CaptureRegionResult::New();
-  result->tab_id = sessions::SessionTabHelper::IdForTab(web_contents_).id();
+  result->tab_id = GetTabId(web_contents_);
   result->region = mojom::CapturedRegion::NewRect(rect);
   capture_region_observer_->OnUpdate(std::move(result), std::nullopt);
 }
diff --git a/chrome/browser/glic/host/glic_web_client_access.h b/chrome/browser/glic/host/glic_web_client_access.h
index d2c7b35..b9a0a8e 100644
--- a/chrome/browser/glic/host/glic_web_client_access.h
+++ b/chrome/browser/glic/host/glic_web_client_access.h
@@ -7,7 +7,9 @@
 
 // Interface to the glic web client, provided by the glic WebUI.
 #include "base/functional/callback_forward.h"
+#include "chrome/browser/actor/actor_task_delegate.h"
 #include "chrome/browser/glic/host/glic.mojom.h"
+#include "url/origin.h"
 
 namespace glic {
 
@@ -42,6 +44,20 @@
 
   // Informs the web client that additional context is available.
   virtual void NotifyAdditionalContext(mojom::AdditionalContextPtr context) = 0;
+
+  virtual void RequestToShowCredentialSelectionDialog(
+      actor::TaskId task_id,
+      const base::flat_map<std::string, gfx::Image>& icons,
+      const std::vector<actor_login::Credential>& credentials,
+      actor::ActorTaskDelegate::CredentialSelectedCallback callback) = 0;
+  virtual void RequestToShowUserConfirmationDialog(
+      actor::TaskId task_id,
+      const url::Origin& navigation_origin,
+      actor::ActorTaskDelegate::UserConfirmationDialogCallback callback) = 0;
+  virtual void RequestToConfirmNavigation(
+      actor::TaskId task_id,
+      const url::Origin& navigation_origin,
+      actor::ActorTaskDelegate::NavigationConfirmationCallback callback) = 0;
 };
 
 }  // namespace glic
diff --git a/chrome/browser/glic/host/host.cc b/chrome/browser/glic/host/host.cc
index 2e1937e2..16099ae 100644
--- a/chrome/browser/glic/host/host.cc
+++ b/chrome/browser/glic/host/host.cc
@@ -524,6 +524,50 @@
   return glic_instance_ ? glic_instance_->GetPanelState() : mojom::PanelState();
 }
 
+void Host::RequestToShowCredentialSelectionDialog(
+    actor::TaskId task_id,
+    const base::flat_map<std::string, gfx::Image>& icons,
+    const std::vector<actor_login::Credential>& credentials,
+    actor::ActorTaskDelegate::CredentialSelectedCallback callback) {
+  if (!IsReady()) {
+    std::move(callback).Run(
+        actor::webui::mojom::SelectCredentialDialogResponse::New());
+    return;
+  }
+  handler_info_->web_client->RequestToShowCredentialSelectionDialog(
+      task_id, icons, credentials, std::move(callback));
+}
+
+void Host::RequestToShowUserConfirmationDialog(
+    actor::TaskId task_id,
+    const url::Origin& navigation_origin,
+    actor::ActorTaskDelegate::UserConfirmationDialogCallback callback) {
+  if (!IsReady()) {
+    std::move(callback).Run(
+        actor::webui::mojom::UserConfirmationDialogResponse::New(
+            actor::webui::mojom::ConfirmationRequestResult::
+                NewPermissionGranted(/*value=*/false)));
+    return;
+  }
+  handler_info_->web_client->RequestToShowUserConfirmationDialog(
+      task_id, navigation_origin, std::move(callback));
+}
+
+void Host::RequestToConfirmNavigation(
+    actor::TaskId task_id,
+    const url::Origin& navigation_origin,
+    actor::ActorTaskDelegate::NavigationConfirmationCallback callback) {
+  if (!IsReady()) {
+    std::move(callback).Run(
+        actor::webui::mojom::NavigationConfirmationResponse::New(
+            actor::webui::mojom::ConfirmationRequestResult::
+                NewPermissionGranted(/*value=*/false)));
+    return;
+  }
+  handler_info_->web_client->RequestToConfirmNavigation(
+      task_id, navigation_origin, std::move(callback));
+}
+
 HostManager::HostManager(Profile* profile,
                          base::WeakPtr<GlicWindowController> window_controller)
     : profile_(profile),
diff --git a/chrome/browser/glic/host/host.h b/chrome/browser/glic/host/host.h
index 27220d5..43fcb03b 100644
--- a/chrome/browser/glic/host/host.h
+++ b/chrome/browser/glic/host/host.h
@@ -337,6 +337,22 @@
 
   base::WeakPtr<Host> GetWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); }
 
+  void RequestToShowCredentialSelectionDialog(
+      actor::TaskId task_id,
+      const base::flat_map<std::string, gfx::Image>& icons,
+      const std::vector<actor_login::Credential>& credentials,
+      actor::ActorTaskDelegate::CredentialSelectedCallback callback);
+
+  void RequestToShowUserConfirmationDialog(
+      actor::TaskId task_id,
+      const url::Origin& navigation_origin,
+      actor::ActorTaskDelegate::UserConfirmationDialogCallback callback);
+
+  void RequestToConfirmNavigation(
+      actor::TaskId task_id,
+      const url::Origin& navigation_origin,
+      actor::ActorTaskDelegate::NavigationConfirmationCallback callback);
+
  private:
   friend class HostManager;
 
@@ -364,6 +380,7 @@
     bool context_access_indicator_enabled = false;
     raw_ptr<GlicWebClientAccess> web_client = nullptr;
   };
+
   void PanelWillOpenComplete(GlicWebClientAccess* client,
                              mojom::OpenPanelInfoPtr open_info);
   PageHandlerInfo* FindInfo(GlicPageHandler* handler);
diff --git a/chrome/browser/glic/public/glic_keyed_service.cc b/chrome/browser/glic/public/glic_keyed_service.cc
index 59adb6f..27efdca 100644
--- a/chrome/browser/glic/public/glic_keyed_service.cc
+++ b/chrome/browser/glic/public/glic_keyed_service.cc
@@ -737,4 +737,38 @@
   return sharing_manager().GetFocusedBrowser();
 }
 
+void GlicKeyedService::RequestToShowCredentialSelectionDialog(
+    actor::TaskId task_id,
+    const base::flat_map<std::string, gfx::Image>& icons,
+    const std::vector<actor_login::Credential>& credentials,
+    actor::ActorTaskDelegate::CredentialSelectedCallback callback) {
+  CHECK(UseDefaultWindowController());
+  auto* window_controller_impl =
+      static_cast<GlicWindowControllerImpl*>(window_controller_.get());
+  window_controller_impl->host().RequestToShowCredentialSelectionDialog(
+      task_id, icons, credentials, std::move(callback));
+}
+
+void GlicKeyedService::RequestToShowUserConfirmationDialog(
+    actor::TaskId task_id,
+    const url::Origin& navigation_origin,
+    actor::ActorTaskDelegate::UserConfirmationDialogCallback callback) {
+  CHECK(UseDefaultWindowController());
+  auto* window_controller_impl =
+      static_cast<GlicWindowControllerImpl*>(window_controller_.get());
+  window_controller_impl->host().RequestToShowUserConfirmationDialog(
+      task_id, navigation_origin, std::move(callback));
+}
+
+void GlicKeyedService::RequestToConfirmNavigation(
+    actor::TaskId task_id,
+    const url::Origin& navigation_origin,
+    actor::ActorTaskDelegate::NavigationConfirmationCallback callback) {
+  CHECK(UseDefaultWindowController());
+  auto* window_controller_impl =
+      static_cast<GlicWindowControllerImpl*>(window_controller_.get());
+  window_controller_impl->host().RequestToConfirmNavigation(
+      task_id, navigation_origin, std::move(callback));
+}
+
 }  // namespace glic
diff --git a/chrome/browser/glic/public/glic_keyed_service.h b/chrome/browser/glic/public/glic_keyed_service.h
index 5a581c2..72b4744 100644
--- a/chrome/browser/glic/public/glic_keyed_service.h
+++ b/chrome/browser/glic/public/glic_keyed_service.h
@@ -310,6 +310,23 @@
   base::CallbackListSubscription AddTabDataChangedCallback(
       TabDataChangedCallback callback);
 
+  // ActorTaskDelegate:
+  void RequestToShowCredentialSelectionDialog(
+      actor::TaskId task_id,
+      const base::flat_map<std::string, gfx::Image>& icons,
+      const std::vector<actor_login::Credential>& credentials,
+      actor::ActorTaskDelegate::CredentialSelectedCallback callback) override;
+  void RequestToShowUserConfirmationDialog(
+      actor::TaskId task_id,
+      const url::Origin& navigation_origin,
+      actor::ActorTaskDelegate::UserConfirmationDialogCallback callback)
+      override;
+  void RequestToConfirmNavigation(
+      actor::TaskId task_id,
+      const url::Origin& navigation_origin,
+      actor::ActorTaskDelegate::NavigationConfirmationCallback callback)
+      override;
+
  private:
   // A helper function to route GetZeroStateSuggestionsForFocusedTabCallback
   // callbacks.
diff --git a/chrome/browser/glic/service/glic_instance_coordinator_impl.cc b/chrome/browser/glic/service/glic_instance_coordinator_impl.cc
index bb3e8b0..a5e49c3e 100644
--- a/chrome/browser/glic/service/glic_instance_coordinator_impl.cc
+++ b/chrome/browser/glic/service/glic_instance_coordinator_impl.cc
@@ -424,6 +424,7 @@
   // Remove the instance first, and then delete. This way, GetInstances() will
   // not return the instance being deleted while it's being deleted.
   InstanceId id = instance->id();
+  instance->CloseInstanceAndShutdown();
   auto instance_value = std::exchange(instances_[id], {});
   instances_.erase(id);
   if (instance == last_active_instance_) {
diff --git a/chrome/browser/glic/service/glic_instance_impl.cc b/chrome/browser/glic/service/glic_instance_impl.cc
index ed36bb0..02e3dbc 100644
--- a/chrome/browser/glic/service/glic_instance_impl.cc
+++ b/chrome/browser/glic/service/glic_instance_impl.cc
@@ -91,7 +91,9 @@
 
     // Only bind if the previous instance was active.
     if (glic_embedder && glic_embedder->IsShowing()) {
-      auto show_options = ShowOptions{SidePanelShowOptions{*tab_to_bind}};
+      SidePanelShowOptions side_panel_options{*tab_to_bind};
+      side_panel_options.suppress_opening_animation = true;
+      auto show_options = ShowOptions{side_panel_options};
       show_options.focus_on_show = tab_to_bind->IsActivated();
       instance_->Show(show_options);
       instance_->metrics()->OnDaisyChain(DaisyChainSource::kTabContents,
@@ -133,6 +135,7 @@
                        coordinator_delegate,
                        metrics,
                        contextual_cueing_service,
+                       new GlicFocusedBrowserManager(this, profile),
                        new GlicFocusedBrowserManager(this, profile)) {}
 
 GlicInstanceImpl::GlicInstanceImpl(
@@ -141,7 +144,8 @@
     base::WeakPtr<InstanceCoordinatorDelegate> coordinator_delegate,
     GlicMetrics* metrics,
     contextual_cueing::ContextualCueingService* contextual_cueing_service,
-    GlicFocusedBrowserManager* focused_browser_manager)
+    GlicFocusedBrowserManager* detached_mode_focused_browser_manager,
+    GlicFocusedBrowserManager* live_mode_focused_browser_manager)
     : profile_(profile),
       service_(GlicKeyedService::Get(profile)),
       coordinator_delegate_(coordinator_delegate),
@@ -151,11 +155,19 @@
       detached_mode_sharing_manager_(
           std::make_unique<GlicPinAwareDetachedFocusedTabManager>(
               &sharing_manager_,
-              focused_browser_manager),
-          base::WrapUnique<GlicFocusedBrowserManager>(focused_browser_manager),
+              detached_mode_focused_browser_manager),
+          base::WrapUnique<GlicFocusedBrowserManager>(
+              detached_mode_focused_browser_manager),
           &pinned_tab_manager_,
           profile,
           metrics),
+      live_mode_sharing_manager_(std::make_unique<GlicFocusedTabManager>(
+                                     live_mode_focused_browser_manager),
+                                 base::WrapUnique<GlicFocusedBrowserManager>(
+                                     live_mode_focused_browser_manager),
+                                 &pinned_tab_manager_,
+                                 profile,
+                                 metrics),
       attached_mode_sharing_manager_(
           std::make_unique<GlicActivePinnedFocusedTabManager>(
               profile,
@@ -249,7 +261,7 @@
   }
 
   MaybeShowHostUi(embedder_to_show);
-  embedder_to_show->Show();
+  embedder_to_show->Show(options);
   if (options.focus_on_show) {
     embedder_to_show->Focus();
   }
@@ -356,7 +368,9 @@
 
   auto* active_embedder = GetActiveEmbedder();
   bool hasFocus = active_embedder && active_embedder->HasFocus();
-  auto show_options = ShowOptions::ForSidePanel(*created_tab);
+  SidePanelShowOptions side_panel_options{*created_tab};
+  side_panel_options.suppress_opening_animation = true;
+  auto show_options = ShowOptions{side_panel_options};
   show_options.focus_on_show = created_tab->IsActivated() || hasFocus;
   Show(show_options);
   instance_metrics_.OnDaisyChain(DaisyChainSource::kGlicContents,
@@ -442,8 +456,23 @@
   }
 }
 
+void GlicInstanceImpl::UpdateSharingManagerDelegate() {
+  if (last_non_hidden_panel_state_kind_ == mojom::PanelStateKind::kAttached) {
+    sharing_manager_.SetDelegate(&attached_mode_sharing_manager_);
+    return;
+  }
+
+  if (interaction_mode_ == mojom::WebClientMode::kAudio) {
+    sharing_manager_.SetDelegate(&live_mode_sharing_manager_);
+    return;
+  }
+
+  sharing_manager_.SetDelegate(&detached_mode_sharing_manager_);
+}
+
 void GlicInstanceImpl::OnInteractionModeChange(mojom::WebClientMode new_mode) {
   interaction_mode_ = new_mode;
+  UpdateSharingManagerDelegate();
 }
 
 void GlicInstanceImpl::AddStateObserver(PanelStateObserver* observer) {
@@ -643,11 +672,7 @@
   if (last_non_hidden_panel_state_kind_ != panel_state_kind &&
       panel_state_kind != mojom::PanelStateKind::kHidden) {
     last_non_hidden_panel_state_kind_ = panel_state_kind;
-    if (panel_state_kind == mojom::PanelStateKind::kDetached) {
-      sharing_manager_.SetDelegate(&detached_mode_sharing_manager_);
-    } else if (panel_state_kind == mojom::PanelStateKind::kAttached) {
-      sharing_manager_.SetDelegate(&attached_mode_sharing_manager_);
-    }
+    UpdateSharingManagerDelegate();
   }
   NotifyStateChange();
   NotifyPanelStateChanged();
@@ -830,7 +855,9 @@
   if (base::FeatureList::IsEnabled(features::kGlicGetTabByIdApi)) {
     service_->OnTabAddedToTask(task_id, tab_handle);
   }
-  Show(ShowOptions::ForSidePanel(*tab));
+  SidePanelShowOptions side_panel_options{*tab};
+  side_panel_options.suppress_opening_animation = true;
+  Show(ShowOptions{side_panel_options});
   instance_metrics_.OnDaisyChain(DaisyChainSource::kActorAddTab,
                                  /*success=*/true);
 }
@@ -917,4 +944,29 @@
   return embedder->GetView().get();
 }
 
+void GlicInstanceImpl::RequestToShowCredentialSelectionDialog(
+    actor::TaskId task_id,
+    const base::flat_map<std::string, gfx::Image>& icons,
+    const std::vector<actor_login::Credential>& credentials,
+    actor::ActorTaskDelegate::CredentialSelectedCallback callback) {
+  host_.RequestToShowCredentialSelectionDialog(task_id, icons, credentials,
+                                               std::move(callback));
+}
+
+void GlicInstanceImpl::RequestToShowUserConfirmationDialog(
+    actor::TaskId task_id,
+    const url::Origin& navigation_origin,
+    actor::ActorTaskDelegate::UserConfirmationDialogCallback callback) {
+  host_.RequestToShowUserConfirmationDialog(task_id, navigation_origin,
+                                            std::move(callback));
+}
+
+void GlicInstanceImpl::RequestToConfirmNavigation(
+    actor::TaskId task_id,
+    const url::Origin& navigation_origin,
+    actor::ActorTaskDelegate::NavigationConfirmationCallback callback) {
+  host_.RequestToConfirmNavigation(task_id, navigation_origin,
+                                   std::move(callback));
+}
+
 }  // namespace glic
diff --git a/chrome/browser/glic/service/glic_instance_impl.h b/chrome/browser/glic/service/glic_instance_impl.h
index df6a0eea2..8a7d03a 100644
--- a/chrome/browser/glic/service/glic_instance_impl.h
+++ b/chrome/browser/glic/service/glic_instance_impl.h
@@ -211,6 +211,23 @@
   void CloseAllEmbeddersForTesting();
   views::View* GetActiveEmbedderGlicViewForTesting();
 
+  // ActorTaskDelegate:
+  void RequestToShowCredentialSelectionDialog(
+      actor::TaskId task_id,
+      const base::flat_map<std::string, gfx::Image>& icons,
+      const std::vector<actor_login::Credential>& credentials,
+      actor::ActorTaskDelegate::CredentialSelectedCallback callback) override;
+  void RequestToShowUserConfirmationDialog(
+      actor::TaskId task_id,
+      const url::Origin& navigation_origin,
+      actor::ActorTaskDelegate::UserConfirmationDialogCallback callback)
+      override;
+  void RequestToConfirmNavigation(
+      actor::TaskId task_id,
+      const url::Origin& navigation_origin,
+      actor::ActorTaskDelegate::NavigationConfirmationCallback callback)
+      override;
+
  private:
   // We use a delegating constructor pattern so we can hand off ownership of the
   // focused browser manager as well as provide a reference to it to another
@@ -221,7 +238,8 @@
       base::WeakPtr<InstanceCoordinatorDelegate> coordinator_delegate,
       GlicMetrics* metrics,
       contextual_cueing::ContextualCueingService* contextual_cueing_service,
-      GlicFocusedBrowserManager* focused_browser_manager);
+      GlicFocusedBrowserManager* detached_mode_focused_browser_manager,
+      GlicFocusedBrowserManager* live_mode_focused_browser_manager);
 
   struct EmbedderEntry {
     EmbedderEntry();
@@ -271,6 +289,8 @@
   void OnTabPinningStatusChanged(tabs::TabInterface* tab, bool pinned);
   void NotifyPanelWillOpen(mojom::InvocationSource invocation_source);
 
+  void UpdateSharingManagerDelegate();
+
   using StateChangeCallbackList =
       base::RepeatingCallbackList<void(bool, mojom::CurrentView view)>;
   StateChangeCallbackList state_change_callback_list_;
@@ -308,6 +328,9 @@
   // The sharing manager used internally for detached mode.
   GlicSharingManagerImpl detached_mode_sharing_manager_;
 
+  // The sharing manager used internally for live mode.
+  GlicSharingManagerImpl live_mode_sharing_manager_;
+
   // The sharing manager used internally for attached mode.
   GlicSharingManagerImpl attached_mode_sharing_manager_;
 
diff --git a/chrome/browser/glic/service/glic_ui_embedder.h b/chrome/browser/glic/service/glic_ui_embedder.h
index 3161be5..8eb5245 100644
--- a/chrome/browser/glic/service/glic_ui_embedder.h
+++ b/chrome/browser/glic/service/glic_ui_embedder.h
@@ -48,7 +48,7 @@
   // Show the glic UI for this embedder. Do nothing if the embedder is
   // currently showing. Show will be called when switching from an inactive to
   // active embedder.
-  virtual void Show() = 0;
+  virtual void Show(const ShowOptions& options) = 0;
 
   // Returns true if the embedder is currently showing.
   virtual bool IsShowing() const = 0;
diff --git a/chrome/browser/glic/service/glic_ui_types.h b/chrome/browser/glic/service/glic_ui_types.h
index 5219532..7c98376e 100644
--- a/chrome/browser/glic/service/glic_ui_types.h
+++ b/chrome/browser/glic/service/glic_ui_types.h
@@ -31,6 +31,7 @@
   explicit SidePanelShowOptions(tabs::TabInterface& bound_tab)
       : tab(bound_tab) {}
   base::raw_ref<tabs::TabInterface> tab;
+  bool suppress_opening_animation = false;
 };
 
 struct FloatingShowOptions {
diff --git a/chrome/browser/glic/widget/glic_floating_ui.cc b/chrome/browser/glic/widget/glic_floating_ui.cc
index 4ec3c5c..8ae6562 100644
--- a/chrome/browser/glic/widget/glic_floating_ui.cc
+++ b/chrome/browser/glic/widget/glic_floating_ui.cc
@@ -225,7 +225,7 @@
   return glic_widget_ != nullptr;
 }
 
-void GlicFloatingUi::Show() {
+void GlicFloatingUi::Show(const ShowOptions& options) {
   instance_metrics_->OnShowInFloaty();
   GlicProfileManager::GetInstance()->SetCurrentDetachedGlic(profile_);
   GetGlicWidget()->Show();
diff --git a/chrome/browser/glic/widget/glic_floating_ui.h b/chrome/browser/glic/widget/glic_floating_ui.h
index e4e9dcb..6d6b94ed 100644
--- a/chrome/browser/glic/widget/glic_floating_ui.h
+++ b/chrome/browser/glic/widget/glic_floating_ui.h
@@ -51,7 +51,7 @@
 
   // GlicUiEmbedder:
   Host::EmbedderDelegate* GetHostEmbedderDelegate() override;
-  void Show() override;
+  void Show(const ShowOptions& options) override;
   bool IsShowing() const override;
   void Close() override;
   std::unique_ptr<GlicUiEmbedder> CreateInactiveEmbedder() const override;
diff --git a/chrome/browser/glic/widget/glic_inactive_floating_ui.cc b/chrome/browser/glic/widget/glic_inactive_floating_ui.cc
index 1a0c5318..75a19d6 100644
--- a/chrome/browser/glic/widget/glic_inactive_floating_ui.cc
+++ b/chrome/browser/glic/widget/glic_inactive_floating_ui.cc
@@ -31,7 +31,7 @@
   return nullptr;
 }
 
-void GlicInactiveFloatingUi::Show() {
+void GlicInactiveFloatingUi::Show(const ShowOptions& options) {
   // TODO: implement show.
   NOTIMPLEMENTED();
 }
diff --git a/chrome/browser/glic/widget/glic_inactive_floating_ui.h b/chrome/browser/glic/widget/glic_inactive_floating_ui.h
index ac32843c..6334abd 100644
--- a/chrome/browser/glic/widget/glic_inactive_floating_ui.h
+++ b/chrome/browser/glic/widget/glic_inactive_floating_ui.h
@@ -22,7 +22,7 @@
 
   // GlicUiEmbedder:
   Host::EmbedderDelegate* GetHostEmbedderDelegate() override;
-  void Show() override;
+  void Show(const ShowOptions& options) override;
   bool IsShowing() const override;
   void Close() override;
   std::unique_ptr<GlicUiEmbedder> CreateInactiveEmbedder() const override;
diff --git a/chrome/browser/glic/widget/glic_inactive_side_panel_ui.cc b/chrome/browser/glic/widget/glic_inactive_side_panel_ui.cc
index 47d8e10..96d13c1 100644
--- a/chrome/browser/glic/widget/glic_inactive_side_panel_ui.cc
+++ b/chrome/browser/glic/widget/glic_inactive_side_panel_ui.cc
@@ -46,7 +46,7 @@
   auto inactive_side_panel =
       base::WrapUnique(new GlicInactiveSidePanelUi(tab, delegate));
   // Mark the side panel for showing next time the tab becomes active.
-  inactive_side_panel->Show();
+  inactive_side_panel->Show(ShowOptions::ForSidePanel(*tab));
   inactive_side_panel->inactive_view_controller_.CaptureScreenshot(
       glic_webui_contents);
   return inactive_side_panel;
@@ -96,12 +96,17 @@
   return glic_side_panel_coordinator->IsShowing();
 }
 
-void GlicInactiveSidePanelUi::Show() {
+void GlicInactiveSidePanelUi::Show(const ShowOptions& options) {
   auto* glic_side_panel_coordinator = GetGlicSidePanelCoordinator();
   if (!glic_side_panel_coordinator) {
     return;
   }
-  glic_side_panel_coordinator->Show();
+  bool suppress_animations = false;
+  if (const auto* side_panel_options =
+          std::get_if<SidePanelShowOptions>(&options.embedder_options)) {
+    suppress_animations = side_panel_options->suppress_opening_animation;
+  }
+  glic_side_panel_coordinator->Show(suppress_animations);
 }
 
 void GlicInactiveSidePanelUi::Close() {
diff --git a/chrome/browser/glic/widget/glic_inactive_side_panel_ui.h b/chrome/browser/glic/widget/glic_inactive_side_panel_ui.h
index 9638f98..b6d4c4fd5 100644
--- a/chrome/browser/glic/widget/glic_inactive_side_panel_ui.h
+++ b/chrome/browser/glic/widget/glic_inactive_side_panel_ui.h
@@ -41,7 +41,7 @@
 
   // GlicUiEmbedder:
   Host::EmbedderDelegate* GetHostEmbedderDelegate() override;
-  void Show() override;
+  void Show(const ShowOptions& options) override;
   bool IsShowing() const override;
   void Close() override;
   std::unique_ptr<GlicUiEmbedder> CreateInactiveEmbedder() const override;
diff --git a/chrome/browser/glic/widget/glic_side_panel_ui.cc b/chrome/browser/glic/widget/glic_side_panel_ui.cc
index 883929f7..d8e1ec1 100644
--- a/chrome/browser/glic/widget/glic_side_panel_ui.cc
+++ b/chrome/browser/glic/widget/glic_side_panel_ui.cc
@@ -185,7 +185,7 @@
       browser_window->GetWindow()->GetNativeWindow(), std::move(callback));
 }
 
-void GlicSidePanelUi::Show() {
+void GlicSidePanelUi::Show(const ShowOptions& options) {
   instance_metrics_->OnShowInSidePanel(tab_.get());
   auto* glic_side_panel_coordinator = GetGlicSidePanelCoordinator();
   if (!glic_side_panel_coordinator) {
@@ -195,7 +195,13 @@
   delegate_->NotifyPanelStateChanged();
   application_hotkey_manager_->InitializeAccelerators();
   glic_panel_hotkey_manager_->InitializeAccelerators();
-  glic_side_panel_coordinator->Show();
+
+  bool suppress_animations = false;
+  if (const auto* side_panel_options =
+          std::get_if<SidePanelShowOptions>(&options.embedder_options)) {
+    suppress_animations = side_panel_options->suppress_opening_animation;
+  }
+  glic_side_panel_coordinator->Show(suppress_animations);
 }
 
 void GlicSidePanelUi::Close() {
diff --git a/chrome/browser/glic/widget/glic_side_panel_ui.h b/chrome/browser/glic/widget/glic_side_panel_ui.h
index ce3eddd7..f2039fc 100644
--- a/chrome/browser/glic/widget/glic_side_panel_ui.h
+++ b/chrome/browser/glic/widget/glic_side_panel_ui.h
@@ -45,7 +45,7 @@
 
   // GlicUiEmbedder:
   Host::EmbedderDelegate* GetHostEmbedderDelegate() override;
-  void Show() override;
+  void Show(const ShowOptions& options) override;
   void Close() override;
   std::unique_ptr<GlicUiEmbedder> CreateInactiveEmbedder() const override;
   void Focus() override;
diff --git a/chrome/browser/incognito/android/javatests/src/org/chromium/chrome/browser/incognito/reauth/FullScreenIncognitoReauthViewTest.java b/chrome/browser/incognito/android/javatests/src/org/chromium/chrome/browser/incognito/reauth/FullScreenIncognitoReauthViewTest.java
index c6ab629..9a0da8eb 100644
--- a/chrome/browser/incognito/android/javatests/src/org/chromium/chrome/browser/incognito/reauth/FullScreenIncognitoReauthViewTest.java
+++ b/chrome/browser/incognito/android/javatests/src/org/chromium/chrome/browser/incognito/reauth/FullScreenIncognitoReauthViewTest.java
@@ -38,6 +38,7 @@
 import org.chromium.base.test.util.CommandLineFlags;
 import org.chromium.base.test.util.Feature;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
+import org.chromium.chrome.browser.incognito.IncognitoUtils;
 import org.chromium.chrome.browser.incognito.R;
 import org.chromium.chrome.browser.settings.SettingsNavigationFactory;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
@@ -105,16 +106,20 @@
         onView(withId(R.id.incognito_reauth_unlock_incognito_button)).check(matches(isDisplayed()));
         onView(withText(R.string.incognito_reauth_page_unlock_incognito_button_label))
                 .check(matches(isDisplayed()));
-
-        onView(withId(R.id.incognito_reauth_see_other_tabs_label)).check(matches(isDisplayed()));
-        onView(withText(R.string.incognito_reauth_page_see_other_tabs_label))
-                .check(matches(isDisplayed()));
+        if (!IncognitoUtils.shouldOpenIncognitoAsWindow()) {
+            onView(withId(R.id.incognito_reauth_see_other_tabs_label))
+                    .check(matches(isDisplayed()));
+            onView(withText(R.string.incognito_reauth_page_see_other_tabs_label))
+                    .check(matches(isDisplayed()));
+        }
 
         onView(withId(R.id.incognito_reauth_unlock_incognito_button)).perform(click());
         verify(mUnlockIncognitoRunnableMock).run();
 
-        onView(withId(R.id.incognito_reauth_see_other_tabs_label)).perform(click());
-        verify(mSeeOtherTabsRunnableMock).run();
+        if (!IncognitoUtils.shouldOpenIncognitoAsWindow()) {
+            onView(withId(R.id.incognito_reauth_see_other_tabs_label)).perform(click());
+            verify(mSeeOtherTabsRunnableMock).run();
+        }
     }
 
     @Test
diff --git a/chrome/browser/keyboard_accessory/android/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java b/chrome/browser/keyboard_accessory/android/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
index c6913d0..963f9fa 100644
--- a/chrome/browser/keyboard_accessory/android/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
+++ b/chrome/browser/keyboard_accessory/android/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryViewBinder.java
@@ -272,7 +272,7 @@
                 // required UI.
                 chipView.setBorder(
                         chipView.getResources().getDimensionPixelSize(R.dimen.chip_border_width),
-                        chipView.getContext().getColor(R.color.black_alpha_12));
+                        chipView.getContext().getColorStateList(R.color.black_alpha_12));
             } else {
                 chipView.setEnabled(true);
                 iconAlpha = COMPLETE_OPACITY_ALPHA;
diff --git a/chrome/browser/local_network_access/local_network_access_workers_browsertest.cc b/chrome/browser/local_network_access/local_network_access_workers_browsertest.cc
index a041ab6..52f8dea 100644
--- a/chrome/browser/local_network_access/local_network_access_workers_browsertest.cc
+++ b/chrome/browser/local_network_access/local_network_access_workers_browsertest.cc
@@ -56,8 +56,16 @@
 
 // Tests that a script tag that is included in the main page HTML (and thus
 // load blocking) correctly triggers the LNA permission prompt.
+
+// TODO(crbug.com/456821852): Re-enable this test.
+#if BUILDFLAG(IS_WIN)
+#define MAYBE_DedicatedWorkerDenyPermission \
+  DISABLED_DedicatedWorkerDenyPermission
+#else
+#define MAYBE_DedicatedWorkerDenyPermission DedicatedWorkerDenyPermission
+#endif
 IN_PROC_BROWSER_TEST_F(LocalNetworkAccessWorkersBrowserTest,
-                       DedicatedWorkerDenyPermission) {
+                       MAYBE_DedicatedWorkerDenyPermission) {
   ASSERT_TRUE(content::NavigateToURL(
       web_contents(), https_server().GetURL("a.com", kWorkerHtmlPath)));
 
diff --git a/chrome/browser/new_tab_page/modules/v2/tab_groups/tab_groups_page_handler.cc b/chrome/browser/new_tab_page/modules/v2/tab_groups/tab_groups_page_handler.cc
index 065acd5..ed5dd11 100644
--- a/chrome/browser/new_tab_page/modules/v2/tab_groups/tab_groups_page_handler.cc
+++ b/chrome/browser/new_tab_page/modules/v2/tab_groups/tab_groups_page_handler.cc
@@ -127,11 +127,19 @@
 std::vector<const tab_groups::SavedTabGroup*>
 TabGroupsPageHandler::FilterActiveGroup(
     std::vector<const tab_groups::SavedTabGroup*> groups) {
+  auto* bwi = webui::GetBrowserWindowInterface(web_contents_);
+  if (!bwi) {
+    return groups;
+  }
+
+  TabStripModel* tab_strip_model = bwi->GetTabStripModel();
+  if (!tab_strip_model) {
+    // No tab strip in this window type.
+    return groups;
+  }
+
   // Get the group ID of the currently active tab. This can be nullopt if the
   // active tab is not in any group.
-  TabStripModel* tab_strip_model =
-      webui::GetBrowserWindowInterface(web_contents_)->GetTabStripModel();
-  CHECK(tab_strip_model);
   std::optional<tab_groups::TabGroupId> active_group_id =
       tab_strip_model->GetTabGroupForTab(tab_strip_model->active_index());
 
diff --git a/chrome/browser/plugins/plugin_info_host_impl.cc b/chrome/browser/plugins/plugin_info_host_impl.cc
index ebbf27dd..57fbb04 100644
--- a/chrome/browser/plugins/plugin_info_host_impl.cc
+++ b/chrome/browser/plugins/plugin_info_host_impl.cc
@@ -239,24 +239,15 @@
   }
 
   ContentSetting plugin_setting = CONTENT_SETTING_DEFAULT;
-  bool uses_default_content_setting = true;
   bool is_managed = false;
   // Check plugin content settings. The primary URL is the top origin URL and
   // the secondary URL is the plugin URL.
   PluginUtils::GetPluginContentSetting(
       host_content_settings_map_, plugin, main_frame_origin, url,
-      plugin_identifier, &plugin_setting, &uses_default_content_setting,
-      &is_managed);
+      plugin_identifier, &plugin_setting, &is_managed);
 
   DCHECK(plugin_setting != CONTENT_SETTING_DEFAULT);
 
-  // Check if the plugin is crashing too much.
-  if (PluginService::GetInstance()->IsPluginUnstable(plugin.path) &&
-      plugin_setting != CONTENT_SETTING_BLOCK && uses_default_content_setting) {
-    *status = chrome::mojom::PluginStatus::kUnauthorized;
-    return;
-  }
-
 #if BUILDFLAG(ENABLE_EXTENSIONS)
   // If an app has explicitly made internal resources available by listing them
   // in |accessible_resources| in the manifest, then allow them to be loaded by
diff --git a/chrome/browser/plugins/plugin_utils.cc b/chrome/browser/plugins/plugin_utils.cc
index 00dd9a3..94433f7 100644
--- a/chrome/browser/plugins/plugin_utils.cc
+++ b/chrome/browser/plugins/plugin_utils.cc
@@ -34,23 +34,12 @@
     const GURL& plugin_url,
     const std::string& resource,
     ContentSetting* setting,
-    bool* is_default,
     bool* is_managed) {
   GURL main_frame_url = main_frame_origin.GetURL();
   content_settings::SettingInfo info;
-  bool uses_plugin_specific_setting = false;
   *setting = host_content_settings_map->GetContentSetting(
       main_frame_url, main_frame_url, ContentSettingsType::JAVASCRIPT, &info);
-
-  bool uses_default_content_setting =
-      !uses_plugin_specific_setting &&
-      info.primary_pattern == ContentSettingsPattern::Wildcard() &&
-      info.secondary_pattern == ContentSettingsPattern::Wildcard();
-
-  if (is_default)
-    *is_default = uses_default_content_setting;
-  if (is_managed)
-    *is_managed = info.source == content_settings::SettingSource::kPolicy;
+  *is_managed = info.source == content_settings::SettingSource::kPolicy;
 }
 
 // static
diff --git a/chrome/browser/plugins/plugin_utils.h b/chrome/browser/plugins/plugin_utils.h
index 41881ad..4c05786 100644
--- a/chrome/browser/plugins/plugin_utils.h
+++ b/chrome/browser/plugins/plugin_utils.h
@@ -28,8 +28,7 @@
   PluginUtils(const PluginUtils&) = delete;
   PluginUtils& operator=(const PluginUtils&) = delete;
 
-  // |is_default| and |is_managed| may be nullptr. In that case, they aren't
-  // set.
+  // The out-parameters must be non-null.
   static void GetPluginContentSetting(
       const HostContentSettingsMap* host_content_settings_map,
       const content::WebPluginInfo& plugin,
@@ -37,7 +36,6 @@
       const GURL& plugin_url,
       const std::string& resource,
       ContentSetting* setting,
-      bool* is_default,
       bool* is_managed);
 
   // If there's an extension that is allowed to handle |mime_type|, returns its
diff --git a/chrome/browser/resources/actor_overlay/BUILD.gn b/chrome/browser/resources/actor_overlay/BUILD.gn
index 1043c78d..3b953e8 100644
--- a/chrome/browser/resources/actor_overlay/BUILD.gn
+++ b/chrome/browser/resources/actor_overlay/BUILD.gn
@@ -9,11 +9,7 @@
 build_webui("build") {
   grd_prefix = "actor_overlay"
 
-  # TODO(crbug.com/422539773): Move svg to actor resources
-  static_files = [
-    "actor_overlay.html",
-    "magic_cursor.svg",
-  ]
+  static_files = [ "actor_overlay.html" ]
 
   ts_files = [
     "app.html.ts",
diff --git a/chrome/browser/resources/extensions_zero_state_promo/icons.html b/chrome/browser/resources/extensions_zero_state_promo/icons.html
index 2f53592..c9ca70a3 100644
--- a/chrome/browser/resources/extensions_zero_state_promo/icons.html
+++ b/chrome/browser/resources/extensions_zero_state_promo/icons.html
@@ -13,6 +13,9 @@
       <g id="writing">
         <path d="M2.833 5.217 2.1 3.583l-1.633-.75L2.1 2.1 2.833.467l.75 1.633 1.634.733-1.634.75-.75 1.634Zm-1.566 7.516V10.3l4.516-4.5L8.2 8.217l-4.5 4.516H1.267ZM2.65 11.35h.467L6.25 8.217l-.217-.25-.25-.217-3.133 3.133v.467Zm6.4-3.983L6.633 4.95l3.434-3.433c.089-.078.183-.14.283-.184a.892.892 0 0 1 .333-.066c.111 0 .223.022.334.066.11.045.21.106.3.184l1.166 1.166c.078.09.14.19.184.3a.892.892 0 0 1 .066.334.892.892 0 0 1-.066.333.71.71 0 0 1-.184.3L9.05 7.367Zm-3.017.6-.25-.217.25.217.217.25-.217-.25Z"/>
       </g>
+      <g id="webstore">
+        <path d="M1.19961 11.2C0.866276 11.2 0.582943 11.0833 0.34961 10.85C0.116276 10.6166 -0.00039053 10.3333 -0.00039053 9.99998V-2.47955e-05H11.1996V9.99998C11.1996 10.3333 11.0829 10.6166 10.8496 10.85C10.6163 11.0833 10.3329 11.2 9.99961 11.2H1.19961ZM4.19961 3.59997C4.03294 3.59997 3.8885 3.54442 3.76628 3.43331C3.65517 3.31109 3.59961 3.16664 3.59961 2.99998C3.59961 2.83331 3.65517 2.69442 3.76628 2.58331C3.8885 2.46109 4.03294 2.39997 4.19961 2.39997H6.99961C7.16628 2.39997 7.30517 2.46109 7.41628 2.58331C7.5385 2.69442 7.59961 2.83331 7.59961 2.99998C7.59961 3.16664 7.5385 3.31109 7.41628 3.43331C7.30517 3.54442 7.16628 3.59997 6.99961 3.59997H4.19961ZM1.19961 9.99998H9.99961V1.19998H1.19961V9.99998ZM3.54961 9.23331L2.73294 7.83331C3.07739 7.37775 3.49961 7.02775 3.99961 6.78331C4.49961 6.52775 5.03294 6.39998 5.59961 6.39998C6.16628 6.39998 6.69405 6.5222 7.18294 6.76664C7.67183 7.01109 8.0885 7.35553 8.43294 7.79998H5.59961C5.13294 7.79998 4.71072 7.93331 4.33294 8.19998C3.96628 8.45553 3.70517 8.79998 3.54961 9.23331ZM2.21628 11.2C2.14961 11.0111 2.09405 10.8166 2.04961 10.6166C2.01628 10.4166 1.99961 10.2111 1.99961 9.99998C1.99961 9.75553 2.02183 9.5222 2.06628 9.29998C2.11072 9.07775 2.17739 8.85553 2.26628 8.63331L3.76628 11.2H2.21628ZM7.43294 11.2C7.55517 11.0222 7.64405 10.8333 7.69961 10.6333C7.76628 10.4333 7.79961 10.2222 7.79961 9.99998C7.79961 9.74442 7.75517 9.49998 7.66628 9.26664C7.57739 9.0222 7.44961 8.79998 7.28294 8.59998H8.91628C9.00517 8.8222 9.07183 9.04998 9.11628 9.28331C9.17183 9.51664 9.19961 9.75553 9.19961 9.99998C9.19961 10.2111 9.17739 10.4166 9.13294 10.6166C9.0885 10.8166 9.03294 11.0111 8.96628 11.2H7.43294ZM4.88294 11.2C4.66072 11.0778 4.4885 10.9111 4.36628 10.7C4.25517 10.4889 4.19961 10.2555 4.19961 9.99998C4.19961 9.61109 4.33294 9.28331 4.59961 9.01664C4.87739 8.73886 5.21072 8.59998 5.59961 8.59998C5.9885 8.59998 6.31628 8.73886 6.58294 9.01664C6.86072 9.28331 6.99961 9.61109 6.99961 9.99998C6.99961 10.2555 6.9385 10.4889 6.81628 10.7C6.70517 10.9111 6.5385 11.0778 6.31628 11.2H4.88294ZM1.19961 9.99998H9.99961H1.19961Z" fill="#0B57D0"/>
+      </g>
     </defs>
   </svg>
 </cr-iconset>
diff --git a/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.css b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.css
index 9f39db5..96e2aed9 100644
--- a/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.css
+++ b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.css
@@ -15,6 +15,7 @@
 :host {
   --zero-state-promo-background-color: var(--color-button-foreground);
   --zero-state-promo-foreground-color: var(--color-button-background);
+  --zero-state-promo-chip-border-radius: 8px;
   --container-gap: 8px;
 
   border-radius: 12px;
@@ -67,10 +68,27 @@
 #labelContainer {
   flex-wrap: wrap;
   padding: 0;
+}
+
+.v1Chip, .v2Chip {
+  border-radius: var(--zero-state-promo-chip-border-radius);
+  padding: 0px;
+  gap: 0px;
+  --cr-chip-border-radius: var(--zero-state-promo-chip-border-radius);
+}
+
+.v1Chip {
+  background-color: var(--zero-state-promo-background-color);
   --color-chip-foreground: var(--zero-state-promo-foreground-color);
   --color-chip-icon: var(--color-sys-inverse-primary);
 }
 
+.v2Chip  {
+  background-color: var(--zero-state-promo-foreground-color);
+  --color-chip-foreground: var(--zero-state-promo-background-color);
+  --color-chip-icon: var(--zero-state-promo-background-color);
+}
+
 #anchorContainer {
   display: block;
   font-size: 14px;
diff --git a/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.html.ts b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.html.ts
index 1d674692..fb24e31 100644
--- a/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.html.ts
+++ b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.html.ts
@@ -17,32 +17,7 @@
       @click="${this.onDismissButtonClick_}">
   </cr-icon-button>
 </div>
-${this.showChipsUi_ ? html`
-  <div id="sectionHeaderContainer">
-    $i18nRaw{extensionsZeroStateChipsIphDesc}
-  </div>
-  <div id="labelContainer">
-    <cr-chip id="couponsButton" chip-role="link"
-        @click="${this.onCouponsButtonClick_}">
-      <cr-icon icon="zero-state-promo:coupons"></cr-icon>
-      $i18n{extensionsZeroStateIphShoppingCategoryLabel}
-    </cr-chip>
-    <cr-chip id="writingButton" chip-role="link"
-        @click="${this.onWritingButtonClick_}">
-      <cr-icon icon="zero-state-promo:writing"></cr-icon>
-      $i18n{extensionsZeroStateIphWritingHelpCollectionLabel}
-    </cr-chip>
-    <cr-chip id="productivityButton"
-        @click="${this.onProductivityButtonClick_}">
-      <cr-icon icon="zero-state-promo:productivity"></cr-icon>
-      $i18n{extensionsZeroStateIphProductivityCategoryLabel}
-    </cr-chip>
-    <cr-chip id="aiButton"
-        @click="${this.onAiButtonClick_}">
-      <cr-icon icon="zero-state-promo:ai"></cr-icon>
-      $i18n{extensionsZeroStateIphAiProductivityCollectionLabel}
-    </cr-chip>
-  </div>` : html`
+${this.showPlainLinksUi_ ? html`
   <div id="anchorContainer">
     $i18nRaw{extensionsZeroStatePlainLinkIphDesc}
     <a id="couponsLink" @click="${this.onCouponsButtonClick_}"
@@ -70,7 +45,72 @@
         @click="${this.onChromeWebStoreButtonClick_}">
       $i18n{extensionsZeroStateIphCustomActionButtonLabel}
     </cr-button>
-  </div>`}
+  </div>` : html`
+  <div id="sectionHeaderContainer">
+    $i18nRaw{extensionsZeroStateChipsIphDesc}
+  </div>
+  ${this.showChipsV1_ ? html`
+  <div id='labelContainer'>
+    <div class="v1Chip">
+      <cr-chip id="couponsButton" chip-role="link"
+          @click="${this.onCouponsButtonClick_}">
+        <cr-icon icon="zero-state-promo:coupons"></cr-icon>
+        $i18n{extensionsZeroStateIphShoppingCategoryLabel}
+      </cr-chip>
+    </div>
+    <div class="v1Chip">
+      <cr-chip id="writingButton" chip-role="link"
+          @click="${this.onWritingButtonClick_}">
+        <cr-icon icon="zero-state-promo:writing"></cr-icon>
+        $i18n{extensionsZeroStateIphWritingHelpCollectionLabel}
+      </cr-chip>
+    </div>
+    <div class="v1Chip">
+      <cr-chip id="productivityButton"
+          @click="${this.onProductivityButtonClick_}">
+        <cr-icon icon="zero-state-promo:productivity"></cr-icon>
+        $i18n{extensionsZeroStateIphProductivityCategoryLabel}
+      </cr-chip>
+    </div>
+    <div class="v1Chip">
+      <cr-chip id="aiButton"
+          @click="${this.onAiButtonClick_}">
+        <cr-icon icon="zero-state-promo:ai"></cr-icon>
+        $i18n{extensionsZeroStateIphAiProductivityCollectionLabel}
+      </cr-chip>
+    </div>
+  </div>` : html`
+  <div id='labelContainer'>
+    <div class="v2Chip">
+      <cr-chip id="aiButton"
+          @click="${this.onAiButtonClick_}">
+        <cr-icon icon="zero-state-promo:ai"></cr-icon>
+        $i18n{extensionsZeroStateIphAiProductivityCollectionLabel}
+      </cr-chip>
+    </div>
+    <div class="v2Chip">
+      <cr-chip id="couponsButton" chip-role="link"
+          @click="${this.onCouponsButtonClick_}">
+        <cr-icon icon="zero-state-promo:coupons"></cr-icon>
+        $i18n{extensionsZeroStateIphShoppingCategoryLabel}
+      </cr-chip>
+    </div>
+    <div class="v2Chip">
+      <cr-chip id="productivityButton"
+          @click="${this.onProductivityButtonClick_}">
+        <cr-icon icon="zero-state-promo:productivity"></cr-icon>
+        $i18n{extensionsZeroStateIphProductivityCategoryLabel}
+      </cr-chip>
+    </div>
+    <div class="v2Chip">
+      <cr-chip id="webStoreButton" chip-role="link"
+          @click="${this.onChromeWebStoreButtonClick_}">
+        <cr-icon icon="zero-state-promo:webstore"></cr-icon>
+        $i18n{extensionsZeroStateIphWebStoreLink}
+      </cr-chip>
+    </div>
+  </div>` }
+  ` }
 <!--_html_template_end_-->`;
   // clang-format on
 }
diff --git a/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.ts b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.ts
index 9186e99b..f985a8a0 100644
--- a/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.ts
+++ b/chrome/browser/resources/extensions_zero_state_promo/zero_state_promo_app.ts
@@ -36,7 +36,9 @@
 
   static override get properties() {
     return {
-      showChipsUi_: {type: Boolean},
+      showPlainLinksUi_: {type: Boolean},
+      showChipsV1_: {type: Boolean},
+      showChipsV2_: {type: Boolean},
     };
   }
 
@@ -45,8 +47,14 @@
   private customHelpBubbleHandler_: CustomHelpBubbleHandlerInterface =
       CustomHelpBubbleProxyImpl.getInstance().getHandler();
 
-  protected accessor showChipsUi_: boolean =
-      loadTimeData.getBoolean('showChipsUi');
+  protected accessor showPlainLinksUi_: boolean =
+      loadTimeData.getBoolean('showPlainLinksUi');
+
+  protected accessor showChipsV1_: boolean =
+      loadTimeData.getBoolean('showChipsUiV1');
+
+  protected accessor showChipsV2_: boolean =
+      loadTimeData.getBoolean('showChipsUiV2');
 
   protected onChromeWebStoreButtonClick_() {
     this.apiProxy_.launchWebStoreLink(WebStoreLinkClicked.kDiscoverExtension);
diff --git a/chrome/browser/resources/glic/glic.css b/chrome/browser/resources/glic/glic.css
index a30c640..3c9bf83 100644
--- a/chrome/browser/resources/glic/glic.css
+++ b/chrome/browser/resources/glic/glic.css
@@ -145,20 +145,19 @@
 
 #loadingPanel #sidePanelLoading .p4 {
   height: 32px;
+  border-radius: 12px;
   margin-bottom: 8px;
-  border-top-left-radius: 12px;
-  border-top-right-radius: 12px;
 }
 
 #loadingPanel #sidePanelLoading .p5 {
   height: 32px;
+  border-radius: 12px;
   margin-bottom: 8px;
 }
 
 #loadingPanel #sidePanelLoading .p6 {
   height: 32px;
-  border-bottom-left-radius: 12px;
-  border-bottom-right-radius: 12px;
+  border-radius: 12px;
 }
 
 #loadingPanel #sidePanelLoading .p7 {
diff --git a/chrome/browser/resources/new_tab_page/app.html b/chrome/browser/resources/new_tab_page/app.html
index a90703e..280068d7 100644
--- a/chrome/browser/resources/new_tab_page/app.html
+++ b/chrome/browser/resources/new_tab_page/app.html
@@ -72,7 +72,8 @@
       </ntp-lens-upload-dialog>
     ` : ''}
   </div>
-  ${this.lazyRender_ && this.ntpNextFeaturesEnabled_ ? html`
+  ${this.lazyRender_
+    && this.ntpNextFeaturesEnabled_ && this.isActionChipsVisible_ ? html`
     <ntp-action-chips
         @action-chip-click="${this.onActionChipClick_}">
     </ntp-action-chips>
diff --git a/chrome/browser/resources/new_tab_page/app.ts b/chrome/browser/resources/new_tab_page/app.ts
index 19ff690..2f72810 100644
--- a/chrome/browser/resources/new_tab_page/app.ts
+++ b/chrome/browser/resources/new_tab_page/app.ts
@@ -186,6 +186,8 @@
 
       showWallpaperSearch_: {type: Boolean},
 
+      isActionChipsVisible_: {type: Boolean},
+
       isFooterVisible_: {type: Boolean},
 
       selectedCustomizeDialogPage_: {type: String},
@@ -372,6 +374,8 @@
       loadTimeData.getBoolean('composeboxCloseByClickOutside');
   accessor composeboxEnabled: boolean =
       loadTimeData.getBoolean('searchboxShowComposebox');
+  protected accessor isActionChipsVisible_: boolean =
+      loadTimeData.getBoolean('actionChipsEnabled');
   protected accessor isFooterVisible_: boolean = false;
   protected accessor ntpRealboxNextEnabled_: boolean =
       loadTimeData.getBoolean('ntpRealboxNextEnabled');
@@ -395,6 +399,7 @@
   private setThemeListenerId_: number|null = null;
   private setCustomizeChromeSidePanelVisibilityListener_: number|null = null;
   private setWallpaperSearchButtonVisibilityListener_: number|null = null;
+  private setActionChipsVisibilityListenerId_: number|null = null;
   private footerVisibilityUpdatedListener_: number|null = null;
   private eventTracker_: EventTracker = new EventTracker();
   private shouldPrintPerformance_: boolean = false;
@@ -508,6 +513,10 @@
               }
             });
 
+    this.setActionChipsVisibilityListenerId_ =
+        this.callbackRouter_.setActionChipsVisibility.addListener(
+            (isVisible: boolean) => this.isActionChipsVisible_ = isVisible);
+
     this.footerVisibilityUpdatedListener_ =
         this.callbackRouter_.footerVisibilityUpdated.addListener(
             (visible: boolean) => {
@@ -575,6 +584,8 @@
         this.setWallpaperSearchButtonVisibilityListener_!);
     this.customizeButtonsCallbackRouter_.removeListener(
         this.setCustomizeChromeSidePanelVisibilityListener_!);
+    this.callbackRouter_.removeListener(
+        this.setActionChipsVisibilityListenerId_!);
     this.callbackRouter_.removeListener(this.footerVisibilityUpdatedListener_!);
     this.eventTracker_.removeAll();
   }
diff --git a/chrome/browser/resources/omnibox_popup/BUILD.gn b/chrome/browser/resources/omnibox_popup/BUILD.gn
index 7785165..f82f1bf5 100644
--- a/chrome/browser/resources/omnibox_popup/BUILD.gn
+++ b/chrome/browser/resources/omnibox_popup/BUILD.gn
@@ -9,6 +9,7 @@
 build_webui("build") {
   grd_prefix = "omnibox_popup"
   static_files = [
+    "images/create_images.png",
     "omnibox_popup_aim.html",
     "omnibox_popup_full.html",
     "omnibox_popup.html",
diff --git a/chrome/browser/resources/omnibox_popup/images/create_images.png b/chrome/browser/resources/omnibox_popup/images/create_images.png
new file mode 100644
index 0000000..64c9cfaa
--- /dev/null
+++ b/chrome/browser/resources/omnibox_popup/images/create_images.png
Binary files differ
diff --git a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
index 1380815..cde5fa7 100644
--- a/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
+++ b/chrome/browser/safe_browsing/download_protection/deep_scanning_request.cc
@@ -126,8 +126,8 @@
     case DownloadCheckResult::SENSITIVE_CONTENT_WARNING:
       return enterprise_connectors::EventResult::WARNED;
 
-    // TODO(alshawwa): Add force save to drive EventResult, for reporting.
     case DownloadCheckResult::FORCE_SAVE_TO_GDRIVE:
+      return enterprise_connectors::EventResult::FORCED_SAVE_TO_CLOUD;
     case DownloadCheckResult::BLOCKED_PASSWORD_PROTECTED:
     case DownloadCheckResult::BLOCKED_TOO_LARGE:
     case DownloadCheckResult::SENSITIVE_CONTENT_BLOCK:
@@ -167,6 +167,9 @@
       final_action =
           enterprise_connectors::ContentAnalysisAcknowledgement::WARN;
       break;
+    // TODO(alshawwa): handle FORCE_SAVE_TO_CLOUD case. Currently defaults to
+    // BLOCKED behaviour.
+    case enterprise_connectors::EventResult::FORCED_SAVE_TO_CLOUD:
     case enterprise_connectors::EventResult::BLOCKED:
       final_action =
           enterprise_connectors::ContentAnalysisAcknowledgement::BLOCK;
diff --git a/chrome/browser/ui/android/omnibox/java/res/layout/navigation_attachments_bar.xml b/chrome/browser/ui/android/omnibox/java/res/layout/navigation_attachments_bar.xml
index 4e08d9b..1ee5e861 100644
--- a/chrome/browser/ui/android/omnibox/java/res/layout/navigation_attachments_bar.xml
+++ b/chrome/browser/ui/android/omnibox/java/res/layout/navigation_attachments_bar.xml
@@ -83,6 +83,7 @@
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintTop_toBottomOf="@id/location_bar_attachments"
         app:buttonColor="@color/gm3_baseline_surface_container"
+        app:buttonBorderStyle="dashed"
         app:drawableTint="?attr/colorPrimary"
         app:buttonTextColor="@null"/>
 
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/navattach/NavigationAttachmentsViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/navattach/NavigationAttachmentsViewBinder.java
index 19525ec..f58893b 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/navattach/NavigationAttachmentsViewBinder.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/navattach/NavigationAttachmentsViewBinder.java
@@ -14,6 +14,7 @@
 import org.chromium.components.omnibox.AutocompleteRequestType;
 import org.chromium.ui.modelutil.PropertyKey;
 import org.chromium.ui.modelutil.PropertyModel;
+import org.chromium.ui.widget.RippleBackgroundHelper;
 
 /** Binds the Navigation Attachments properties to the view and component. */
 @NullMarked
@@ -116,6 +117,11 @@
                         ? res.getColorStateList(R.color.gm3_baseline_surface_container)
                         : res.getColorStateList(android.R.color.transparent));
 
+        views.requestType.setBorderStyle(
+                isAiModeEnabled
+                        ? RippleBackgroundHelper.BorderType.SOLID
+                        : RippleBackgroundHelper.BorderType.DASHED);
+
         views.requestType.setCompoundDrawablesRelativeWithIntrinsicBounds(
                 res.getDrawable(R.drawable.search_spark_black_24dp),
                 null,
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
index 5534b5b..2fe93ee 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -9,6 +9,7 @@
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.view.View.OnLongClickListener;
+import android.view.ViewGroup.MarginLayoutParams;
 import android.widget.ImageButton;
 
 import androidx.annotation.ColorInt;
@@ -857,4 +858,32 @@
         boolean isToolbarAtTheBottom = mTopControlsStacker.isLayerAtBottom(getTopControlType());
         mToolbarLayout.setHairlineVisibility(isToolbarAtTheBottom);
     }
+
+    @Override
+    public void onBrowserControlsOffsetUpdate(int layerYOffset, boolean reachRestingPosition) {
+        if (mBrowserControls.getControlsPosition() != ControlsPosition.TOP) {
+            return;
+        }
+
+        // In Android view, tab strip and toolbar lives together in control container. The toolbar
+        // applies a top margin so it can leave enough space for the tab strip to show.
+        int tabStripHeight = getTabStripHeight();
+
+        // In compositor, the position of the toolbar depends on the capture. As for Oct 2025, the
+        // capture includes everything in control container, including the top margin, which
+        // represents the size of the tab strip.
+        // To place the toolbar at its desired position, we have to subtract the top margin
+        // from layerYOffset.
+        if (mOverlayCoordinator != null) {
+            mOverlayCoordinator.setYOffset(layerYOffset - tabStripHeight);
+        }
+
+        // Skip the layout params in non-resting position to avoid trigger layout during browser
+        // controls reposition.
+        if (reachRestingPosition) {
+            MarginLayoutParams lp = (MarginLayoutParams) mToolbarLayout.getLayoutParams();
+            lp.topMargin = tabStripHeight;
+            mToolbarLayout.setLayoutParams(lp);
+        }
+    }
 }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java
index fe2e80f..231527a 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayCoordinator.java
@@ -115,7 +115,14 @@
         mMediator.setXOffset(xOffset);
     }
 
-    /** @param anonymize Whether the URL should be hidden when the layer is rendered. */
+    /** Set the yOffset */
+    public void setYOffset(float yOffset) {
+        mMediator.setYOffset(yOffset);
+    }
+
+    /**
+     * @param anonymize Whether the URL should be hidden when the layer is rendered.
+     */
     public void setAnonymize(boolean anonymize) {
         mMediator.setAnonymize(anonymize);
     }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java
index d7e27c26..50063fe 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java
@@ -43,6 +43,10 @@
 /** The business logic for controlling the top toolbar's cc texture. */
 @NullMarked
 public class TopToolbarOverlayMediator {
+    // LINT.IfChange(InvalidContentOffset)
+    static final float INVALID_CONTENT_OFFSET = -10001.f;
+    // LINT.ThenChange(//chrome/browser/android/compositor/layer/toolbar_layer.cc:InvalidContentOffset)
+
     // Forced testing params.
     private static @Nullable Boolean sIsTabletForTesting;
     private static @Nullable Integer sToolbarBackgroundColorForTesting;
@@ -256,11 +260,9 @@
                                             ? getBookmarkBarAdjustedContentOffset()
                                             : mBrowserControlsStateProvider.getTopControlsHeight();
                             if (getControlsPosition() == ControlsPosition.TOP) {
-                                mModel.set(
-                                        TopToolbarOverlayProperties.LEGACY_CONTENT_OFFSET, height);
+                                applyContentOffsetToModel(height);
                             } else if (getControlsPosition() == ControlsPosition.BOTTOM) {
-                                mModel.set(
-                                        TopToolbarOverlayProperties.LEGACY_CONTENT_OFFSET,
+                                applyContentOffsetToModel(
                                         mBottomToolbarControlsOffsetSupplier.get()
                                                 + mViewportHeight);
                             }
@@ -291,8 +293,7 @@
                             mBottomControlsOffsetTag = offsetTagsInfo.getBottomControlsOffsetTag();
                             updateOffsetTag();
                             if (shouldUpdateOffsets) {
-                                mModel.set(
-                                        TopToolbarOverlayProperties.LEGACY_CONTENT_OFFSET,
+                                applyContentOffsetToModel(
                                         mBrowserControlsStateProvider.getContentOffset());
                             }
                         }
@@ -533,7 +534,17 @@
         mModel.set(TopToolbarOverlayProperties.X_OFFSET, xOffset);
     }
 
-    /** @param anonymize Whether the URL should be hidden when the layer is rendered. */
+    /**
+     * @param yOffset The Y offset of the toolbar.
+     */
+    void setYOffset(float yOffset) {
+        assert BrowserControlsUtils.isTopControlsRefactorOffsetEnabled();
+        mModel.set(TopToolbarOverlayProperties.Y_OFFSET, yOffset);
+    }
+
+    /**
+     * @param anonymize Whether the URL should be hidden when the layer is rendered.
+     */
     void setAnonymize(boolean anonymize) {
         mModel.set(TopToolbarOverlayProperties.ANONYMIZE, anonymize);
     }
@@ -587,12 +598,12 @@
 
         if (getControlsPosition() == ControlsPosition.BOTTOM) {
             contentOffset = (int) (mBottomToolbarControlsOffsetSupplier.get() + mViewportHeight);
-            mModel.set(TopToolbarOverlayProperties.LEGACY_CONTENT_OFFSET, contentOffset);
+            applyContentOffsetToModel(contentOffset);
             return;
         }
 
         if (!ChromeFeatureList.sBrowserControlsInViz.isEnabled()) {
-            mModel.set(TopToolbarOverlayProperties.LEGACY_CONTENT_OFFSET, contentOffset);
+            applyContentOffsetToModel(contentOffset);
             return;
         }
 
@@ -607,6 +618,14 @@
             contentOffset = Math.min(getBookmarkBarAdjustedContentOffset(), contentOffset);
         }
 
+        applyContentOffsetToModel(contentOffset);
+    }
+
+    private void applyContentOffsetToModel(float contentOffset) {
+        if (BrowserControlsUtils.isTopControlsRefactorOffsetEnabled()
+                && getControlsPosition() == ControlsPosition.TOP) {
+            contentOffset = INVALID_CONTENT_OFFSET;
+        }
         mModel.set(TopToolbarOverlayProperties.LEGACY_CONTENT_OFFSET, contentOffset);
     }
 
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java
index a49e8a85..13dc4e503 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java
@@ -504,4 +504,47 @@
         assertEquals(
                 captureResourceId, mModel.get(TopToolbarOverlayProperties.CAPTURE_RESOURCE_ID));
     }
+
+    @Test
+    @EnableFeatures({
+        ChromeFeatureList.TOP_CONTROLS_REFACTOR,
+        ChromeFeatureList.TOP_CONTROLS_REFACTOR_V2
+    })
+    public void testContentOffset_topControlsRefactorEnabled() {
+        int offset = -10;
+        int height = 150;
+        doReturn(offset).when(mBrowserControlsStateProvider).getContentOffset();
+        doReturn(height).when(mBrowserControlsStateProvider).getTopControlsHeight();
+        doReturn(ControlsPosition.TOP).when(mBrowserControlsStateProvider).getControlsPosition();
+        mBrowserControlsObserverCaptor.getValue().onControlsPositionChanged(ControlsPosition.TOP);
+
+        mBrowserControlsObserverCaptor
+                .getValue()
+                .onControlsOffsetChanged(0, 0, false, 0, 0, false, false, false);
+        assertEquals(
+                TopToolbarOverlayMediator.INVALID_CONTENT_OFFSET,
+                mModel.get(TopToolbarOverlayProperties.LEGACY_CONTENT_OFFSET),
+                MathUtils.EPSILON);
+    }
+
+    @Test
+    @EnableFeatures({
+        ChromeFeatureList.TOP_CONTROLS_REFACTOR,
+        ChromeFeatureList.TOP_CONTROLS_REFACTOR_V2
+    })
+    public void testContentOffset_topControlsRefactorEnabled_ControlsAtBottom() {
+
+        float height = 700.0f;
+        mMediator.setViewportHeight(height);
+        mBottomToolbarControlsOffsetSupplier.set(0);
+        doReturn(ControlsPosition.BOTTOM).when(mBrowserControlsStateProvider).getControlsPosition();
+
+        mBrowserControlsObserverCaptor
+                .getValue()
+                .onControlsOffsetChanged(0, 0, false, 0, 0, false, false, false);
+        assertEquals(
+                700.0f,
+                mModel.get(TopToolbarOverlayProperties.LEGACY_CONTENT_OFFSET),
+                MathUtils.EPSILON);
+    }
 }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/FadeTransitionHandler.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/FadeTransitionHandler.java
index 3149d79..7ee53094 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/FadeTransitionHandler.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/FadeTransitionHandler.java
@@ -18,9 +18,6 @@
  */
 @NullMarked
 class FadeTransitionHandler {
-    // Minimum width (in dp) of the tab strip for it to be shown.
-    // 284 = 2 * minTabWidth(108) - tabOverlap(28) + newTabButton (48) + modelSelectorButton(48).
-    static final int TRANSITION_THRESHOLD_DP = 284;
     private static final int FADE_TRANSITION_DURATION_MS = 200;
 
     private final OneshotSupplier<TabStripTransitionDelegate> mTabStripTransitionDelegateSupplier;
@@ -37,7 +34,12 @@
     }
 
     void updateTabStripTransitionThreshold(DisplayMetrics displayMetrics) {
-        mTabStripTransitionThreshold = ViewUtils.dpToPx(displayMetrics, TRANSITION_THRESHOLD_DP);
+        var delegate = mTabStripTransitionDelegateSupplier.get();
+        // Skip while the delegate is null before native init; this method will be invoked by the
+        // observer callback once the delegate supplier is injected.
+        if (delegate == null) return;
+        mTabStripTransitionThreshold =
+                ViewUtils.dpToPx(displayMetrics, delegate.getFadeTransitionThresholdDp());
     }
 
     void onTabStripSizeChanged(
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java
index 05eef33..a1138144 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinator.java
@@ -77,6 +77,12 @@
 
         /** Returns the observable supplier for the {@link StripVisibilityState}. */
         ObservableSupplier<Integer> getStripVisibilityStateSupplier();
+
+        /**
+         * Returns the min strip width (in dp) required for it to become visible by a fade
+         * transition.
+         */
+        int getFadeTransitionThresholdDp();
     }
 
     private final CallbackController mCallbackController = new CallbackController();
@@ -157,7 +163,8 @@
                 };
         controlContainerView().addOnLayoutChangeListener(mOnLayoutChangedListener);
 
-        updateTabStripTransitionThreshold();
+        mTabStripTransitionDelegateSupplier.runSyncOrOnAvailable(
+                (unused) -> updateTabStripTransitionThreshold());
 
         AppHeaderState appHeaderState = null;
         if (mDesktopWindowStateManager != null) {
@@ -407,8 +414,10 @@
      * @return The min strip width (in dp) required for it to become visible by a fade transition.
      */
     @VisibleForTesting
-    public static int getFadeTransitionThresholdDp() {
-        return FadeTransitionHandler.TRANSITION_THRESHOLD_DP;
+    public int getFadeTransitionThresholdDp() {
+        TabStripTransitionDelegate delegate = mTabStripTransitionDelegateSupplier.get();
+        assert delegate != null : "Expected a non-null strip transition delegate.";
+        return delegate.getFadeTransitionThresholdDp();
     }
 
     HeightTransitionHandler getHeightTransitionHandlerForTesting() {
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinatorUnitTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinatorUnitTest.java
index e9d606a4..f6bd751 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinatorUnitTest.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinatorUnitTest.java
@@ -1413,5 +1413,10 @@
         public ObservableSupplier<Integer> getStripVisibilityStateSupplier() {
             return mStripVisibilitySupplier;
         }
+
+        @Override
+        public int getFadeTransitionThresholdDp() {
+            return NARROW_DESKTOP_WINDOW_WIDTH + 1;
+        }
     }
 }
diff --git a/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutCoordinator.java b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutCoordinator.java
index 0cc7e71..ba4565a 100644
--- a/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutCoordinator.java
+++ b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutCoordinator.java
@@ -102,7 +102,7 @@
     private final ObservableSupplierImpl<MenuButtonState> mMenuButtonStateSupplier =
             new ObservableSupplierImpl<>();
     private @Nullable View mMenuButtonContainer;
-    private final String mClientPackageName;
+    private final @Nullable String mClientPackageName;
     private @Nullable ChromeImageButton mToggleButtonView;
 
     /**
@@ -156,7 +156,6 @@
         buttonState.adaptiveBadgeIcon = R.drawable.badge_update;
         mMenuButtonStateSupplier.set(buttonState);
 
-        assert clientPackageName != null;
         mClientPackageName = clientPackageName;
 
         mViewStub = viewStub;
diff --git a/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutMediator.java b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutMediator.java
index 6a5baca8..8fef1b0 100644
--- a/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutMediator.java
+++ b/chrome/browser/ui/android/web_app_header/java/src/org/chromium/chrome/browser/ui/web_app_header/WebAppHeaderLayoutMediator.java
@@ -68,7 +68,7 @@
     private int mButtonBottomInset;
     private final @DisplayMode.EnumType int mDisplayMode;
     private final Callback<@Nullable Tab> mOnTabUpdate;
-    private final String mClientPackageName;
+    private final @Nullable String mClientPackageName;
 
     private int mDisabledControlsToken = TokenHolder.INVALID_TOKEN;
     private boolean mIsFirstAppHeaderStateUpdate = true;
@@ -99,7 +99,7 @@
             int headerButtonHeight,
             int displayMode,
             Callback<Boolean> setHeaderAsOverlayCallback,
-            String clientPackageName) {
+            @Nullable String clientPackageName) {
         mThemeColorProvider = themeColorProvider;
         mWebAppMinHeaderHeight = webAppHeaderMinHeightFromResources;
         mHeaderDelegate = headerDelegate;
@@ -148,22 +148,28 @@
 
         SharedPreferencesManager prefs = ChromeSharedPreferences.getInstance();
         mUserToggleHeaderAsOverlay =
-                prefs.readStringSet(ChromePreferenceKeys.WINDOW_CONTROLS_OVERLAY_ENABLED_PACKAGES)
-                        .contains(mClientPackageName);
+                mClientPackageName == null
+                        ? false
+                        : prefs.readStringSet(
+                                        ChromePreferenceKeys
+                                                .WINDOW_CONTROLS_OVERLAY_ENABLED_PACKAGES)
+                                .contains(mClientPackageName);
     }
 
     public void setUserToggleHeaderAsOverlay(boolean userToggleHeaderAsOverlay) {
         if (mUserToggleHeaderAsOverlay == userToggleHeaderAsOverlay) return;
         mUserToggleHeaderAsOverlay = userToggleHeaderAsOverlay;
         SharedPreferencesManager prefs = ChromeSharedPreferences.getInstance();
-        if (mUserToggleHeaderAsOverlay) {
-            prefs.addToStringSet(
-                    ChromePreferenceKeys.WINDOW_CONTROLS_OVERLAY_ENABLED_PACKAGES,
-                    mClientPackageName);
-        } else {
-            prefs.removeFromStringSet(
-                    ChromePreferenceKeys.WINDOW_CONTROLS_OVERLAY_ENABLED_PACKAGES,
-                    mClientPackageName);
+        if (mClientPackageName != null) {
+            if (mUserToggleHeaderAsOverlay) {
+                prefs.addToStringSet(
+                        ChromePreferenceKeys.WINDOW_CONTROLS_OVERLAY_ENABLED_PACKAGES,
+                        mClientPackageName);
+            } else {
+                prefs.removeFromStringSet(
+                        ChromePreferenceKeys.WINDOW_CONTROLS_OVERLAY_ENABLED_PACKAGES,
+                        mClientPackageName);
+            }
         }
         updateHeaderAsOverlay();
     }
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc
index f68bd44..d27effbf 100644
--- a/chrome/browser/ui/browser.cc
+++ b/chrome/browser/ui/browser.cc
@@ -1238,8 +1238,9 @@
 
 std::vector<tabs::TabInterface*> Browser::GetAllTabInterfaces() {
   std::vector<tabs::TabInterface*> results;
-  for (int index = 0; index < tab_strip_model_->count(); ++index) {
-    results.push_back(tab_strip_model_->GetTabAtIndex(index));
+  results.reserve(tab_strip_model_->count());
+  for (tabs::TabInterface* tab : *tab_strip_model_) {
+    results.push_back(tab);
   }
   return results;
 }
diff --git a/chrome/browser/ui/browser_actions.cc b/chrome/browser/ui/browser_actions.cc
index d467df3c..5ffd0509 100644
--- a/chrome/browser/ui/browser_actions.cc
+++ b/chrome/browser/ui/browser_actions.cc
@@ -47,6 +47,7 @@
 #include "chrome/browser/ui/passwords/passwords_model_delegate.h"
 #include "chrome/browser/ui/performance_controls/memory_saver_bubble_controller.h"
 #include "chrome/browser/ui/qrcode_generator/qrcode_generator_bubble_controller.h"
+#include "chrome/browser/ui/read_anything/read_anything_entry_point_controller.h"
 #include "chrome/browser/ui/search/omnibox_utils.h"
 #include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_bubble.h"
 #include "chrome/browser/ui/send_tab_to_self/send_tab_to_self_toolbar_icon_controller.h"
@@ -272,11 +273,38 @@
             .Build());
   }
 
-  root_action_item_->AddChild(
-      SidePanelAction(SidePanelEntryId::kReadAnything, IDS_READING_MODE_TITLE,
-                      IDS_READING_MODE_TITLE, kMenuBookChromeRefreshIcon,
-                      kActionSidePanelShowReadAnything, bwi, true)
-          .Build());
+  if (features::IsReadAnythingOmniboxChipEnabled()) {
+    actions::ActionItem::InvokeActionCallback read_anything_callback =
+        base::BindRepeating(
+            [](BrowserWindowInterface* bwi, actions::ActionItem* item,
+               actions::ActionInvocationContext context) {
+              if (!bwi) {
+                return;
+              }
+              read_anything::ReadAnythingEntryPointController::InvokePageAction(
+                  bwi, context);
+            },
+            bwi);
+    root_action_item_->AddChild(
+        actions::ActionItem::Builder(read_anything_callback)
+            .SetActionId(kActionSidePanelShowReadAnything)
+            .SetText(l10n_util::GetStringUTF16(IDS_READING_MODE_TITLE))
+            .SetTooltipText(l10n_util::GetStringUTF16(IDS_READING_MODE_TITLE))
+            .SetImage(ui::ImageModel::FromVectorIcon(kMenuBookChromeRefreshIcon,
+                                                     ui::kColorIcon))
+            .SetProperty(
+                actions::kActionItemPinnableKey,
+                static_cast<
+                    std::underlying_type_t<actions::ActionPinnableState>>(
+                    actions::ActionPinnableState::kPinnable))
+            .Build());
+  } else {
+    root_action_item_->AddChild(
+        SidePanelAction(SidePanelEntryId::kReadAnything, IDS_READING_MODE_TITLE,
+                        IDS_READING_MODE_TITLE, kMenuBookChromeRefreshIcon,
+                        kActionSidePanelShowReadAnything, bwi, true)
+            .Build());
+  }
 
   if (lens::features::IsLensOverlayEnabled()) {
     actions::ActionItem::InvokeActionCallback callback = base::BindRepeating(
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index ecd4ffa..15d5702 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -2173,9 +2173,14 @@
 }
 
 void ShowContextualTasksSidePanel(BrowserWindowInterface* browser) {
-  CHECK_DEREF(
-      contextual_tasks::ContextualTasksSidePanelCoordinator::From(browser))
-      .Show();
+  auto* coordinator =
+      contextual_tasks::ContextualTasksSidePanelCoordinator::From(browser);
+  CHECK(coordinator);
+  if (coordinator->IsSidePanelOpenForContextualTask()) {
+    coordinator->Close();
+  } else {
+    coordinator->Show();
+  }
 }
 
 void ToggleVerticalTabs(Browser* browser) {
diff --git a/chrome/browser/ui/browser_tab_strip_tracker.cc b/chrome/browser/ui/browser_tab_strip_tracker.cc
index 8e67f11..47f25c3f 100644
--- a/chrome/browser/ui/browser_tab_strip_tracker.cc
+++ b/chrome/browser/ui/browser_tab_strip_tracker.cc
@@ -54,9 +54,10 @@
   tab_strip_model->AddObserver(tab_strip_model_observer_);
 
   TabStripModelChange::Insert insert;
-  for (int i = 0; i < tab_strip_model->count(); ++i) {
-    insert.contents.push_back({tab_strip_model->GetTabAtIndex(i),
-                               tab_strip_model->GetWebContentsAt(i), i});
+  insert.contents.reserve(tab_strip_model->count());
+  for (int i = 0; tabs::TabInterface* tab : *tab_strip_model) {
+    insert.contents.push_back({tab, tab->GetContents(), i});
+    ++i;
   }
 
   TabStripModelChange change(std::move(insert));
diff --git a/chrome/browser/ui/lens/lens_overlay_controller.cc b/chrome/browser/ui/lens/lens_overlay_controller.cc
index 2b6cb376..e0b95779 100644
--- a/chrome/browser/ui/lens/lens_overlay_controller.cc
+++ b/chrome/browser/ui/lens/lens_overlay_controller.cc
@@ -425,7 +425,6 @@
   immersive_mode_observer_.Reset();
   lens_overlay_blur_layer_delegate_.reset();
   pref_change_registrar_.Reset();
-  use_aim_for_visual_search_ = false;
 
   // Notify the searchbox controller to reset its handlers before the overlay
   // is cleaned up. This is needed to prevent a dangling ptr.
@@ -928,10 +927,6 @@
     return;
   }
 
-  // If the search controller is already active, then visual selections
-  // are considered follow ups that should be fulfilled by AIM.
-  use_aim_for_visual_search_ = lens_search_controller_->IsActive();
-
   // Increment the counter for the number of times the Lens Overlay has been
   // started.
   int lens_overlay_start_count =
@@ -2547,7 +2542,8 @@
   MaybeOpenSidePanel();
   auto* results_side_panel_coordinator = GetLensOverlaySidePanelCoordinator();
 
-  if (use_aim_for_visual_search_ &&
+  if (lens::IsAimQuery(
+          results_side_panel_coordinator->GetSidePanelNewTabUrl()) &&
       IsVisualSelectionType(lens_selection_type_) &&
       lens::features::GetEnableLensButtonInSearchbox()) {
     // Focus the side panel contents so the composebox can be properly focused.
@@ -2646,7 +2642,6 @@
 void LensOverlayController::ReshowOverlay() {
   // The overlay must be in the kHidden state to be restored properly.
   CHECK(state_ == State::kHidden);
-  use_aim_for_visual_search_ = true;
 
   // Clear any previous selections to ensure a clean state.
   ClearAllSelections();
diff --git a/chrome/browser/ui/lens/lens_overlay_controller.h b/chrome/browser/ui/lens/lens_overlay_controller.h
index 33bff577..00de18a 100644
--- a/chrome/browser/ui/lens/lens_overlay_controller.h
+++ b/chrome/browser/ui/lens/lens_overlay_controller.h
@@ -1186,9 +1186,6 @@
   // horizontal alignment pref.
   PrefChangeRegistrar pref_change_registrar_;
 
-  // Whether to use AIM for visual searches.
-  bool use_aim_for_visual_search_ = false;
-
   // --------------------Browser window scoped state: END---------------------
 
   // Must be the last member.
diff --git a/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc b/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
index bf474c6..add9135b 100644
--- a/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
+++ b/chrome/browser/ui/lens/lens_overlay_controller_browsertest.cc
@@ -9647,7 +9647,7 @@
 }
 
 IN_PROC_BROWSER_TEST_F(LensOverlayControllerReinvocationBrowserTest,
-                       FollowUpRegionSearchDoesNotLoadInSidePanel) {
+                       AimQueryRegionSearchDoesNotLoadInSidePanel) {
   WaitForPaint();
   auto* controller = GetLensOverlayController();
   ASSERT_EQ(controller->state(), State::kOff);
@@ -9698,8 +9698,11 @@
   ASSERT_TRUE(content::WaitForLoadStop(GetOverlayWebContents()));
 
   // Simulate a region search.
+  content::TestNavigationObserver search_observer(
+      controller->GetSidePanelWebContentsForTesting());
   controller->IssueLensRegionRequestForTesting(kTestRegion->Clone(),
                                                /*is_click=*/false);
+  search_observer.WaitForNavigationFinished();
 
   // Wait for the region search to be processed.
   ASSERT_TRUE(base::test::RunUntil(
@@ -9721,46 +9724,3 @@
   EXPECT_EQ(url_before_region_search,
             side_panel_web_contents->GetLastCommittedURL());
 }
-
-IN_PROC_BROWSER_TEST_F(LensOverlayControllerReinvocationBrowserTest,
-                       RegionSearchLoadsInSidePanel) {
-  // State should start in off.
-  auto* controller = GetLensOverlayController();
-  ASSERT_EQ(controller->state(), State::kOff);
-
-  // Showing UI should change the state to screenshot and eventually to overlay.
-  SkBitmap initial_bitmap = CreateNonEmptyBitmap(100, 100);
-  OpenLensOverlayWithPendingRegion(LensOverlayInvocationSource::kAppMenu,
-                                   kTestRegion->Clone(), initial_bitmap);
-  ASSERT_EQ(controller->state(), State::kScreenshot);
-  ASSERT_TRUE(base::test::RunUntil(
-      [&]() { return controller->state() == State::kOverlayAndResults; }));
-  auto* coordinator = browser()->GetFeatures().side_panel_coordinator();
-  // Expect the Lens Overlay results panel to open.
-  ASSERT_TRUE(coordinator->IsSidePanelEntryShowing(
-      SidePanelEntryKey(SidePanelEntryId::kLensOverlayResults)));
-
-  // Verify region was passed to WebUI.
-  auto* fake_controller = static_cast<LensOverlayControllerFake*>(controller);
-  ASSERT_TRUE(fake_controller);
-  EXPECT_EQ(kTestRegion,
-            fake_controller->fake_overlay_page_.post_region_selection_);
-  fake_controller->FlushForTesting();
-  ASSERT_TRUE(content::WaitForLoadStop(GetOverlayWebContents()));
-
-  // The selection type should be INJECTED_IMAGE at this point.
-  auto* query_controller = static_cast<lens::TestLensOverlayQueryController*>(
-      controller->get_lens_overlay_query_controller_for_testing());
-  EXPECT_EQ(query_controller->last_lens_selection_type(), lens::INJECTED_IMAGE);
-
-  // Simulate a region search. This should trigger a navigation in the side
-  // panel.
-  content::TestNavigationObserver search_observer(
-      controller->GetSidePanelWebContentsForTesting());
-  controller->IssueLensRegionRequestForTesting(kTestRegion->Clone(),
-                                               /*is_click=*/false);
-
-  // Verify that the navigation occurred.
-  search_observer.WaitForNavigationFinished();
-  EXPECT_EQ(query_controller->last_lens_selection_type(), lens::REGION_SEARCH);
-}
diff --git a/chrome/browser/ui/omnibox/BUILD.gn b/chrome/browser/ui/omnibox/BUILD.gn
index ad9428f..4bf89e23 100644
--- a/chrome/browser/ui/omnibox/BUILD.gn
+++ b/chrome/browser/ui/omnibox/BUILD.gn
@@ -99,6 +99,7 @@
     ]
     deps += [
       "//chrome/app:command_ids",
+      "//chrome/app/vector_icons",
       "//chrome/browser:browser_process",
       "//chrome/browser:primitives",
       "//chrome/browser/autocomplete",
@@ -110,6 +111,7 @@
       "//chrome/browser/omnibox",
       "//chrome/browser/preloading/search_preload",
       "//chrome/browser/profiles:profile",
+      "//chrome/browser/resources/omnibox_popup:resources_grit",
       "//chrome/browser/safe_browsing",
       "//chrome/browser/search_engines",
       "//chrome/browser/ui:browser_list",
diff --git a/chrome/browser/ui/omnibox/omnibox_context_menu_controller.cc b/chrome/browser/ui/omnibox/omnibox_context_menu_controller.cc
index a9548dd..1a9ecbe 100644
--- a/chrome/browser/ui/omnibox/omnibox_context_menu_controller.cc
+++ b/chrome/browser/ui/omnibox/omnibox_context_menu_controller.cc
@@ -11,6 +11,7 @@
 
 #include "base/strings/utf_string_conversions.h"
 #include "chrome/app/chrome_command_ids.h"
+#include "chrome/app/vector_icons/vector_icons.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
@@ -18,7 +19,10 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/browser/ui/webui/webui_embedding_context.h"
 #include "chrome/grit/generated_resources.h"
+#include "chrome/grit/omnibox_popup_resources.h"
 #include "content/public/common/url_constants.h"
+#include "ui/base/models/image_model.h"
+#include "ui/gfx/image/image.h"
 
 OmniboxContextMenuController::OmniboxContextMenuController(
     BrowserWindowInterface* browser_window_interface)
@@ -31,19 +35,18 @@
 
 void OmniboxContextMenuController::BuildMenu() {
   AddRecentTabItems();
-  AddItem(IDC_OMNIBOX_CONTEXT_ADD_IMAGE, IDS_NTP_COMPOSE_ADD_IMAGE);
-  AddItem(IDC_OMNIBOX_CONTEXT_ADD_FILE, IDS_NTP_COMPOSE_ADD_FILE);
-  AddSeparator();
-  AddItem(IDC_OMNIBOX_CONTEXT_CREATE_IMAGES, IDS_NTP_COMPOSE_CREATE_IMAGES);
-  AddItem(IDC_OMNIBOX_CONTEXT_DEEP_RESEARCH, IDS_NTP_COMPOSE_DEEP_SEARCH);
+  AddStaticItems();
 }
 
 void OmniboxContextMenuController::AddItem(int id, const std::u16string str) {
   menu_model_->AddItem(id, str);
 }
 
-void OmniboxContextMenuController::AddItem(int id, int localization_id) {
-  menu_model_->AddItemWithStringId(id, localization_id);
+void OmniboxContextMenuController::AddItemWithStringIdAndIcon(
+    int id,
+    int localization_id,
+    const ui::ImageModel& icon) {
+  menu_model_->AddItemWithStringIdAndIcon(id, localization_id, icon);
 }
 
 void OmniboxContextMenuController::AddSeparator() {
@@ -53,11 +56,7 @@
 void OmniboxContextMenuController::AddRecentTabItems() {
   // Iterate through the tab strip model, getting the data for each tab.
   auto* tab_strip_model = browser_window_interface_->GetTabStripModel();
-  if (tab_strip_model->count() == 1 &&
-      !IsValidTab(TabRendererData::FromTabInModel(tab_strip_model, 0)
-                      .last_committed_url)) {
-    return;
-  }
+  size_t valid_tab_count = 0;
   AddTitleWithStringId(IDS_NTP_COMPOSE_MOST_RECENT_TABS);
   for (int i = 0; i < tab_strip_model->count(); i++) {
     TabRendererData tab_renderer_data =
@@ -67,10 +66,41 @@
       continue;
     }
     AddItem(i, tab_renderer_data.title);
+    valid_tab_count += 1;
+  }
+  if (!valid_tab_count) {
+    auto index = menu_model_->GetIndexOfCommandId(ui::MenuModel::kTitleId);
+    if (index) {
+      menu_model_->RemoveItemAt(index.value());
+      return;
+    }
   }
   AddSeparator();
 }
 
+void OmniboxContextMenuController::AddStaticItems() {
+  auto add_image_icon =
+      ui::ImageModel::FromVectorIcon(kAddPhotoAlternateIcon, ui::kColorMenuIcon,
+                                     ui::SimpleMenuModel::kDefaultIconSize);
+  AddItemWithStringIdAndIcon(IDC_OMNIBOX_CONTEXT_ADD_IMAGE,
+                             IDS_NTP_COMPOSE_ADD_IMAGE, add_image_icon);
+  auto add_file_icon =
+      ui::ImageModel::FromVectorIcon(kAttachFileIcon, ui::kColorMenuIcon,
+                                     ui::SimpleMenuModel::kDefaultIconSize);
+  AddItemWithStringIdAndIcon(IDC_OMNIBOX_CONTEXT_ADD_FILE,
+                             IDS_NTP_COMPOSE_ADD_FILE, add_file_icon);
+  AddSeparator();
+  auto deep_search_icon =
+      ui::ImageModel::FromVectorIcon(kTravelExploreIcon, ui::kColorMenuIcon,
+                                     ui::SimpleMenuModel::kDefaultIconSize);
+  AddItemWithStringIdAndIcon(IDC_OMNIBOX_CONTEXT_DEEP_RESEARCH,
+                             IDS_NTP_COMPOSE_DEEP_SEARCH, deep_search_icon);
+  auto create_images_icon = ui::ImageModel::FromResourceId(
+      IDR_OMNIBOX_POPUP_IMAGES_CREATE_IMAGES_PNG);
+  AddItemWithStringIdAndIcon(IDC_OMNIBOX_CONTEXT_CREATE_IMAGES,
+                             IDS_NTP_COMPOSE_CREATE_IMAGES, create_images_icon);
+}
+
 void OmniboxContextMenuController::AddTitleWithStringId(int localization_id) {
   menu_model_->AddTitleWithStringId(localization_id);
 }
diff --git a/chrome/browser/ui/omnibox/omnibox_context_menu_controller.h b/chrome/browser/ui/omnibox/omnibox_context_menu_controller.h
index f5e6980..c47cd4fed 100644
--- a/chrome/browser/ui/omnibox/omnibox_context_menu_controller.h
+++ b/chrome/browser/ui/omnibox/omnibox_context_menu_controller.h
@@ -11,6 +11,10 @@
 class BrowserWindowInterface;
 class GURL;
 
+namespace ui {
+class ImageModel;
+}  // namespace ui
+
 // OmniboxContextMenuController creates and manages state for the context menu
 // shown for the omnibox.
 class OmniboxContextMenuController : public ui::SimpleMenuModel::Delegate {
@@ -30,15 +34,18 @@
 
  private:
   void BuildMenu();
-
   // Adds a IDC_* style command to the menu with a string16.
   void AddItem(int id, const std::u16string str);
-  // Adds a IDC_* style command to the menu with a localized string.
-  void AddItem(int id, int localization_id);
+  // Adds a IDC_* style command to the menu with a localized string and icon.
+  void AddItemWithStringIdAndIcon(int id,
+                                  int localization_id,
+                                  const ui::ImageModel& icon);
   // Adds a separator to the menu.
   void AddSeparator();
   // Adds recent tabs as items to the menu.
   void AddRecentTabItems();
+  // Adds the static items with icons.
+  void AddStaticItems();
   // Adds a title with a localized string to the menu.
   void AddTitleWithStringId(int localization_id);
 
diff --git a/chrome/browser/ui/page_action/page_action_icon_type.cc b/chrome/browser/ui/page_action/page_action_icon_type.cc
index 456042b..52f1b42 100644
--- a/chrome/browser/ui/page_action/page_action_icon_type.cc
+++ b/chrome/browser/ui/page_action/page_action_icon_type.cc
@@ -56,6 +56,8 @@
       return &features::kPageActionsMigrationVirtualCard;
     case PageActionIconType::kFilledCardInformation:
       return &features::kPageActionsMigrationFilledCardInformation;
+    case PageActionIconType::kReadingMode:
+      return &features::kPageActionsMigrationReadingMode;
     default:
       return nullptr;
   }
diff --git a/chrome/browser/ui/page_action/page_action_icon_type.h b/chrome/browser/ui/page_action/page_action_icon_type.h
index 92a9331..b6b121a 100644
--- a/chrome/browser/ui/page_action/page_action_icon_type.h
+++ b/chrome/browser/ui/page_action/page_action_icon_type.h
@@ -49,7 +49,8 @@
   // DEPRECATED: kChangePassword = 33,
   kLensOverlayHomework = 34,
   kAiMode = 35,
-  kMaxValue = kAiMode,
+  kReadingMode = 36,
+  kMaxValue = kReadingMode,
 };
 // LINT.ThenChange(//tools/metrics/histograms/metadata/page/enums.xml:PageActionIconType)
 
@@ -86,6 +87,7 @@
               32);
 static_assert(static_cast<int>(PageActionIconType::kLensOverlayHomework) == 34);
 static_assert(static_cast<int>(PageActionIconType::kAiMode) == 35);
+static_assert(static_cast<int>(PageActionIconType::kReadingMode) == 36);
 
 // Returns a bool indicating whether the given page action type has been
 // migrated to the new framework, which is based on ActionItems instead of
diff --git a/chrome/browser/ui/read_anything/BUILD.gn b/chrome/browser/ui/read_anything/BUILD.gn
index 9e16e53..0f49e12 100644
--- a/chrome/browser/ui/read_anything/BUILD.gn
+++ b/chrome/browser/ui/read_anything/BUILD.gn
@@ -15,6 +15,8 @@
     "immersive_read_anything_overlay_view.h",
     "read_anything_controller.cc",
     "read_anything_controller.h",
+    "read_anything_entry_point_controller.cc",
+    "read_anything_entry_point_controller.h",
     "read_anything_service.cc",
     "read_anything_service.h",
     "read_anything_service_factory.cc",
@@ -44,10 +46,12 @@
   deps = [
     "//chrome/app:generated_resources",
     "//chrome/browser:browser_process",
+    "//chrome/browser/dom_distiller",
     "//chrome/browser/extensions",
     "//chrome/browser/profiles",
     "//chrome/browser/ui:ui_features",
     "//chrome/browser/ui/views/interaction",
+    "//chrome/browser/ui/views/page_action",
     "//chrome/browser/ui/views/side_panel",
     "//components/accessibility:reading",
     "//components/language/core/browser",
diff --git a/chrome/browser/ui/read_anything/read_anything_entry_point_controller.cc b/chrome/browser/ui/read_anything/read_anything_entry_point_controller.cc
new file mode 100644
index 0000000..a5d606f
--- /dev/null
+++ b/chrome/browser/ui/read_anything/read_anything_entry_point_controller.cc
@@ -0,0 +1,64 @@
+// 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/ui/read_anything/read_anything_entry_point_controller.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/ui_features.h"
+#include "chrome/browser/ui/views/page_action/page_action_controller.h"
+#include "chrome/browser/ui/views/page_action/page_action_triggers.h"
+#include "chrome/browser/ui/views/side_panel/side_panel_entry_id.h"
+#include "chrome/browser/ui/views/side_panel/side_panel_ui.h"
+#include "ui/accessibility/accessibility_features.h"
+
+namespace read_anything {
+
+// static
+void ReadAnythingEntryPointController::InvokePageAction(
+    BrowserWindowInterface* bwi,
+    const actions::ActionInvocationContext& context) {
+  if (!bwi) {
+    return;
+  }
+
+  std::underlying_type_t<page_actions::PageActionTrigger> page_action_trigger =
+      context.GetProperty(page_actions::kPageActionTriggerKey);
+  SidePanelOpenTrigger side_panel_open_trigger;
+  if (page_action_trigger == page_actions::kInvalidPageActionTrigger) {
+    side_panel_open_trigger = SidePanelOpenTrigger::kPinnedEntryToolbarButton;
+  } else {
+    side_panel_open_trigger = SidePanelOpenTrigger::kReadAnythingOmniboxChip;
+  }
+
+  // TODO(crbug.com/447418049): Open immersive reading mode via this entrypoint.
+  // TODO(crbug.com/455640523): Finalize the behavior here once UX & PM are
+  // aligned. This may only open and not close RM, or it may trigger a LHS chip
+  // after opening RM.
+  bwi->GetFeatures().side_panel_ui()->Toggle(
+      SidePanelEntryKey(SidePanelEntryId::kReadAnything),
+      side_panel_open_trigger);
+}
+
+// static
+void ReadAnythingEntryPointController::UpdatePageActionVisibility(
+    bool should_show_page_action,
+    BrowserWindowInterface* bwi) {
+  if (!base::FeatureList::IsEnabled(features::kPageActionsMigration) ||
+      !features::IsReadAnythingOmniboxChipEnabled()) {
+    return;
+  }
+
+  page_actions::PageActionController* page_action_controller =
+      bwi->GetActiveTabInterface()->GetTabFeatures()->page_action_controller();
+  if (should_show_page_action) {
+    page_action_controller->Show(kActionSidePanelShowReadAnything);
+    page_action_controller->ShowSuggestionChip(
+        kActionSidePanelShowReadAnything);
+  } else {
+    page_action_controller->Hide(kActionSidePanelShowReadAnything);
+  }
+}
+
+}  // namespace read_anything
diff --git a/chrome/browser/ui/read_anything/read_anything_entry_point_controller.h b/chrome/browser/ui/read_anything/read_anything_entry_point_controller.h
new file mode 100644
index 0000000..02de7e7
--- /dev/null
+++ b/chrome/browser/ui/read_anything/read_anything_entry_point_controller.h
@@ -0,0 +1,33 @@
+// 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 CHROME_BROWSER_UI_READ_ANYTHING_READ_ANYTHING_ENTRY_POINT_CONTROLLER_H_
+#define CHROME_BROWSER_UI_READ_ANYTHING_READ_ANYTHING_ENTRY_POINT_CONTROLLER_H_
+
+#include "chrome/browser/ui/browser_window/public/browser_window_interface.h"
+#include "ui/actions/actions.h"
+
+namespace read_anything {
+
+// Maintains and handles entrypoints for the ReadAnythingController.
+class ReadAnythingEntryPointController {
+ public:
+  ReadAnythingEntryPointController(const ReadAnythingEntryPointController&) =
+      delete;
+  ReadAnythingEntryPointController& operator=(
+      const ReadAnythingEntryPointController&) = delete;
+  ~ReadAnythingEntryPointController();
+
+  // Triggered when the omnibox chip or pinned side panel entrypoint is clicked.
+  static void InvokePageAction(BrowserWindowInterface* bwi,
+                               const actions::ActionInvocationContext& context);
+
+  // Shows or hides the omnibox entry point.
+  static void UpdatePageActionVisibility(bool should_show_page_action,
+                                         BrowserWindowInterface* bwi);
+};
+
+}  // namespace read_anything
+
+#endif  // CHROME_BROWSER_UI_READ_ANYTHING_READ_ANYTHING_ENTRY_POINT_CONTROLLER_H_
diff --git a/chrome/browser/ui/read_anything/read_anything_entry_point_controller_browsertest.cc b/chrome/browser/ui/read_anything/read_anything_entry_point_controller_browsertest.cc
new file mode 100644
index 0000000..d3e9fb0a
--- /dev/null
+++ b/chrome/browser/ui/read_anything/read_anything_entry_point_controller_browsertest.cc
@@ -0,0 +1,60 @@
+// 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/ui/read_anything/read_anything_entry_point_controller.h"
+
+#include "base/test/run_until.h"
+#include "base/test/scoped_feature_list.h"
+#include "chrome/app/chrome_command_ids.h"
+#include "chrome/browser/ui/browser.h"
+#include "chrome/browser/ui/browser_commands.h"
+#include "chrome/browser/ui/browser_window/public/browser_window_features.h"
+#include "chrome/browser/ui/tabs/public/tab_features.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
+#include "chrome/browser/ui/views/page_action/page_action_triggers.h"
+#include "chrome/browser/ui/views/side_panel/side_panel_entry_id.h"
+#include "chrome/browser/ui/views/side_panel/side_panel_ui.h"
+#include "chrome/test/base/in_process_browser_test.h"
+#include "content/public/test/browser_test.h"
+#include "ui/accessibility/accessibility_features.h"
+
+class ReadAnythingEntryPointControllerBrowserTest
+    : public InProcessBrowserTest {
+ public:
+  ReadAnythingEntryPointControllerBrowserTest() = default;
+};
+
+IN_PROC_BROWSER_TEST_F(ReadAnythingEntryPointControllerBrowserTest,
+                       ShowSidePanelFromOmnibox) {
+  auto* side_panel_ui = browser()->GetFeatures().side_panel_ui();
+  ASSERT_FALSE(side_panel_ui->IsSidePanelEntryShowing(
+      SidePanelEntryKey(SidePanelEntryId::kReadAnything)));
+  actions::ActionInvocationContext context;
+  context.SetProperty(page_actions::kPageActionTriggerKey, 1);
+
+  read_anything::ReadAnythingEntryPointController::InvokePageAction(browser(),
+                                                                    context);
+
+  ASSERT_TRUE(base::test::RunUntil([&]() {
+    return side_panel_ui->IsSidePanelEntryShowing(
+        SidePanelEntryKey(SidePanelEntryId::kReadAnything));
+  }));
+}
+
+IN_PROC_BROWSER_TEST_F(ReadAnythingEntryPointControllerBrowserTest,
+                       ShowSidePanelFromPinned) {
+  auto* side_panel_ui = browser()->GetFeatures().side_panel_ui();
+  ASSERT_FALSE(side_panel_ui->IsSidePanelEntryShowing(
+      SidePanelEntryKey(SidePanelEntryId::kReadAnything)));
+  actions::ActionInvocationContext context;
+  context.SetProperty(page_actions::kPageActionTriggerKey, -1);
+
+  read_anything::ReadAnythingEntryPointController::InvokePageAction(browser(),
+                                                                    context);
+
+  ASSERT_TRUE(base::test::RunUntil([&]() {
+    return side_panel_ui->IsSidePanelEntryShowing(
+        SidePanelEntryKey(SidePanelEntryId::kReadAnything));
+  }));
+}
diff --git a/chrome/browser/ui/read_anything/read_anything_side_panel_controller.cc b/chrome/browser/ui/read_anything/read_anything_side_panel_controller.cc
index 1238eef..0888cfc 100644
--- a/chrome/browser/ui/read_anything/read_anything_side_panel_controller.cc
+++ b/chrome/browser/ui/read_anything/read_anything_side_panel_controller.cc
@@ -11,6 +11,7 @@
 
 #include "base/check_is_test.h"
 #include "chrome/app/vector_icons/vector_icons.h"
+#include "chrome/browser/dom_distiller/tab_utils.h"
 #include "chrome/browser/language/language_model_manager_factory.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser_finder.h"
@@ -34,6 +35,7 @@
 #include "components/language/core/common/locale_util.h"
 #include "components/user_education/common/feature_promo/feature_promo_controller.h"
 #include "content/public/browser/render_frame_host.h"
+#include "read_anything_entry_point_controller.h"
 #include "read_anything_side_panel_controller.h"
 #include "services/metrics/public/cpp/ukm_builders.h"
 #include "services/metrics/public/cpp/ukm_recorder.h"
@@ -273,6 +275,24 @@
   // The page finished loading.
   loading_ = false;
   UpdateIphVisibility();
+
+  if (!features::IsReadAnythingOmniboxChipEnabled()) {
+    return;
+  }
+
+  // Readability will callback with whether or not the current contents are a
+  // good candidate for distillation.
+  // TODO(crbug.com/c/455640523): Show this entrypoint max 3 times in 3 days if
+  // it's not clicked.
+  RunReadabilityHeuristicsOnWebContents(
+      tab_->GetContents(),
+      base::BindOnce(&ReadAnythingSidePanelController::OnReadabilityResult,
+                     weak_factory_.GetWeakPtr()));
+}
+
+void ReadAnythingSidePanelController::OnReadabilityResult(bool should_show) {
+  read_anything::ReadAnythingEntryPointController::UpdatePageActionVisibility(
+      should_show, tab_->GetBrowserWindowInterface());
 }
 
 void ReadAnythingSidePanelController::PrimaryPageChanged(content::Page& page) {
diff --git a/chrome/browser/ui/read_anything/read_anything_side_panel_controller.h b/chrome/browser/ui/read_anything/read_anything_side_panel_controller.h
index e4b6e83..8fadad7c 100644
--- a/chrome/browser/ui/read_anything/read_anything_side_panel_controller.h
+++ b/chrome/browser/ui/read_anything/read_anything_side_panel_controller.h
@@ -116,6 +116,9 @@
   // visibility and background tabs do nothing.
   void UpdateIphVisibility();
 
+  // Show or hide the omnibox entry point.
+  void OnReadabilityResult(bool should_show);
+
   std::string default_language_code_;
 
   base::ObserverList<ReadAnythingSidePanelController::Observer> observers_;
diff --git a/chrome/browser/ui/read_anything/read_anything_side_panel_controller_interactive_uitest.cc b/chrome/browser/ui/read_anything/read_anything_side_panel_controller_interactive_uitest.cc
index 0025647..8608d19 100644
--- a/chrome/browser/ui/read_anything/read_anything_side_panel_controller_interactive_uitest.cc
+++ b/chrome/browser/ui/read_anything/read_anything_side_panel_controller_interactive_uitest.cc
@@ -6,6 +6,8 @@
 #include "chrome/browser/ui/browser_element_identifiers.h"
 #include "chrome/browser/ui/read_anything/read_anything_side_panel_controller.h"
 #include "chrome/browser/ui/tabs/public/tab_features.h"
+#include "chrome/browser/ui/ui_features.h"
+#include "chrome/browser/ui/views/page_action/test_support/page_action_interactive_test_mixin.h"
 #include "chrome/browser/ui/views/side_panel/side_panel_registry.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/user_education/interactive_feature_promo_test.h"
@@ -15,6 +17,7 @@
 #include "components/user_education/views/help_bubble_view.h"
 #include "content/public/test/browser_test.h"
 #include "testing/gmock/include/gmock/gmock.h"
+#include "ui/accessibility/accessibility_features.h"
 
 namespace {
 constexpr char kDocumentWithNamedElement[] = "/select.html";
@@ -163,3 +166,74 @@
       WaitForHide(
           user_education::HelpBubbleView::kHelpBubbleElementIdForTesting));
 }
+
+class ReadAnythingOmniboxTest
+    : public PageActionInteractiveTestMixin<InteractiveBrowserTest> {
+ public:
+  void SetUp() override {
+    ASSERT_TRUE(embedded_test_server()->InitializeAndListen());
+    features_.InitWithFeatures(
+        {features::kReadAnythingOmniboxChip, features::kPageActionsMigration},
+        {});
+    distillable_url_ = embedded_test_server()->GetURL("/long_text_page.html");
+    non_distillable_url_ = GURL("chrome://blank");
+    InteractiveBrowserTest::SetUp();
+  }
+
+  void SetUpOnMainThread() override {
+    InteractiveBrowserTest::SetUpOnMainThread();
+    embedded_test_server()->StartAcceptingConnections();
+  }
+
+  void TearDownOnMainThread() override {
+    EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete());
+    InteractiveBrowserTest::TearDownOnMainThread();
+  }
+
+  using PageActionInteractiveTestMixin::WaitForPageActionChipNotVisible;
+  using PageActionInteractiveTestMixin::WaitForPageActionChipVisible;
+
+  auto WaitForPageActionChipVisible() {
+    MultiStep steps;
+    steps += WaitForPageActionChipVisible(kActionSidePanelShowReadAnything);
+    return steps;
+  }
+
+  auto WaitForPageActionChipNotVisible() {
+    MultiStep steps;
+    steps += WaitForPageActionChipNotVisible(kActionSidePanelShowReadAnything);
+    return steps;
+  }
+
+  GURL distillable_url_;
+  GURL non_distillable_url_;
+  base::test::ScopedFeatureList features_;
+};
+
+IN_PROC_BROWSER_TEST_F(ReadAnythingOmniboxTest,
+                       ShowAndHideOmniboxAfterTabSwitch) {
+  DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kFirstTab);
+  DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kSecondTab);
+  RunTestSequence(
+      // First tab is non-distillable, second tab is distillable.
+      InstrumentTab(kFirstTab),
+      NavigateWebContents(kFirstTab, non_distillable_url_),
+      AddInstrumentedTab(kSecondTab, distillable_url_),
+
+      // Select the second tab, wait for chip to show.
+      SelectTab(kTabStripElementId, 1), WaitForPageActionChipVisible(),
+
+      // Select the first tab, wait for chip to hide.
+      SelectTab(kTabStripElementId, 0), WaitForPageActionChipNotVisible());
+}
+
+IN_PROC_BROWSER_TEST_F(ReadAnythingOmniboxTest,
+                       ShowAndHideOmniboxAfterNavigation) {
+  DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kActiveTab);
+  RunTestSequence(
+      InstrumentTab(kActiveTab),
+      NavigateWebContents(kActiveTab, distillable_url_),
+      WaitForWebContentsReady(kActiveTab), WaitForPageActionChipVisible(),
+      NavigateWebContents(kActiveTab, non_distillable_url_),
+      WaitForWebContentsReady(kActiveTab), WaitForPageActionChipNotVisible());
+}
diff --git a/chrome/browser/ui/tabs/organization/tab_declutter_controller.cc b/chrome/browser/ui/tabs/organization/tab_declutter_controller.cc
index 7319ddbb..1d86117 100644
--- a/chrome/browser/ui/tabs/organization/tab_declutter_controller.cc
+++ b/chrome/browser/ui/tabs/organization/tab_declutter_controller.cc
@@ -121,10 +121,7 @@
   std::map<GURL, std::vector<tabs::TabInterface*>> duplicate_tabs;
   CHECK(features::IsTabstripDedupeEnabled());
 
-  for (int tab_index = 0; tab_index < tab_strip_model_->GetTabCount();
-       tab_index++) {
-    tabs::TabInterface* tab = tab_strip_model_->GetTabAtIndex(tab_index);
-
+  for (tabs::TabInterface* tab : *tab_strip_model_) {
     if (IsTabExcluded(tab)) {
       continue;
     }
@@ -162,10 +159,7 @@
   std::vector<tabs::TabInterface*> tabs;
 
   const base::Time now = base::Time::Now();
-  for (int tab_index = 0; tab_index < tab_strip_model_->GetTabCount();
-       tab_index++) {
-    tabs::TabInterface* tab = tab_strip_model_->GetTabAtIndex(tab_index);
-
+  for (tabs::TabInterface* tab : *tab_strip_model_) {
     if (IsTabExcluded(tab)) {
       continue;
     }
@@ -247,10 +241,7 @@
     // close all the tabs except the oldest tab.
     std::vector<std::pair<tabs::TabInterface*, base::Time>> url_matching_tabs;
 
-    for (int tab_index = 0; tab_index < tab_strip_model_->GetTabCount();
-         ++tab_index) {
-      tabs::TabInterface* tab = tab_strip_model_->GetTabAtIndex(tab_index);
-
+    for (tabs::TabInterface* tab : *tab_strip_model_) {
       if (tab->GetContents()->GetLastCommittedURL().GetWithoutRef() != url) {
         continue;
       }
diff --git a/chrome/browser/ui/tabs/organization/tab_organization_session.cc b/chrome/browser/ui/tabs/organization/tab_organization_session.cc
index bc6ebc04..69a02c0 100644
--- a/chrome/browser/ui/tabs/organization/tab_organization_session.cc
+++ b/chrome/browser/ui/tabs/organization/tab_organization_session.cc
@@ -130,8 +130,7 @@
 
   // iterate through the tabstripmodel building the tab data.
   TabStripModel* tab_strip_model = browser->tab_strip_model();
-  for (int index = 0; index < tab_strip_model->count(); index++) {
-    tabs::TabInterface* tab = tab_strip_model->GetTabAtIndex(index);
+  for (tabs::TabInterface* tab : *tab_strip_model) {
     std::unique_ptr<TabData> tab_data = std::make_unique<TabData>(tab);
     if (!tab_data->IsValidForOrganizing()) {
       continue;
diff --git a/chrome/browser/ui/tabs/organization/trigger.cc b/chrome/browser/ui/tabs/organization/trigger.cc
index 8fb4bbd..99a70b3 100644
--- a/chrome/browser/ui/tabs/organization/trigger.cc
+++ b/chrome/browser/ui/tabs/organization/trigger.cc
@@ -27,8 +27,8 @@
           : nullptr;
 
   int num_eligible_tabs = 0;
-  for (int i = 0; i < model->count(); i++) {
-    const TabData tab = TabData(model->GetTabAtIndex(i));
+  for (tabs::TabInterface* tab_model : *model) {
+    const TabData tab = TabData(tab_model);
     if (service) {
       const std::optional<float> score =
           service->tab_sensitivity_cache()->GetScore(tab.original_url());
diff --git a/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_delegate_desktop.cc b/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_delegate_desktop.cc
index 5a59cb9..6509c6f 100644
--- a/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_delegate_desktop.cc
+++ b/chrome/browser/ui/tabs/saved_tab_groups/tab_group_sync_delegate_desktop.cc
@@ -317,8 +317,7 @@
 
         if (const TabStripModel* const tab_strip_model =
                 browser->GetTabStripModel()) {
-          for (int i = 0; i < tab_strip_model->count(); ++i) {
-            tabs::TabInterface* tab = tab_strip_model->GetTabAtIndex(i);
+          for (tabs::TabInterface* tab : *tab_strip_model) {
             if (tab->GetHandle().raw_value() == local_tab_id) {
               result = tab->GetContents() ? tab->GetContents()->GetTitle()
                                           : std::u16string();
@@ -365,11 +364,11 @@
     const std::map<tabs::TabInterface*, base::Uuid>& tab_guid_mapping,
     const SavedTabGroup& saved_group) {
   std::vector<int> tab_indices;
-  for (int i = 0; i < tab_strip_model->count(); ++i) {
-    if (base::Contains(tab_guid_mapping, tab_strip_model->GetTabAtIndex(i)) &&
-        !tab_strip_model->GetTabGroupForTab(i).has_value()) {
+  for (int i = 0; tabs::TabInterface* tab : *tab_strip_model) {
+    if (base::Contains(tab_guid_mapping, tab) && !tab->GetGroup().has_value()) {
       tab_indices.push_back(i);
     }
+    ++i;
   }
 
   TabGroupId tab_group_id = TabGroupId::GenerateNew();
diff --git a/chrome/browser/ui/tabs/tab_list_bridge.cc b/chrome/browser/ui/tabs/tab_list_bridge.cc
index 8f0c8d3..8e656fd 100644
--- a/chrome/browser/ui/tabs/tab_list_bridge.cc
+++ b/chrome/browser/ui/tabs/tab_list_bridge.cc
@@ -126,8 +126,8 @@
   std::vector<tabs::TabInterface*> all_tabs;
   size_t tab_count = tab_strip_->count();
   all_tabs.reserve(tab_count);
-  for (size_t i = 0; i < tab_count; ++i) {
-    all_tabs.push_back(tab_strip_->GetTabAtIndex(i));
+  for (tabs::TabInterface* tab : *tab_strip_) {
+    all_tabs.push_back(tab);
   }
   return all_tabs;
 }
diff --git a/chrome/browser/ui/ui_features.cc b/chrome/browser/ui/ui_features.cc
index a43129c6..9ee9cb39 100644
--- a/chrome/browser/ui/ui_features.cc
+++ b/chrome/browser/ui/ui_features.cc
@@ -610,6 +610,12 @@
                    "filled_card_information",
                    false);
 
+BASE_FEATURE_PARAM(bool,
+                   kPageActionsMigrationReadingMode,
+                   &kPageActionsMigration,
+                   "reading_mode",
+                   true);
+
 BASE_FEATURE(kSavePasswordsContextualUi, base::FEATURE_DISABLED_BY_DEFAULT);
 
 BASE_FEATURE(kCompositorLoadingAnimations, base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h
index e9ccdbd..fde7e0e 100644
--- a/chrome/browser/ui/ui_features.h
+++ b/chrome/browser/ui/ui_features.h
@@ -406,6 +406,7 @@
 BASE_DECLARE_FEATURE_PARAM(bool, kPageActionsMigrationAiMode);
 BASE_DECLARE_FEATURE_PARAM(bool, kPageActionsMigrationVirtualCard);
 BASE_DECLARE_FEATURE_PARAM(bool, kPageActionsMigrationFilledCardInformation);
+BASE_DECLARE_FEATURE_PARAM(bool, kPageActionsMigrationReadingMode);
 
 // Determines whether the "save password" page action displays different UI if
 // the user has said to never save passwords for that site.
diff --git a/chrome/browser/ui/views/autofill/payments/payments_view_util.cc b/chrome/browser/ui/views/autofill/payments/payments_view_util.cc
index 3fe5279..e298088 100644
--- a/chrome/browser/ui/views/autofill/payments/payments_view_util.cc
+++ b/chrome/browser/ui/views/autofill/payments/payments_view_util.cc
@@ -156,9 +156,6 @@
   is_valid_input = is_valid;
   input->SetInvalid(!is_valid);
   if (error_label) {
-    if (!is_valid) {
-      error_label->GetViewAccessibility().AnnounceAlert(error_label->GetText());
-    }
     error_label->SetVisible(!is_valid);
   }
   if (error_label_placeholder) {
@@ -166,6 +163,13 @@
   }
 }
 
+void LabeledTextfieldWithErrorMessage::MaybeAnnounceError() {
+  if (!GetInputTextField().GetText().empty() && !is_valid_input) {
+    error_label->GetViewAccessibility().AnnouncePolitely(
+        error_label->GetText());
+  }
+}
+
 ui::ImageModel GetProfileAvatar(const AccountInfo& account_info) {
   // Get the user avatar icon.
   gfx::Image account_avatar = account_info.account_image;
diff --git a/chrome/browser/ui/views/autofill/payments/payments_view_util.h b/chrome/browser/ui/views/autofill/payments/payments_view_util.h
index bb76d789..788f784 100644
--- a/chrome/browser/ui/views/autofill/payments/payments_view_util.h
+++ b/chrome/browser/ui/views/autofill/payments/payments_view_util.h
@@ -67,6 +67,10 @@
   views::Textfield& GetInputTextField() const;
 
   void SetErrorState(bool is_valid);
+
+  // Announces the error message if the current state is invalid and an error
+  // message is being shown.
+  void MaybeAnnounceError();
 };
 
 // Gets the user avatar icon if available, or else a placeholder.
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 c29d9d23..1bb2057 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
@@ -136,6 +136,13 @@
     card_number_data_.GetInputTextField().SetText(
         GetFormattedCardNumberForDisplay(
             card_number_data_.GetInputTextField().GetText()));
+    card_number_data_.MaybeAnnounceError();
+  } else if (before == &cvc_data_.GetInputTextField()) {
+    cvc_data_.MaybeAnnounceError();
+  } else if (before == &name_on_card_data_.GetInputTextField()) {
+    name_on_card_data_.MaybeAnnounceError();
+  } else if (before == &expiration_date_data_.GetInputTextField()) {
+    expiration_date_data_.MaybeAnnounceError();
   }
 }
 
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_mac.h b/chrome/browser/ui/views/frame/browser_frame_view_mac.h
index 34fd5d5..6338946 100644
--- a/chrome/browser/ui/views/frame/browser_frame_view_mac.h
+++ b/chrome/browser/ui/views/frame/browser_frame_view_mac.h
@@ -90,9 +90,6 @@
   FRIEND_TEST_ALL_PREFIXES(BrowserFrameViewMacTest,
                            GetCaptionButtonPlaceholderBounds);
 
-  // Fetches the caption button bounds from the buttons themselves.
-  BoundsAndMargins GetCaptionButtonBoundsNative() const;
-
   // Creates an inset from the caption button size which controls for which edge
   // the captions buttons exists on. Used to position elements like the tabstrip
   // that are adjacent to the caption buttons.
diff --git a/chrome/browser/ui/views/frame/browser_frame_view_mac.mm b/chrome/browser/ui/views/frame/browser_frame_view_mac.mm
index 2ea9731..72daacb 100644
--- a/chrome/browser/ui/views/frame/browser_frame_view_mac.mm
+++ b/chrome/browser/ui/views/frame/browser_frame_view_mac.mm
@@ -458,96 +458,9 @@
 }
 
 BrowserFrameViewMac::BoundsAndMargins
-BrowserFrameViewMac::GetCaptionButtonBoundsNative() const {
+BrowserFrameViewMac::GetCaptionButtonBounds() const {
   BoundsAndMargins result;
 
-  // Verify that this is not an out-of-process window.
-  const auto native_window = GetWidget()->GetNativeWindow();
-  if (auto* const host =
-          views::NativeWidgetMacNSWindowHost::GetFromNativeWindow(
-              native_window);
-      host && host->application_host()) {
-    return result;
-  }
-
-  // Verify that there is a valid NSWindow.
-  NSWindow* ns_window = native_window.GetNativeNSWindow();
-  if (!ns_window) {
-    return result;
-  }
-
-  // Build a list of caption button bounds.
-  std::vector<gfx::RectF> button_rects;
-
-  // Also track some other data that will be useful for calculating the visual
-  // margins of the buttons against the window border.
-  float min_x = width();
-  float max_x = 0;
-  float min_y = height();
-
-  // Chrome coordinates are reversed in RTL but not in the Mac API, so we might
-  // have to flip them.
-  const bool is_rtl = base::i18n::IsRTL();
-
-  // Build the list. If any of the buttons are not present or are zero size,
-  // abort (this will fall back to previous hard-coded values).
-  for (NSButton* button :
-       {[ns_window standardWindowButton:NSWindowCloseButton],
-        [ns_window standardWindowButton:NSWindowMiniaturizeButton],
-        [ns_window standardWindowButton:NSWindowZoomButton]}) {
-    if (!button) {
-      return result;
-    }
-    NSRect ns_rect = [button convertRect:[button bounds] toView:nil];
-
-    // When converting from Mac to Chrome coordinates:
-    //  - Y axis is inverted (Mac coordinates start at bottom-left).
-    //  - X axis is inverted in RTL mode only (Mac coordinates are invariant
-    //    while Chrome reverses them).
-    button_rects.emplace_back(
-        is_rtl ? width() - (ns_rect.origin.x + ns_rect.size.width)
-               : ns_rect.origin.x,
-        height() - (ns_rect.origin.y + ns_rect.size.height), ns_rect.size.width,
-        ns_rect.size.height);
-    const auto& rect = button_rects.back();
-    if (rect.IsEmpty()) {
-      return result;
-    }
-    min_x = std::min(min_x, rect.x());
-    max_x = std::max(max_x, rect.right());
-    min_y = std::min(min_y, rect.y());
-  }
-
-  // Calculate the margins that the buttons are using.
-  const float block_margin = min_y;
-  const float inline_margin =
-      CaptionButtonsOnLeadingEdge() ? min_x : width() - max_x;
-
-  // Accumulate the button bounds.
-  for (const auto& rect : button_rects) {
-    result.bounds.Union(rect);
-  }
-
-  // Apply the margins on the exterior of the region, so that the padding around
-  // the buttons appears visually symmetrical.
-  result.margins = gfx::OutsetsF::VH(block_margin, inline_margin);
-
-  return result;
-}
-
-BrowserFrameViewMac::BoundsAndMargins
-BrowserFrameViewMac::GetCaptionButtonBounds() const {
-  BoundsAndMargins result = GetCaptionButtonBoundsNative();
-  if (!result.bounds.IsEmpty()) {
-    return result;
-  }
-
-  // If that doesn't work, fall back to some hard-coded constants. These will
-  // apply for app windows, since the app is out of process and the caption
-  // buttons can't be retrieved. Note that the app window actually positions its
-  // buttons slightly differently from a standard browser window (it's unclear
-  // why).
-  //
   // These are empirically determined; feel free to change them if they're
   // not precise.
   if (@available(macOS 26, *)) {
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc
index 21c0f3d..5898923 100644
--- a/chrome/browser/ui/views/frame/browser_view.cc
+++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -874,8 +874,7 @@
 
   browser_->tab_strip_model()->AddObserver(this);
 
-  main_region_ = AddChildView(std::make_unique<MainRegionView>());
-  main_region_->SetVisible(false);
+  main_region_ = AddChildView(std::make_unique<MainRegionView>(*this));
 
   main_container_ = AddChildView(std::make_unique<MainContainerView>(*this));
 
@@ -4077,13 +4076,14 @@
   overlay_view_tracker_.view()->SetVisible(false);
   top_container()->DestroyLayer();
 
-  AddChildView(tab_strip_region_view_);
-  if (web_app_frame_toolbar_) {
-    AddChildView(web_app_frame_toolbar_);
-  }
   if (web_app_window_title_) {
-    AddChildView(web_app_window_title_);
+    AddChildViewAt(web_app_window_title_.get(), 0);
   }
+  if (web_app_frame_toolbar_) {
+    AddChildViewAt(web_app_frame_toolbar_.get(), 0);
+  }
+
+  AddChildViewAt(tab_strip_region_view_.get(), 0);
 
   main_container_->AddChildViewAt(top_container(), 0);
   EnsureFocusOrder();
@@ -5153,6 +5153,7 @@
   layout_views.browser_view = this;
   layout_views.window_scrim = window_scrim_view_;
   layout_views.main_container = main_container_;
+  layout_views.main_region = main_region_;
   layout_views.top_container = top_container_;
   layout_views.web_app_frame_toolbar = web_app_frame_toolbar_;
   layout_views.web_app_window_title = web_app_window_title_;
diff --git a/chrome/browser/ui/views/frame/layout/browser_view_layout.h b/chrome/browser/ui/views/frame/layout/browser_view_layout.h
index 9ebee937..1f906e9 100644
--- a/chrome/browser/ui/views/frame/layout/browser_view_layout.h
+++ b/chrome/browser/ui/views/frame/layout/browser_view_layout.h
@@ -48,6 +48,7 @@
   // NOTE: If you add a view, try to add it as a views::View, which makes
   // testing much easier.
   raw_ptr<views::View> window_scrim = nullptr;
+  raw_ptr<views::View> main_region = nullptr;
   raw_ptr<views::View> main_container = nullptr;
   raw_ptr<views::View> top_container = nullptr;
   raw_ptr<WebAppFrameToolbarView> web_app_frame_toolbar = nullptr;
diff --git a/chrome/browser/ui/views/frame/layout/browser_view_layout_impl.cc b/chrome/browser/ui/views/frame/layout/browser_view_layout_impl.cc
index fcfe837..ad8a8504 100644
--- a/chrome/browser/ui/views/frame/layout/browser_view_layout_impl.cc
+++ b/chrome/browser/ui/views/frame/layout/browser_view_layout_impl.cc
@@ -15,6 +15,7 @@
 #include "base/trace_event/trace_event.h"
 #include "build/build_config.h"
 #include "chrome/browser/ui/layout_constants.h"
+#include "chrome/browser/ui/tabs/tab_style.h"
 #include "chrome/browser/ui/views/bookmarks/bookmark_bar_view.h"
 #include "chrome/browser/ui/views/frame/browser_frame_view.h"
 #include "chrome/browser/ui/views/frame/immersive_mode_controller.h"
@@ -25,12 +26,17 @@
 #include "chrome/browser/ui/views/infobars/infobar_container_view.h"
 #include "chrome/browser/ui/views/side_panel/side_panel.h"
 #include "chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_view.h"
+#include "ui/gfx/geometry/rect.h"
 #include "ui/views/controls/separator.h"
 #include "ui/views/layout/flex_layout_types.h"
 #include "ui/views/layout/proposed_layout.h"
 
 namespace {
 
+// The insets for main region and its containing views when the
+// toolbar_height_side_panel is visible.
+constexpr int kContainerInsetPadding = 8 + views::Separator::kThickness;
+
 // Shorthand for validating both `child` and `parent` and checking that one is
 // parented to the other. Ignores child visibility.
 bool IsParentedTo(const views::View* child, const views::View* parent) {
@@ -59,9 +65,17 @@
 // Gets the bounds for a `view`, placed between the exclusion zones in `params`
 // if they are present.
 gfx::Rect GetBoundsWithExclusion(const BrowserLayoutParams& params,
-                                 const views::View* view) {
-  const auto leading = params.leading_exclusion.ContentWithPadding();
-  const auto trailing = params.trailing_exclusion.ContentWithPadding();
+                                 const views::View* view,
+                                 int leading_margin = 0,
+                                 int trailing_margin = 0) {
+  const auto leading =
+      leading_margin ? params.leading_exclusion.ContentWithPaddingAndInsets(
+                           leading_margin, 0.f)
+                     : params.leading_exclusion.ContentWithPadding();
+  const auto trailing =
+      trailing_margin ? params.trailing_exclusion.ContentWithPaddingAndInsets(
+                            trailing_margin, 0.f)
+                      : params.trailing_exclusion.ContentWithPadding();
   int height = base::ClampCeil(std::max(leading.height(), trailing.height()));
   if (height) {
     height = std::max(height, view->GetMinimumSize().height());
@@ -314,8 +328,14 @@
     gfx::Rect tabstrip_bounds;
     const bool tabstrip_visible = delegate().ShouldDrawTabStrip();
     if (tabstrip_visible) {
+      // Inset the leading edge of the tabstrip by the size of the swoop of the
+      // first tab; this is especially important for Mac, where the negative
+      // space of the caption button margins and the edge of the tabstrip should
+      // overlap. The trailing edge receives the usual treatment, as it is the
+      // new tab button and not a tab.
       tabstrip_bounds =
-          GetBoundsWithExclusion(params, views().tab_strip_region_view);
+          GetBoundsWithExclusion(params, views().tab_strip_region_view,
+                                 TabStyle::Get()->GetBottomCornerRadius());
       // TODO(https://crbug.com/454583671): Figure out if we always want to
       // apply TABSTRIP_TOOLBAR_OVERLAP, or whether it should not apply to
       // toolbar height side panel.
@@ -332,23 +352,40 @@
   // Lay out toolbar-height side panel.
   if (IsParentedToAndVisible(views().toolbar_height_side_panel,
                              views().browser_view)) {
+    const gfx::Rect main_region_bounds(
+        x, std::max(y, params.visual_client_area.y()),
+        params.visual_client_area.width(),
+        params.visual_client_area.bottom() - params.visual_client_area.y());
+    layout.AddChild(views().main_region, main_region_bounds, true);
+
     const int width =
         views().toolbar_height_side_panel->GetPreferredSize().width();
     const int visible_width = base::ClampFloor(
         width * views().toolbar_height_side_panel->GetAnimationValue());
     const int top = std::max(
-        y, params.visual_client_area.y() +
-               base::ClampCeil(
-                   params.leading_exclusion.ContentWithPadding().height()));
+        y + kContainerInsetPadding,
+        params.visual_client_area.y() +
+            base::ClampCeil(
+                params.leading_exclusion.ContentWithPadding().height()));
     gfx::Rect toolbar_height_bounds(x - (width - visible_width), top, width,
                                     params.visual_client_area.bottom() - top);
     x = toolbar_height_bounds.right();
     layout.AddChild(views().toolbar_height_side_panel, toolbar_height_bounds);
+  } else {
+    // Set the main_region bounds to 0 since it should only be visible when
+    // toolbar height side panel is visible.
+    layout.AddChild(views().main_region, gfx::Rect(), false);
   }
 
   // Layout the main container.
-  const gfx::Rect main_bounds(x, y, params.visual_client_area.width() - x,
-                              params.visual_client_area.height() - y);
+  gfx::Rect main_bounds(x, y, params.visual_client_area.width() - x,
+                        params.visual_client_area.height() - y);
+
+  if (IsParentedToAndVisible(views().toolbar_height_side_panel,
+                             views().browser_view)) {
+    main_bounds.Inset(kContainerInsetPadding);
+  }
+
   const BrowserLayoutParams main_params =
       params.InLocalCoordinates(main_bounds);
   ProposedLayout& main_layout =
@@ -558,9 +595,15 @@
     gfx::Rect tabstrip_bounds;
     const bool tabstrip_visible = delegate().ShouldDrawTabStrip();
     if (tabstrip_visible) {
+      // When there is an exclusion, inset the leading edge of the tabstrip by
+      // the size of the swoop of the first tab; this is especially important
+      // for Mac, where the negative space of the caption button margins and the
+      // edge of the tabstrip should overlap. The trailing edge receives the
+      // usual treatment, as it is the new tab button and not a tab.
       tabstrip_bounds =
           needs_exclusion
-              ? GetBoundsWithExclusion(params, views().tab_strip_region_view)
+              ? GetBoundsWithExclusion(params, views().tab_strip_region_view,
+                                       TabStyle::Get()->GetBottomCornerRadius())
               : gfx::Rect(
                     params.visual_client_area.x(), y,
                     params.visual_client_area.width(),
diff --git a/chrome/browser/ui/views/frame/layout/browser_view_layout_params.cc b/chrome/browser/ui/views/frame/layout/browser_view_layout_params.cc
index 7583b28..963de06 100644
--- a/chrome/browser/ui/views/frame/layout/browser_view_layout_params.cc
+++ b/chrome/browser/ui/views/frame/layout/browser_view_layout_params.cc
@@ -28,6 +28,14 @@
 
 }  // namespace
 
+gfx::SizeF BrowserLayoutExclusionArea::ContentWithPaddingAndInsets(
+    float horizontal_inset,
+    float vertical_inset) const {
+  return gfx::SizeF(
+      content.width() + std::max(0.f, horizontal_padding - horizontal_inset),
+      content.height() + std::max(0.f, vertical_padding - vertical_inset));
+}
+
 bool BrowserLayoutParams::IsEmpty() const {
   return visual_client_area.IsEmpty();
 }
diff --git a/chrome/browser/ui/views/frame/layout/browser_view_layout_params.h b/chrome/browser/ui/views/frame/layout/browser_view_layout_params.h
index 97fb74af..e9f2e54 100644
--- a/chrome/browser/ui/views/frame/layout/browser_view_layout_params.h
+++ b/chrome/browser/ui/views/frame/layout/browser_view_layout_params.h
@@ -44,6 +44,11 @@
                       content.height() + vertical_padding);
   }
 
+  // As ContentWithPadding(), but subtracts the insets `horizontal_inset` and
+  // `vertical_inset` from the margins, with a minimum margin of zero.
+  gfx::SizeF ContentWithPaddingAndInsets(float horizontal_inset,
+                                         float vertical_inset) const;
+
   // Returns true if there is no exclusion area.
   bool IsEmpty() const { return ContentWithPadding().IsEmpty(); }
 };
diff --git a/chrome/browser/ui/views/frame/main_region_view.cc b/chrome/browser/ui/views/frame/main_region_view.cc
index eece6aa..b0594e6 100644
--- a/chrome/browser/ui/views/frame/main_region_view.cc
+++ b/chrome/browser/ui/views/frame/main_region_view.cc
@@ -4,10 +4,16 @@
 
 #include "chrome/browser/ui/views/frame/main_region_view.h"
 
+#include "chrome/browser/ui/views/frame/top_container_background.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/gfx/canvas.h"
 
-MainRegionView::MainRegionView() = default;
+MainRegionView::MainRegionView(BrowserView& browser_view)
+    : browser_view_(browser_view) {}
 MainRegionView::~MainRegionView() = default;
 
-BEGIN_METADATA(MainRegionView)
-END_METADATA
+void MainRegionView::OnPaint(gfx::Canvas* canvas) {
+  TopContainerBackground::PaintBackground(canvas, this, &browser_view_.get());
+}
+
+BEGIN_METADATA(MainRegionView) END_METADATA
diff --git a/chrome/browser/ui/views/frame/main_region_view.h b/chrome/browser/ui/views/frame/main_region_view.h
index 1c0e682..19282137 100644
--- a/chrome/browser/ui/views/frame/main_region_view.h
+++ b/chrome/browser/ui/views/frame/main_region_view.h
@@ -5,6 +5,8 @@
 #ifndef CHROME_BROWSER_UI_VIEWS_FRAME_MAIN_REGION_VIEW_H_
 #define CHROME_BROWSER_UI_VIEWS_FRAME_MAIN_REGION_VIEW_H_
 
+#include "base/memory/raw_ptr.h"
+#include "ui/gfx/canvas.h"
 #include "ui/views/view.h"
 
 // This wrapper view primarily serves to hold the MainContainer and
@@ -13,10 +15,15 @@
   METADATA_HEADER(MainRegionView, views::View)
 
  public:
-  MainRegionView();
+  explicit MainRegionView(BrowserView& browser_view);
   MainRegionView(const MainRegionView&) = delete;
   MainRegionView& operator=(const MainRegionView&) = delete;
   ~MainRegionView() override;
+
+  void OnPaint(gfx::Canvas* canvas) override;
+
+ private:
+  raw_ref<BrowserView> browser_view_;
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_FRAME_MAIN_REGION_VIEW_H_
diff --git a/chrome/browser/ui/views/page_action/action_ids.h b/chrome/browser/ui/views/page_action/action_ids.h
index dcc5222..92120491 100644
--- a/chrome/browser/ui/views/page_action/action_ids.h
+++ b/chrome/browser/ui/views/page_action/action_ids.h
@@ -15,12 +15,13 @@
 // All ActionIds associated with a page action.
 // For now, the order of the page actions will be based on their position in
 // the array.
-inline constexpr std::array<actions::ActionId, 19> kActionIds = {
+inline constexpr std::array<actions::ActionId, 20> kActionIds = {
     kActionAiMode,
     kActionSidePanelShowLensOverlayResults,
     kActionShowTranslate,
     kActionShowMemorySaverChip,
     kActionShowIntentPicker,
+    kActionSidePanelShowReadAnything,
     kActionZoomNormal,
     kActionOffersAndRewardsForPage,
     kActionShowFileSystemAccess,
diff --git a/chrome/browser/ui/views/page_action/page_action_icon_controller.cc b/chrome/browser/ui/views/page_action/page_action_icon_controller.cc
index b1ffb1b..6764330 100644
--- a/chrome/browser/ui/views/page_action/page_action_icon_controller.cc
+++ b/chrome/browser/ui/views/page_action/page_action_icon_controller.cc
@@ -301,6 +301,9 @@
                       params.browser, params.icon_label_bubble_delegate,
                       params.page_action_icon_delegate));
         break;
+      case PageActionIconType::kReadingMode:
+        // Do nothing as this action was added after the migration.
+        break;
     }
   }
 
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 01d7959..f333726 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
@@ -63,6 +63,13 @@
             },
         },
         {
+            kActionSidePanelShowReadAnything,
+            {
+                .histogram_name = "ReadingMode",
+                .type = PageActionIconType::kReadingMode,
+            },
+        },
+        {
             kActionOffersAndRewardsForPage,
             {
                 .histogram_name = "PaymentsOfferNotification",
diff --git a/chrome/browser/ui/views/page_action/test_support/page_action_interactive_test_mixin.h b/chrome/browser/ui/views/page_action/test_support/page_action_interactive_test_mixin.h
index 0ccd4869..a71c19a 100644
--- a/chrome/browser/ui/views/page_action/test_support/page_action_interactive_test_mixin.h
+++ b/chrome/browser/ui/views/page_action/test_support/page_action_interactive_test_mixin.h
@@ -60,6 +60,24 @@
     T::AddDescriptionPrefix(steps, "WaitForPageActionChipVisible()");
     return steps;
   }
+
+  // Utility to reliably wait for the page action view to not be visible in chip
+  // state.
+  auto WaitForPageActionChipNotVisible(actions::ActionId action_id) {
+    auto steps = T::Steps(
+        T::PollState(kPageActionButtonVisible,
+                     [this, action_id]() {
+                       auto* view =
+                           BrowserView::GetBrowserViewForBrowser(T::browser())
+                               ->toolbar_button_provider()
+                               ->GetPageActionView(action_id);
+                       return view->GetVisible() && !view->is_animating_label();
+                     }),
+        T::WaitForState(kPageActionButtonVisible, false),
+        T::StopObservingState(kPageActionButtonVisible));
+    T::AddDescriptionPrefix(steps, "WaitForPageActionChipNotVisible()");
+    return steps;
+  }
 };
 
 #endif  // CHROME_BROWSER_UI_VIEWS_PAGE_ACTION_TEST_SUPPORT_PAGE_ACTION_INTERACTIVE_TEST_MIXIN_H_
diff --git a/chrome/browser/ui/views/side_panel/glic/glic_side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/glic/glic_side_panel_coordinator.cc
index 0961bc6..ef4dd8c 100644
--- a/chrome/browser/ui/views/side_panel/glic/glic_side_panel_coordinator.cc
+++ b/chrome/browser/ui/views/side_panel/glic/glic_side_panel_coordinator.cc
@@ -76,7 +76,7 @@
   side_panel_registry_->Register(std::move(entry));
 }
 
-void GlicSidePanelCoordinator::Show() {
+void GlicSidePanelCoordinator::Show(bool suppress_animations) {
   auto* window_side_panel_coordinator = GetWindowSidePanelCoordinator();
   if (!window_side_panel_coordinator || !entry_) {
     return;
@@ -90,7 +90,11 @@
     }
     return;
   }
-  window_side_panel_coordinator->Show(SidePanelEntry::Id::kGlic);
+  SidePanelUIBase::UniqueKey unique_key{
+      .tab_handle = tab_->GetHandle(),
+      .key = SidePanelEntry::Key(SidePanelEntry::Id::kGlic)};
+  window_side_panel_coordinator->Show(unique_key, std::nullopt,
+                                      suppress_animations);
 }
 
 void GlicSidePanelCoordinator::Close() {
diff --git a/chrome/browser/ui/views/side_panel/glic/glic_side_panel_coordinator.h b/chrome/browser/ui/views/side_panel/glic/glic_side_panel_coordinator.h
index 7d94707..9b83d698 100644
--- a/chrome/browser/ui/views/side_panel/glic/glic_side_panel_coordinator.h
+++ b/chrome/browser/ui/views/side_panel/glic/glic_side_panel_coordinator.h
@@ -53,7 +53,7 @@
   };
 
   // Show the Glic side panel.
-  void Show();
+  void Show(bool suppress_animations = false);
 
   // Close the Glic side panel.
   void Close();
diff --git a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
index 66a8e4e..613f868 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
+++ b/chrome/browser/ui/views/side_panel/side_panel_coordinator.cc
@@ -321,9 +321,7 @@
     SidePanelEntry::PanelType type) {
   window_registry_->ClearCachedEntryViews(type);
   TabStripModel* model = browser_view_->browser()->tab_strip_model();
-  for (int index = 0; index < model->count(); ++index) {
-    auto* tab =
-        browser_view_->browser()->tab_strip_model()->GetTabAtIndex(index);
+  for (tabs::TabInterface* tab : *model) {
     tab->GetTabFeatures()->side_panel_registry()->ClearCachedEntryViews(type);
   }
 }
diff --git a/chrome/browser/ui/views/side_panel/side_panel_enums.h b/chrome/browser/ui/views/side_panel/side_panel_enums.h
index 96f8e266..5d503c5a 100644
--- a/chrome/browser/ui/views/side_panel/side_panel_enums.h
+++ b/chrome/browser/ui/views/side_panel/side_panel_enums.h
@@ -34,7 +34,8 @@
   kNewTabFooter = 21,
   kNewTabPageCustomizationPromo = 22,
   kNewTabPageAutomaticCustomizeChrome = 23,
-  kMaxValue = kNewTabPageAutomaticCustomizeChrome,
+  kReadAnythingOmniboxChip = 24,
+  kMaxValue = kReadAnythingOmniboxChip,
 };
 
 enum class SidePanelContentState {
diff --git a/chrome/browser/ui/views/toolbar/toolbar_view.cc b/chrome/browser/ui/views/toolbar/toolbar_view.cc
index cf944eb..db2f4de 100644
--- a/chrome/browser/ui/views/toolbar/toolbar_view.cc
+++ b/chrome/browser/ui/views/toolbar/toolbar_view.cc
@@ -69,6 +69,7 @@
 #include "chrome/browser/ui/views/page_action/page_action_view.h"
 #include "chrome/browser/ui/views/performance_controls/battery_saver_button.h"
 #include "chrome/browser/ui/views/performance_controls/performance_intervention_button.h"
+#include "chrome/browser/ui/views/side_panel/side_panel.h"
 #include "chrome/browser/ui/views/tabs/tab_strip.h"
 #include "chrome/browser/ui/views/tabs/tab_strip_controller.h"
 #include "chrome/browser/ui/views/toolbar/app_menu.h"
@@ -182,7 +183,6 @@
 
 constexpr int kBrowserAppMenuRefreshExpandedMargin = 5;
 constexpr int kBrowserAppMenuRefreshCollapsedMargin = 2;
-
 // Draws background akin to the tabstrip.
 class TabstripLikeBackground : public views::Background {
  public:
@@ -194,10 +194,18 @@
   void Paint(gfx::Canvas* canvas, views::View* view) const override {
     bool painted = TopContainerBackground::PaintThemeCustomImage(canvas, view,
                                                                  browser_view_);
+
     if (!painted) {
-      SkColor frame_color =
-          browser_view_->browser_widget()->GetFrameView()->GetFrameColor(
-              BrowserFrameActiveState::kUseCurrent);
+      SkColor frame_color;
+      // If the toolbar height side panel is visible, background should be
+      // painted the same as the toolbar rather than tab strip.
+      if (browser_view_->toolbar_height_side_panel()->GetVisible()) {
+        frame_color = view->GetColorProvider()->GetColor(kColorToolbar);
+      } else {
+        frame_color =
+            browser_view_->browser_widget()->GetFrameView()->GetFrameColor(
+                BrowserFrameActiveState::kUseCurrent);
+      }
       canvas->DrawColor(frame_color);
     }
   }
diff --git a/chrome/browser/ui/views/user_education/browser_user_education_service.cc b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
index c022935..b09241b 100644
--- a/chrome/browser/ui/views/user_education/browser_user_education_service.cc
+++ b/chrome/browser/ui/views/user_education/browser_user_education_service.cc
@@ -657,7 +657,8 @@
               .SetHighlightedMenuItem(
                   ExtensionsMenuModel::kVisitChromeWebStoreMenuItem)));
       break;
-    case feature_engagement::kCustomUiChipIph:
+    case feature_engagement::kCustomUiChipIphV1:
+    case feature_engagement::kCustomUiChipIphV2:
     case feature_engagement::kCustomUIPlainLinkIph:
       registry.RegisterFeature(std::move(
           user_education::FeaturePromoSpecification::CreateForCustomUi(
diff --git a/chrome/browser/ui/web_applications/navigation_capturing_process.cc b/chrome/browser/ui/web_applications/navigation_capturing_process.cc
index 01d7bff5..2b10c8b 100644
--- a/chrome/browser/ui/web_applications/navigation_capturing_process.cc
+++ b/chrome/browser/ui/web_applications/navigation_capturing_process.cc
@@ -8,7 +8,6 @@
 #include "base/feature_list.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/strings/string_split.h"
-#include "base/time/clock.h"
 #include "base/types/optional_util.h"
 #include "chrome/browser/profiles/profile.h"
 #include "chrome/browser/ui/browser.h"
@@ -876,8 +875,7 @@
     return;
   }
 
-  counter_service->OnWebContentsCreated(*iwa_opener_app_id, &web_contents,
-                                        provider->clock().Now());
+  counter_service->OnWebContentsCreated(*iwa_opener_app_id, &web_contents);
 }
 
 // static
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/extensions_zero_state_promo_interactive_uitest.cc b/chrome/browser/ui/webui/extensions_zero_state_promo/extensions_zero_state_promo_interactive_uitest.cc
index 3e61831..78a1a8f 100644
--- a/chrome/browser/ui/webui/extensions_zero_state_promo/extensions_zero_state_promo_interactive_uitest.cc
+++ b/chrome/browser/ui/webui/extensions_zero_state_promo/extensions_zero_state_promo_interactive_uitest.cc
@@ -120,13 +120,13 @@
           feature_engagement::kIPHExtensionsZeroStatePromoFeature, false)));
 }
 
-class ExtensionsZeroStateCustomUiChipIphTest
+class ExtensionsZeroStateCustomUiChipIphTestV1
     : public ExtensionsZeroStatePromoTestBase {
  public:
-  ExtensionsZeroStateCustomUiChipIphTest()
+  ExtensionsZeroStateCustomUiChipIphTestV1()
       : ExtensionsZeroStatePromoTestBase(
             feature_engagement::IPHExtensionsZeroStatePromoVariant::
-                kCustomUiChipIph) {}
+                kCustomUiChipIphV1) {}
 
   const DeepQuery kDismissButton{"extensions-zero-state-promo-app",
                                  "#dismissButton"};
@@ -142,8 +142,7 @@
 // Test showing the zero state promo custom ui IPH (chips variant) with no
 // extensions installed. Clicking on the coupon chip button should open a
 // page to the Chrome Web Store.
-// TODO(crbug.com/419854475): Re-enable this test once the bug is fixed.
-IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTest,
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV1,
                        ClickCouponChipOnZeroStatePromoIph) {
   RunTestSequence(
       InstrumentTab(kFirstTabContents, 0),
@@ -170,8 +169,7 @@
 // Test showing the zero state promo custom ui IPH (chips variant) with no
 // extensions installed. Clicking on the writing chip button should open a
 // page to the Chrome Web Store.
-// TODO(crbug.com/419854475): Re-enable this test once the bug is fixed.
-IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTest,
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV1,
                        ClickWritingChipOnZeroStatePromoIph) {
   RunTestSequence(
       InstrumentTab(kFirstTabContents, 0),
@@ -198,8 +196,7 @@
 // Test showing the zero state promo custom ui IPH (chips variant) with no
 // extensions installed. Clicking on the productivity chip button should open a
 // page to the Chrome Web Store.
-// TODO(crbug.com/419854475): Re-enable this test once the bug is fixed.
-IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTest,
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV1,
                        ClickProductivityChipOnZeroStatePromoIph) {
   RunTestSequence(
       InstrumentTab(kFirstTabContents, 0),
@@ -225,8 +222,7 @@
 // Test showing the zero state promo custom ui IPH (chips variant) with no
 // extensions installed. Clicking on the ai chip button should open a
 // page to the Chrome Web Store.
-// TODO(crbug.com/419854475): Re-enable this test once the bug is fixed.
-IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTest,
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV1,
                        ClickAiChipOnZeroStatePromoIph) {
   RunTestSequence(
       InstrumentTab(kFirstTabContents, 0),
@@ -249,8 +245,7 @@
           zero_state_promo::mojom::WebStoreLinkClicked::kAi, 1));
 }
 
-// TODO(crbug.com/419854475): Re-enable this test once the bug is fixed.
-IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTest,
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV1,
                        DismissPromoIph) {
   RunTestSequence(
       InstrumentTab(kFirstTabContents, 0),
@@ -273,7 +268,166 @@
 
 // Test that IPH does not show when the user does not have the PromotionEnabled
 // policy.
-IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTest,
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV1,
+                       RespectPromotionEnabledPolicy) {
+  g_browser_process->local_state()->SetBoolean(prefs::kPromotionsEnabled,
+                                               false);
+  RunTestSequence(
+      InstrumentTab(kFirstTabContents),
+      NavigateWebContents(kFirstTabContents, GURL(chrome::kChromeUIAboutURL)),
+      InAnyContext(CheckPromoRequested(
+          feature_engagement::kIPHExtensionsZeroStatePromoFeature, false)));
+}
+
+class ExtensionsZeroStateCustomUiChipIphTestV2
+    : public ExtensionsZeroStatePromoTestBase {
+ public:
+  ExtensionsZeroStateCustomUiChipIphTestV2()
+      : ExtensionsZeroStatePromoTestBase(
+            feature_engagement::IPHExtensionsZeroStatePromoVariant::
+                kCustomUiChipIphV2) {}
+
+  const DeepQuery kDismissButton{"extensions-zero-state-promo-app",
+                                 "#dismissButton"};
+  const DeepQuery kCouponButton{"extensions-zero-state-promo-app",
+                                "#couponsButton"};
+  const DeepQuery kWebstoreButton{"extensions-zero-state-promo-app",
+                                  "#webStoreButton"};
+  const DeepQuery kProductivityButton{"extensions-zero-state-promo-app",
+                                      "#productivityButton"};
+  const DeepQuery kAiButton{"extensions-zero-state-promo-app", "#aiButton"};
+};
+
+// Test showing the zero state promo custom ui IPH (chips variant) with no
+// extensions installed. Clicking on the coupon chip button should open a
+// page to the Chrome Web Store.
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV2,
+                       ClickCouponChipOnZeroStatePromoIph) {
+  RunTestSequence(
+      InstrumentTab(kFirstTabContents, 0),
+      NavigateWebContents(kFirstTabContents, GURL(chrome::kChromeUIAboutURL)),
+      WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting),
+      InstrumentNonTabWebView(kZeroStatePromoWebUiIphId,
+                              CustomWebUIHelpBubble::kWebViewIdForTesting),
+      WaitForWebContentsReady(
+          kZeroStatePromoWebUiIphId,
+          GURL(chrome::kChromeUIExtensionsZeroStatePromoURL)),
+      CheckZeroStatePromoLinkClickCount(
+          zero_state_promo::mojom::WebStoreLinkClicked::kCoupon, 0),
+      ClickElement(kZeroStatePromoWebUiIphId, kCouponButton,
+                   ExecuteJsMode::kFireAndForget),
+      WaitForHide(CustomWebUIHelpBubble::kWebViewIdForTesting),
+      WaitForTabOpenedTo(
+          1, GURL("https://chromewebstore.google.com/category/extensions/"
+                  "lifestyle/"
+                  "shopping?utm_source=ext_zero_state_promo_chips_iph_v2")),
+      CheckZeroStatePromoLinkClickCount(
+          zero_state_promo::mojom::WebStoreLinkClicked::kCoupon, 1));
+}
+
+// Test showing the zero state promo custom ui IPH (chips variant) with no
+// extensions installed. Clicking on the web store chip button should open a
+// page to the Chrome Web Store.
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV2,
+                       ClickWebstoreChipOnZeroStatePromoIph) {
+  RunTestSequence(
+      InstrumentTab(kFirstTabContents, 0),
+      NavigateWebContents(kFirstTabContents, GURL(chrome::kChromeUIAboutURL)),
+      WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting),
+      InstrumentNonTabWebView(kZeroStatePromoWebUiIphId,
+                              CustomWebUIHelpBubble::kWebViewIdForTesting),
+      WaitForWebContentsReady(
+          kZeroStatePromoWebUiIphId,
+          GURL(chrome::kChromeUIExtensionsZeroStatePromoURL)),
+      CheckZeroStatePromoLinkClickCount(
+          zero_state_promo::mojom::WebStoreLinkClicked::kWriting, 0),
+      ClickElement(kZeroStatePromoWebUiIphId, kWebstoreButton,
+                   ExecuteJsMode::kFireAndForget),
+      WaitForHide(CustomWebUIHelpBubble::kWebViewIdForTesting),
+      WaitForTabOpenedTo(1, GURL("https://"
+                                 "chromewebstore.google.com/?utm_source="
+                                 "ext_zero_state_promo_chips_iph_v2")),
+      CheckZeroStatePromoLinkClickCount(
+          zero_state_promo::mojom::WebStoreLinkClicked::kDiscoverExtension, 1));
+}
+
+// Test showing the zero state promo custom ui IPH (chips variant) with no
+// extensions installed. Clicking on the productivity chip button should open a
+// page to the Chrome Web Store.
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV2,
+                       ClickProductivityChipOnZeroStatePromoIph) {
+  RunTestSequence(
+      InstrumentTab(kFirstTabContents, 0),
+      NavigateWebContents(kFirstTabContents, GURL(chrome::kChromeUIAboutURL)),
+      WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting),
+      InstrumentNonTabWebView(kZeroStatePromoWebUiIphId,
+                              CustomWebUIHelpBubble::kWebViewIdForTesting),
+      WaitForWebContentsReady(
+          kZeroStatePromoWebUiIphId,
+          GURL(chrome::kChromeUIExtensionsZeroStatePromoURL)),
+      CheckZeroStatePromoLinkClickCount(
+          zero_state_promo::mojom::WebStoreLinkClicked::kProductivity, 0),
+      ClickElement(kZeroStatePromoWebUiIphId, kProductivityButton,
+                   ExecuteJsMode::kFireAndForget),
+      WaitForHide(CustomWebUIHelpBubble::kWebViewIdForTesting),
+      WaitForTabOpenedTo(
+          1, GURL("https://chromewebstore.google.com/collection/"
+                  "productivity?utm_source=ext_zero_state_promo_chips_iph_v2")),
+      CheckZeroStatePromoLinkClickCount(
+          zero_state_promo::mojom::WebStoreLinkClicked::kProductivity, 1));
+}
+
+// Test showing the zero state promo custom ui IPH (chips variant) with no
+// extensions installed. Clicking on the ai chip button should open a
+// page to the Chrome Web Store.
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV2,
+                       ClickAiChipOnZeroStatePromoIph) {
+  RunTestSequence(
+      InstrumentTab(kFirstTabContents, 0),
+      NavigateWebContents(kFirstTabContents, GURL(chrome::kChromeUIAboutURL)),
+      WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting),
+      InstrumentNonTabWebView(kZeroStatePromoWebUiIphId,
+                              CustomWebUIHelpBubble::kWebViewIdForTesting),
+      WaitForWebContentsReady(
+          kZeroStatePromoWebUiIphId,
+          GURL(chrome::kChromeUIExtensionsZeroStatePromoURL)),
+      CheckZeroStatePromoLinkClickCount(
+          zero_state_promo::mojom::WebStoreLinkClicked::kAi, 0),
+      ClickElement(kZeroStatePromoWebUiIphId, kAiButton,
+                   ExecuteJsMode::kFireAndForget),
+      WaitForHide(CustomWebUIHelpBubble::kWebViewIdForTesting),
+      WaitForTabOpenedTo(
+          1,
+          GURL("https://chromewebstore.google.com/collection/"
+               "ai_productivity?utm_source=ext_zero_state_promo_chips_iph_v2")),
+      CheckZeroStatePromoLinkClickCount(
+          zero_state_promo::mojom::WebStoreLinkClicked::kAi, 1));
+}
+
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV2,
+                       DismissPromoIph) {
+  RunTestSequence(
+      InstrumentTab(kFirstTabContents, 0),
+      NavigateWebContents(kFirstTabContents, GURL(chrome::kChromeUIAboutURL)),
+      WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting),
+      InstrumentNonTabWebView(kZeroStatePromoWebUiIphId,
+                              CustomWebUIHelpBubble::kWebViewIdForTesting),
+      WaitForWebContentsReady(
+          kZeroStatePromoWebUiIphId,
+          GURL(chrome::kChromeUIExtensionsZeroStatePromoURL)),
+      ClickElement(kZeroStatePromoWebUiIphId, kDismissButton,
+                   ExecuteJsMode::kFireAndForget),
+      WaitForHide(CustomWebUIHelpBubble::kWebViewIdForTesting),
+      CheckResult(
+          [this] { return browser()->tab_strip_model()->GetTabCount(); }, 1,
+          "CheckTabCount"),
+      CheckZeroStatePromoClosedReason(
+          user_education::FeaturePromoClosedReason::kDismiss));
+}
+
+// Test that IPH does not show when the user does not have the PromotionEnabled
+// policy.
+IN_PROC_BROWSER_TEST_F(ExtensionsZeroStateCustomUiChipIphTestV2,
                        RespectPromotionEnabledPolicy) {
   g_browser_process->local_state()->SetBoolean(prefs::kPromotionsEnabled,
                                                false);
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.cc b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.cc
index 2d4f514..3b98eae2 100644
--- a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.cc
+++ b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler.cc
@@ -48,12 +48,20 @@
       break;
   }
 
-  std::string_view utm_source =
-      (feature_engagement::IPHExtensionsZeroStatePromoVariant::
-           kCustomUiChipIph ==
-       feature_engagement::kIPHExtensionsZeroStatePromoVariantParam.Get())
-          ? extension_urls::kCustomUiChipIphUtmSource
-          : extension_urls::kCustomUiPlainLinkIphUtmSource;
+  std::string_view utm_source;
+  switch (feature_engagement::kIPHExtensionsZeroStatePromoVariantParam.Get()) {
+    case feature_engagement::IPHExtensionsZeroStatePromoVariant::
+        kCustomUiChipIphV1:
+      utm_source = extension_urls::kCustomUiChipIphV1UtmSource;
+      break;
+    case feature_engagement::IPHExtensionsZeroStatePromoVariant::
+        kCustomUiChipIphV2:
+      utm_source = extension_urls::kCustomUiChipIphV2UtmSource;
+      break;
+    default:
+      utm_source = extension_urls::kCustomUiPlainLinkIphUtmSource;
+      break;
+  }
   GURL url_with_utm = extension_urls::AppendUtmSource(url, utm_source);
 
   NavigateParams params(profile_, url_with_utm,
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler_browsertest.cc b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler_browsertest.cc
index 0fc4215..88f5cfc 100644
--- a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler_browsertest.cc
+++ b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_page_handler_browsertest.cc
@@ -11,6 +11,8 @@
 #include "chrome/browser/ui/tabs/tab_strip_model.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chrome/test/base/ui_test_utils.h"
+#include "components/feature_engagement/public/feature_constants.h"
+#include "components/feature_engagement/test/scoped_iph_feature_list.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/browser_test.h"
 #include "extensions/common/extension_urls.h"
@@ -25,7 +27,16 @@
 
 class ZeroStatePromoPageHandlerTest : public InProcessBrowserTest {
  public:
-  ZeroStatePromoPageHandlerTest() {}
+  ZeroStatePromoPageHandlerTest() {
+    feature_list_.InitAndEnableFeaturesWithParameters(
+        {base::test::FeatureRefAndParams(
+            feature_engagement::kIPHExtensionsZeroStatePromoFeature,
+            {{feature_engagement::kIPHExtensionsZeroStatePromoVariantParam.name,
+              feature_engagement::kIPHExtensionsZeroStatePromoVariantParam
+                  .GetName(
+                      feature_engagement::IPHExtensionsZeroStatePromoVariant::
+                          kCustomUiChipIphV2)}})});
+  }
 
   void SetUpOnMainThread() override {
     InProcessBrowserTest::SetUpOnMainThread();
@@ -58,7 +69,7 @@
  protected:
   GURL GetExpectedUrlWithUtm(std::string_view base_url) {
     return extension_urls::AppendUtmSource(
-        GURL(base_url), extension_urls::kCustomUiPlainLinkIphUtmSource);
+        GURL(base_url), extension_urls::kCustomUiChipIphV2UtmSource);
   }
 
   void TestWebStoreLink(const WebStoreLinkTestCase& test_case) {
@@ -75,6 +86,9 @@
 
   std::unique_ptr<ZeroStatePromoPageHandler> handler_;
   std::unique_ptr<base::HistogramTester> histogram_tester_;
+
+ private:
+  feature_engagement::test::ScopedIphFeatureList feature_list_;
 };
 
 IN_PROC_BROWSER_TEST_F(ZeroStatePromoPageHandlerTest,
diff --git a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.cc b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.cc
index 929ecd9..c7c750e 100644
--- a/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.cc
+++ b/chrome/browser/ui/webui/extensions_zero_state_promo/zero_state_promo_ui.cc
@@ -58,6 +58,8 @@
        IDS_EXTENSIONS_ZERO_STATE_IPH_PRODUCTIVITY_CATEGORY_LINK},
       {"extensionsZeroStateIphAiProductivityCollectionLink",
        IDS_EXTENSIONS_ZERO_STATE_IPH_AI_PRODUCTIVITY_COLLECTION_LINK},
+      {"extensionsZeroStateIphWebStoreLink",
+       IDS_EXTENSIONS_ZERO_STATE_IPH_WEB_STORE_LINK},
       {"extensionsZeroStateIphCloseButtonLabel",
        IDS_EXTENSIONS_ZERO_STATE_IPH_DISMISS_BUTTON_TEXT},
       {"extensionsZeroStateIphCustomActionButtonLabel",
@@ -67,9 +69,15 @@
 
   feature_engagement::IPHExtensionsZeroStatePromoVariant promoVariant =
       feature_engagement::kIPHExtensionsZeroStatePromoVariantParam.Get();
-  source->AddBoolean("showChipsUi",
+  source->AddBoolean("showPlainLinksUi",
                      feature_engagement::IPHExtensionsZeroStatePromoVariant::
-                             kCustomUiChipIph == promoVariant);
+                             kCustomUIPlainLinkIph == promoVariant);
+  source->AddBoolean("showChipsUiV1",
+                     feature_engagement::IPHExtensionsZeroStatePromoVariant::
+                             kCustomUiChipIphV1 == promoVariant);
+  source->AddBoolean("showChipsUiV2",
+                     feature_engagement::IPHExtensionsZeroStatePromoVariant::
+                             kCustomUiChipIphV2 == promoVariant);
 
   webui::SetupWebUIDataSource(
       source, kExtensionsZeroStatePromoResources,
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom b/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
index 8a1206e6971..216e4c0 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page.mojom
@@ -253,6 +253,8 @@
   GetModulesOrder() => (array<string> module_ids);
   // Triggers a call to |SetModulesLoadable|.
   UpdateModulesLoadable();
+  // Updates the visibility of the action chips in the NTP on any pref changes.
+  UpdateActionChipsVisibility();
   // Triggers a call to |FooterVisibilityUpdated|.
   UpdateFooterVisibility();
   // Attempts to trigger the specified in product help promo.
@@ -305,6 +307,8 @@
   // Allows modules to load on NTP when the UI has postponed module loading for
   // some reason.
   SetModulesLoadable();
+  // Sets the action chips visibility.
+  SetActionChipsVisibility(bool visible);
   // Sets NTP homepage promo.
   SetPromo(Promo? promo);
   // Shows a toast with information about Chrome Webstore themes.
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
index 7d624ce..71fd38d 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -575,6 +575,11 @@
       prefs::kSeedColorChangeCount,
       base::BindRepeating(&NewTabPageHandler::MaybeShowWebstoreToast,
                           base::Unretained(this)));
+
+  pref_change_registrar_.Add(
+      prefs::kNtpToolChipsVisible,
+      base::BindRepeating(&NewTabPageHandler::UpdateActionChipsVisibility,
+                          base::Unretained(this)));
 }
 
 NewTabPageHandler::~NewTabPageHandler() {
@@ -838,6 +843,10 @@
   }
 }
 
+void NewTabPageHandler::UpdateActionChipsVisibility() {
+  page_->SetActionChipsVisibility(IsActionChipsVisible());
+}
+
 void NewTabPageHandler::UpdateFooterVisibility() {
   if (!base::FeatureList::IsEnabled(ntp_features::kNtpFooter)) {
     return;
@@ -1299,6 +1308,10 @@
              : ntp_tiles::TileType::kTopSites;
 }
 
+bool NewTabPageHandler::IsActionChipsVisible() const {
+  return profile_->GetPrefs()->GetBoolean(prefs::kNtpToolChipsVisible);
+}
+
 bool NewTabPageHandler::IsShortcutsVisible() const {
   return profile_->GetPrefs()->GetBoolean(ntp_prefs::kNtpShortcutsVisible);
 }
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h
index 98d1f75..4f61f6f 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.h
@@ -141,6 +141,7 @@
   void SetModulesOrder(const std::vector<std::string>& module_ids) override;
   void GetModulesOrder(GetModulesOrderCallback callback) override;
   void UpdateModulesLoadable() override;
+  void UpdateActionChipsVisibility() override;
   void MaybeShowFeaturePromo(
       new_tab_page::mojom::IphFeature iph_feature) override;
   void OnAppRendered(double time) override;
@@ -207,6 +208,7 @@
                         std::unique_ptr<std::string> body);
 
   ntp_tiles::TileType GetTileType() const;
+  bool IsActionChipsVisible() const;
   bool IsShortcutsVisible() const;
   void MaybeLaunchInteractionSurvey(std::string_view interaction,
                                     const std::string& module_id,
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_browsertest.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_browsertest.cc
index 6dc9929..7cdfbf7 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_browsertest.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_browsertest.cc
@@ -65,6 +65,7 @@
               SetDisabledModules,
               (bool, const std::vector<std::string>&));
   MOCK_METHOD(void, SetModulesLoadable, ());
+  MOCK_METHOD(void, SetActionChipsVisibility, (bool));
   MOCK_METHOD(void, SetModulesFreVisibility, (bool));
   MOCK_METHOD(void, SetCustomizeChromeSidePanelVisibility, (bool));
   MOCK_METHOD(void, SetPromo, (new_tab_page::mojom::PromoPtr));
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc
index bd67c0b6..fe61f87 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler_unittest.cc
@@ -115,6 +115,7 @@
   MOCK_METHOD(void, SetModulesLoadable, ());
   MOCK_METHOD(void, SetModulesFreVisibility, (bool));
   MOCK_METHOD(void, SetCustomizeChromeSidePanelVisibility, (bool));
+  MOCK_METHOD(void, SetActionChipsVisibility, (bool));
   MOCK_METHOD(void, SetPromo, (new_tab_page::mojom::PromoPtr));
   MOCK_METHOD(void, ShowWebstoreToast, ());
   MOCK_METHOD(void, SetWallpaperSearchButtonVisibility, (bool));
@@ -1214,6 +1215,21 @@
   mock_page_.FlushForTesting();
 }
 
+// Tests that UpdateActionChipsVisibility calls the page with
+// SetActionChipsVisibility
+TEST_F(NewTabPageHandlerTest, UpdateActionChipsVisibility) {
+  bool visible;
+  EXPECT_CALL(mock_page_, SetActionChipsVisibility)
+      .Times(1)
+      .WillOnce([&visible](bool visible_arg) { visible = visible_arg; });
+
+  profile_->GetPrefs()->SetBoolean(prefs::kNtpToolChipsVisible, true);
+  mock_page_.FlushForTesting();
+
+  EXPECT_TRUE(visible);
+  EXPECT_TRUE(profile_->GetPrefs()->GetBoolean(prefs::kNtpToolChipsVisible));
+}
+
 // TODO (crbug/1521350): Fails when ChromeRefresh2023 is enabled.
 TEST_F(NewTabPageHandlerTest, DISABLED_MaybeShowFeaturePromo_CustomizeChrome) {
   EXPECT_CALL(*mock_feature_promo_helper_, IsSigninModalDialogOpen)
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
index 7a6134d4..49d4012 100644
--- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
+++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_ui.cc
@@ -617,6 +617,12 @@
 
   source->AddBoolean("composeboxShowSubmit", ntp_composebox::kShowSubmit.Get());
 
+  // Action Chips LoadTimeData
+  bool show_action_chips =
+      aim_eligibility_service && aim_eligibility_service->IsAimEligible() &&
+      profile->GetPrefs()->GetBoolean(prefs::kNtpToolChipsVisible);
+  source->AddBoolean("actionChipsEnabled", show_action_chips);
+
   // User education browser promos.
   int browser_promo_limit = 0;
   int browser_completed_promo_limit = 0;
diff --git a/chrome/browser/visited_url_ranking/desktop_tab_model_url_visit_data_fetcher.cc b/chrome/browser/visited_url_ranking/desktop_tab_model_url_visit_data_fetcher.cc
index 57572ffa..efe9883 100644
--- a/chrome/browser/visited_url_ranking/desktop_tab_model_url_visit_data_fetcher.cc
+++ b/chrome/browser/visited_url_ranking/desktop_tab_model_url_visit_data_fetcher.cc
@@ -64,8 +64,8 @@
         }
 
         TabStripModel* const tab_strip_model = browser->GetTabStripModel();
-        for (int i = 0; i < tab_strip_model->GetTabCount(); ++i) {
-          auto* web_contents = tab_strip_model->GetWebContentsAt(i);
+        for (tabs::TabInterface* tab : *tab_strip_model) {
+          auto* web_contents = tab->GetContents();
           auto* last_entry =
               web_contents->GetController().GetLastCommittedEntry();
           if (!last_entry || last_entry->GetTimestamp() < options.begin_time) {
@@ -101,8 +101,6 @@
             tab_data.tab_count += 1;
           }
 
-          tabs::TabInterface* tab = tab_strip_model->GetTabAtIndex(i);
-
           tab_data.pinned = tab_data.pinned || tab->IsPinned();
           tab_data.in_group = tab_data.in_group || tab->GetGroup().has_value();
         }
diff --git a/chrome/browser/web_applications/commands/fetch_manifest_and_update_command.cc b/chrome/browser/web_applications/commands/fetch_manifest_and_update_command.cc
index e340612..d531371c 100644
--- a/chrome/browser/web_applications/commands/fetch_manifest_and_update_command.cc
+++ b/chrome/browser/web_applications/commands/fetch_manifest_and_update_command.cc
@@ -24,6 +24,7 @@
 #include "content/public/browser/page_manifest_manager.h"
 #include "content/public/browser/web_contents.h"
 #include "third_party/blink/public/common/manifest/manifest_util.h"
+#include "third_party/blink/public/mojom/manifest/manifest_manager.mojom.h"
 #include "url/gurl.h"
 
 namespace web_app {
@@ -83,17 +84,23 @@
       return;
   }
   data_retriever_ = lock_->web_contents_manager().CreateDataRetriever();
-  manifest_fetch_subscription_ =
-      data_retriever_->GetPrimaryPageFirstSpecifiedManifest(
-          lock_->shared_web_contents(),
-          base::BindOnce(&FetchManifestAndUpdateCommand::OnManifestRetrieved,
-                         weak_factory_.GetWeakPtr()));
+  data_retriever_->GetPrimaryPageFirstSpecifiedManifest(
+      lock_->shared_web_contents(),
+      base::BindOnce(&FetchManifestAndUpdateCommand::OnManifestRetrieved,
+                     weak_factory_.GetWeakPtr()));
 }
 
 void FetchManifestAndUpdateCommand::OnManifestRetrieved(
     const base::expected<blink::mojom::ManifestPtr,
                          blink::mojom::RequestManifestErrorPtr>& result) {
   if (!result.has_value()) {
+    GetMutableDebugValue().Set("manifest_error",
+                               base::ToString(result.error()->error));
+    for (const auto& error : result.error()->details) {
+      GetMutableDebugValue()
+          .EnsureList("manifest_error_details")
+          ->Append(error->message);
+    }
     CompleteAndSelfDestruct(
         CommandResult::kSuccess,
         FetchManifestAndUpdateResult::kManifestRetrievalError);
@@ -103,18 +110,23 @@
 
   const blink::mojom::Manifest& manifest = *result.value();
   if (blink::IsEmptyManifest(manifest)) {
+    GetMutableDebugValue().Set("manifest_error", "empty");
     CompleteAndSelfDestruct(CommandResult::kSuccess,
                             FetchManifestAndUpdateResult::kInvalidManifest);
     return;
   }
 
   if (manifest.id != expected_manifest_id_) {
+    GetMutableDebugValue().Set("manifest_id",
+                               manifest.id.possibly_invalid_spec());
+    GetMutableDebugValue().Set("manifest_error", "manifest_id_mismatch");
     CompleteAndSelfDestruct(CommandResult::kSuccess,
                             FetchManifestAndUpdateResult::kInvalidManifest);
     return;
   }
 
   if (!manifest.has_valid_specified_start_url) {
+    GetMutableDebugValue().Set("manifest_error", "no_specified_start_url");
     CompleteAndSelfDestruct(CommandResult::kSuccess,
                             FetchManifestAndUpdateResult::kInvalidManifest);
     return;
@@ -129,6 +141,7 @@
     }
   }
   if (!has_any_icon) {
+    GetMutableDebugValue().Set("manifest_error", "no_any_icon");
     CompleteAndSelfDestruct(CommandResult::kFailure,
                             FetchManifestAndUpdateResult::kInvalidManifest);
     return;
diff --git a/chrome/browser/web_applications/commands/fetch_manifest_and_update_command.h b/chrome/browser/web_applications/commands/fetch_manifest_and_update_command.h
index 31b2190..41c45782 100644
--- a/chrome/browser/web_applications/commands/fetch_manifest_and_update_command.h
+++ b/chrome/browser/web_applications/commands/fetch_manifest_and_update_command.h
@@ -5,7 +5,6 @@
 #ifndef CHROME_BROWSER_WEB_APPLICATIONS_COMMANDS_FETCH_MANIFEST_AND_UPDATE_COMMAND_H_
 #define CHROME_BROWSER_WEB_APPLICATIONS_COMMANDS_FETCH_MANIFEST_AND_UPDATE_COMMAND_H_
 
-#include "base/callback_list.h"
 #include "base/memory/weak_ptr.h"
 #include "chrome/browser/web_applications/commands/fetch_manifest_and_update_result.h"
 #include "chrome/browser/web_applications/commands/web_app_command.h"
@@ -70,7 +69,6 @@
   std::unique_ptr<WebAppInstallInfo> install_info_;
 
   std::unique_ptr<ManifestToWebAppInstallInfoJob> manifest_to_install_info_job_;
-  base::CallbackListSubscription manifest_fetch_subscription_;
 
   base::WeakPtrFactory<FetchManifestAndUpdateCommand> weak_factory_{this};
 };
diff --git a/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service.cc b/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service.cc
index 90f908e..0cf139f 100644
--- a/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service.cc
@@ -4,9 +4,7 @@
 
 #include "chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service.h"
 
-#include <algorithm>
 #include <memory>
-#include <tuple>
 #include <utility>
 #include <vector>
 
@@ -16,7 +14,6 @@
 #include "base/i18n/message_formatter.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
-#include "base/time/time.h"
 #include "chrome/browser/notifications/notification_display_service.h"
 #include "chrome/browser/notifications/notification_display_service_factory.h"
 #include "chrome/browser/notifications/notification_handler.h"
@@ -31,7 +28,6 @@
 #include "chrome/browser/web_applications/web_app_sync_bridge.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/webapps/common/web_app_id.h"
-#include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/browser/web_contents_observer.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -43,11 +39,6 @@
 
 constexpr int kMaxNotificationShowCount = 3;
 
-// The time window to check for a burst of opened tabs.
-constexpr base::TimeDelta kBurstWindow = base::Seconds(7);
-// The number of tabs opened within the window to trigger a notification.
-constexpr int kBurstThreshold = 3;
-
 constexpr std::string_view
     kIsolatedWebAppsOpenedTabsCounterNotificationPattern =
         "isolated_web_apps_opened_tabs_counter_notification_%s";
@@ -67,18 +58,14 @@
 
 struct IsolatedWebAppsOpenedTabsCounterService::TrackedTabData {
   TrackedTabData(const webapps::AppId& app_id,
-                 base::Time creation_time,
                  std::unique_ptr<TabObserver> observer)
-      : app_id(app_id),
-        creation_time(creation_time),
-        observer(std::move(observer)) {}
+      : app_id(app_id), observer(std::move(observer)) {}
   ~TrackedTabData() = default;
 
   TrackedTabData(TrackedTabData&&) = default;
   TrackedTabData& operator=(TrackedTabData&&) = default;
 
   webapps::AppId app_id;
-  base::Time creation_time;
   std::unique_ptr<TabObserver> observer;
 };
 
@@ -151,18 +138,16 @@
     ~IsolatedWebAppsOpenedTabsCounterService() = default;
 
 void IsolatedWebAppsOpenedTabsCounterService::Shutdown() {
-  for (const auto& [app_id, _] : app_tab_timestamps_) {
+  for (const auto& [app_id, _] : app_tab_counts_) {
     CloseNotification(app_id);
   }
 
-  app_tab_timestamps_.clear();
+  app_tab_counts_.clear();
   tracked_tabs_.clear();
 }
-
 void IsolatedWebAppsOpenedTabsCounterService::OnWebContentsCreated(
     const webapps::AppId& opener_app_id,
-    content::WebContents* new_contents,
-    base::Time navigation_start_time) {
+    content::WebContents* new_contents) {
   if (!base::Contains(notification_states_cache_, opener_app_id)) {
     const web_app::WebApp* web_app =
         web_app::WebAppProvider::GetForWebApps(profile())
@@ -176,10 +161,10 @@
   }
 
   if (tracked_tabs_
-          .try_emplace(new_contents, opener_app_id, navigation_start_time,
+          .try_emplace(new_contents, opener_app_id,
                        std::make_unique<TabObserver>(new_contents, this))
           .second) {
-    AddTabTimestampForApp(opener_app_id, navigation_start_time);
+    IncrementTabCountForApp(opener_app_id);
     UpdateOrRemoveNotificationForOpener(opener_app_id);
   }
 }
@@ -192,61 +177,35 @@
   }
 
   webapps::AppId opener_app_id = it->second.app_id;
-  base::Time creation_time = it->second.creation_time;
   tracked_tabs_.erase(it);
 
-  RemoveTabTimestampForApp(opener_app_id, creation_time);
+  DecrementTabCountForApp(opener_app_id);
   UpdateOrRemoveNotificationForOpener(opener_app_id);
 }
 
-void IsolatedWebAppsOpenedTabsCounterService::AddTabTimestampForApp(
-    const webapps::AppId& app_id,
-    base::Time timestamp) {
-  app_tab_timestamps_[app_id].push_back(timestamp);
+void IsolatedWebAppsOpenedTabsCounterService::IncrementTabCountForApp(
+    const webapps::AppId& app_id) {
+  app_tab_counts_[app_id]++;
 }
 
-void IsolatedWebAppsOpenedTabsCounterService::RemoveTabTimestampForApp(
-    const webapps::AppId& app_id,
-    base::Time timestamp) {
-  auto it = app_tab_timestamps_.find(app_id);
-  if (it == app_tab_timestamps_.end()) {
+void IsolatedWebAppsOpenedTabsCounterService::DecrementTabCountForApp(
+    const webapps::AppId& app_id) {
+  if (!base::Contains(app_tab_counts_, app_id)) {
     return;
   }
+  CHECK(app_tab_counts_[app_id] > 0);
 
-  auto& timestamps = it->second;
-  std::erase(timestamps, timestamp);
-
-  if (timestamps.empty()) {
-    app_tab_timestamps_.erase(it);
+  app_tab_counts_[app_id]--;
+  if (app_tab_counts_[app_id] == 0) {
+    app_tab_counts_.erase(app_id);
   }
 }
 
 void IsolatedWebAppsOpenedTabsCounterService::
     UpdateOrRemoveNotificationForOpener(const webapps::AppId& app_id) {
-  int tab_count = 0;
-
-  if (auto it = app_tab_timestamps_.find(app_id);
-      it != app_tab_timestamps_.end()) {
-    auto& timestamps = it->second;
-
-    // Prune timestamps older than the burst window.
-    const base::Time cutoff = base::Time::Now() - kBurstWindow;
-    std::erase_if(timestamps,
-                  [cutoff](const base::Time& t) { return t < cutoff; });
-    tab_count = timestamps.size();
-    if (tab_count == 0) {
-      app_tab_timestamps_.erase(it);
-    }
-  }
-
-  // If there are no longer any tracked tabs for this app, close the
-  // corresponding notification if it's active.
-  if (tab_count == 0) {
-    if (apps_with_active_notifications_.contains(app_id)) {
-      CloseNotification(app_id);
-    }
-    return;
-  }
+  auto tab_count_it = app_tab_counts_.find(app_id);
+  int tab_count =
+      (tab_count_it == app_tab_counts_.end()) ? 0 : tab_count_it->second;
 
   auto notification_state_it = notification_states_cache_.find(app_id);
 
@@ -260,34 +219,28 @@
   }
   auto& notification_state = notification_state_it->second;
 
-  if (notification_state.acknowledged() ||
-      notification_state.times_shown() >= kMaxNotificationShowCount) {
-    return;
-  }
-
-  if (tab_count >= kBurstThreshold) {
-    if (!apps_with_active_notifications_.contains(app_id)) {
-      RegisterFirstTimeActiveAppNotification(app_id);
+  // Conditions to close or suppress the notification:
+  // 1. Not enough tabs are open.
+  // 2. Notification has been shown the maximum number of times.
+  // 3. User has permanently dismissed it.
+  if (tab_count <= 1 ||
+      notification_state.times_shown() >= kMaxNotificationShowCount ||
+      notification_state.acknowledged()) {
+    if (apps_with_active_notifications_.contains(app_id)) {
+      CloseNotification(app_id);
+      PersistNotificationState(app_id);
     }
-    CreateAndDisplayNotification(app_id, tab_count);
-  }
-}
-
-void IsolatedWebAppsOpenedTabsCounterService::
-    RegisterFirstTimeActiveAppNotification(const webapps::AppId& app_id) {
-  auto it = notification_states_cache_.find(app_id);
-
-  if (it == notification_states_cache_.end()) {
     return;
   }
 
-  auto& notification_state = it->second;
+  if (!apps_with_active_notifications_.contains(app_id)) {
+    notification_state = IsolationData::OpenedTabsCounterNotificationState(
+        notification_state.acknowledged(),
+        notification_state.times_shown() + 1);
+    apps_with_active_notifications_.insert(app_id);
+  }
 
-  notification_state = IsolationData::OpenedTabsCounterNotificationState(
-      notification_state.acknowledged(), notification_state.times_shown() + 1);
-
-  apps_with_active_notifications_.insert(app_id);
-
+  CreateAndDisplayNotification(app_id, tab_count);
   PersistNotificationState(app_id);
 }
 
@@ -366,9 +319,9 @@
   }
 
   for (content::WebContents* web_contents : web_contents_to_close) {
-    // Closing the WebContents will trigger its observer, which in turn will
-    // call HandleTabClosure, removing the contents from `tracked_tabs_` and
-    // removing the timestamp.
+    // Closing the WebContents will trigger its WebContentsDestroyed observer,
+    // which in turn will call HandleTabClosure, removing the contents
+    // from `tracked_tabs_` and decrementing counts.
     web_contents->Close();
   }
 }
diff --git a/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service.h b/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service.h
index 13c20b7..e238cc2b 100644
--- a/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service.h
+++ b/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service.h
@@ -31,21 +31,20 @@
 // permission by default upon installation. As a result,
 // these apps can open multiple new windows/tabs programmatically.
 // To mitigate potential abuse of this permission and to not confuse the user,
-// this service tracks `WebContents` (tabs or windows) opened by each
-// non-policy-installed IWA to detect a burst of activity.
+// this service tracks the number of active `WebContents` (tabs or windows)
+// opened by each non-policy-installed IWA.
 //
 // The service works by:
-// 1. Being notified via the `OnWebContentsCreated` method when an IWA creates a
-//    new `WebContents`. It records the creation timestamp for that tab.
-// 2. Attaching an observer to the new `WebContents` to monitor its lifecycle.
-// 3. Each time a new tab is opened, it checks how many tabs were opened by the
-//    same app within a short time window (7 seconds). If the count
-//    reaches a certain threshold (currently equal to 3), a notification is
+// 1. Being notified directly by the navigation system (via the
+//    `OnWebContentsCreated` method) when an IWA creates a new `WebContents`.
+// 2. Incrementing a counter for that IWA and attaching an observer to the new
+//    `WebContents` to monitor its lifecycle.
+// 3. When the count of opened windows for an IWA exceeds 1, a notification is
 //    displayed.
-// 4. The notification informs the user and provides actions to either close all
-//    tabs opened by the app or manage its "Pop-ups and Redirects" permission.
-// 5. When a tracked `WebContents` is destroyed, its timestamp is removed. The
-//    notification remains visible
+// 4. The notification informs the user and provides an action to manage the
+//    app's content settings.
+// 5. When a tracked `WebContents` is destroyed, the observer notifies the
+//    service to decrement the count and update or remove the notification.
 class IsolatedWebAppsOpenedTabsCounterService : public KeyedService {
  public:
   using CloseWebContentsCallback =
@@ -63,8 +62,7 @@
   // Called by the `web_app::NavigationCapturingProcess` when a new WebContents
   // is created by an IWA.
   void OnWebContentsCreated(const webapps::AppId& opener_app_id,
-                            content::WebContents* new_contents,
-                            base::Time navigation_start_time);
+                            content::WebContents* new_contents);
 
   void OnNotificationAcknowledged(const webapps::AppId& app_id);
   void CloseNotification(const webapps::AppId& app_id);
@@ -99,13 +97,10 @@
   // Called by `TabObserver` when a tracked WebContents is destroyed.
   void HandleTabClosure(content::WebContents* contents);
 
-  void AddTabTimestampForApp(const webapps::AppId& app_id,
-                             base::Time timestamp);
-  void RemoveTabTimestampForApp(const webapps::AppId& app_id,
-                                base::Time timestamp);
+  void IncrementTabCountForApp(const webapps::AppId& app_id);
+  void DecrementTabCountForApp(const webapps::AppId& app_id);
 
   void UpdateOrRemoveNotificationForOpener(const webapps::AppId& app_id);
-  void RegisterFirstTimeActiveAppNotification(const webapps::AppId& app_id);
   void CreateAndDisplayNotification(const webapps::AppId& app_id,
                                     int current_tab_count);
   void CloseAllWebContentsOpenedByApp(const webapps::AppId& app_id);
@@ -116,7 +111,7 @@
 
   const raw_ref<Profile> profile_;
 
-  base::flat_map<webapps::AppId, std::vector<base::Time>> app_tab_timestamps_;
+  base::flat_map<webapps::AppId, int> app_tab_counts_;
 
   // Tracks WebContents opened by IWAs, mapping each to its opener's AppId
   // and an observer that handles its destruction.
diff --git a/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service_browsertest.cc b/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service_browsertest.cc
index a08c68e..8b458935 100644
--- a/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service_browsertest.cc
+++ b/chrome/browser/web_applications/isolated_web_apps/window_management/isolated_web_apps_opened_tabs_counter_service_browsertest.cc
@@ -141,14 +141,14 @@
       content::WebContents* opener_contents,
       const GURL& child_url,
       const webapps::AppId& app_id,
-      int expected_tabs_count_in_notification,
+      int expected_window_count_in_notification,
       base::test::TestFuture<void>& notification_added_future,
       std::string app_display_name = kIsolatedApp1DefaultName) {
     content::WebContents* child_contents =
         OpenChildWindowFromIwaBrowser(opener_contents, child_url);
 
     EXPECT_TRUE(notification_added_future.Wait());
-    CheckNotificationContents(app_id, expected_tabs_count_in_notification,
+    CheckNotificationContents(app_id, expected_window_count_in_notification,
                               app_display_name);
 
     notification_added_future.Clear();
@@ -164,7 +164,7 @@
 
   void CheckNotificationContents(
       const webapps::AppId& app_id,
-      int opened_tabs_count,
+      int opened_window_count,
       std::string app_display_name = kIsolatedApp1DefaultName) {
     std::optional<message_center::Notification> notification =
         display_service_tester_->GetNotification(
@@ -176,7 +176,7 @@
     EXPECT_EQ(notification->title(), expected_title);
 
     std::u16string expected_message =
-        base::NumberToString16(opened_tabs_count) +
+        base::NumberToString16(opened_window_count) +
         u" new Chrome tabs have been opened by this app. You "
         u"can manage this behavior under \"Pop-ups and Redirects\" permission.";
     EXPECT_EQ(notification->message(), expected_message);
@@ -207,28 +207,33 @@
   display_service_tester_->SetNotificationAddedClosure(
       notification_added_future.GetRepeatingCallback());
 
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/app1/child1"));
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/app1/child2"));
-
+  content::WebContents* iwa_child_browser1_contents =
+      OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
+                                    GURL("https://example.com/app1/child1"));
   ASSERT_FALSE(notification_added_future.IsReady());
 
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/app1/child3"));
+  content::WebContents* iwa_child_browser2_contents =
+      OpenChildWindowAndExpectNotificationContents(
+          iwa_opener_web_contents, GURL("https://example.com/app1/child2"),
+          app_id,
+          /*expected_window_count_in_notification=*/2,
+          notification_added_future, kIsolatedApp1DefaultName);
 
-  EXPECT_TRUE(notification_added_future.Wait());
-  CheckNotificationContents(app_id, /*opened_tabs_count=*/3,
-                            kIsolatedApp1DefaultName);
+  OpenChildWindowAndExpectNotificationContents(
+      iwa_opener_web_contents, GURL("https://example.com/app1/child3"), app_id,
+      /*expected_window_count_in_notification=*/3, notification_added_future,
+      kIsolatedApp1DefaultName);
 
-  notification_added_future.Clear();
+  base::test::TestFuture<void> notification_closed_future;
+  display_service_tester_->SetNotificationClosedClosure(
+      notification_closed_future.GetRepeatingCallback());
 
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/app1/child4"));
-
-  EXPECT_TRUE(notification_added_future.Wait());
-  CheckNotificationContents(app_id, /*opened_tabs_count=*/4,
-                            kIsolatedApp1DefaultName);
+  iwa_child_browser1_contents->Close();
+  CheckNotificationContents(app_id, /*opened_window_count=*/2);
+  iwa_child_browser2_contents->Close();
+  ASSERT_TRUE(notification_closed_future.Wait());
+  notification_closed_future.Clear();
+  EXPECT_EQ(0u, GetNotificationCount());
 }
 
 IN_PROC_BROWSER_TEST_F(IsolatedWebAppsOpenedTabsCounterServiceBrowserTest,
@@ -239,6 +244,7 @@
   Browser* iwa1_browser = OpenIwaWindow(app1_id);
   Browser* iwa2_browser = OpenIwaWindow(app2_id);
 
+  // Child WebContents of the first app.
   base::test::TestFuture<void> notification_added_future;
   display_service_tester_->SetNotificationAddedClosure(
       notification_added_future.GetRepeatingCallback());
@@ -246,30 +252,24 @@
   OpenChildWindowFromIwaBrowser(
       iwa1_browser->tab_strip_model()->GetActiveWebContents(),
       GURL("https://example.com/app1/child1"));
-  OpenChildWindowFromIwaBrowser(
-      iwa1_browser->tab_strip_model()->GetActiveWebContents(),
-      GURL("https://example.com/app1/child2"));
   ASSERT_FALSE(notification_added_future.IsReady());
 
   OpenChildWindowAndExpectNotificationContents(
       iwa1_browser->tab_strip_model()->GetActiveWebContents(),
-      GURL("https://example.com/app1/child3"), app1_id,
-      /*expected_tabs_count_in_notification=*/3, notification_added_future,
+      GURL("https://example.com/app1/child2"), app1_id,
+      /*expected_window_count_in_notification=*/2, notification_added_future,
       kIsolatedApp1DefaultName);
-  EXPECT_EQ(1u, GetNotificationCount());
 
+  // Child WebContents of the second app.
   OpenChildWindowFromIwaBrowser(
       iwa2_browser->tab_strip_model()->GetActiveWebContents(),
       GURL("https://example.com/app2/child1"));
-  OpenChildWindowFromIwaBrowser(
-      iwa2_browser->tab_strip_model()->GetActiveWebContents(),
-      GURL("https://example.com/app2/child2"));
   ASSERT_FALSE(notification_added_future.IsReady());
 
   OpenChildWindowAndExpectNotificationContents(
       iwa2_browser->tab_strip_model()->GetActiveWebContents(),
-      GURL("https://example.com/app2/child3"), app2_id,
-      /*expected_tabs_count_in_notification=*/3, notification_added_future,
+      GURL("https://example.com/app2/child2"), app2_id,
+      /*expected_window_count_in_notification=*/2, notification_added_future,
       kIsolatedApp2DefaultName);
   EXPECT_EQ(2u, GetNotificationCount());
 
@@ -286,26 +286,47 @@
   content::WebContents* iwa1_opener_contents =
       OpenIwaWindow(app1_id)->tab_strip_model()->GetActiveWebContents();
 
+  webapps::AppId app2_id = InstallIsolatedWebApp(kIsolatedApp2DefaultName);
+  content::WebContents* iwa2_opener_contents =
+      OpenIwaWindow(app2_id)->tab_strip_model()->GetActiveWebContents();
+
   base::test::TestFuture<void> notification_added_future;
   display_service_tester_->SetNotificationAddedClosure(
       notification_added_future.GetRepeatingCallback());
 
+  // Open two child windows from IWA 1.
+  // This should trigger a notification for IWA 1.
   content::WebContents* app1_child1_contents = OpenChildWindowFromIwaBrowser(
       iwa1_opener_contents, GURL("https://example.com/app1/child1"));
-  OpenChildWindowFromIwaBrowser(iwa1_opener_contents,
-                                GURL("https://example.com/app1/child2"));
   ASSERT_FALSE(notification_added_future.IsReady());
 
   OpenChildWindowAndExpectNotificationContents(
-      iwa1_opener_contents, GURL("https://example.com/app1/child3"), app1_id,
-      /*expected_tabs_count_in_notification=*/3, notification_added_future,
+      iwa1_opener_contents, GURL("https://example.com/app1/child2"), app1_id,
+      /*expected_window_count_in_notification=*/2, notification_added_future,
       kIsolatedApp1DefaultName);
   EXPECT_EQ(1u, GetNotificationCount());
 
+  // Open two child windows from IWA 2.
+  // This should trigger a notification for IWA 2.
+  OpenChildWindowFromIwaBrowser(iwa2_opener_contents,
+                                GURL("https://example.com/app2/child1"));
+  ASSERT_FALSE(notification_added_future.IsReady());
+
+  OpenChildWindowAndExpectNotificationContents(
+      iwa2_opener_contents, GURL("https://example.com/app2/child2"), app2_id,
+      /*expected_window_count_in_notification=*/2, notification_added_future,
+      kIsolatedApp2DefaultName);
+  EXPECT_EQ(2u, GetNotificationCount());
+
+  ASSERT_TRUE(display_service_tester_->GetNotification(
+      GetNotificationIdForApp(app1_id)));
+  ASSERT_TRUE(display_service_tester_->GetNotification(
+      GetNotificationIdForApp(app2_id)));
+
   Browser* another_browser = CreateBrowser(profile());
 
-  // Move one of IWA 1's child windows (app1_child1_contents) to another
-  // browser.
+  // Move one of IWA 1's child windows (app1_child1_contents) to the
+  // regular_browser.
   tabs::TabInterface* tab =
       tabs::TabInterface::GetFromContents(app1_child1_contents);
   Browser* original_app1_child1_browser =
@@ -326,9 +347,13 @@
       another_browser->tab_strip_model()->GetActiveWebContents()->GetURL(),
       GURL("https://example.com/app1/child1"));
 
-  EXPECT_EQ(1u, GetNotificationCount());
-  CheckNotificationContents(app1_id, /*opened_tabs_count=*/3,
+  // No WebContents were destroyed, so no notification change events should
+  // fire.
+  EXPECT_EQ(2u, GetNotificationCount());
+  CheckNotificationContents(app1_id, /*opened_window_count=*/2,
                             kIsolatedApp1DefaultName);
+  CheckNotificationContents(app2_id, /*opened_window_count=*/2,
+                            kIsolatedApp2DefaultName);
 }
 
 IN_PROC_BROWSER_TEST_F(
@@ -345,18 +370,24 @@
 
   OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
                                 GURL("https://example.com/child1"));
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/child2"));
+  EXPECT_FALSE(notification_added_future.IsReady());
+  EXPECT_EQ(0u, GetNotificationCount());
+
   OpenChildWindowAndExpectNotificationContents(
-      iwa_opener_web_contents, GURL("https://example.com/child3"), app_id,
-      /*expected_tabs_count_in_notification=*/3, notification_added_future,
+      iwa_opener_web_contents, GURL("https://example.com/child2"), app_id,
+      /*expected_window_count_in_notification=*/2, notification_added_future,
       kIsolatedApp1DefaultName);
+
   EXPECT_EQ(1u, GetNotificationCount());
 
   std::optional<message_center::Notification> notification =
       display_service_tester_->GetNotification(GetNotificationIdForApp(app_id));
   ASSERT_TRUE(notification.has_value());
 
+  EXPECT_EQ(isolated_web_apps_opened_tabs_counter_service_->app_tab_counts_.at(
+                app_id),
+            2);
+
   base::test::TestFuture<void> notification_closed_future;
   display_service_tester_->SetNotificationClosedClosure(
       notification_closed_future.GetRepeatingCallback());
@@ -365,9 +396,13 @@
   notification->delegate()->Click(/*button_index=*/1,
                                   /*reply=*/std::nullopt);
 
-  // Clicking the button closes the child windows and the
+  // Clicking the button asynchronously closes the child windows and the
   // notification itself.
   ASSERT_TRUE(notification_closed_future.Wait());
+
+  ASSERT_FALSE(base::Contains(
+      isolated_web_apps_opened_tabs_counter_service_->app_tab_counts_, app_id));
+
   EXPECT_EQ(0u, GetNotificationCount());
   ASSERT_FALSE(iwa_browser->capabilities()->IsAttemptingToCloseBrowser());
 }
@@ -384,23 +419,26 @@
     display_service_tester_->SetNotificationAddedClosure(
         notification_added_future.GetRepeatingCallback());
 
-    OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                  GURL("https://example.com/s1/child1"));
-    OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                  GURL("https://example.com/s1/child2"));
-    OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                  GURL("https://example.com/s1/child3"));
+    // Open 2 windows to trigger the notification.
+    content::WebContents* child1 = OpenChildWindowFromIwaBrowser(
+        iwa_opener_web_contents, GURL("https://example.com/s1/child1"));
+    content::WebContents* child2 = OpenChildWindowFromIwaBrowser(
+        iwa_opener_web_contents, GURL("https://example.com/s1/child2"));
 
     // Check notification was shown.
     ASSERT_TRUE(notification_added_future.Wait());
+    EXPECT_TRUE(display_service_tester_->GetNotification(notification_id));
 
-    std::optional<message_center::Notification> notification =
-        display_service_tester_->GetNotification(notification_id);
-    EXPECT_TRUE(notification.has_value());
+    // Close those 2 windows.
+    base::test::TestFuture<void> notification_closed_future;
+    display_service_tester_->SetNotificationClosedClosure(
+        notification_closed_future.GetRepeatingCallback());
+    child1->Close();
+    child2->Close();
 
-    notification->delegate()->Click(/*button_index=*/1,
-                                    /*reply=*/std::nullopt);
-    EXPECT_EQ(0u, GetNotificationCount());
+    // Check no notification is present after windows are closed.
+    ASSERT_TRUE(notification_closed_future.Wait());
+    EXPECT_FALSE(display_service_tester_->GetNotification(notification_id));
   }
 
   // Notification should be suppressed after 3 show ups.
@@ -409,8 +447,7 @@
                                   GURL("https://example.com/s4/child1"));
     OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
                                   GURL("https://example.com/s4/child2"));
-    OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                  GURL("https://example.com/s4/child3"));
+
     // Check that no notification appears this time.
     EXPECT_EQ(0u, GetNotificationCount());
   }
@@ -422,19 +459,23 @@
       "IWA1", web_package::test::GetDefaultEd25519KeyPair());
   content::WebContents* iwa_opener_web_contents =
       OpenIwaWindow(app_id)->tab_strip_model()->GetActiveWebContents();
+  const std::string notification_id = GetNotificationIdForApp(app_id);
 
   base::test::TestFuture<void> notification_added_future;
   display_service_tester_->SetNotificationAddedClosure(
       notification_added_future.GetRepeatingCallback());
-
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/s1/child1"));
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/s1/child2"));
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/s1/child3"));
+  content::WebContents* child1 = OpenChildWindowFromIwaBrowser(
+      iwa_opener_web_contents, GURL("https://example.com/s1/child1"));
+  content::WebContents* child2 = OpenChildWindowFromIwaBrowser(
+      iwa_opener_web_contents, GURL("https://example.com/s1/child2"));
   ASSERT_TRUE(notification_added_future.Wait());
 
+  base::test::TestFuture<void> notification_closed_future;
+  display_service_tester_->SetNotificationClosedClosure(
+      notification_closed_future.GetRepeatingCallback());
+  child1->Close();
+  child2->Close();
+  ASSERT_TRUE(notification_closed_future.Wait());
 }
 
 IN_PROC_BROWSER_TEST_F(IsolatedWebAppsOpenedTabsCounterServiceBrowserTest,
@@ -460,10 +501,10 @@
             std::optional<IsolationData::OpenedTabsCounterNotificationState>(
                 std::nullopt));
 
-    EXPECT_TRUE(future.Wait());
+    ASSERT_TRUE(future.Wait());
     auto state = future.Take();
 
-    EXPECT_TRUE(state.has_value());
+    ASSERT_TRUE(state.has_value());
     EXPECT_EQ(state->times_shown(), expected_times_shown);
     EXPECT_EQ(state->acknowledged(), expected_acknowledged);
   };
@@ -475,34 +516,33 @@
     base::test::TestFuture<void> notification_added_future;
     display_service_tester_->SetNotificationAddedClosure(
         notification_added_future.GetRepeatingCallback());
-    OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                  GURL("https://example.com/s2/child1"));
-    OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                  GURL("https://example.com/s2/child2"));
-    OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                  GURL("https://example.com/s2/child3"));
+    content::WebContents* child1 = OpenChildWindowFromIwaBrowser(
+        iwa_opener_web_contents, GURL("https://example.com/s2/child1"));
+    content::WebContents* child2 = OpenChildWindowFromIwaBrowser(
+        iwa_opener_web_contents, GURL("https://example.com/s2/child2"));
     ASSERT_TRUE(notification_added_future.Wait());
 
     std::optional<message_center::Notification> notification =
         display_service_tester_->GetNotification(notification_id);
-    EXPECT_TRUE(notification.has_value());
+    ASSERT_TRUE(notification.has_value());
 
     // Acknowledge the notification by closing it as a user.
     // This should set the 'acknowledged' flag to true.
     notification->delegate()->Close(/*by_user=*/true);
+
+    // Clean up the opened windows.
+    child1->Close();
+    child2->Close();
   }
 
   check_persisted_state(/*expected_times_shown=*/2,
                         /*expected_acknowledged=*/true);
 
-  // Triggering again should not show a notification.
   {
     OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
                                   GURL("https://example.com/s3/child1"));
     OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
                                   GURL("https://example.com/s3/child2"));
-    OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                  GURL("https://example.com/s3/child3"));
     EXPECT_EQ(0u, GetNotificationCount());
   }
 }
@@ -518,13 +558,10 @@
   base::test::TestFuture<void> notification_added_future;
   display_service_tester_->SetNotificationAddedClosure(
       notification_added_future.GetRepeatingCallback());
-
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/s1/child1"));
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/s1/child2"));
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/s1/child3"));
+  content::WebContents* child1 = OpenChildWindowFromIwaBrowser(
+      iwa_opener_web_contents, GURL("https://example.com/s1/child1"));
+  content::WebContents* child2 = OpenChildWindowFromIwaBrowser(
+      iwa_opener_web_contents, GURL("https://example.com/s1/child2"));
   ASSERT_TRUE(notification_added_future.Wait());
   EXPECT_TRUE(display_service_tester_->GetNotification(notification_id));
 
@@ -541,6 +578,9 @@
 
   ASSERT_TRUE(notification_closed_future.Wait());
 
+  // Clean up the opened windows.
+  child1->Close();
+  child2->Close();
 
   EXPECT_FALSE(display_service_tester_->GetNotification(notification_id));
 }
@@ -582,8 +622,6 @@
                                 GURL("https://example.com/s2/child1"));
   OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
                                 GURL("https://example.com/s2/child2"));
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/s2/child3"));
 
   // Because the notification has been acknowledged previously, it should not
   // be shown again.
@@ -608,18 +646,21 @@
   OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
                                 GURL("https://example.com/app1/child1"),
                                 "_blank", "noopener");
-  OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
-                                GURL("https://example.com/app1/child2"));
   ASSERT_FALSE(notification_added_future.IsReady());
 
   OpenChildWindowAndExpectNotificationContents(
+      iwa_opener_web_contents, GURL("https://example.com/app1/child2"), app_id,
+      /*expected_window_count_in_notification=*/2, notification_added_future,
+      kIsolatedApp1DefaultName);
+
+  OpenChildWindowAndExpectNotificationContents(
       iwa_opener_web_contents, GURL("https://example.com/app1/child3"), app_id,
-      /*expected_tabs_count_in_notification=*/3, notification_added_future,
+      /*expected_window_count_in_notification=*/3, notification_added_future,
       kIsolatedApp1DefaultName);
 }
 
 IN_PROC_BROWSER_TEST_F(IsolatedWebAppsOpenedTabsCounterServiceBrowserTest,
-                       SelfTargetIsCountedAsOpenedByIwa) {
+                       SelfTargetDoesNotAffectCounters) {
   webapps::AppId app_id = InstallIsolatedWebApp();
 
   content::WebContents* iwa_opener_web_contents =
@@ -628,18 +669,19 @@
   base::test::TestFuture<void> notification_added_future;
   display_service_tester_->SetNotificationAddedClosure(
       notification_added_future.GetRepeatingCallback());
-
   OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
                                 GURL("https://example.com/app1/child1"),
                                 "_self");
   ASSERT_FALSE(notification_added_future.IsReady());
 
-  OpenChildWindowFromIwaBrowser(
-      iwa_opener_web_contents, GURL("https://example.com/app1/child2"), app_id);
+  OpenChildWindowAndExpectNotificationContents(
+      iwa_opener_web_contents, GURL("https://example.com/app1/child2"), app_id,
+      /*expected_window_count_in_notification=*/2, notification_added_future,
+      kIsolatedApp1DefaultName);
 
   OpenChildWindowAndExpectNotificationContents(
       iwa_opener_web_contents, GURL("https://example.com/app1/child3"), app_id,
-      /*expected_tabs_count_in_notification=*/3, notification_added_future,
+      /*expected_window_count_in_notification=*/3, notification_added_future,
       kIsolatedApp1DefaultName);
 }
 
@@ -650,13 +692,22 @@
   content::WebContents* iwa_opener_web_contents =
       OpenIwaWindow(app_id)->tab_strip_model()->GetActiveWebContents();
 
-  // Open multiple child windows, which should trigger a notification.
+  base::test::TestFuture<void> notification_added_future;
+  display_service_tester_->SetNotificationAddedClosure(
+      notification_added_future.GetRepeatingCallback());
+
+  // Open multiple child windows, which would normally trigger a notification.
   OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
                                 GURL("https://example.com/child1"));
   OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
                                 GURL("https://example.com/child2"));
   OpenChildWindowFromIwaBrowser(iwa_opener_web_contents,
                                 GURL("https://example.com/child3"));
+
+  EXPECT_FALSE(notification_added_future.IsReady());
   EXPECT_EQ(0u, GetNotificationCount());
+  EXPECT_FALSE(base::Contains(
+      isolated_web_apps_opened_tabs_counter_service_->app_tab_counts_, app_id));
 }
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/preinstalled_web_app_manager.cc b/chrome/browser/web_applications/preinstalled_web_app_manager.cc
index d7ab526..bb63c84f 100644
--- a/chrome/browser/web_applications/preinstalled_web_app_manager.cc
+++ b/chrome/browser/web_applications/preinstalled_web_app_manager.cc
@@ -773,6 +773,11 @@
   LoadAndSynchronize(std::move(callback));
 }
 
+void PreinstalledWebAppManager::SetPreinstalledAppForUpdatingForTesting(
+    PreinstalledAppForUpdating preinstalled_app_for_updating) {
+  preinstalled_app_for_updating_ = preinstalled_app_for_updating;
+}
+
 void PreinstalledWebAppManager::LoadAndSynchronize(
     SynchronizeCallback callback) {
   base::OnceClosure load_and_synchronize = base::BindOnce(
diff --git a/chrome/browser/web_applications/preinstalled_web_app_manager.h b/chrome/browser/web_applications/preinstalled_web_app_manager.h
index db9da1c..6893c0a1 100644
--- a/chrome/browser/web_applications/preinstalled_web_app_manager.h
+++ b/chrome/browser/web_applications/preinstalled_web_app_manager.h
@@ -18,10 +18,13 @@
 #include "base/observer_list.h"
 #include "base/observer_list_types.h"
 #include "base/values.h"
+#include "build/branding_buildflags.h"
 #include "chrome/browser/web_applications/external_install_options.h"
 #include "chrome/browser/web_applications/externally_managed_app_manager.h"
 #include "chrome/browser/web_applications/file_utils_wrapper.h"
 #include "chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.h"
+#include "components/webapps/common/manifest_id_constants.h"
+#include "components/webapps/common/web_app_id.h"
 #include "url/gurl.h"
 
 namespace user_prefs {
@@ -39,6 +42,11 @@
 
 class WebAppProvider;
 
+struct PreinstalledAppForUpdating {
+  webapps::ManifestId manifest_id;
+  GURL install_url;
+};
+
 // Installs web apps to be preinstalled on the device (AKA default apps) during
 // start up. Will keep the apps installed on the device in sync with the set of
 // apps configured for preinstall, adding or removing as necessary. Works very
@@ -135,6 +143,17 @@
   };
   const DebugInfo* debug_info() const { return debug_info_.get(); }
 
+  // This is a preinstalled app configuration that will be attempted to be
+  // updated on startup via install_url and a background web contents after
+  // initial navigations in the app window.
+  const std::optional<PreinstalledAppForUpdating>&
+  preinstalled_app_for_updating() const {
+    return preinstalled_app_for_updating_;
+  }
+
+  void SetPreinstalledAppForUpdatingForTesting(
+      PreinstalledAppForUpdating preinstalled_app_for_updating);
+
  private:
   // Helper to delay a task until device information is fully initialized in
   // ui::DeviceDataManager.
@@ -187,6 +206,17 @@
   // TODO(http://b/333583704): Revert CL which added this field after migration.
   std::optional<DeviceInfo> device_info_;
 
+  std::optional<PreinstalledAppForUpdating> preinstalled_app_for_updating_
+#if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+      = PreinstalledAppForUpdating{
+          .manifest_id =
+              webapps::ManifestId(webapps::kMailGoogleChatManifestId),
+          .install_url = GURL(webapps::kMailGoogleChatInstallUrl),
+      };
+#else
+      = std::nullopt;
+#endif
+
   base::ObserverList<PreinstalledWebAppManager::Observer, /*check_empty=*/true>
       observers_;
 
diff --git a/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc b/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc
index 257cb68..60936b1 100644
--- a/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc
+++ b/chrome/browser/web_applications/preinstalled_web_app_manager_browsertest.cc
@@ -9,8 +9,10 @@
 #include "base/auto_reset.h"
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
+#include "base/functional/callback.h"
 #include "base/json/json_reader.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/memory/weak_ptr.h"
 #include "base/path_service.h"
 #include "base/strings/strcat.h"
 #include "base/strings/string_util.h"
@@ -31,12 +33,14 @@
 #include "chrome/browser/ui/browser.h"
 #include "chrome/browser/ui/web_applications/test/ssl_test_utils.h"
 #include "chrome/browser/ui/web_applications/test/web_app_browsertest_util.h"
+#include "chrome/browser/ui/web_applications/web_app_browsertest_base.h"
 #include "chrome/browser/web_applications/extension_status_utils.h"
 #include "chrome/browser/web_applications/mojom/user_display_mode.mojom.h"
 #include "chrome/browser/web_applications/policy/web_app_policy_manager.h"
 #include "chrome/browser/web_applications/preinstalled_app_install_features.h"
 #include "chrome/browser/web_applications/preinstalled_web_app_config_utils.h"
 #include "chrome/browser/web_applications/preinstalled_web_apps/preinstalled_web_apps.h"
+#include "chrome/browser/web_applications/test/fake_web_app_provider.h"
 #include "chrome/browser/web_applications/test/os_integration_test_override_impl.h"
 #include "chrome/browser/web_applications/test/test_file_utils.h"
 #include "chrome/browser/web_applications/test/web_app_icon_test_utils.h"
@@ -49,8 +53,10 @@
 #include "chrome/browser/web_applications/web_app_provider.h"
 #include "chrome/browser/web_applications/web_app_registrar.h"
 #include "chrome/common/chrome_features.h"
+#include "chrome/common/chrome_paths.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/in_process_browser_test.h"
+#include "components/keyed_service/core/keyed_service.h"
 #include "components/prefs/pref_service.h"
 #include "components/services/app_service/public/cpp/app_registry_cache.h"
 #include "components/services/app_service/public/cpp/app_update.h"
@@ -60,11 +66,14 @@
 #include "extensions/browser/extension_registry.h"
 #include "extensions/browser/test_extension_registry_observer.h"
 #include "net/ssl/ssl_info.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/skia/include/core/SkBitmap.h"
 #include "ui/events/devices/device_data_manager.h"
 #include "ui/events/devices/device_data_manager_test_api.h"
 #include "ui/events/devices/touchscreen_device.h"
+#include "ui/gfx/codec/png_codec.h"
 
 #if BUILDFLAG(IS_CHROMEOS)
 #include "ash/public/cpp/test/app_list_test_api.h"
@@ -1827,4 +1836,162 @@
 
 #endif
 
+class PreinstalledWebAppManagerSimpleBrowserTest
+    : public WebAppBrowserTestBase {
+ public:
+  static constexpr std::string_view kHostname = "www.example.com";
+  static constexpr std::string_view kStartUrl = "/web_apps/simple/index.html";
+  static constexpr std::string_view kScope = "/web_apps/simple/";
+  static constexpr std::string_view kInstallUrl =
+      "web_apps/simple/install_url.html";
+  static constexpr std::string_view kManifestId = "/web_app/simple/index.html";
+  static constexpr std::string_view kManifestUrl =
+      "/web_app/simple/manifest.json";
+  static constexpr base::FilePath::StringViewType kIcon48 =
+      FILE_PATH_LITERAL("web_apps/simple/basic-48.png");
+  static constexpr base::FilePath::StringViewType kIcon192 =
+      FILE_PATH_LITERAL("web_apps/simple/basic-192.png");
+  static constexpr std::u16string_view kWrongName = u"Wrong App Name";
+
+  PreinstalledWebAppManagerSimpleBrowserTest() {
+    fake_provider_creator_ =
+        std::make_unique<FakeWebAppProviderCreator>(base::BindRepeating(
+            [](base::WeakPtr<PreinstalledWebAppManagerSimpleBrowserTest> test,
+               Profile* profile) -> std::unique_ptr<KeyedService> {
+              if (!test) {
+                return nullptr;
+              }
+              std::unique_ptr<WebAppProvider> provider =
+                  std::make_unique<WebAppProvider>(profile);
+              test->run_delayed_startup_tasks_ =
+                  provider->DisableDelayedPostStartupWorkForTesting();
+              provider->preinstalled_web_app_manager()
+                  .SetPreinstalledAppForUpdatingForTesting(
+                      PreinstalledAppForUpdating{
+                          .manifest_id = test->GetManifestId(),
+                          .install_url = test->GetInstallUrl()});
+              provider->Start();
+              return provider;
+            },
+            weak_ptr_factory_.GetWeakPtr()));
+  }
+  ~PreinstalledWebAppManagerSimpleBrowserTest() override = default;
+
+  GURL GetStartUrl() {
+    return embedded_https_test_server().GetURL(kHostname, kStartUrl);
+  }
+
+  GURL GetInstallUrl() {
+    return embedded_https_test_server().GetURL(kHostname, kStartUrl);
+  }
+
+  GURL GetScope() {
+    return embedded_https_test_server().GetURL(kHostname, kScope);
+  }
+
+  webapps::ManifestId GetManifestId() {
+    return GenerateManifestIdFromStartUrlOnly(GetStartUrl());
+  }
+
+  GURL GetManifestUrl() {
+    return embedded_https_test_server().GetURL(kHostname, kManifestUrl);
+  }
+
+  webapps::AppId GetAppId() {
+    return GenerateAppIdFromManifestId(GetManifestId());
+  }
+
+  SkBitmap LoadPngImageFromDisk(base::FilePath relative_test_file) {
+    base::ScopedAllowBlockingForTesting allow_blocking;
+    base::FilePath path;
+    base::PathService::Get(chrome::DIR_TEST_DATA, &path);
+    base::FilePath image_file = path.Append(relative_test_file);
+    CHECK(base::PathExists(image_file)) << image_file.value();
+    std::optional<std::vector<uint8_t>> file_contents =
+        base::ReadFileToBytes(image_file);
+    CHECK(file_contents.has_value());
+    SkBitmap png_bytes = gfx::PNGCodec::Decode(file_contents.value());
+    CHECK(!png_bytes.empty());
+    return png_bytes;
+  }
+
+  ExternalInstallOptions GetInstallOptionsWithFactory() {
+    ExternalInstallOptions options(
+        /*install_url=*/GetInstallUrl(),
+        /*user_display_mode=*/
+        mojom::UserDisplayMode::kBrowser,
+        /*install_source=*/ExternalInstallSource::kExternalDefault);
+
+    options.user_type_allowlist = {"unmanaged", "managed", "child"};
+    options.expected_app_id = GetAppId();
+
+    IconBitmaps icons;
+    icons.any = {{48, LoadPngImageFromDisk(base::FilePath(kIcon48))},
+                 {192, LoadPngImageFromDisk(base::FilePath(kIcon192))}};
+
+    options.app_info_factory = base::BindRepeating(
+        [](webapps::ManifestId manifest_id, GURL start_url, GURL scope,
+           GURL install_url, IconBitmaps icons) {
+          auto info =
+              std::make_unique<WebAppInstallInfo>(manifest_id, start_url);
+          info->title = kWrongName;
+          info->scope = scope;
+          info->display_mode = DisplayMode::kStandalone;
+          info->install_url = install_url;
+          info->icon_bitmaps = std::move(icons);
+          return info;
+        },
+        GetManifestId(), GetStartUrl(), GetScope(), GetInstallUrl(),
+        std::move(icons));
+    options.only_use_app_info_factory = true;
+
+    return options;
+  }
+
+  void SetUp() override {
+    ASSERT_TRUE(embedded_https_test_server().Start());
+    preinstalled_app_override_ =
+        std::make_unique<ScopedTestingPreinstalledAppData>();
+    preinstalled_app_override_->apps = {GetInstallOptionsWithFactory()};
+    WebAppBrowserTestBase::SetUp();
+  }
+
+  void SetUpOnMainThread() override {
+    WebAppBrowserTestBase::SetUpOnMainThread();
+    test::WaitUntilWebAppProviderAndSubsystemsReady(&provider());
+  }
+
+ protected:
+  base::RepeatingClosure run_delayed_startup_tasks_;
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_{
+      features::kWebAppPeriodicPreinstallUpdate};
+
+  std::unique_ptr<ScopedTestingPreinstalledAppData> preinstalled_app_override_;
+
+  std::unique_ptr<FakeWebAppProviderCreator> fake_provider_creator_;
+
+  base::WeakPtrFactory<PreinstalledWebAppManagerSimpleBrowserTest>
+      weak_ptr_factory_{this};
+};
+
+IN_PROC_BROWSER_TEST_F(PreinstalledWebAppManagerSimpleBrowserTest,
+                       PreinstallWorks) {
+  EXPECT_TRUE(provider().registrar_unsafe().AppMatches(
+      GetAppId(), WebAppFilter::InstalledInChrome()));
+}
+
+IN_PROC_BROWSER_TEST_F(PreinstalledWebAppManagerSimpleBrowserTest,
+                       DelayedUpdateWorks) {
+  EXPECT_TRUE(provider().registrar_unsafe().AppMatches(
+      GetAppId(), WebAppFilter::InstalledInChrome()));
+
+  run_delayed_startup_tasks_.Run();
+  provider().command_manager().AwaitAllCommandsCompleteForTesting();
+
+  EXPECT_EQ(provider().registrar_unsafe().GetAppShortName(GetAppId()),
+            "Simple web app");
+}
+
 }  // namespace web_app
diff --git a/chrome/browser/web_applications/preinstalled_web_app_manager_unittest.cc b/chrome/browser/web_applications/preinstalled_web_app_manager_unittest.cc
index 50b5ea7d..1ca857b 100644
--- a/chrome/browser/web_applications/preinstalled_web_app_manager_unittest.cc
+++ b/chrome/browser/web_applications/preinstalled_web_app_manager_unittest.cc
@@ -653,8 +653,7 @@
         /*install_source=*/ExternalInstallSource::kExternalDefault);
 
     options.user_type_allowlist = {"unmanaged", "managed", "child"};
-    options.expected_app_id =
-        GenerateAppIdFromManifestId(webapps::ManifestId(kManifestId));
+    options.expected_app_id = GenerateAppIdFromManifestId(manifest_id);
     options.app_info_factory = base::BindRepeating(
         [](webapps::ManifestId manifest_id, GURL start_url, GURL scope,
            GURL install_url) {
@@ -675,20 +674,6 @@
     return options;
   }
 
-  static ExternalInstallOptions GetInstallOptionsFromManifest(
-      GURL install_url = GURL(kInstallUrl)) {
-    ExternalInstallOptions options(
-        /*install_url=*/install_url,
-        /*user_display_mode=*/
-        mojom::UserDisplayMode::kBrowser,
-        /*install_source=*/ExternalInstallSource::kExternalDefault);
-
-    options.user_type_allowlist = {"unmanaged", "managed", "child"};
-    options.expected_app_id =
-        GenerateAppIdFromManifestId(webapps::ManifestId(kManifestId));
-    return options;
-  }
-
   PreinstalledWebAppManagerBasicTest()
       : app_id_(GenerateAppIdFromManifestId(GURL(kManifestId))) {}
   ~PreinstalledWebAppManagerBasicTest() override = default;
@@ -705,6 +690,11 @@
     preinstalled_app_override_ =
         std::make_unique<ScopedTestingPreinstalledAppData>();
     fake_provider().SetSynchronizePreinstalledAppsOnStartup(true);
+    fake_provider()
+        .preinstalled_web_app_manager()
+        .SetPreinstalledAppForUpdatingForTesting(
+            PreinstalledAppForUpdating{.manifest_id = GURL(kManifestId),
+                                       .install_url = GURL(kInstallUrl)});
     auto fake_extensions_manager = std::make_unique<FakeExtensionsManager>();
     fake_extensions_manager->SetExtensionsSytemReady(true);
     fake_provider().SetExtensionsManager(std::move(fake_extensions_manager));
@@ -750,34 +740,7 @@
   const webapps::AppId app_id_;
 };
 
-TEST_F(PreinstalledWebAppManagerBasicTest, PreinstallWorksViaFactory) {
-  preinstalled_app_override_->apps = {GetInstallOptionsWithFactory()};
-  test::AwaitStartWebAppProviderAndSubsystems(profile());
-
-  EXPECT_TRUE(provider().registrar_unsafe().AppMatches(
-      GenerateAppIdFromManifestId(GURL(kManifestId)),
-      WebAppFilter::InstalledInChrome()));
-  EXPECT_TRUE(provider().registrar_unsafe().AppMatches(
-      GenerateAppIdFromManifestId(GURL(kManifestId)),
-      WebAppFilter::OpensInBrowserTab()));
-
-  // State matches.
-  EXPECT_EQ(provider().registrar_unsafe().GetAppShortName(app_id_),
-            base::UTF16ToUTF8(kAppName));
-  WebAppIconManager::WebAppBitmaps bitmaps;
-  base::test::TestFuture<WebAppIconManager::WebAppBitmaps> icons;
-  provider().icon_manager().ReadAllIcons(app_id_, icons.GetCallback());
-  ASSERT_TRUE(icons.Wait());
-  ASSERT_TRUE(base::Contains(icons.Get().trusted_icons.any, 144));
-  EXPECT_THAT(
-      icons.Get().trusted_icons.any.at(144),
-      gfx::test::EqualsBitmap(gfx::test::CreateBitmap(144, SK_ColorGREEN)));
-}
-
-TEST_F(PreinstalledWebAppManagerBasicTest, PreinstallWorksViaManifest) {
-  // TODO(crbug.com/454861476): This should be GetInstallOptionsWithManifest(),
-  // but that does not seem to work here, because the
-  // DCHECK(options.app_info_factory) fails.
+TEST_F(PreinstalledWebAppManagerBasicTest, PreinstallWorks) {
   preinstalled_app_override_->apps = {GetInstallOptionsWithFactory()};
   test::AwaitStartWebAppProviderAndSubsystems(profile());
 
@@ -804,6 +767,15 @@
 class PreinstalledWebAppManagerChatUpdate
     : public PreinstalledWebAppManagerBasicTest {
  public:
+  void SetUp() override {
+    PreinstalledWebAppManagerBasicTest::SetUp();
+    fake_provider()
+        .preinstalled_web_app_manager()
+        .SetPreinstalledAppForUpdatingForTesting(
+            PreinstalledAppForUpdating{.manifest_id = GetChatManifestId(),
+                                       .install_url = GetChatInstallUrl()});
+  }
+
   GURL GetChatInstallUrl() const {
     return GURL(webapps::kMailGoogleChatInstallUrl);
   }
diff --git a/chrome/browser/web_applications/test/fake_web_contents_manager.cc b/chrome/browser/web_applications/test/fake_web_contents_manager.cc
index fa4336651..be54f242 100644
--- a/chrome/browser/web_applications/test/fake_web_contents_manager.cc
+++ b/chrome/browser/web_applications/test/fake_web_contents_manager.cc
@@ -329,7 +329,7 @@
                        page.valid_manifest_for_web_app, page.error_code));
   }
 
-  base::CallbackListSubscription GetPrimaryPageFirstSpecifiedManifest(
+  void GetPrimaryPageFirstSpecifiedManifest(
       content::WebContents& web_contents,
       GetManifestOnceCallbackList::CallbackType callback) override {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
@@ -357,7 +357,6 @@
                       blink::mojom::ManifestRequestResult::
                           kManifestFailedToFetch,
                       std::vector<blink::mojom::ManifestErrorPtr>()))));
-      return base::CallbackListSubscription();
     }
     FakeWebContentsManager::FakePageState& page = page_it->second;
     if (page.on_manifest_fetch) {
@@ -368,7 +367,6 @@
     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
         FROM_HERE,
         base::BindOnce(std::move(callback), base::ok(std::move(manifest))));
-    return base::CallbackListSubscription();
   }
 
   void GetIcons(content::WebContents* web_contents,
diff --git a/chrome/browser/web_applications/web_app_provider.cc b/chrome/browser/web_applications/web_app_provider.cc
index 3c8a9b6..fd93f350 100644
--- a/chrome/browser/web_applications/web_app_provider.cc
+++ b/chrome/browser/web_applications/web_app_provider.cc
@@ -541,22 +541,24 @@
 }
 
 void WebAppProvider::DoDelayedPostStartupWork() {
-  webapps::ManifestId old_chat_manifest_id =
-      webapps::ManifestId(webapps::kMailGoogleChatManifestId);
   WebAppPrefGuardrails guardrails =
       WebAppPrefGuardrails::GetForDefaultAppUpdateOnStartup(
           *profile_->GetPrefs());
-  webapps::AppId app_id = GenerateAppIdFromManifestId(old_chat_manifest_id);
+
+  const std::optional<PreinstalledAppForUpdating>& app_to_update =
+      preinstalled_web_app_manager().preinstalled_app_for_updating();
+  webapps::AppId preinstalled_app_id = GenerateAppIdFromManifestId(
+      app_to_update.value_or(PreinstalledAppForUpdating()).manifest_id);
   if (base::FeatureList::IsEnabled(features::kWebAppPeriodicPreinstallUpdate) &&
-      !guardrails.IsBlockedByGuardrails(app_id)) {
-    GURL install_url = GURL(webapps::kMailGoogleChatInstallUrl);
+      app_to_update.has_value() &&
+      !guardrails.IsBlockedByGuardrails(preinstalled_app_id)) {
     GURL::Replacements add_query;
     add_query.SetQueryStr("usp=chrome_preinstall_update");
-    install_url = install_url.ReplaceComponents(add_query);
+    GURL install_url = app_to_update->install_url.ReplaceComponents(add_query);
     scheduler().FetchManifestAndUpdate(
-        install_url, webapps::ManifestId(webapps::kMailGoogleChatManifestId),
+        install_url, app_to_update->manifest_id,
         base::BindOnce(&WebAppProvider::OnDefaultAppUpdateComplete,
-                       weak_ptr_factory_.GetWeakPtr(), app_id));
+                       weak_ptr_factory_.GetWeakPtr(), preinstalled_app_id));
   }
 #if BUILDFLAG(IS_MAC)
   if (base::FeatureList::IsEnabled(kDiyAppIconsMaskedOnMacUpdate)) {
diff --git a/chrome/browser/web_applications/web_app_provider.h b/chrome/browser/web_applications/web_app_provider.h
index 935b26b4..2fd03d3 100644
--- a/chrome/browser/web_applications/web_app_provider.h
+++ b/chrome/browser/web_applications/web_app_provider.h
@@ -15,7 +15,9 @@
 #include "base/types/pass_key.h"
 #include "build/build_config.h"
 #include "components/keyed_service/core/keyed_service.h"
+#include "components/webapps/common/manifest_id_constants.h"
 #include "components/webapps/common/web_app_id.h"
+#include "url/gurl.h"
 
 class Profile;
 
diff --git a/chrome/browser/web_applications/web_contents/web_app_data_retriever.cc b/chrome/browser/web_applications/web_contents/web_app_data_retriever.cc
index aa3d233..1cd0775 100644
--- a/chrome/browser/web_applications/web_contents/web_app_data_retriever.cc
+++ b/chrome/browser/web_applications/web_contents/web_app_data_retriever.cc
@@ -13,8 +13,12 @@
 
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
+#include "base/not_fatal_until.h"
+#include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/task/sequenced_task_runner.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "chrome/browser/web_applications/web_app_constants.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_icon_generator.h"
@@ -37,6 +41,7 @@
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/common/manifest/manifest_util.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
+#include "third_party/blink/public/mojom/manifest/manifest_manager.mojom-forward.h"
 #include "third_party/blink/public/mojom/manifest/manifest_manager.mojom.h"
 #include "third_party/skia/include/core/SkColor.h"
 
@@ -91,7 +96,7 @@
   Observe(web_contents);
 
   // Concurrent calls are not allowed.
-  DCHECK(!get_web_app_info_callback_);
+  CHECK(!HasPendingCall(), base::NotFatalUntil::M145);
   get_web_app_info_callback_ = std::move(callback);
 
   if (ShouldStopRetrieval()) {
@@ -154,7 +159,7 @@
   Observe(web_contents);
 
   // Concurrent calls are not allowed.
-  DCHECK(!check_installability_callback_);
+  CHECK(!HasPendingCall(), base::NotFatalUntil::M145);
   check_installability_callback_ = std::move(callback);
   if (ShouldStopRetrieval()) {
     base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
@@ -186,13 +191,22 @@
                      weak_ptr_factory_.GetWeakPtr()));
 }
 
-base::CallbackListSubscription
-WebAppDataRetriever::GetPrimaryPageFirstSpecifiedManifest(
+void WebAppDataRetriever::GetPrimaryPageFirstSpecifiedManifest(
     content::WebContents& web_contents,
     GetManifestOnceCallbackList::CallbackType callback) {
+  Observe(&web_contents);
+  // Concurrent calls are not allowed.
+  CHECK(!HasPendingCall(), base::NotFatalUntil::M145);
+  get_specified_manifest_callback_ = std::move(callback);
   content::PageManifestManager* manifest_manager =
       content::PageManifestManager::GetOrCreate(web_contents.GetPrimaryPage());
-  return manifest_manager->GetSpecifiedManifest(std::move(callback));
+  get_specified_manifest_subscription_ = manifest_manager->GetSpecifiedManifest(
+      base::BindOnce(&WebAppDataRetriever::OnGotDeveloperSpecifiedManifest,
+                     weak_ptr_factory_.GetWeakPtr()));
+  get_specified_manifest_timeout_timer_.Start(
+      FROM_HERE, manifest_wait_timeout_,
+      base::BindOnce(&WebAppDataRetriever::OnDeveloperSpecifiedManifestTimeout,
+                     weak_ptr_factory_.GetWeakPtr()));
 }
 
 void WebAppDataRetriever::GetIcons(content::WebContents* web_contents,
@@ -204,7 +218,7 @@
   Observe(web_contents);
 
   // Concurrent calls are not allowed.
-  CHECK(!get_icons_callback_);
+  CHECK(!HasPendingCall(), base::NotFatalUntil::M145);
   get_icons_callback_ = std::move(callback);
 
   if (ShouldStopRetrieval()) {
@@ -243,6 +257,16 @@
   CallCallbackOnError(webapps::InstallableStatusCode::RENDERER_CANCELLED);
 }
 
+void WebAppDataRetriever::SetManifestWaitTimeoutForTesting(  // IN-TEST
+    base::TimeDelta timeout) {
+  manifest_wait_timeout_ = timeout;
+}
+
+bool WebAppDataRetriever::HasPendingCall() const {
+  return get_web_app_info_callback_ || check_installability_callback_ ||
+         get_specified_manifest_callback_ || get_icons_callback_;
+}
+
 void WebAppDataRetriever::OnGetWebPageMetadata(
     mojo::AssociatedRemote<webapps::mojom::WebPageMetadataAgent> metadata_agent,
     int last_committed_nav_entry_unique_id,
@@ -314,6 +338,44 @@
            data.GetFirstError());
 }
 
+void WebAppDataRetriever::OnGotDeveloperSpecifiedManifest(
+    const base::expected<blink::mojom::ManifestPtr,
+                         blink::mojom::RequestManifestErrorPtr>& result) {
+  if (!get_specified_manifest_callback_) {
+    return;
+  }
+  get_specified_manifest_timeout_timer_.Stop();
+  if (ShouldStopRetrieval()) {
+    base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+        FROM_HERE,
+        base::BindOnce(&WebAppDataRetriever::CallCallbackOnError,
+                       weak_ptr_factory_.GetWeakPtr(),
+                       webapps::InstallableStatusCode::RENDERER_CANCELLED));
+    return;
+  }
+  Observe(nullptr);
+  std::move(get_specified_manifest_callback_).Run(result);
+}
+
+void WebAppDataRetriever::OnDeveloperSpecifiedManifestTimeout() {
+  if (!get_specified_manifest_callback_) {
+    return;
+  }
+  Observe(nullptr);
+  // Reset the subscription so `OnGotDeveloperSpecifiedManifest` doesn't get
+  // called.
+  get_specified_manifest_subscription_ = base::CallbackListSubscription();
+  std::vector<::blink::mojom::ManifestErrorPtr> error;
+  error.push_back(::blink::mojom::ManifestError::New(
+      base::StringPrintf("No manifest specified in first %d seconds",
+                         kSpecifiedManifestWaitTimeout.InSeconds()),
+      /*critical=*/true, 0u, 0u));
+  std::move(get_specified_manifest_callback_)
+      .Run(base::unexpected(blink::mojom::RequestManifestError::New(
+          blink::mojom::ManifestRequestResult::kNoManifestSpecified,
+          std::move(error))));
+}
+
 void WebAppDataRetriever::OnIconsDownloaded(
     IconsDownloadedResult result,
     IconsMap icons_map,
@@ -338,7 +400,6 @@
 void WebAppDataRetriever::CallCallbackOnError(
     webapps::InstallableStatusCode error_code) {
   Observe(nullptr);
-  DCHECK(ShouldStopRetrieval());
   icon_downloader_.reset();
   fallback_install_info_.reset();
   weak_ptr_factory_.InvalidateWeakPtrs();
@@ -356,6 +417,15 @@
     std::move(get_icons_callback_)
         .Run(IconsDownloadedResult::kPrimaryPageChanged, IconsMap{},
              DownloadedIconsHttpResults{});
+  } else if (get_specified_manifest_callback_) {
+    std::vector<::blink::mojom::ManifestErrorPtr> error;
+    error.push_back(
+        ::blink::mojom::ManifestError::New("Web contents shutting down",
+                                           /*critical=*/true, 0u, 0u));
+    std::move(get_specified_manifest_callback_)
+        .Run(base::unexpected(blink::mojom::RequestManifestError::New(
+            blink::mojom::ManifestRequestResult::kNoManifestSpecified,
+            std::move(error))));
   }
 }
 
diff --git a/chrome/browser/web_applications/web_contents/web_app_data_retriever.h b/chrome/browser/web_applications/web_contents/web_app_data_retriever.h
index 947b494..7fb45cb7 100644
--- a/chrome/browser/web_applications/web_contents/web_app_data_retriever.h
+++ b/chrome/browser/web_applications/web_contents/web_app_data_retriever.h
@@ -13,6 +13,8 @@
 #include "base/callback_list.h"
 #include "base/functional/callback.h"
 #include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
+#include "base/timer/timer.h"
 #include "chrome/browser/web_applications/web_app_install_utils.h"
 #include "chrome/browser/web_applications/web_contents/web_app_icon_downloader.h"
 #include "components/webapps/browser/installable/installable_logging.h"
@@ -39,7 +41,8 @@
 struct WebAppInstallInfo;
 
 // Class used by the WebApp system to retrieve the necessary information to
-// install an app. Should only be called from the UI thread.
+// install an app. Should only be called from the UI thread. This should not be
+// used for multiple fetches at the same time.
 class WebAppDataRetriever : content::WebContentsObserver {
  public:
   // Returns nullptr for WebAppInstallInfo if error.
@@ -91,7 +94,9 @@
   // this web contents. This will continue to execute even if the page becomes
   // not primary, so the caller must handle any edge cases with primary page
   // changes in the web contents.
-  virtual base::CallbackListSubscription GetPrimaryPageFirstSpecifiedManifest(
+  // Note: This will automatically abandon the request if a timeout of
+  // kSpecifiedManifestWaitTimeout is reached.
+  virtual void GetPrimaryPageFirstSpecifiedManifest(
       content::WebContents& web_contents,
       GetManifestOnceCallbackList::CallbackType callback);
 
@@ -110,13 +115,20 @@
   void PrimaryMainFrameRenderProcessGone(
       base::TerminationStatus status) override;
 
+  void SetManifestWaitTimeoutForTesting(base::TimeDelta timeout);
+
  private:
+  bool HasPendingCall() const;
   void OnGetWebPageMetadata(
       mojo::AssociatedRemote<webapps::mojom::WebPageMetadataAgent>
           metadata_agent,
       int last_committed_nav_entry_unique_id,
       webapps::mojom::WebPageMetadataPtr web_page_metadata);
   void OnDidPerformInstallableCheck(const webapps::InstallableData& data);
+  void OnGotDeveloperSpecifiedManifest(
+      const base::expected<blink::mojom::ManifestPtr,
+                           blink::mojom::RequestManifestErrorPtr>& result);
+  void OnDeveloperSpecifiedManifestTimeout();
   void OnIconsDownloaded(IconsDownloadedResult result,
                          IconsMap icons_map,
                          DownloadedIconsHttpResults icons_http_results);
@@ -129,6 +141,13 @@
 
   CheckInstallabilityCallback check_installability_callback_;
 
+  static constexpr base::TimeDelta kSpecifiedManifestWaitTimeout =
+      base::Seconds(30);
+  base::TimeDelta manifest_wait_timeout_ = kSpecifiedManifestWaitTimeout;
+  base::OneShotTimer get_specified_manifest_timeout_timer_;
+  base::CallbackListSubscription get_specified_manifest_subscription_;
+  GetManifestOnceCallbackList::CallbackType get_specified_manifest_callback_;
+
   GetIconsCallback get_icons_callback_;
 
   std::unique_ptr<WebAppIconDownloader> icon_downloader_;
diff --git a/chrome/browser/web_applications/web_contents/web_app_data_retriever_unittest.cc b/chrome/browser/web_applications/web_contents/web_app_data_retriever_unittest.cc
index 479e71a..efa6b53 100644
--- a/chrome/browser/web_applications/web_contents/web_app_data_retriever_unittest.cc
+++ b/chrome/browser/web_applications/web_contents/web_app_data_retriever_unittest.cc
@@ -13,6 +13,8 @@
 #include "base/functional/bind.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/test/bind.h"
+#include "base/test/test_future.h"
+#include "base/time/time.h"
 #include "chrome/browser/web_applications/web_app.h"
 #include "chrome/browser/web_applications/web_app_helpers.h"
 #include "chrome/browser/web_applications/web_app_install_info.h"
@@ -37,6 +39,7 @@
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
 #include "third_party/blink/public/mojom/manifest/manifest.mojom.h"
+#include "third_party/blink/public/mojom/manifest/manifest_manager.mojom.h"
 
 namespace web_app {
 
@@ -44,7 +47,6 @@
 
 const char16_t kFooTitle[] = u"Foo Title";
 
-}  // namespace
 
 class FakeWebPageMetadataAgent
     : public webapps::mojom::WebPageMetadataAgentInterceptorForTesting {
@@ -451,4 +453,37 @@
   EXPECT_TRUE(callback_called);
 }
 
+// This is required as the CallbackList uses const ref, and TestFuture requires
+// copying or move support. This manually clones from the const ref so the
+// result can be moved into the TestFuture.
+base::expected<blink::mojom::ManifestPtr, blink::mojom::RequestManifestErrorPtr>
+CopyMojoExpectedConstRef(
+    const base::expected<blink::mojom::ManifestPtr,
+                         blink::mojom::RequestManifestErrorPtr>&
+        const_ref_result) {
+  if (const_ref_result.has_value()) {
+    return base::ok(const_ref_result->Clone());
+  } else {
+    return base::unexpected(const_ref_result.error()->Clone());
+  }
+}
+
+TEST_F(WebAppDataRetrieverTest, CheckTimeoutTriggers) {
+  base::test::TestFuture<base::expected<blink::mojom::ManifestPtr,
+                                        blink::mojom::RequestManifestErrorPtr>>
+      primary_manifest_future;
+
+  WebAppDataRetriever retriever;
+  retriever.SetManifestWaitTimeoutForTesting(base::Seconds(0));
+  retriever.GetPrimaryPageFirstSpecifiedManifest(
+      *web_contents(), base::BindOnce(&CopyMojoExpectedConstRef)
+                           .Then(primary_manifest_future.GetCallback()));
+
+  ASSERT_TRUE(primary_manifest_future.Wait());
+  ASSERT_FALSE(primary_manifest_future.Get().has_value());
+  EXPECT_EQ(primary_manifest_future.Get().error()->error,
+            blink::mojom::ManifestRequestResult::kNoManifestSpecified);
+}
+
+}  // namespace
 }  // namespace web_app
diff --git a/chrome/browser/webauthn/chrome_webauthn_browsertest.cc b/chrome/browser/webauthn/chrome_webauthn_browsertest.cc
index 275a0085..6418013 100644
--- a/chrome/browser/webauthn/chrome_webauthn_browsertest.cc
+++ b/chrome/browser/webauthn/chrome_webauthn_browsertest.cc
@@ -400,7 +400,8 @@
     scoped_feature_list_.InitWithFeatures(
         {device::kWebAuthnHelloSignal,
          device::kWebAuthenticationFixWindowsHelloRdp,
-         device::kWebAuthenticationWindowsHints},
+         device::kWebAuthenticationWindowsHints,
+         device::kWebAuthnSignalApiHidePasskeys},
         /*disabled_features=*/{});
   }
 
@@ -676,10 +677,13 @@
   EXPECT_TRUE(ExecJs(browser()->tab_strip_model()->GetActiveWebContents(),
                      GetSignalUnknownCredentialScript(kCredentialID)));
 
-  // After reporting the passkey, it should be deleted from the credentials
-  // list, so the vector of passkeys matching the relying party should be empty.
-  EXPECT_TRUE(
-      passkey_model->GetPasskeysForRelyingPartyId("www.example.com").empty());
+  // After reporting the passkey, it should be marked as hidden.
+  std::optional<sync_pb::WebauthnCredentialSpecifics> credential =
+      (passkey_model->GetPasskeyByCredentialId(
+          "www.example.com",
+          std::string(reinterpret_cast<const char*>(kCredentialID), 16)));
+  ASSERT_TRUE(credential);
+  EXPECT_TRUE(credential->hidden());
 }
 
 IN_PROC_BROWSER_TEST_F(WebAuthnBrowserTest,
@@ -699,10 +703,13 @@
                 browser()->tab_strip_model()->GetActiveWebContents(),
                 GetSignalAllAcceptedCredentials(kCredentialID, kUserId1)));
 
-  // Check that the passkey with kCredentialID was not deleted.
-  EXPECT_TRUE(passkey_model->GetPasskeyByCredentialId(
-      "www.example.com",
-      std::string(reinterpret_cast<const char*>(kCredentialID), 16)));
+  // Check that the passkey with kCredentialID was not hidden.
+  std::optional<sync_pb::WebauthnCredentialSpecifics> credential =
+      (passkey_model->GetPasskeyByCredentialId(
+          "www.example.com",
+          std::string(reinterpret_cast<const char*>(kCredentialID), 16)));
+  ASSERT_TRUE(credential);
+  EXPECT_FALSE(credential->hidden());
 
   password_manager::ui::State model_state =
       PasswordsModelDelegateFromWebContents(
@@ -725,7 +732,7 @@
       kCredentialID2, kUserId2, kUsername2, kDisplayName2));
 
   // Reports the user ID that matches the passkey created with an empty
-  // allCurrentCredentialIds. The passkey will be deleted.
+  // allCurrentCredentialIds. The passkey will be hidden.
   EXPECT_EQ(
       "webauthn: OK",
       content::EvalJs(browser()->tab_strip_model()->GetActiveWebContents(),
@@ -737,10 +744,13 @@
   }).then(c => 'webauthn: OK', e => 'error ' + e);
   )"));
 
-  // Check that the passkey with kCredentialID2 was deleted.
-  EXPECT_FALSE(passkey_model->GetPasskeyByCredentialId(
-      "www.example.com",
-      std::string(reinterpret_cast<const char*>(kCredentialID2), 16)));
+  // Check that the passkey with kCredentialID2 was hidden.
+  std::optional<sync_pb::WebauthnCredentialSpecifics> credential =
+      (passkey_model->GetPasskeyByCredentialId(
+          "www.example.com",
+          std::string(reinterpret_cast<const char*>(kCredentialID2), 16)));
+  ASSERT_TRUE(credential);
+  EXPECT_TRUE(credential->hidden());
 
   password_manager::ui::State model_state =
       PasswordsModelDelegateFromWebContents(
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index d9be9b193..bc3ea1b 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1761911625-f63a251c3f153363e076f5993f57e3518fdfa79a-e3bc228bc2cf01561e0e0f3139899be8aece8e15.profdata
+chrome-android32-main-1761933529-c159e7c7696b474ff8eea1f13c055893814e447d-eb39d0d95e3b127962732e988df7ba49b68c00da.profdata
diff --git a/chrome/build/android-desktop-x64.pgo.txt b/chrome/build/android-desktop-x64.pgo.txt
index ce96e4a5..ca88c4c 100644
--- a/chrome/build/android-desktop-x64.pgo.txt
+++ b/chrome/build/android-desktop-x64.pgo.txt
@@ -1 +1 @@
-chrome-android-desktop-x64-main-1761911625-196405983c6202d33d1069962f94d5cd4b339a0c-e3bc228bc2cf01561e0e0f3139899be8aece8e15.profdata
+chrome-android-desktop-x64-main-1761933529-4833e3974573bc21479a8a97be153fc292667444-eb39d0d95e3b127962732e988df7ba49b68c00da.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index fd37043..ea84c3d3 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1761911625-e18b1a7d2c88728fc03d255905559c9f2abd93ff-e3bc228bc2cf01561e0e0f3139899be8aece8e15.profdata
+chrome-linux-main-1761933529-70c30d347baae79e5e1c022ce2bd1566c46fd5a1-eb39d0d95e3b127962732e988df7ba49b68c00da.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 7eacfd1f..849b592 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1761926295-20cf7f01d887653b4929603dc14bf2c62601b619-bc50edd5ee43f562b4017479c75a267174c79fe0.profdata
+chrome-mac-arm-main-1761940412-88ec21ea3063e646ec2d2c086ce487bfa38ab93d-3f6922a0ba6f633d813d12eead7470772ed2a62e.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 3e818b6..9576f0c 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1761911625-56a7821e65f41d45ea9a36aa417d2992dcedcf10-e3bc228bc2cf01561e0e0f3139899be8aece8e15.profdata
+chrome-mac-main-1761933529-1b9dd0e295e16f96b2d706e6d82f8870b0f17b47-eb39d0d95e3b127962732e988df7ba49b68c00da.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 909ce79..db8de52 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1761911625-284b64ac113f51512fa8cc969cc94b84ded75900-e3bc228bc2cf01561e0e0f3139899be8aece8e15.profdata
+chrome-win-arm64-main-1761933529-62486363e8f501cfa17373c4f236efb0f4723508-eb39d0d95e3b127962732e988df7ba49b68c00da.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 371d4cf..07f266e 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1761911625-6aa9271f5c876c4dd56217254b87502d466f73b7-e3bc228bc2cf01561e0e0f3139899be8aece8e15.profdata
+chrome-win32-main-1761922649-fab462633d633b3302fd5e3dc957dfc3b1e2b390-73ae8d34f2796b5a6b050d8246f5382f4d06b80d.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index a329d4b..108dcc37 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1761901187-6ed08352eb9448b96cffd000da75c131bf12dead-406af31cb00a0f0a62b17811c1999c943f5c8465.profdata
+chrome-win64-main-1761911625-01585a2395ff4fa64a3c4093005481250edb33c9-e3bc228bc2cf01561e0e0f3139899be8aece8e15.profdata
diff --git a/chrome/common/request_header_integrity/BUILD.gn b/chrome/common/request_header_integrity/BUILD.gn
index f2299d6..e7e65339 100644
--- a/chrome/common/request_header_integrity/BUILD.gn
+++ b/chrome/common/request_header_integrity/BUILD.gn
@@ -41,7 +41,6 @@
   configs += [ ":header_name_defines" ]
 
   deps = [
-    ":build_derived_values",
     "//base",
     "//build:branding_buildflags",
     "//chrome/common:channel_info",
@@ -52,6 +51,9 @@
     "//services/network/public/mojom",
     "//third_party/blink/public/common:headers",
   ]
+  if (is_chrome_branded) {
+    deps += [ "internal:build_derived_values" ]
+  }
 }
 
 source_set("unit_tests") {
@@ -105,17 +107,3 @@
   header = "buildflags.h"
   flags = [ "ENABLE_REQUEST_HEADER_INTEGRITY=$enable_request_header_integrity" ]
 }
-
-process_version("build_derived_values") {
-  template_file = "build_derived_values.h.template"
-
-  # Needs to use the actual LASTCHANGE_YEAR instead of LASTCHANGE.dummy based
-  # values for header reporting, which should be fine for caching builds as it
-  # only changes once a year.
-  sources = [
-    "//build/util/LASTCHANGE",
-    branding_file_path,
-  ]
-
-  output = "$target_gen_dir/build_derived_values.h"
-}
diff --git a/chrome/common/request_header_integrity/build_derived_values.h.template b/chrome/common/request_header_integrity/build_derived_values.h.template
deleted file mode 100644
index 6bc625cb..0000000
--- a/chrome/common/request_header_integrity/build_derived_values.h.template
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef CHROME_COMMON_REQUEST_HEADER_INTEGRITY_BUILD_DERIVIED_VALUES_H_
-#define CHROME_COMMON_REQUEST_HEADER_INTEGRITY_BUILD_DERIVIED_VALUES_H_
-
-#define CHROME_COPYRIGHT "@COPYRIGHT@"
-#define LASTCHANGE_YEAR "@LASTCHANGE_YEAR@"
-
-#endif  // CHROME_COMMON_REQUEST_HEADER_INTEGRITY_BUILD_DERIVIED_VALUES_H_
diff --git a/chrome/common/request_header_integrity/internal b/chrome/common/request_header_integrity/internal
index 1592aa7..f8540e2 160000
--- a/chrome/common/request_header_integrity/internal
+++ b/chrome/common/request_header_integrity/internal
@@ -1 +1 @@
-Subproject commit 1592aa7ba598a048f918f54735bcf056556532c3
+Subproject commit f8540e200327c806b7434d1e6632bfd3f3673de8
diff --git a/chrome/common/request_header_integrity/request_header_integrity_url_loader_throttle.cc b/chrome/common/request_header_integrity/request_header_integrity_url_loader_throttle.cc
index c665381..34ab5cf 100644
--- a/chrome/common/request_header_integrity/request_header_integrity_url_loader_throttle.cc
+++ b/chrome/common/request_header_integrity/request_header_integrity_url_loader_throttle.cc
@@ -14,7 +14,6 @@
 #include "base/strings/string_util.h"
 #include "build/branding_buildflags.h"
 #include "chrome/common/channel_info.h"
-#include "chrome/common/request_header_integrity/build_derived_values.h"
 #include "components/embedder_support/user_agent_utils.h"
 #include "components/google/core/common/google_util.h"
 #include "google_apis/google_api_keys.h"
@@ -23,6 +22,7 @@
 #include "services/network/public/mojom/network_context.mojom.h"
 
 #if BUILDFLAG(GOOGLE_CHROME_BRANDING)
+#include "chrome/common/request_header_integrity/internal/build_derived_values.h"
 #include "chrome/common/request_header_integrity/internal/google_header_names.h"
 #endif
 
@@ -42,6 +42,14 @@
 #define COPYRIGHT_HEADER_NAME "X-Placeholder-4"
 #endif
 
+#if !defined(CHROME_COPYRIGHT)
+#define CHROME_COPYRIGHT "X-COPYRIGHT"
+#endif
+
+#if !defined(LASTCHANGE_YEAR)
+#define LASTCHANGE_YEAR "1969"
+#endif
+
 namespace request_header_integrity {
 
 namespace {
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h
index 7b2c72f..a0100de 100644
--- a/chrome/common/webui_url_constants.h
+++ b/chrome/common/webui_url_constants.h
@@ -83,6 +83,9 @@
     "connectors-internals";
 inline constexpr char kChromeUIConstrainedHTMLTestURL[] =
     "chrome://constrained-test/";
+inline constexpr char kChromeUIContextualTasksHost[] = "contextual-tasks";
+inline constexpr char kChromeUIContextualTasksURL[] =
+    "chrome://contextual-tasks/";
 inline constexpr char kChromeUIContentSettingsURL[] =
     "chrome://settings/content";
 inline constexpr char16_t kChromeUIContentSettingsURL16[] =
diff --git a/chrome/renderer/actor/drag_and_release_tool.cc b/chrome/renderer/actor/drag_and_release_tool.cc
index a071395..a012729 100644
--- a/chrome/renderer/actor/drag_and_release_tool.cc
+++ b/chrome/renderer/actor/drag_and_release_tool.cc
@@ -8,6 +8,7 @@
 #include "base/types/expected.h"
 #include "chrome/common/actor/action_result.h"
 #include "chrome/common/actor/actor_logging.h"
+#include "chrome/common/actor/journal_details_builder.h"
 #include "chrome/common/chrome_features.h"
 #include "chrome/renderer/actor/tool_utils.h"
 #include "content/public/renderer/render_frame.h"
@@ -58,6 +59,12 @@
   ResolvedTarget from_target = validated_result->from;
   ResolvedTarget to_target = validated_result->to;
 
+  journal_->Log(task_id_, "DragAndReleaseTool::Execute",
+                JournalDetailsBuilder()
+                    .Add("from", from_target.widget_point)
+                    .Add("to", to_target.widget_point)
+                    .Build());
+
   WebWidget* widget = from_target.GetWidget(*this);
   CHECK(widget);
 
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn
index 298cbde..b1fcad8 100644
--- a/chrome/test/BUILD.gn
+++ b/chrome/test/BUILD.gn
@@ -1961,7 +1961,6 @@
       "//components/feed/core/v2:test_helpers",
       "//components/feed/mojom:mojo_bindings",
       "//components/fingerprinting_protection_filter/common:features",
-      "//components/fingerprinting_protection_filter/interventions/common:features",
       "//components/infobars/content",
       "//components/invalidation:test_support",
       "//components/messages/android",
@@ -2706,7 +2705,6 @@
       "//components/feedback/redaction_tool",
       "//components/fingerprinting_protection_filter/browser",
       "//components/fingerprinting_protection_filter/common",
-      "//components/fingerprinting_protection_filter/interventions/common:features",
       "//components/fullscreen_control",
       "//components/heavy_ad_intervention",
       "//components/history/content/browser",
@@ -3658,6 +3656,7 @@
       "../browser/ui/native_window_tracker_browsertest.cc",
       "../browser/ui/promos/ios_promos_utils_browsertest.cc",
       "../browser/ui/read_anything/read_anything_controller_browsertest.cc",
+      "../browser/ui/read_anything/read_anything_entry_point_controller_browsertest.cc",
       "../browser/ui/renderer_event_injection_browsertest.cc",
       "../browser/ui/sad_tab_helper_browsertest.cc",
       "../browser/ui/tab_modal_confirm_dialog_browsertest.cc",
@@ -7146,7 +7145,6 @@
     "//components/feedback/redaction_tool",
     "//components/fingerprinting_protection_filter/browser",
     "//components/fingerprinting_protection_filter/common",
-    "//components/fingerprinting_protection_filter/interventions/common:features",
     "//components/history/content/browser",
     "//components/history/core/browser:features",
     "//components/history/core/common",
diff --git a/chrome/test/data/actor/beforeunload.html b/chrome/test/data/actor/beforeunload.html
new file mode 100644
index 0000000..9ff21fe7
--- /dev/null
+++ b/chrome/test/data/actor/beforeunload.html
@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html>
+<head><title>Beforeunload Actor Test</title></head>
+<body>
+  <h1>Page with beforeunload</h1>
+  <script>
+    window.addEventListener('beforeunload', function (event) {
+      event.preventDefault();
+      event.returnValue = 'Test';
+    });
+  </script>
+</body>
+</html>
\ No newline at end of file
diff --git a/chrome/test/data/long_text_page.html b/chrome/test/data/long_text_page.html
new file mode 100644
index 0000000..5a33ff0
--- /dev/null
+++ b/chrome/test/data/long_text_page.html
@@ -0,0 +1,83 @@
+<html>
+<head><title>This page has several paragraphs</title></head>
+<body>
+<p>
+Use Reading mode in Chrome
+Customize your reading experience on Chrome with Reading mode. This feature helps you:
+</p>
+<p>
+Focus more easily on text
+Reduce distractions from images and videos on screen
+Listen to the text you read
+Select a voice and change voice speed
+Select alternate typeface and font size
+Adjust line and letter spacing
+Choose color theme
+Important: These settings only apply to the text you want to read in the side panel. They won't apply to any other content in Chrome or to general websites.
+</p>
+<p>
+Turn on Reading mode
+On your computer, open Chrome.
+Go to a website with text that you'd like to read.
+Right-click the page.
+Select Open in reading mode.
+Tips:
+</p>
+<p>
+To make the panel bigger, slide the panel border to the left.
+To pin Reading mode, at the top right of the side panel, select Pin to toolbar Pin.
+At the top right of the toolbar, you can access Reading mode after you pin it. Select Reading mode .
+Use Reading mode to make reading easier
+When you use Reading mode, you can adjust font settings for easier reading.
+</p>
+<p>
+In the toolbar, you can:
+
+Adjust the font size: Select Font size .
+To decrease the font size: Select Decrease .
+To increase the font size: Select Increase .
+To reset to default font size: Select Reset.
+Adjust the font: Select Font .
+Change the Reading mode color theme: Select Color theme .
+Change the spacing between lines: Select Line spacing .
+Change the spacing between letters: Select Letter spacing .
+Listen to the text you read with read aloud
+When you use Reading mode, you can listen to the text on a website.
+</p>
+<p>
+To turn on read aloud and listen to the text on a website, under "Reading mode," select Play .
+
+While in read aloud, use the toolbar to:
+
+Play and pause while you read: Select Play  or Pause .
+Jump to the beginning of the previous or next sentence: Select Previous  or Next  .
+Adjust the playback speed: Select Playback speed .
+Select your preferred voice:
+To preview a voice:
+Through the toolbar:
+Select Voice .
+Next to the voice name, select Preview .
+Through your keyboard:
+To put keyboard focus on the voice you want to preview, in the menu, press Arrow up and Arrow down.
+Press Right arrow  and then Enter.
+To select a voice: Select the voice you prefer.
+To add a language: Select Voice  and then Languages....
+To search a language: At the search bar, enter the language.
+To add a language: Turn on the preferred language.
+To remove a language: Turn off the preferred language.
+Select your preferred highlighting mode:
+Select Voice highlight.
+To turn on text highlighting: From the dropdown menu, select one of the following:
+Adaptive highlighting
+Word
+Sentence
+To turn off text highlighting: From the dropdown menu, select Off.
+</p>
+<p>
+Tips:
+
+When there isn't enough space for the toolbar options to fit, you can find the toolbar options when you select More More.
+Reading mode automatically downloads Google natural voices for your current language. If download fails, the system voice for your language will be used instead.
+</p>
+</body>
+</html>
diff --git a/chrome/test/data/web_apps/simple/install_url.html b/chrome/test/data/web_apps/simple/install_url.html
new file mode 100644
index 0000000..c320a1d
--- /dev/null
+++ b/chrome/test/data/web_apps/simple/install_url.html
@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <link rel="manifest" href="manifest.json">
+  <link rel="icon" href="basic-48.png">
+  <script src="../launch_params_detector.js"></script>
+</head>
+<body>
+  <h1>Page that is not the start_url, but with manifest link.</h1>
+</body>
+</html>
diff --git a/chrome/test/data/webui/extensions_zero_state/zero_state_promo_app_test.ts b/chrome/test/data/webui/extensions_zero_state/zero_state_promo_app_test.ts
index d3aa596..2b47439 100644
--- a/chrome/test/data/webui/extensions_zero_state/zero_state_promo_app_test.ts
+++ b/chrome/test/data/webui/extensions_zero_state/zero_state_promo_app_test.ts
@@ -50,7 +50,7 @@
   }
 }
 
-suite('ChipsUiTest', () => {
+suite('ChipsUiV1Test', () => {
   let bubbleHandler: TestBubbleHandler;
   let zeroStatePromoApp: ZeroStatePromoAppElement;
   let promoProxy: TestPromoProxy;
@@ -78,6 +78,7 @@
     assertTrue(isVisible(queryAppSelector('#writingButton')));
     assertTrue(isVisible(queryAppSelector('#productivityButton')));
     assertTrue(isVisible(queryAppSelector('#aiButton')));
+    assertFalse(isVisible(queryAppSelector('#webStoreButton')));
     assertFalse(isVisible(queryAppSelector('#couponsLink')));
     assertFalse(isVisible(queryAppSelector('#writingLink')));
     assertFalse(isVisible(queryAppSelector('#productivityLink')));
@@ -149,6 +150,106 @@
   });
 });
 
+suite('ChipsUiV2Test', () => {
+  let bubbleHandler: TestBubbleHandler;
+  let zeroStatePromoApp: ZeroStatePromoAppElement;
+  let promoProxy: TestPromoProxy;
+
+  setup(() => {
+    bubbleHandler = new TestBubbleHandler();
+    CustomHelpBubbleProxyImpl.setInstance(new TestBubbleProxy(bubbleHandler));
+
+    promoProxy = new TestPromoProxy();
+    ZeroStatePromoBrowserProxyImpl.setInstance(promoProxy);
+
+    document.body.innerHTML = window.trustedTypes!.emptyHTML;
+    zeroStatePromoApp =
+        document.createElement('extensions-zero-state-promo-app');
+    document.body.appendChild(zeroStatePromoApp);
+  });
+
+  function queryAppSelector(selector: string): HTMLElement|null {
+    return zeroStatePromoApp.shadowRoot.querySelector<HTMLElement>(selector);
+  }
+
+  test('UiElementVisibility', () => {
+    assertTrue(isVisible(queryAppSelector('#dismissButton')));
+    assertTrue(isVisible(queryAppSelector('#couponsButton')));
+    assertTrue(isVisible(queryAppSelector('#productivityButton')));
+    assertTrue(isVisible(queryAppSelector('#aiButton')));
+    assertTrue(isVisible(queryAppSelector('#webStoreButton')));
+    assertFalse(isVisible(queryAppSelector('#writingButton')));
+    assertFalse(isVisible(queryAppSelector('#couponsLink')));
+    assertFalse(isVisible(queryAppSelector('#writingLink')));
+    assertFalse(isVisible(queryAppSelector('#productivityLink')));
+    assertFalse(isVisible(queryAppSelector('#aiLink')));
+    assertFalse(isVisible(queryAppSelector('#closeButton')));
+    assertFalse(isVisible(queryAppSelector('#customActionButton')));
+  });
+
+  test('ClickCouponsChip', async () => {
+    const chip = queryAppSelector('#couponsButton');
+    assertTrue(!!chip);
+    chip.click();
+
+    assertEquals(
+        WebStoreLinkClicked.kCoupon,
+        await promoProxy.whenCalled('launchWebStoreLink'));
+    assertEquals(
+        CustomHelpBubbleUserAction.kAction,
+        await bubbleHandler.whenCalled('notifyUserAction'));
+  });
+
+  test('ClickWebstoreChip', async () => {
+    const chip = queryAppSelector('#webStoreButton');
+    assertTrue(!!chip);
+    chip.click();
+
+    assertEquals(
+        WebStoreLinkClicked.kDiscoverExtension,
+        await promoProxy.whenCalled('launchWebStoreLink'));
+    assertEquals(
+        CustomHelpBubbleUserAction.kAction,
+        await bubbleHandler.whenCalled('notifyUserAction'));
+  });
+
+  test('ClickProductivityChip', async () => {
+    const chip = queryAppSelector('#productivityButton');
+    assertTrue(!!chip);
+    chip.click();
+
+    assertEquals(
+        WebStoreLinkClicked.kProductivity,
+        await promoProxy.whenCalled('launchWebStoreLink'));
+    assertEquals(
+        CustomHelpBubbleUserAction.kAction,
+        await bubbleHandler.whenCalled('notifyUserAction'));
+  });
+
+  test('ClickAiChip', async () => {
+    const chip = queryAppSelector('#aiButton');
+    assertTrue(!!chip);
+    chip.click();
+
+    assertEquals(
+        WebStoreLinkClicked.kAi,
+        await promoProxy.whenCalled('launchWebStoreLink'));
+    assertEquals(
+        CustomHelpBubbleUserAction.kAction,
+        await bubbleHandler.whenCalled('notifyUserAction'));
+  });
+
+  test('ClickDismissButton', async () => {
+    const button = queryAppSelector('#dismissButton');
+    assertTrue(!!button);
+    button.click();
+
+    assertEquals(
+        CustomHelpBubbleUserAction.kDismiss,
+        await bubbleHandler.whenCalled('notifyUserAction'));
+  });
+});
+
 suite('PlainLinkUiTest', () => {
   let bubbleHandler: TestBubbleHandler;
   let zeroStatePromoApp: ZeroStatePromoAppElement;
diff --git a/chrome/test/data/webui/extensions_zero_state/zero_state_promo_browsertest.cc b/chrome/test/data/webui/extensions_zero_state/zero_state_promo_browsertest.cc
index 95049f4..6226c5a 100644
--- a/chrome/test/data/webui/extensions_zero_state/zero_state_promo_browsertest.cc
+++ b/chrome/test/data/webui/extensions_zero_state/zero_state_promo_browsertest.cc
@@ -15,25 +15,46 @@
   }
 };
 
-class ZeroStatePromoChipsUiTest : public ZeroStatePromoBrowserTest {
+class ZeroStatePromoChipsUiV1Test : public ZeroStatePromoBrowserTest {
  protected:
-  ZeroStatePromoChipsUiTest() {
+  ZeroStatePromoChipsUiV1Test() {
     feature_list_.InitAndEnableFeatureWithParameters(
         feature_engagement::kIPHExtensionsZeroStatePromoFeature,
         {{feature_engagement::kIPHExtensionsZeroStatePromoVariantParam.name,
           feature_engagement::kIPHExtensionsZeroStatePromoVariantParam.GetName(
               feature_engagement::IPHExtensionsZeroStatePromoVariant::
-                  kCustomUiChipIph)}});
+                  kCustomUiChipIphV1)}});
   }
 
  private:
   base::test::ScopedFeatureList feature_list_;
 };
 
-IN_PROC_BROWSER_TEST_F(ZeroStatePromoChipsUiTest, AllTests) {
+IN_PROC_BROWSER_TEST_F(ZeroStatePromoChipsUiV1Test, AllTests) {
   ZeroStatePromoBrowserTest::RunTest(
       "extensions_zero_state/zero_state_promo_app_test.js",
-      "runMochaSuite('ChipsUiTest');");
+      "runMochaSuite('ChipsUiV1Test');");
+}
+
+class ZeroStatePromoChipsUiV2Test : public ZeroStatePromoBrowserTest {
+ protected:
+  ZeroStatePromoChipsUiV2Test() {
+    feature_list_.InitAndEnableFeatureWithParameters(
+        feature_engagement::kIPHExtensionsZeroStatePromoFeature,
+        {{feature_engagement::kIPHExtensionsZeroStatePromoVariantParam.name,
+          feature_engagement::kIPHExtensionsZeroStatePromoVariantParam.GetName(
+              feature_engagement::IPHExtensionsZeroStatePromoVariant::
+                  kCustomUiChipIphV2)}});
+  }
+
+ private:
+  base::test::ScopedFeatureList feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_F(ZeroStatePromoChipsUiV2Test, AllTests) {
+  ZeroStatePromoBrowserTest::RunTest(
+      "extensions_zero_state/zero_state_promo_app_test.js",
+      "runMochaSuite('ChipsUiV2Test');");
 }
 
 class ZeroStatePromoPlainLinkUiTest : public ZeroStatePromoBrowserTest {
diff --git a/chrome/test/data/webui/new_tab_page/app_test.ts b/chrome/test/data/webui/new_tab_page/app_test.ts
index c5078195..ef7712d 100644
--- a/chrome/test/data/webui/new_tab_page/app_test.ts
+++ b/chrome/test/data/webui/new_tab_page/app_test.ts
@@ -1934,21 +1934,52 @@
       loadTimeData.overrideValues({
         ntpNextFeaturesEnabled: true,
         ntpRealboxNextEnabled: true,
+        actionChipsEnabled: true,
       });
     });
+
+    // Testing Action Chips visibility on initial flag load values.
     [true, false].forEach(
-        (ntpNextFeaturesEnabled) =>
-            suite(`actionChips rendered ${ntpNextFeaturesEnabled}`, () => {
-              suiteSetup(() => {
-                loadTimeData.overrideValues({ntpNextFeaturesEnabled});
-              });
+        (actionChipsEnabled) => [true, false].forEach(
+            (ntpNextFeaturesEnabled) => suite(
+                'Action Chips settings rendered with actionChipsEnabled: ' +
+                    actionChipsEnabled +
+                    ' and ntpNextFeaturesEnabled: ' + ntpNextFeaturesEnabled,
+                () => {
+                  // Arrange.
+                  const expectedVisibility =
+                      ntpNextFeaturesEnabled && actionChipsEnabled;
+                  suiteSetup(() => {
+                    loadTimeData.overrideValues({
+                      ntpNextFeaturesEnabled,
+                      actionChipsEnabled,
+                    });
+                  });
 
-              test('Show iframe when appropriate', () => {
-                const chips = $$<HTMLElement>(app, 'ntp-action-chips');
+                  // Assert.
+                  test('Show iframe when appropriate', () => {
+                    const chips = $$<HTMLElement>(app, 'ntp-action-chips');
+                    assertEquals(!!chips, expectedVisibility);
+                  });
+                })));
 
-                assertEquals(!!chips, ntpNextFeaturesEnabled);
-              });
+    // Testing Action Chips visibility on changing visibility prefs.
+    [true, false].forEach(
+        (isActionChipsVisible) => test(
+            'Action chips are rendered/hidden on changing visibility to ' +
+                isActionChipsVisible,
+            async () => {
+              // Act.
+              callbackRouterRemote.setActionChipsVisibility(
+                  isActionChipsVisible);
+              await callbackRouterRemote.$.flushForTesting();
+              await microtasksFinished();
+
+              // Assert.
+              const chips = $$(app, 'ntp-action-chips')!;
+              assertEquals(!!chips, isActionChipsVisible);
             }));
+
     test(
         'Nano Banana chip click opens composebox create image mode',
         async () => {
diff --git a/chromecast/base/alarm_manager.h b/chromecast/base/alarm_manager.h
index a584008..0542364 100644
--- a/chromecast/base/alarm_manager.h
+++ b/chromecast/base/alarm_manager.h
@@ -11,7 +11,7 @@
 
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
diff --git a/chromecast/base/metrics/cast_metrics_helper.h b/chromecast/base/metrics/cast_metrics_helper.h
index d9d1e1c0..4cf7051 100644
--- a/chromecast/base/metrics/cast_metrics_helper.h
+++ b/chromecast/base/metrics/cast_metrics_helper.h
@@ -11,7 +11,7 @@
 #include "base/containers/flat_map.h"
 #include "base/functional/callback.h"
 #include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/no_destructor.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
diff --git a/chromecast/base/system_time_change_notifier.h b/chromecast/base/system_time_change_notifier.h
index 88dc070..c9e41e6 100644
--- a/chromecast/base/system_time_change_notifier.h
+++ b/chromecast/base/system_time_change_notifier.h
@@ -6,7 +6,7 @@
 #define CHROMECAST_BASE_SYSTEM_TIME_CHANGE_NOTIFIER_H_
 
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list_threadsafe.h"
 #include "base/time/time.h"
diff --git a/chromecast/base/task_runner_impl.h b/chromecast/base/task_runner_impl.h
index 3a7fe5a6..80ae8d1c 100644
--- a/chromecast/base/task_runner_impl.h
+++ b/chromecast/base/task_runner_impl.h
@@ -7,7 +7,7 @@
 
 #include <stdint.h>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/public/task_runner.h"
 
 namespace base {
diff --git a/chromecast/browser/cast_browser_process.h b/chromecast/browser/cast_browser_process.h
index 6ebbd5c..2c6fbb1 100644
--- a/chromecast/browser/cast_browser_process.h
+++ b/chromecast/browser/cast_browser_process.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "build/build_config.h"
 #include "chromecast/chromecast_buildflags.h"
 
diff --git a/chromecast/browser/cast_web_contents_impl.h b/chromecast/browser/cast_web_contents_impl.h
index 019ed96..78ef7d2 100644
--- a/chromecast/browser/cast_web_contents_impl.h
+++ b/chromecast/browser/cast_web_contents_impl.h
@@ -16,7 +16,7 @@
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/memory/platform_shared_memory_region.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "base/task/sequenced_task_runner.h"
diff --git a/chromecast/browser/cast_web_service.h b/chromecast/browser/cast_web_service.h
index be6196ba..c6cbb1d 100644
--- a/chromecast/browser/cast_web_service.h
+++ b/chromecast/browser/cast_web_service.h
@@ -12,7 +12,7 @@
 #include "base/containers/flat_map.h"
 #include "base/containers/flat_set.h"
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "chromecast/browser/cast_web_view.h"
diff --git a/chromecast/browser/renderer_prelauncher.h b/chromecast/browser/renderer_prelauncher.h
index e222a081..96413e63 100644
--- a/chromecast/browser/renderer_prelauncher.h
+++ b/chromecast/browser/renderer_prelauncher.h
@@ -5,7 +5,7 @@
 #ifndef CHROMECAST_BROWSER_RENDERER_PRELAUNCHER_H_
 #define CHROMECAST_BROWSER_RENDERER_PRELAUNCHER_H_
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "ipc/ipc_listener.h"
 #include "url/gurl.h"
 
diff --git a/chromecast/browser/service_manager_context.h b/chromecast/browser/service_manager_context.h
index ebd7470..3f5141a5 100644
--- a/chromecast/browser/service_manager_context.h
+++ b/chromecast/browser/service_manager_context.h
@@ -5,7 +5,7 @@
 #ifndef CHROMECAST_BROWSER_SERVICE_MANAGER_CONTEXT_H_
 #define CHROMECAST_BROWSER_SERVICE_MANAGER_CONTEXT_H_
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/task/single_thread_task_runner.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
diff --git a/chromecast/external_mojo/broker_service/broker_service.h b/chromecast/external_mojo/broker_service/broker_service.h
index 3fe4a6f..a2f982a0 100644
--- a/chromecast/external_mojo/broker_service/broker_service.h
+++ b/chromecast/external_mojo/broker_service/broker_service.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <string>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/threading/sequence_bound.h"
 #include "chromecast/external_mojo/public/mojom/connector.mojom.h"
 #include "chromecast/mojo/interface_bundle.h"
diff --git a/chromecast/media/api/cast_audio_decoder.h b/chromecast/media/api/cast_audio_decoder.h
index 7897cee..4f8fd489 100644
--- a/chromecast/media/api/cast_audio_decoder.h
+++ b/chromecast/media/api/cast_audio_decoder.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/api/decoder_buffer_base.h"
 #include "chromecast/public/media/decoder_config.h"
 
diff --git a/chromecast/media/api/cma_backend.h b/chromecast/media/api/cma_backend.h
index 8de76abd4..0aee7571 100644
--- a/chromecast/media/api/cma_backend.h
+++ b/chromecast/media/api/cma_backend.h
@@ -7,7 +7,7 @@
 
 #include <stdint.h>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/api/decoder_buffer_base.h"
 #include "chromecast/public/media/decoder_config.h"
 #include "chromecast/public/media/media_pipeline_backend.h"
diff --git a/chromecast/media/api/test/mock_cma_backend.h b/chromecast/media/api/test/mock_cma_backend.h
index e967d19..62540b9e 100644
--- a/chromecast/media/api/test/mock_cma_backend.h
+++ b/chromecast/media/api/test/mock_cma_backend.h
@@ -7,7 +7,7 @@
 
 #include <string>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/api/cma_backend.h"
 #include "chromecast/media/api/decoder_buffer_base.h"
 #include "chromecast/public/graphics_types.h"
diff --git a/chromecast/media/audio/audio_io_thread.h b/chromecast/media/audio/audio_io_thread.h
index 176b5cc..e3b273c 100644
--- a/chromecast/media/audio/audio_io_thread.h
+++ b/chromecast/media/audio/audio_io_thread.h
@@ -5,7 +5,7 @@
 #ifndef CHROMECAST_MEDIA_AUDIO_AUDIO_IO_THREAD_H_
 #define CHROMECAST_MEDIA_AUDIO_AUDIO_IO_THREAD_H_
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/threading/thread.h"
 
 namespace base {
diff --git a/chromecast/media/audio/cast_audio_device_factory.h b/chromecast/media/audio/cast_audio_device_factory.h
index d9e72f9d5..2b76e29 100644
--- a/chromecast/media/audio/cast_audio_device_factory.h
+++ b/chromecast/media/audio/cast_audio_device_factory.h
@@ -6,7 +6,7 @@
 #define CHROMECAST_MEDIA_AUDIO_CAST_AUDIO_DEVICE_FACTORY_H_
 
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/base/bitstream_audio_codecs.h"
 #include "media/audio/audio_sink_parameters.h"
 #include "third_party/blink/public/common/tokens/tokens.h"
diff --git a/chromecast/media/cma/backend/android/audio_sink_android.h b/chromecast/media/cma/backend/android/audio_sink_android.h
index 85d8d47..7ea56de 100644
--- a/chromecast/media/cma/backend/android/audio_sink_android.h
+++ b/chromecast/media/cma/backend/android/audio_sink_android.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <string>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/threading/thread_checker.h"
 #include "chromecast/media/cma/backend/android/media_pipeline_backend_android.h"
 #include "chromecast/public/media/media_pipeline_device_params.h"
diff --git a/chromecast/media/cma/backend/android/audio_sink_android_audiotrack_impl.h b/chromecast/media/cma/backend/android/audio_sink_android_audiotrack_impl.h
index 5ef59c47..6c863cfc 100644
--- a/chromecast/media/cma/backend/android/audio_sink_android_audiotrack_impl.h
+++ b/chromecast/media/cma/backend/android/audio_sink_android_audiotrack_impl.h
@@ -12,7 +12,7 @@
 
 #include "base/android/jni_android.h"
 #include "base/cancelable_callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread.h"
 #include "base/time/time.h"
diff --git a/chromecast/media/cma/backend/android/media_pipeline_backend_android.h b/chromecast/media/cma/backend/android/media_pipeline_backend_android.h
index 1bde5563..a1911bf 100644
--- a/chromecast/media/cma/backend/android/media_pipeline_backend_android.h
+++ b/chromecast/media/cma/backend/android/media_pipeline_backend_android.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <string>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/public/media/media_pipeline_backend.h"
 #include "chromecast/public/media/media_pipeline_device_params.h"
 #include "chromecast/public/volume_control.h"
diff --git a/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h b/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h
index 8b6bfcc..57267ae 100644
--- a/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h
+++ b/chromecast/media/cma/backend/media_pipeline_backend_for_mixer.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <string>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "chromecast/media/cma/backend/video_decoder_for_mixer.h"
 #include "chromecast/public/media/media_pipeline_backend.h"
diff --git a/chromecast/media/cma/backend/mixer/mixer_input_connection.h b/chromecast/media/cma/backend/mixer/mixer_input_connection.h
index 9f081ee..3277dce 100644
--- a/chromecast/media/cma/backend/mixer/mixer_input_connection.h
+++ b/chromecast/media/cma/backend/mixer/mixer_input_connection.h
@@ -11,7 +11,7 @@
 
 #include "base/containers/circular_deque.h"
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/synchronization/lock.h"
 #include "base/thread_annotations.h"
diff --git a/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h b/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h
index 56b7813..a8eb5dc 100644
--- a/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h
+++ b/chromecast/media/cma/backend/mixer/mixer_loopback_connection.h
@@ -9,7 +9,7 @@
 #include <memory>
 
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/audio/mixer_service/mixer_socket.h"
 #include "chromecast/public/media/decoder_config.h"
 
diff --git a/chromecast/media/cma/backend/mixer/stream_mixer.h b/chromecast/media/cma/backend/mixer/stream_mixer.h
index 0d10cbf0..3e97911 100644
--- a/chromecast/media/cma/backend/mixer/stream_mixer.h
+++ b/chromecast/media/cma/backend/mixer/stream_mixer.h
@@ -14,7 +14,7 @@
 
 #include "base/containers/flat_map.h"
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
 #include "base/synchronization/lock.h"
diff --git a/chromecast/media/cma/backend/proxy/cma_proxy_handler.h b/chromecast/media/cma/backend/proxy/cma_proxy_handler.h
index feb20ca..0c0d62fa 100644
--- a/chromecast/media/cma/backend/proxy/cma_proxy_handler.h
+++ b/chromecast/media/cma/backend/proxy/cma_proxy_handler.h
@@ -5,7 +5,7 @@
 #ifndef CHROMECAST_MEDIA_CMA_BACKEND_PROXY_CMA_PROXY_HANDLER_H_
 #define CHROMECAST_MEDIA_CMA_BACKEND_PROXY_CMA_PROXY_HANDLER_H_
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/cma/backend/proxy/audio_channel_push_buffer_handler.h"
 #include "chromecast/media/cma/backend/proxy/buffer_id_manager.h"
 
diff --git a/chromecast/media/cma/backend/proxy/multizone_audio_decoder_proxy_impl.h b/chromecast/media/cma/backend/proxy/multizone_audio_decoder_proxy_impl.h
index 9026de0..b414cda 100644
--- a/chromecast/media/cma/backend/proxy/multizone_audio_decoder_proxy_impl.h
+++ b/chromecast/media/cma/backend/proxy/multizone_audio_decoder_proxy_impl.h
@@ -7,7 +7,7 @@
 
 #include <limits>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/api/cma_backend.h"
 #include "chromecast/media/api/decoder_buffer_base.h"
 #include "chromecast/media/cma/backend/proxy/audio_channel_push_buffer_handler.h"
diff --git a/chromecast/media/cma/backend/proxy/proxy_call_translator.h b/chromecast/media/cma/backend/proxy/proxy_call_translator.h
index ec04d5d..4c3d1fb 100644
--- a/chromecast/media/cma/backend/proxy/proxy_call_translator.h
+++ b/chromecast/media/cma/backend/proxy/proxy_call_translator.h
@@ -8,7 +8,7 @@
 #include <memory>
 #include <optional>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/api/decoder_buffer_base.h"
 #include "chromecast/media/cma/backend/proxy/buffer_id_manager.h"
 #include "chromecast/media/cma/backend/proxy/cast_runtime_audio_channel_broker.h"
diff --git a/chromecast/media/cma/base/buffering_controller.h b/chromecast/media/cma/base/buffering_controller.h
index 6b0044a..08f28ac 100644
--- a/chromecast/media/cma/base/buffering_controller.h
+++ b/chromecast/media/cma/base/buffering_controller.h
@@ -9,7 +9,7 @@
 #include <string>
 
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
diff --git a/chromecast/media/cma/base/buffering_frame_provider.h b/chromecast/media/cma/base/buffering_frame_provider.h
index 52671c4..f70f822 100644
--- a/chromecast/media/cma/base/buffering_frame_provider.h
+++ b/chromecast/media/cma/base/buffering_frame_provider.h
@@ -10,7 +10,7 @@
 #include <list>
 #include <memory>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread_checker.h"
 #include "chromecast/media/cma/base/coded_frame_provider.h"
diff --git a/chromecast/media/cma/base/coded_frame_provider.h b/chromecast/media/cma/base/coded_frame_provider.h
index 870e23e..2341b33d 100644
--- a/chromecast/media/cma/base/coded_frame_provider.h
+++ b/chromecast/media/cma/base/coded_frame_provider.h
@@ -6,7 +6,7 @@
 #define CHROMECAST_MEDIA_CMA_BASE_CODED_FRAME_PROVIDER_H_
 
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 
 namespace media {
 class AudioDecoderConfig;
diff --git a/chromecast/media/cma/base/simple_media_task_runner.h b/chromecast/media/cma/base/simple_media_task_runner.h
index cccf8b99..1d531e4 100644
--- a/chromecast/media/cma/base/simple_media_task_runner.h
+++ b/chromecast/media/cma/base/simple_media_task_runner.h
@@ -5,7 +5,7 @@
 #ifndef CHROMECAST_MEDIA_CMA_BASE_SIMPLE_MEDIA_TASK_RUNNER_H_
 #define CHROMECAST_MEDIA_CMA_BASE_SIMPLE_MEDIA_TASK_RUNNER_H_
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/cma/base/media_task_runner.h"
 
 namespace base {
diff --git a/chromecast/media/cma/pipeline/av_pipeline_impl.h b/chromecast/media/cma/pipeline/av_pipeline_impl.h
index f18277cb..82b63551 100644
--- a/chromecast/media/cma/pipeline/av_pipeline_impl.h
+++ b/chromecast/media/cma/pipeline/av_pipeline_impl.h
@@ -13,7 +13,7 @@
 #include <string>
 
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
diff --git a/chromecast/media/cma/pipeline/backend_decryptor.h b/chromecast/media/cma/pipeline/backend_decryptor.h
index 4a641205..f752808d 100644
--- a/chromecast/media/cma/pipeline/backend_decryptor.h
+++ b/chromecast/media/cma/pipeline/backend_decryptor.h
@@ -8,7 +8,7 @@
 #include <memory>
 
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/api/decoder_buffer_base.h"
 #include "chromecast/media/cma/pipeline/stream_decryptor.h"
 #include "chromecast/public/media/media_pipeline_backend.h"
diff --git a/chromecast/media/cma/pipeline/decrypt_util.h b/chromecast/media/cma/pipeline/decrypt_util.h
index 0a73da76..e761ec5 100644
--- a/chromecast/media/cma/pipeline/decrypt_util.h
+++ b/chromecast/media/cma/pipeline/decrypt_util.h
@@ -6,7 +6,7 @@
 #define CHROMECAST_MEDIA_CMA_PIPELINE_DECRYPT_UTIL_H_
 
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/api/decoder_buffer_base.h"
 
 namespace chromecast {
diff --git a/chromecast/media/cma/pipeline/stream_decryptor.h b/chromecast/media/cma/pipeline/stream_decryptor.h
index 9994d15..7511b71 100644
--- a/chromecast/media/cma/pipeline/stream_decryptor.h
+++ b/chromecast/media/cma/pipeline/stream_decryptor.h
@@ -8,7 +8,7 @@
 #include <queue>
 
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 
 namespace chromecast {
 namespace media {
diff --git a/chromecast/media/cma/test/frame_generator_for_test.h b/chromecast/media/cma/test/frame_generator_for_test.h
index 1a8c001..284878c9 100644
--- a/chromecast/media/cma/test/frame_generator_for_test.h
+++ b/chromecast/media/cma/test/frame_generator_for_test.h
@@ -9,7 +9,7 @@
 
 #include <vector>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/time/time.h"
 
 namespace chromecast {
diff --git a/chromecast/media/cma/test/frame_segmenter_for_test.h b/chromecast/media/cma/test/frame_segmenter_for_test.h
index 2d8e888..722a03e 100644
--- a/chromecast/media/cma/test/frame_segmenter_for_test.h
+++ b/chromecast/media/cma/test/frame_segmenter_for_test.h
@@ -10,7 +10,7 @@
 
 #include <list>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "media/base/audio_decoder_config.h"
 #include "media/base/video_decoder_config.h"
 
diff --git a/chromecast/media/common/audio_decoder_software_wrapper.h b/chromecast/media/common/audio_decoder_software_wrapper.h
index aa6d3c5..acb1b65 100644
--- a/chromecast/media/common/audio_decoder_software_wrapper.h
+++ b/chromecast/media/common/audio_decoder_software_wrapper.h
@@ -10,7 +10,7 @@
 #include <memory>
 #include <string>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/api/cast_audio_decoder.h"
 #include "chromecast/public/media/media_pipeline_backend.h"
 
diff --git a/chromecast/media/common/audio_decoder_wrapper.h b/chromecast/media/common/audio_decoder_wrapper.h
index 07a77323..61ff6852 100644
--- a/chromecast/media/common/audio_decoder_wrapper.h
+++ b/chromecast/media/common/audio_decoder_wrapper.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/api/cma_backend.h"
 #include "chromecast/media/common/audio_decoder_software_wrapper.h"
 #include "chromecast/media/common/media_pipeline_backend_manager.h"
diff --git a/chromecast/media/common/media_pipeline_backend_manager.h b/chromecast/media/common/media_pipeline_backend_manager.h
index 59a2a9b..f00f13d0 100644
--- a/chromecast/media/common/media_pipeline_backend_manager.h
+++ b/chromecast/media/common/media_pipeline_backend_manager.h
@@ -10,7 +10,7 @@
 #include <vector>
 
 #include "base/containers/flat_map.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/observer_list_threadsafe.h"
 #include "base/task/sequenced_task_runner.h"
diff --git a/chromecast/media/common/media_resource_tracker.h b/chromecast/media/common/media_resource_tracker.h
index da71b5465..91c432d 100644
--- a/chromecast/media/common/media_resource_tracker.h
+++ b/chromecast/media/common/media_resource_tracker.h
@@ -6,7 +6,7 @@
 #define CHROMECAST_MEDIA_COMMON_MEDIA_RESOURCE_TRACKER_H_
 
 #include "base/functional/callback.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/task/sequenced_task_runner_helpers.h"
 
 namespace base {
diff --git a/chromecast/media/common/video_decoder_wrapper.h b/chromecast/media/common/video_decoder_wrapper.h
index d45575d..522a5d1c 100644
--- a/chromecast/media/common/video_decoder_wrapper.h
+++ b/chromecast/media/common/video_decoder_wrapper.h
@@ -7,7 +7,7 @@
 
 #include <memory>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/media/api/cma_backend.h"
 #include "chromecast/public/media/decoder_config.h"
 #include "chromecast/public/media/media_pipeline_backend.h"
diff --git a/chromecast/metrics/cast_metrics_service_client.h b/chromecast/metrics/cast_metrics_service_client.h
index 5c9657b9..5d1f9a4 100644
--- a/chromecast/metrics/cast_metrics_service_client.h
+++ b/chromecast/metrics/cast_metrics_service_client.h
@@ -12,7 +12,7 @@
 #include <string_view>
 
 #include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/scoped_observation.h"
 #include "build/build_config.h"
 #include "chromecast/public/cast_sys_info.h"
diff --git a/chromecast/metrics/timed_event_recorder.h b/chromecast/metrics/timed_event_recorder.h
index 454863fd..4c65432 100644
--- a/chromecast/metrics/timed_event_recorder.h
+++ b/chromecast/metrics/timed_event_recorder.h
@@ -10,7 +10,7 @@
 
 #include "base/containers/flat_map.h"
 #include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/time/tick_clock.h"
 #include "base/time/time.h"
diff --git a/chromecast/net/small_message_socket.h b/chromecast/net/small_message_socket.h
index 6e4217cd..5ccc572 100644
--- a/chromecast/net/small_message_socket.h
+++ b/chromecast/net/small_message_socket.h
@@ -9,7 +9,7 @@
 
 #include "base/containers/span.h"
 #include "base/memory/raw_ptr.h"
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "net/base/io_buffer.h"
 
diff --git a/chromecast/renderer/queryable_data_store.h b/chromecast/renderer/queryable_data_store.h
index 14d36ace..e475431aa 100644
--- a/chromecast/renderer/queryable_data_store.h
+++ b/chromecast/renderer/queryable_data_store.h
@@ -7,7 +7,7 @@
 
 #include <string>
 
-#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_refptr.h"
 #include "chromecast/common/mojom/queryable_data_store.mojom.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/receiver_set.h"
diff --git a/chromeos/ash/components/proximity_auth/metrics.cc b/chromeos/ash/components/proximity_auth/metrics.cc
index 15dfa86..fc14204 100644
--- a/chromeos/ash/components/proximity_auth/metrics.cc
+++ b/chromeos/ash/components/proximity_auth/metrics.cc
@@ -4,37 +4,15 @@
 
 #include "chromeos/ash/components/proximity_auth/metrics.h"
 
-#include <stdint.h>
-
 #include <algorithm>
 
 #include "base/check_op.h"
-#include "base/containers/span.h"
-#include "base/hash/md5.h"
 #include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
-#include "base/numerics/byte_conversions.h"
 
 namespace proximity_auth {
 namespace metrics {
 
-namespace {
-
-// Converts the 4-byte prefix of an MD5 hash into a int32_t value.
-int32_t DigestToInt32(const base::MD5Digest& digest) {
-  return base::I32FromLittleEndian(base::span(digest.a).first<4u>());
-}
-
-// Returns a hash of the given |name|, encoded as a 32-bit signed integer.
-int32_t HashDeviceModelName(const std::string& name) {
-  base::MD5Digest digest;
-  base::MD5Sum(base::as_byte_span(name), &digest);
-  return DigestToInt32(digest);
-}
-
-}  // namespace
-
-const char kUnknownDeviceModel[] = "Unknown";
 const int kUnknownProximityValue = 127;
 
 void RecordAuthProximityRollingRssi(int rolling_rssi) {
@@ -45,11 +23,6 @@
                            rolling_rssi);
 }
 
-void RecordAuthProximityRemoteDeviceModelHash(const std::string& device_model) {
-  base::UmaHistogramSparse("EasyUnlock.AuthProximity.RemoteDeviceModelHash",
-                           HashDeviceModelName(device_model));
-}
-
 void RecordRemoteSecuritySettingsState(RemoteSecuritySettingsState state) {
   DCHECK(state < RemoteSecuritySettingsState::COUNT);
   UMA_HISTOGRAM_ENUMERATION(
diff --git a/chromeos/ash/components/proximity_auth/metrics.h b/chromeos/ash/components/proximity_auth/metrics.h
index a9ac6c1e..f9f2cf8b 100644
--- a/chromeos/ash/components/proximity_auth/metrics.h
+++ b/chromeos/ash/components/proximity_auth/metrics.h
@@ -5,12 +5,9 @@
 #ifndef CHROMEOS_ASH_COMPONENTS_PROXIMITY_AUTH_METRICS_H_
 #define CHROMEOS_ASH_COMPONENTS_PROXIMITY_AUTH_METRICS_H_
 
-#include <string>
-
 namespace proximity_auth {
 namespace metrics {
 
-extern const char kUnknownDeviceModel[];
 extern const int kUnknownProximityValue;
 
 // Possible states of the remote device's security settings. This enum is used
@@ -31,11 +28,6 @@
 // are available.
 void RecordAuthProximityRollingRssi(int rolling_rssi);
 
-// Records the phone model used for a successful auth attempt. The model is
-// recorded as a 32-bit hash due to the limits of UMA. |device_model| should be
-// set to |kUnknownDeviceModel| if the device model could not be read.
-void RecordAuthProximityRemoteDeviceModelHash(const std::string& device_model);
-
 // Records the screen lock and trust agent settings state of the remote device,
 // as received in a status update from the remote device.
 void RecordRemoteSecuritySettingsState(RemoteSecuritySettingsState state);
diff --git a/chromeos/ash/components/proximity_auth/proximity_monitor_impl.cc b/chromeos/ash/components/proximity_auth/proximity_monitor_impl.cc
index 082ebb8..66a4524 100644
--- a/chromeos/ash/components/proximity_auth/proximity_monitor_impl.cc
+++ b/chromeos/ash/components/proximity_auth/proximity_monitor_impl.cc
@@ -69,13 +69,7 @@
                                     ? *rssi_rolling_average_
                                     : metrics::kUnknownProximityValue;
 
-  std::string remote_device_model = metrics::kUnknownDeviceModel;
-  ash::multidevice::RemoteDeviceRef remote_device = remote_device_;
-  if (!remote_device.name().empty())
-    remote_device_model = remote_device.name();
-
   metrics::RecordAuthProximityRollingRssi(round(rssi_rolling_average));
-  metrics::RecordAuthProximityRemoteDeviceModelHash(remote_device_model);
 }
 
 void ProximityMonitorImpl::OnAdapterInitialized(
diff --git a/chromeos/ash/components/proximity_auth/proximity_monitor_impl_unittest.cc b/chromeos/ash/components/proximity_auth/proximity_monitor_impl_unittest.cc
index 7541a26e..eb339a29 100644
--- a/chromeos/ash/components/proximity_auth/proximity_monitor_impl_unittest.cc
+++ b/chromeos/ash/components/proximity_auth/proximity_monitor_impl_unittest.cc
@@ -363,9 +363,6 @@
   monitor_->RecordProximityMetricsOnAuthSuccess();
   histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi",
                                       -6, 1);
-  histogram_tester.ExpectUniqueSample(
-      "EasyUnlock.AuthProximity.RemoteDeviceModelHash",
-      1881443083 /* hash of "LGE Nexus 5" */, 1);
 }
 
 TEST_F(ProximityAuthProximityMonitorImplTest,
@@ -401,9 +398,6 @@
   monitor.RecordProximityMetricsOnAuthSuccess();
   histogram_tester.ExpectUniqueSample("EasyUnlock.AuthProximity.RollingRssi",
                                       127, 1);
-  histogram_tester.ExpectUniqueSample(
-      "EasyUnlock.AuthProximity.RemoteDeviceModelHash",
-      -1808066424 /* hash of "Unknown" */, 1);
 }
 
 }  // namespace proximity_auth
diff --git a/chromeos/profiles/arm.afdo.newest.txt b/chromeos/profiles/arm.afdo.newest.txt
index 3641a50..47b34de 100644
--- a/chromeos/profiles/arm.afdo.newest.txt
+++ b/chromeos/profiles/arm.afdo.newest.txt
@@ -1 +1 @@
-chromeos-chrome-arm-none-143-7473.0-1761530930-benchmark-143.0.7498.0_pre1535948-r1-redacted.afdo.xz
+chromeos-chrome-arm-none-143-7473.0-1761530930-benchmark-144.0.7503.0_pre1537931-r1-redacted.afdo.xz
diff --git a/clank b/clank
index f6e3ab4d..a335609 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit f6e3ab4dc4a030cacc98eecaf3d1ecdb11607cd1
+Subproject commit a33560958e4b27944324ad5010b7321066789c02
diff --git a/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc b/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc
index 56cb8b5..6c51d44 100644
--- a/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc
+++ b/components/autofill/core/browser/data_manager/payments/payments_data_manager.cc
@@ -12,6 +12,7 @@
 #include "base/containers/contains.h"
 #include "base/containers/span.h"
 #include "base/containers/to_vector.h"
+#include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback_forward.h"
 #include "base/i18n/timezone.h"
@@ -45,6 +46,7 @@
 #include "components/autofill/core/common/autofill_payments_features.h"
 #include "components/autofill/core/common/autofill_prefs.h"
 #include "components/autofill/core/common/credit_card_number_validation.h"
+#include "components/autofill/core/common/dense_set.h"
 #include "components/prefs/pref_service.h"
 #include "components/sync/base/data_type.h"
 #include "components/sync/protocol/autofill_specifics.pb.h"
@@ -2141,7 +2143,9 @@
     BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
   return (app_locale_ == "en-US" || app_locale_ == "en-GB" ||
           app_locale_ == "en-CA") &&
-         GetCountryCodeForExperimentGroup() == "US" &&
+         (GetCountryCodeForExperimentGroup() == "US" ||
+          base::FeatureList::IsEnabled(
+              features::kAutofillDisableBnplCountryCheckForTesting)) &&
          base::FeatureList::IsEnabled(
              features::kAutofillEnableBuyNowPayLaterSyncing);
 #else
diff --git a/components/autofill/core/browser/data_manager/payments/payments_data_manager.h b/components/autofill/core/browser/data_manager/payments/payments_data_manager.h
index aafd730..1c80f516 100644
--- a/components/autofill/core/browser/data_manager/payments/payments_data_manager.h
+++ b/components/autofill/core/browser/data_manager/payments/payments_data_manager.h
@@ -376,10 +376,11 @@
   // Sets the value of the kAutofillHasSeenIban pref to true.
   void SetAutofillHasSeenIban();
 
+  // TODO(crbug.com/430575808): Remove build flags.
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
     BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
   // Returns the value of the kAutofillHasSeenBnpl pref.
-  bool IsAutofillHasSeenBnplPrefEnabled() const;
+  virtual bool IsAutofillHasSeenBnplPrefEnabled() const;
 
   // Sets the value of the kAutofillHasSeenBnpl pref to true.
   void SetAutofillHasSeenBnpl();
diff --git a/components/autofill/core/browser/data_manager/payments/payments_data_manager_test_api.cc b/components/autofill/core/browser/data_manager/payments/payments_data_manager_test_api.cc
index fd0d1a64..8e1f7ca 100644
--- a/components/autofill/core/browser/data_manager/payments/payments_data_manager_test_api.cc
+++ b/components/autofill/core/browser/data_manager/payments/payments_data_manager_test_api.cc
@@ -4,6 +4,10 @@
 
 #include "components/autofill/core/browser/data_manager/payments/payments_data_manager_test_api.h"
 
+#include <vector>
+
+#include "components/autofill/core/browser/data_model/payments/bnpl_issuer.h"
+
 namespace autofill {
 
 void PaymentsDataManagerTestApi::AddServerCreditCard(
diff --git a/components/autofill/core/browser/data_manager/payments/payments_data_manager_unittest.cc b/components/autofill/core/browser/data_manager/payments/payments_data_manager_unittest.cc
index afbc257f..ddc4791 100644
--- a/components/autofill/core/browser/data_manager/payments/payments_data_manager_unittest.cc
+++ b/components/autofill/core/browser/data_manager/payments/payments_data_manager_unittest.cc
@@ -4079,6 +4079,27 @@
   EXPECT_TRUE(payments_data_manager().GetLinkedBnplIssuers().empty());
 }
 
+// Tests that Buy-now-pay-later issuer getters returns issuers if
+// `experiment_country_code` is not "US", and the disable country check flag is
+// enabled.
+TEST_F(
+    PaymentsDataManagerTest,
+    BnplIssuerGetters_AutofillBnplCountryNotSupported_DisableCountryCheckFlagTurnedOn) {
+  base::test::ScopedFeatureList scoped_feature_list{
+      features::kAutofillDisableBnplCountryCheckForTesting};
+
+  ResetPaymentsDataManager(false, "en-US", "CA");
+
+  test_api(payments_data_manager())
+      .AddBnplIssuer(test::GetTestLinkedBnplIssuer());
+  test_api(payments_data_manager())
+      .AddBnplIssuer(test::GetTestUnlinkedBnplIssuer());
+
+  EXPECT_FALSE(payments_data_manager().GetBnplIssuers().empty());
+  EXPECT_FALSE(payments_data_manager().GetUnlinkedBnplIssuers().empty());
+  EXPECT_FALSE(payments_data_manager().GetLinkedBnplIssuers().empty());
+}
+
 // Tests that `SetAutofillHasSeenBnpl()` sets the pref to `true` regardless of
 // its current value.
 TEST_F(PaymentsDataManagerTest, SetAutofillHasSeenBnpl) {
diff --git a/components/autofill/core/browser/data_manager/payments/test_payments_data_manager.cc b/components/autofill/core/browser/data_manager/payments/test_payments_data_manager.cc
index d408233..b4353270 100644
--- a/components/autofill/core/browser/data_manager/payments/test_payments_data_manager.cc
+++ b/components/autofill/core/browser/data_manager/payments/test_payments_data_manager.cc
@@ -282,6 +282,14 @@
   return PaymentsDataManager::IsAutofillBnplPrefEnabled();
 }
 
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
+bool TestPaymentsDataManager::IsAutofillHasSeenBnplPrefEnabled() const {
+  return PaymentsDataManager::IsAutofillHasSeenBnplPrefEnabled();
+}
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
+
 CoreAccountInfo TestPaymentsDataManager::GetAccountInfoForPaymentsServer()
     const {
   return account_info_;
diff --git a/components/autofill/core/browser/data_manager/payments/test_payments_data_manager.h b/components/autofill/core/browser/data_manager/payments/test_payments_data_manager.h
index 44f4359..4df0fe1 100644
--- a/components/autofill/core/browser/data_manager/payments/test_payments_data_manager.h
+++ b/components/autofill/core/browser/data_manager/payments/test_payments_data_manager.h
@@ -65,6 +65,11 @@
   bool IsPaymentCvcStorageEnabled() const override;
   bool IsSyncFeatureEnabledForPaymentsServerMetrics() const override;
   bool IsAutofillBnplPrefEnabled() const override;
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
+  bool IsAutofillHasSeenBnplPrefEnabled() const override;
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
   CoreAccountInfo GetAccountInfoForPaymentsServer() const override;
 
   // Clears |local_credit_cards_| and |server_credit_cards_|.
diff --git a/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator.cc b/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator.cc
index 4e74e4e..da0aaaf 100644
--- a/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator.cc
+++ b/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator.cc
@@ -1467,6 +1467,14 @@
                                  .GetBnplIssuers(),
                              /*extracted_amount_in_micros=*/std::nullopt));
     manager.GetCreditCardFormEventLogger().OnBnplSuggestionShown();
+#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \
+    BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
+    manager.client()
+        .GetPersonalDataManager()
+        .payments_data_manager()
+        .SetAutofillHasSeenBnpl();
+#endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) ||
+        // BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID)
   }
   manager.GetCreditCardFormEventLogger().OnMetadataLoggingContextReceived(
       std::move(metadata_logging_context));
diff --git a/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator_unittest.cc b/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator_unittest.cc
index d39baaf..97f546b 100644
--- a/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator_unittest.cc
+++ b/components/autofill/core/browser/suggestions/payments/payments_suggestion_generator_unittest.cc
@@ -2295,6 +2295,7 @@
           Suggestion::Icon::kBnpl,
           {{Suggestion::Text(l10n_util::GetStringFUTF16(
               IDS_AUTOFILL_BNPL_CREDIT_CARD_SUGGESTION_LABEL, u"$35"))}}));
+  EXPECT_TRUE(payments_data().IsAutofillHasSeenBnplPrefEnabled());
 }
 
 // Verifies that a BNPL suggestion is not added to Touch to Fill suggestions
diff --git a/components/autofill_payments_strings.grdp b/components/autofill_payments_strings.grdp
index 8353717..6a927ca 100644
--- a/components/autofill_payments_strings.grdp
+++ b/components/autofill_payments_strings.grdp
@@ -1084,7 +1084,7 @@
   <message name="IDS_AUTOFILL_BNPL_SUGGESTION_LABEL_FOR_UNAVAILABLE_PURCHASE" desc="One line label shows the Buy Now Pay Later option is unavailable for the purchase in the autofill credit card popup." formatter_data="android_java">
     Unavailable for this purchase
   </message>
-  <message name="IDS_AUTOFILL_BNPL_SETTINGS_LABEL" desc="Label for the Buy Now Pay Later preference in the payments settings page. When enabled, users can checkout with external BNPL issuers using a pay-over-time payment option.">
+  <message name="IDS_AUTOFILL_BNPL_SETTINGS_LABEL" desc="Label for the Buy Now Pay Later preference in the payments settings page. When enabled, users can checkout with external BNPL issuers using a pay-over-time payment option." formatter_data="android_java">
     Pay later
   </message>
   <message name="IDS_AUTOFILL_BNPL_SETTINGS_SUBLABEL" desc="Sublabel for the Buy Now Pay Later preference in the payments settings page, including a hyperlink to learn more about pay later options. When enabled, users can checkout with external BNPL issuers using a Buy Now Pay Later option.">
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java
index 94d10e3..c142338 100644
--- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java
+++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/chips/ChipView.java
@@ -37,6 +37,7 @@
 import org.chromium.ui.widget.LoadingView;
 import org.chromium.ui.widget.RectProvider;
 import org.chromium.ui.widget.RippleBackgroundHelper;
+import org.chromium.ui.widget.RippleBackgroundHelper.BorderType;
 import org.chromium.ui.widget.ViewRectProvider;
 
 /**
@@ -525,8 +526,8 @@
      * @param width of the border in pixels.
      * @param color of the border.
      */
-    public void setBorder(int width, @ColorInt int color) {
-        mRippleBackgroundHelper.setBorder(width, color);
+    public void setBorder(int width, @Nullable ColorStateList color) {
+        mRippleBackgroundHelper.setBorder(width, color, BorderType.SOLID);
     }
 
     @Override
diff --git a/components/dom_distiller/content/browser/test/distilled_page_js_browsertest.cc b/components/dom_distiller/content/browser/test/distilled_page_js_browsertest.cc
index a391d6f..6cd709d 100644
--- a/components/dom_distiller/content/browser/test/distilled_page_js_browsertest.cc
+++ b/components/dom_distiller/content/browser/test/distilled_page_js_browsertest.cc
@@ -43,8 +43,11 @@
   void LoadAndExecuteTestScript(const std::string& file) {
     distilled_page_->AppendScriptFile(file);
     distilled_page_->Load(embedded_test_server(), shell()->web_contents());
-    EXPECT_TRUE(content::ExecJs(shell()->web_contents(),
-                                "mocha.run(); window.completePromise"));
+    // First, run the test.
+    EXPECT_TRUE(content::ExecJs(shell()->web_contents(), "mocha.run()"));
+    // Then, wait for the test to complete.
+    EXPECT_TRUE(
+        content::ExecJs(shell()->web_contents(), "window.completePromise"));
   }
 
   std::unique_ptr<FakeDistilledPage> distilled_page_;
@@ -89,6 +92,10 @@
   LoadAndExecuteTestScript("image_classifier_tester.js");
 }
 
+IN_PROC_BROWSER_TEST_F(DistilledPageJsTest, ListClassifierTest) {
+  LoadAndExecuteTestScript("list_classifier_tester.js");
+}
+
 IN_PROC_BROWSER_TEST_F(DistilledPageJsTest, IdentifyEmptySVGsTest) {
   LoadAndExecuteTestScript("identify_empty_svgs_tester.js");
 }
diff --git a/components/dom_distiller/core/css/distilledpage_new.css b/components/dom_distiller/core/css/distilledpage_new.css
index 78427e6..116cef8 100644
--- a/components/dom_distiller/core/css/distilledpage_new.css
+++ b/components/dom_distiller/core/css/distilledpage_new.css
@@ -67,11 +67,9 @@
 
 /* Text rules. */
 
-html {
+html, body, h2[itemprop="description"], h3, h4, h5, h6 {
     font-size: 16px;
-}
-
-body {
+    font-weight: normal;
     line-height: 1.5rem; /* 18px */
 }
 
@@ -81,10 +79,9 @@
     font-weight: bold;
 }
 
-h2, h3, h4, h5, h6 {
-    font-size: 1.5rem; /* 24px */
-    line-height: 2.25rem; /* 36px */
-    font-weight: bold;
+h2 {
+  font-size: 1.25rem; /* 20px */
+  line-height: 1.75rem; /* 28px */
 }
 
 /* Styles for images and captions. */
@@ -144,6 +141,16 @@
     margin: 0;
 }
 
+ul.distilled-content-list {
+  list-style-type: disc;
+  padding-inline-start: 2.5em;
+}
+
+ol.distilled-content-list {
+  list-style-type: decimal;
+  padding-inline-start: 2.5em;
+}
+
 /* Table styling. */
 
 /* Styles for scrollable containers, e.g., for wide tables. */
diff --git a/components/dom_distiller/core/javascript/dom_distiller_viewer.js b/components/dom_distiller/core/javascript/dom_distiller_viewer.js
index e776661..8a6a306 100644
--- a/components/dom_distiller/core/javascript/dom_distiller_viewer.js
+++ b/components/dom_distiller/core/javascript/dom_distiller_viewer.js
@@ -43,6 +43,7 @@
   sanitizeLinks(element);
   identifyEmptySVGs(element);
   ImageClassifier.processImagesIn(element);
+  ListClassifier.processListsIn(element);
 }
 
 function addToPage(html) {
@@ -238,6 +239,186 @@
 }
 
 /**
+ * A utility class to classify lists in distilled content.
+ *
+ * By default, list styling (bullets and numbering) is removed to avoid styling
+ * navigational or UI elements. This class heuristically determines when to
+ * restore styling for content lists.
+ */
+class ListClassifier {
+  // The following thresholds are used in the content analysis stage for
+  // ambiguous <ul> elements.
+
+  // A high ratio (> this value) of items ending in punctuation often indicates
+  // sentence-like content.
+  static PUNCTUATION_RATIO_THRESHOLD = 0.5;
+
+  // A `<ul>` where every `<li>` is a single link is considered content if
+  // the average link text length is > this value.
+  static AVG_LINK_TEXT_LENGTH_THRESHOLD = 15;
+
+  // A low ratio (< this value) of link text to total text often indicates
+  // a content list.
+  static LINK_DENSITY_ACCEPTANCE_THRESHOLD = 0.5;
+
+  // A high ratio (> this value) of link text to total text may indicate a
+  // list of links.
+  static LINK_DOMINANT_THRESHOLD = 0.5;
+
+  // A selector for elements that are considered substantive content, used to
+  // determine if a list item is more than just a simple link.
+  static SUBSTANTIVE_ELEMENTS_SELECTOR =
+      'p, div, img, h1, h2, h3, h4, h5, h6, table, pre, blockquote';
+
+  constructor() {
+    this.nonContentKeywords = new RegExp(
+        'nav|menu|sidebar|footer|links|social|pagination|pager|breadcrumbs',
+        'i');
+    // Matches if a string is any single Unicode punctuation character.
+    this.isPunctuation = new RegExp('^\\p{P}$', 'u');
+  }
+
+  /**
+   * Checks for strong signals that a list is for navigation or UI.
+   * @param {HTMLElement} list The list element.
+   * @return {boolean} True if the list is navigational.
+   * @private
+   */
+  _isNavigational(list) {
+    // Check for explicit navigation roles or containing elements.
+    if (list.closest(
+            'nav, [role="navigation"], [role="menubar"], [role="menu"]')) {
+      return true;
+    }
+
+    // Check for non-content keywords in id or class.
+    const attributes = (list.id + ' ' + list.className).toLowerCase();
+    if (this.nonContentKeywords.test(attributes)) {
+      return true;
+    }
+
+    return false;
+  }
+
+  /**
+   * Performs deeper content analysis on a <ul> list.
+   * @param {HTMLElement} list The UL element.
+   * @return {boolean} True if the list should be styled.
+   * @private
+   */
+  _analyzeContent(list) {
+    const listItems = list.querySelectorAll('li');
+    const numListItems = listItems.length;
+
+    if (numListItems === 0) {
+      return false;
+    }
+
+    // In a single pass, collect all metrics needed for the heuristics.
+    let itemsEndingWithPunctuation = 0;
+    let totalTextLength = 0;
+    let linkTextLength = 0;
+    let hasSubstantiveElements = false;
+
+    for (const li of listItems) {
+      const itemText = li.textContent.trim();
+      totalTextLength += itemText.length;
+
+      if (itemText.length > 0 && this.isPunctuation.test(itemText.slice(-1))) {
+        itemsEndingWithPunctuation++;
+      }
+
+      const links = li.querySelectorAll('a');
+      for (const link of links) {
+        // Don't trim() here; whitespace inside a link can be significant.
+        linkTextLength += link.textContent.length;
+      }
+
+      if (!hasSubstantiveElements &&
+          li.querySelector(ListClassifier.SUBSTANTIVE_ELEMENTS_SELECTOR)) {
+        hasSubstantiveElements = true;
+      }
+    }
+
+    // Heuristic A: A high punctuation ratio is a strong signal for
+    // sentence-based content.
+    const punctuationRatio = itemsEndingWithPunctuation / numListItems;
+    if (punctuationRatio > ListClassifier.PUNCTUATION_RATIO_THRESHOLD) {
+      return true;
+    }
+
+    const linkDensity =
+        totalTextLength > 0 ? (linkTextLength / totalTextLength) : 0;
+
+    // Heuristic B: A list that is dominated by links is content if the links
+    // are long enough to be titles. This allows for some non-link text.
+    if (!hasSubstantiveElements &&
+        linkDensity > ListClassifier.LINK_DOMINANT_THRESHOLD) {
+      const avgLinkTextLength =
+          numListItems > 0 ? (linkTextLength / numListItems) : 0;
+      return avgLinkTextLength >= ListClassifier.AVG_LINK_TEXT_LENGTH_THRESHOLD;
+    }
+
+    // Heuristic C: A list with a low density of links is likely content.
+    if (linkDensity < ListClassifier.LINK_DENSITY_ACCEPTANCE_THRESHOLD) {
+      return true;
+    }
+
+    // Default to false if undecided.
+    return false;
+  }
+
+  /**
+   * Main classification logic.
+   * @param {HTMLElement} list The list element (ul or ol).
+   * @return {boolean} True if the list should be styled.
+   */
+  classify(list) {
+    // An empty list is never content.
+    if (list.children.length === 0) {
+      return false;
+    }
+
+    // Stage 1: Reject navigational lists immediately.
+    if (this._isNavigational(list)) {
+      return false;
+    }
+
+    // Stage 2: Accept lists that are clearly content.
+    // An <ol> that isn't navigational is always considered content.
+    if (list.tagName === 'OL') {
+      return true;
+    }
+    // Any list with block-level elements is also considered content.
+    if (list.querySelector('li p, li ul, li ol')) {
+      return true;
+    }
+
+    // Stage 3: For remaining ambiguous <ul> elements, perform deeper analysis.
+    // Other element types that reach this point are not considered content.
+    if (list.tagName === 'UL') {
+      return this._analyzeContent(list);
+    }
+
+    return false;
+  }
+
+  /**
+   * Post-processes all lists in an element to apply classification classes.
+   * @param {HTMLElement} element The element to search for lists in.
+   */
+  static processListsIn(element) {
+    const classifier = new ListClassifier();
+    const lists = element.querySelectorAll('ul, ol');
+    for (const list of lists) {
+      if (classifier.classify(list)) {
+        list.classList.add('distilled-content-list');
+      }
+    }
+  }
+}
+
+/**
  * Visits all links on the page, preserve http and https links and have them
  * open to new tab. Remove (i.e., unwrap) otherwise.
  * @param {HTMLElement} element The element to sanitize links in.
diff --git a/components/download/internal/common/download_db_cache.cc b/components/download/internal/common/download_db_cache.cc
index 959cb5e..fd894980 100644
--- a/components/download/internal/common/download_db_cache.cc
+++ b/components/download/internal/common/download_db_cache.cc
@@ -10,6 +10,7 @@
 #include "components/download/database/download_db_conversions.h"
 #include "components/download/database/download_db_entry.h"
 #include "components/download/public/common/download_features.h"
+#include "components/download/public/common/download_item_impl.h"
 #include "components/download/public/common/download_stats.h"
 #include "components/download/public/common/download_utils.h"
 
diff --git a/components/download/internal/common/download_utils.cc b/components/download/internal/common/download_utils.cc
index be6122a..4326b72 100644
--- a/components/download/internal/common/download_utils.cc
+++ b/components/download/internal/common/download_utils.cc
@@ -22,6 +22,7 @@
 #include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_features.h"
 #include "components/download/public/common/download_interrupt_reasons_utils.h"
+#include "components/download/public/common/download_item_impl.h"
 #include "components/download/public/common/download_save_info.h"
 #include "components/download/public/common/download_stats.h"
 #include "components/download/public/common/download_task_runner.h"
@@ -34,6 +35,7 @@
 #include "net/http/http_status_code.h"
 #include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/mojom/url_response_head.mojom.h"
 #include "url/origin.h"
 
 #if BUILDFLAG(IS_ANDROID)
diff --git a/components/download/internal/common/download_utils_unittest.cc b/components/download/internal/common/download_utils_unittest.cc
index 21ae9850..be045877 100644
--- a/components/download/internal/common/download_utils_unittest.cc
+++ b/components/download/internal/common/download_utils_unittest.cc
@@ -13,6 +13,7 @@
 #include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
 #include "services/network/public/cpp/features.h"
 #include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/mojom/url_response_head.mojom.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
diff --git a/components/download/public/common/download_utils.h b/components/download/public/common/download_utils.h
index f6d9094..75dcc7e6 100644
--- a/components/download/public/common/download_utils.h
+++ b/components/download/public/common/download_utils.h
@@ -15,13 +15,11 @@
 #include "components/download/public/common/download_export.h"
 #include "components/download/public/common/download_interrupt_reasons.h"
 #include "components/download/public/common/download_item.h"
-#include "components/download/public/common/download_item_impl.h"
-#include "components/download/public/common/download_source.h"
 #include "components/download/public/common/resume_mode.h"
 #include "net/base/net_errors.h"
 #include "net/cert/cert_status_flags.h"
 #include "net/http/http_response_headers.h"
-#include "services/network/public/mojom/url_response_head.mojom.h"
+#include "services/network/public/mojom/url_response_head.mojom-forward.h"
 
 namespace net {
 class HttpRequestHeaders;
@@ -32,9 +30,10 @@
 }
 
 namespace download {
+class DownloadItemImpl;
+class DownloadUrlParameters;
 struct DownloadCreateInfo;
 struct DownloadSaveInfo;
-class DownloadUrlParameters;
 
 // Used to check if the URL is safe. For most cases, this is
 // ChildProcessSecurityPolicy::CanRequestURL.
diff --git a/components/download/public/common/in_progress_download_manager.h b/components/download/public/common/in_progress_download_manager.h
index 0555cb4..39a0dc99 100644
--- a/components/download/public/common/in_progress_download_manager.h
+++ b/components/download/public/common/in_progress_download_manager.h
@@ -15,6 +15,7 @@
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "build/build_config.h"
+#include "components/download/public/common/download_create_info.h"
 #include "components/download/public/common/download_export.h"
 #include "components/download/public/common/download_file_factory.h"
 #include "components/download/public/common/download_item_impl_delegate.h"
diff --git a/components/enterprise/connectors/core/common.cc b/components/enterprise/connectors/core/common.cc
index 7378b15..e1f525d 100644
--- a/components/enterprise/connectors/core/common.cc
+++ b/components/enterprise/connectors/core/common.cc
@@ -412,6 +412,8 @@
       return "EVENT_RESULT_BLOCKED";
     case EventResult::BYPASSED:
       return "EVENT_RESULT_BYPASSED";
+    case EventResult::FORCED_SAVE_TO_CLOUD:
+      return "EVENT_RESULT_FORCED_SAVE_TO_CLOUD";
   }
   NOTREACHED();
 }
diff --git a/components/enterprise/connectors/core/common.h b/components/enterprise/connectors/core/common.h
index 3eb33346..21e89e5 100644
--- a/components/enterprise/connectors/core/common.h
+++ b/components/enterprise/connectors/core/common.h
@@ -303,6 +303,10 @@
   // The user has chosen to use the data even though it violated enterprise
   // rules.
   BYPASSED,
+
+  // The user was not allowed to download the file locally. Download will
+  // proceed directly to cloud storage, if the user is logged in.
+  FORCED_SAVE_TO_CLOUD,
 };
 
 // Helper function to convert a EventResult to a string that.  The format of
diff --git a/components/enterprise/connectors/core/reporting_utils.cc b/components/enterprise/connectors/core/reporting_utils.cc
index f5ae282..eb6189f 100644
--- a/components/enterprise/connectors/core/reporting_utils.cc
+++ b/components/enterprise/connectors/core/reporting_utils.cc
@@ -79,6 +79,8 @@
       return proto::EventResult::EVENT_RESULT_BLOCKED;
     case EventResult::BYPASSED:
       return proto::EventResult::EVENT_RESULT_BYPASSED;
+    case EventResult::FORCED_SAVE_TO_CLOUD:
+      return proto::EventResult::EVENT_RESULT_FORCED_SAVE_TO_CLOUD;
   }
 }
 
diff --git a/components/facilitated_payments/core/validation/BUILD.gn b/components/facilitated_payments/core/validation/BUILD.gn
index ff1d4e9..857a2c44 100644
--- a/components/facilitated_payments/core/validation/BUILD.gn
+++ b/components/facilitated_payments/core/validation/BUILD.gn
@@ -2,8 +2,28 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import("//build/rust/rust_static_library.gni")
 import("//testing/test.gni")
 
+rust_static_library("pix_validator_rs") {
+  crate_root = "pix_validator.rs"
+  sources = [ "pix_validator.rs" ]
+
+  visibility = [ ":*" ]
+}
+
+rust_static_library("pix_validator_rs_ffi_glue") {
+  crate_root = "pix_validator_cxx.rs"
+  sources = [ "pix_validator_cxx.rs" ]
+
+  visibility = [ ":*" ]
+
+  allow_unsafe = true
+  cxx_bindings = [ "pix_validator_cxx.rs" ]
+
+  deps = [ ":pix_validator_rs" ]
+}
+
 static_library("validation") {
   sources = [
     "payment_link_validator.cc",
@@ -33,6 +53,7 @@
 
   deps = [
     ":fuzzer_util",
+    ":pix_validator_rs_ffi_glue",
     ":validation",
     "//testing/gtest",
     "//third_party/re2",
diff --git a/components/facilitated_payments/core/validation/pix_code_validator_unittest.cc b/components/facilitated_payments/core/validation/pix_code_validator_unittest.cc
index 23f11753..fc256c05 100644
--- a/components/facilitated_payments/core/validation/pix_code_validator_unittest.cc
+++ b/components/facilitated_payments/core/validation/pix_code_validator_unittest.cc
@@ -4,145 +4,205 @@
 
 #include "components/facilitated_payments/core/validation/pix_code_validator.h"
 
+#include <string_view>
+
 #include "base/strings/strcat.h"
+#include "base/strings/string_view_rust.h"
+#include "components/facilitated_payments/core/validation/pix_validator_cxx.rs.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace payments::facilitated {
 namespace {
 
-TEST(PixCodeValidatorTest, ValidDynamicCode) {
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
+enum class ValidatorImpl {
+  kCxx,
+  kRust,
+};
+
+class PixCodeValidatorTest : public ::testing::TestWithParam<ValidatorImpl> {
+ public:
+  static mojom::PixQrCodeType GetPixQrCodeType(std::string_view code) {
+    switch (GetParam()) {
+      case ValidatorImpl::kCxx:
+        return PixCodeValidator::GetPixQrCodeType(code);
+      case ValidatorImpl::kRust:
+        switch (get_pix_qr_code_type(base::StringViewToRustSlice(code))) {
+          case PixQrCodeType::Invalid:
+            return mojom::PixQrCodeType::kInvalid;
+          case PixQrCodeType::Dynamic:
+            return mojom::PixQrCodeType::kDynamic;
+          case PixQrCodeType::Static:
+            return mojom::PixQrCodeType::kStatic;
+        }
+    }
+  }
+};
+
+TEST_P(PixCodeValidatorTest, ValidDynamicCode) {
+  EXPECT_EQ(GetPixQrCodeType(
                 "00020126370014br.gov.bcb.pix2515www.example.com6304EA3F"),
             mojom::PixQrCodeType::kDynamic);
 }
 
-TEST(PixCodeValidatorTest, ValidDynamicCodeWithSomeUpperCaseLetters) {
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
+TEST_P(PixCodeValidatorTest, ValidDynamicCodeWithSomeUpperCaseLetters) {
+  EXPECT_EQ(GetPixQrCodeType(
                 "00020126370014Br.gOv.BcB.piX2515www.example.com6304EA3F"),
             mojom::PixQrCodeType::kDynamic);
 }
 
-TEST(PixCodeValidatorTest, StaticCode) {
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
-                "00020126270014br.gov.bcb.pix0105ABCDE63041D3D"),
+TEST_P(PixCodeValidatorTest, StaticCode) {
+  EXPECT_EQ(GetPixQrCodeType("00020126270014br.gov.bcb.pix0105ABCDE63041D3D"),
             mojom::PixQrCodeType::kStatic);
 }
 
-TEST(PixCodeValidatorTest, EmptyStringNotValid) {
+TEST_P(PixCodeValidatorTest, DynamicAndStatic) {
+  // If a dynamic section is encountered first in the merchant account
+  // information section, treat the code as dynamic.
+  EXPECT_EQ(
+      GetPixQrCodeType(
+          "00020126460014br.gov.bcb.pix2515www.example.com0105ABCDE6304EA3F"),
+      mojom::PixQrCodeType::kDynamic);
+
+  // Check that this is still the case when split across multiple account
+  // information sections.
+  EXPECT_EQ(GetPixQrCodeType("00020126370014br.gov.bcb.pix2515www.example."
+                             "com26270014br.gov.bcb.pix0105ABCDE6304EA3F"),
+            mojom::PixQrCodeType::kDynamic);
+}
+
+TEST_P(PixCodeValidatorTest, StaticAndDynamic) {
+  // If a static section is encountered first in the merchant account
+  // information section, treat the code as static.
+  EXPECT_EQ(
+      GetPixQrCodeType(
+          "00020126460014br.gov.bcb.pix0105ABCDE2515www.example.com6304EA3F"),
+      mojom::PixQrCodeType::kStatic);
+
+  // Check that this is still the case when split across multiple account
+  // information sections.
+  EXPECT_EQ(GetPixQrCodeType("00020126270014br.gov.bcb.pix0105ABCDE26370014br."
+                             "gov.bcb.pix2515www.example.com6304EA3F"),
+            mojom::PixQrCodeType::kStatic);
+}
+
+TEST_P(PixCodeValidatorTest, EmptyStringNotValid) {
   EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(""),
             mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, LastSectionLengthTooLong) {
+TEST_P(PixCodeValidatorTest, LastSectionLengthTooLong) {
   // Code is invalid because the last section 63051D3D has the length specified
   // as 05 which is longer than the string succeeding it (1D3D).
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
+  EXPECT_EQ(GetPixQrCodeType(
                 "00020126370014br.gov.bcb.pix2515www.example.com63051D3D"),
             mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, SectionHeaderIsNotADigit) {
+TEST_P(PixCodeValidatorTest, SectionHeaderIsNotADigit) {
   // Code is invalid because the section 000A01 does not have the first 4
   // characters as digits.
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
+  EXPECT_EQ(GetPixQrCodeType(
                 "000A0126370014br.gov.bcb.pix2515www.example.com6304EA3F"),
             mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, LastSectionLengthTooShort) {
+TEST_P(PixCodeValidatorTest, LastSectionLengthTooShort) {
   // Code is invalid because the last section 63021D3 has the length specified
   // as 02 which is shorter than the length of the string succeeding it (1D3).
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
+  EXPECT_EQ(GetPixQrCodeType(
                 "00020126370014br.gov.bcb.pix2515www.example.com63021D3"),
             mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, SectionHeaderTruncatedTooShort) {
+TEST_P(PixCodeValidatorTest, SectionHeaderTruncatedTooShort) {
   // Code is invalid because the last section 630 doesn't have the minimum
   // length of 4 characters.
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
-                "00020126370014br.gov.bcb.pix2515www.example.com630"),
-            mojom::PixQrCodeType::kInvalid);
+  EXPECT_EQ(
+      GetPixQrCodeType("00020126370014br.gov.bcb.pix2515www.example.com630"),
+      mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, MerchantAccountInformationIsEmpty) {
+TEST_P(PixCodeValidatorTest, MerchantAccountInformationIsEmpty) {
   // Code is invalid because the section 2600 has a length of 00.
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType("000201260063041D3D"),
+  EXPECT_EQ(GetPixQrCodeType("000201260063041D3D"),
             mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, MerchantAccountInformationIsNotValid) {
+TEST_P(PixCodeValidatorTest, MerchantAccountInformationIsNotValid) {
   // Code is invalid because the merchant account information section 2629
   // does not contain the Pix code indicator 0014br.gov.bcb.pix.
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
-                "00020126292515www.example.com6304EA3F"),
+  EXPECT_EQ(GetPixQrCodeType("00020126292515www.example.com6304EA3F"),
             mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, InvalidPixCodeIndicator) {
+TEST_P(PixCodeValidatorTest, InvalidPixCodeIndicator) {
   // Code is invalid because the Pix code indicator is 0014br.gov.bcb.pxi
   // instead 0014br.gov.bcb.pix.
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
+  EXPECT_EQ(GetPixQrCodeType(
                 "00020126370014br.gov.bcb.pxi2515www.example.com6304EA3F"),
             mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, EmptyAdditionalDataSection) {
+TEST_P(PixCodeValidatorTest, EmptyAdditionalDataSection) {
   // Code is invalid because the additional data section 6200 has a length of
   // 00.
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
+  EXPECT_EQ(GetPixQrCodeType(
                 "00020126370014br.gov.bcb.pix2515www.example.com620063041D3D"),
             mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, LastSectionIdIsNotCrc16) {
+TEST_P(PixCodeValidatorTest, LastSectionIdIsNotCrc16) {
   // Code is invalid because the last section 64041D3D has an id 64 instead
   // of 63.
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
+  EXPECT_EQ(GetPixQrCodeType(
                 "00020126370014br.gov.bcb.pix2515www.example.com64041D3D"),
             mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, FirstSectionIsNotPayloadIndicator) {
+TEST_P(PixCodeValidatorTest, FirstSectionIsNotPayloadIndicator) {
   // Code is invalid because the first section 010201 has an id 01 instead of
   // 00.
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType(
+  EXPECT_EQ(GetPixQrCodeType(
                 "01020126370014br.gov.bcb.pix2515www.example.com6304EA3F"),
             mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, NoMerchantAccountInformationSection) {
+TEST_P(PixCodeValidatorTest, NoMerchantAccountInformationSection) {
   // Code is invalid because there is no merchant account information section
   // with id 26.
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType("00020163041D3D"),
-            mojom::PixQrCodeType::kInvalid);
+  EXPECT_EQ(GetPixQrCodeType("00020163041D3D"), mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, NoPixCodeIndicator) {
+TEST_P(PixCodeValidatorTest, NoPixCodeIndicator) {
   // Code is invalid because the merchant account information section
   // 261801020063041D3D does not contain the Pix code indicator
   // 0014br.gov.bcb.pix .
-  EXPECT_EQ(PixCodeValidator::GetPixQrCodeType("000201261801020063041D3D"),
+  EXPECT_EQ(GetPixQrCodeType("000201261801020063041D3D"),
             mojom::PixQrCodeType::kInvalid);
 }
 
-TEST(PixCodeValidatorTest, ContainsPixCodeIdentifier) {
+TEST(PixCodeValidatorCxxTest, ContainsPixCodeIdentifier) {
   constexpr char kPixCodeIndicatorLowercase[] = "0014br.gov.bcb.pix";
   EXPECT_TRUE(PixCodeValidator::ContainsPixIdentifier(
       base::StrCat({"0002012637", kPixCodeIndicatorLowercase,
                     "2515www.example.com64041D3D"})));
 }
 
-TEST(PixCodeValidatorTest, ContainsPixCodeIdentifier_MixedCase) {
+TEST(PixCodeValidatorCxxTest, ContainsPixCodeIdentifier_MixedCase) {
   constexpr char kPixCodeIndicatorLowercase[] = "0014BR.GoV.Bcb.PIX";
   EXPECT_TRUE(PixCodeValidator::ContainsPixIdentifier(
       base::StrCat({"0002012637", kPixCodeIndicatorLowercase,
                     "2515www.example.com64041D3D"})));
 }
 
-TEST(PixCodeValidatorTest, DoesNotContainsPixCodeIdentifier) {
+TEST(PixCodeValidatorCxxTest, DoesNotContainsPixCodeIdentifier) {
   EXPECT_FALSE(PixCodeValidator::ContainsPixIdentifier("example.com64041D3D"));
 }
 
+INSTANTIATE_TEST_SUITE_P(,
+                         PixCodeValidatorTest,
+                         ::testing::Values(ValidatorImpl::kCxx,
+                                           ValidatorImpl::kRust));
+
 }  // namespace
 }  // namespace payments::facilitated
diff --git a/components/facilitated_payments/core/validation/pix_validator.rs b/components/facilitated_payments/core/validation/pix_validator.rs
new file mode 100644
index 0000000..8f626bf
--- /dev/null
+++ b/components/facilitated_payments/core/validation/pix_validator.rs
@@ -0,0 +1,164 @@
+// 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.
+
+// A Pix code uses the format defined in EMV Merchant-Presented QR codes:
+// https://www.emvco.com/emv-technologies/qr-codes/
+
+const PIX_GLOBALLY_UNIQUE_IDENTIFIER: &str = "br.gov.bcb.pix";
+
+const PAYLOAD_FORMAT_INDICATOR_DATA_OBJECT_ID: &str = "00";
+const MERCHANT_ACCOUNT_INFORMATION_DATA_OBJECT_ID: &str = "26";
+// ID of the Pix key data object nested in the merchant account information data
+// object. Mandatory for static QR codes.
+const MERCHANT_ACCOUNT_INFORMATION_STATIC_KEY_DATA_OBJECT_ID: &str = "01";
+// ID of the 3-URL data object nested in the merchant account information data
+// object. Mandatory for dynamic QR codes.
+const MERCHANT_ACCOUNT_INFORMATION_DYNAMIC_URL_DATA_OBJECT_ID: &str = "25";
+const ADDITIONAL_DATA_FIELD_TEMPLATE_DATA_OBJECT_ID: &str = "62";
+const CRC16_DATA_OBJECT_ID: &str = "63";
+
+pub enum PixQrCodeType {
+    Dynamic,
+    Static,
+}
+
+/// Parses and determines the `PixQrCodeType` that `code` represents, or `None`
+/// if `code` is not a valid Pix code.
+pub fn get_pix_qr_code_type(code: &[u8]) -> Option<PixQrCodeType> {
+    if code.is_empty() {
+        return None;
+    }
+
+    // Per the specification, EMV Merchant-Presented QR codes can contain three
+    // types data object values:
+    // - Numeric: encoded as the ASCII digits from "0" to "9"
+    // - Alphanumeric Special: 96 characters, i.e. the "Common Character Set" as
+    //   defined in [EMV Book 4]. Interestingly enough, the Merchant-Presented QR
+    //   code specification claims 96 characters, while EMV Book 4 only claims 95
+    //   characters. The characters in question are the characters that are common
+    //   to all ISO 8859 encodings, with codepoints from 0x20 to 0x7F.
+    // - Unicode: encoded as UTF-8
+    //
+    // So any `code` that is not valid UTF-8 can be ignored.
+    let code = str::from_utf8(code).ok()?;
+
+    // 4.6.1.1 The Payload Format Indicator (ID "00") shall be the first data object
+    // in the QR Code.
+    let Some((first_data_object, mut rest)) = parse_next_data_object(code) else {
+        return None;
+    };
+    if first_data_object.id != PAYLOAD_FORMAT_INDICATOR_DATA_OBJECT_ID {
+        return None;
+    }
+
+    let mut detected_qr_code_type = None;
+
+    loop {
+        let Some((next_data_object, next_rest)) = parse_next_data_object(rest) else {
+            return None;
+        };
+        match next_data_object.id {
+            MERCHANT_ACCOUNT_INFORMATION_DATA_OBJECT_ID => {
+                let qr_code_type =
+                    get_type_from_merchant_account_info_data_object(next_data_object)?;
+                if detected_qr_code_type.is_none() {
+                    detected_qr_code_type = Some(qr_code_type);
+                }
+            }
+            ADDITIONAL_DATA_FIELD_TEMPLATE_DATA_OBJECT_ID => {
+                // 4.8.1.1: If present, the Additional Data Field Template shall contain at
+                // least 1 data object.
+                if !contains_valid_data_objects(next_data_object.value) {
+                    return None;
+                }
+            }
+            CRC16_DATA_OBJECT_ID => {
+                // 4.6.1.2 The CRC (ID "63") shall be the last data object in the QR Code
+                if !next_rest.is_empty() {
+                    return None;
+                }
+                return detected_qr_code_type;
+            }
+            _ => (),
+        }
+        rest = next_rest;
+    }
+}
+
+struct Section<'a> {
+    id: &'a str,
+    value: &'a str,
+}
+
+fn parse_next_data_object(input: &str) -> Option<(Section<'_>, &str)> {
+    // 3.2: Each data object is made up of three individual fields [...]:
+    // - The ID is coded as a two-digit numeric value, with a value ranging from
+    //   "00" to "99",
+    // - The length is coded as a two-digit numeric value, with a value ranging from
+    //   "01" to "99"
+    // - The value field has a minimum length of one character and maximum length of
+    //   99 characters.
+    let (id, rest) = input.split_at_checked(2)?;
+    let (length, rest) = rest.split_at_checked(2)?;
+    let length: usize = length.parse().ok()?;
+    let (value, rest) = rest.split_at_checked(length)?;
+    Some((Section { id, value }, rest))
+}
+
+fn contains_valid_data_objects(input: &str) -> bool {
+    let mut input = input;
+
+    // Subtle: this means that an empty `input` will return false
+    while let Some((_data_object, rest)) = parse_next_data_object(input) {
+        if rest.is_empty() {
+            return true;
+        }
+        input = rest;
+    }
+    false
+}
+
+/// Given a merchant account information `data_object`, returns the
+/// PixQrCodeType it represents or None if the `data_object` is invalid or it
+/// does not represent a Pix code.
+fn get_type_from_merchant_account_info_data_object(data_object: Section) -> Option<PixQrCodeType> {
+    // 4.7.11.2: If present, a Merchant Account Information template shall contain a
+    // primitive Globally Unique Identifier data object with a data object ID
+    // "00", as defined in Table 4.2.
+    let Some((gui_data_object, rest)) = parse_next_data_object(data_object.value) else {
+        return None;
+    };
+    if gui_data_object.id != "00"
+        || !gui_data_object.value.eq_ignore_ascii_case(PIX_GLOBALLY_UNIQUE_IDENTIFIER)
+    {
+        return None;
+    }
+
+    // 4.7.11.2: The value of the Globally Unique Identifier sets the context for
+    // the remainder of the template and the meaning of the other data objects
+    // in the template are context specific and outside of the scope of EMVCo.
+    let Some((next_data_object, rest)) = parse_next_data_object(rest) else {
+        return None;
+    };
+
+    // Make sure the remainder consists of valid data_objects if there is still
+    // unparsed content.
+    if !rest.is_empty() && !contains_valid_data_objects(rest) {
+        return None;
+    }
+
+    // According to EMVCo:
+    // 3.2: The position of all other data objects under the root or within
+    // templates is arbitrary and may appear in any order.
+    //
+    // While Pix does not appear to mandate a specific ordering for data objects, in
+    // practice, the validator expects the first data object after the Globally
+    // Unique Identifier to indicate whether the Pix code is static or dynamic.
+    // If it does not, treat the Pix code as malformed.
+    match next_data_object.id {
+        MERCHANT_ACCOUNT_INFORMATION_DYNAMIC_URL_DATA_OBJECT_ID => Some(PixQrCodeType::Dynamic),
+        MERCHANT_ACCOUNT_INFORMATION_STATIC_KEY_DATA_OBJECT_ID => Some(PixQrCodeType::Static),
+        _ => None,
+    }
+}
diff --git a/components/facilitated_payments/core/validation/pix_validator_cxx.rs b/components/facilitated_payments/core/validation/pix_validator_cxx.rs
new file mode 100644
index 0000000..16ffaeb
--- /dev/null
+++ b/components/facilitated_payments/core/validation/pix_validator_cxx.rs
@@ -0,0 +1,34 @@
+// 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.
+
+chromium::import! {
+    "//components/facilitated_payments/core/validation:pix_validator_rs";
+}
+
+#[cxx::bridge(namespace=payments::facilitated)]
+pub mod ffi {
+    enum PixQrCodeType {
+        Invalid,
+        Dynamic,
+        Static,
+    }
+
+    extern "Rust" {
+        fn get_pix_qr_code_type(code: &[u8]) -> PixQrCodeType;
+    }
+}
+
+impl std::convert::From<Option<pix_validator_rs::PixQrCodeType>> for ffi::PixQrCodeType {
+    fn from(value: Option<pix_validator_rs::PixQrCodeType>) -> Self {
+        match value {
+            None => Self::Invalid,
+            Some(pix_validator_rs::PixQrCodeType::Dynamic) => Self::Dynamic,
+            Some(pix_validator_rs::PixQrCodeType::Static) => Self::Static,
+        }
+    }
+}
+
+fn get_pix_qr_code_type(code: &[u8]) -> ffi::PixQrCodeType {
+    pix_validator_rs::get_pix_qr_code_type(code).into()
+}
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc
index e54e0ca..6e6e46e 100644
--- a/components/feature_engagement/public/feature_constants.cc
+++ b/components/feature_engagement/public/feature_constants.cc
@@ -91,8 +91,10 @@
     kIPHExtensionsZeroStatePromoVariantOptions[] = {
         {IPHExtensionsZeroStatePromoVariant::kCustomActionIph,
          "custom-action-iph"},
-        {IPHExtensionsZeroStatePromoVariant::kCustomUiChipIph,
+        {IPHExtensionsZeroStatePromoVariant::kCustomUiChipIphV1,
          "custom-ui-chip-iph"},
+        {IPHExtensionsZeroStatePromoVariant::kCustomUiChipIphV2,
+         "custom-ui-chip-iph-v2"},
         {IPHExtensionsZeroStatePromoVariant::kCustomUIPlainLinkIph,
          "custom-ui-plain-link-iph"}};
 BASE_FEATURE_ENUM_PARAM(
@@ -100,7 +102,7 @@
     kIPHExtensionsZeroStatePromoVariantParam,
     &feature_engagement::kIPHExtensionsZeroStatePromoFeature,
     "x_iph-variant",
-    IPHExtensionsZeroStatePromoVariant::kCustomActionIph,
+    IPHExtensionsZeroStatePromoVariant::kCustomUiChipIphV2,
     &kIPHExtensionsZeroStatePromoVariantOptions);
 #endif
 BASE_FEATURE(kIPHFocusHelpBubbleScreenReaderPromoFeature,
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h
index 94a83a92..c420ac0 100644
--- a/components/feature_engagement/public/feature_constants.h
+++ b/components/feature_engagement/public/feature_constants.h
@@ -61,7 +61,10 @@
   kCustomActionIph,
   // A custom UI IPH, presenting the user with different collections of
   // extension collections in cr-chip buttons.
-  kCustomUiChipIph,
+  kCustomUiChipIphV1,
+  // Same as above, but with a slightly different color scheme to highlight
+  // the chips button, and a different selection of links.
+  kCustomUiChipIphV2,
   // A custom UI IPH, presenting the user with different collections of
   // extension collections in plain text links.
   kCustomUIPlainLinkIph,
diff --git a/components/fingerprinting_protection_filter/interventions/common/BUILD.gn b/components/fingerprinting_protection_filter/interventions/common/BUILD.gn
deleted file mode 100644
index c27eab2..0000000
--- a/components/fingerprinting_protection_filter/interventions/common/BUILD.gn
+++ /dev/null
@@ -1,18 +0,0 @@
-# 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/features.gni")
-
-# For this component iOS is explicitly not supported.
-if (use_blink) {
-  component("features") {
-    output_name = "fingerprinting_protection_interventions_features"
-    defines = [ "IS_FINGERPRINTING_PROTECTION_INTERVENTIONS_FEATURES_IMPL" ]
-    sources = [
-      "interventions_features.cc",
-      "interventions_features.h",
-    ]
-    deps = [ "//base" ]
-  }
-}
diff --git a/components/fingerprinting_protection_filter/interventions/common/interventions_features.cc b/components/fingerprinting_protection_filter/interventions/common/interventions_features.cc
deleted file mode 100644
index 72d5e3d..0000000
--- a/components/fingerprinting_protection_filter/interventions/common/interventions_features.cc
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h"
-
-#include "base/feature_list.h"
-
-namespace fingerprinting_protection_interventions::features {
-
-// Whether the canvas interventions should be enabled that add noise to the
-// readback values.
-BASE_FEATURE(kCanvasNoise, base::FeatureState::FEATURE_DISABLED_BY_DEFAULT);
-
-BASE_FEATURE_PARAM(bool,
-                   kCanvasNoiseInRegularMode,
-                   &kCanvasNoise,
-                   "enable_in_regular_mode",
-                   false);
-
-bool IsCanvasInterventionsEnabledForIncognitoState(bool is_incognito) {
-  if (is_incognito) {
-    return base::FeatureList::IsEnabled(kCanvasNoise);
-  }
-  return base::FeatureList::IsEnabled(kCanvasNoise) &&
-         kCanvasNoiseInRegularMode.Get();
-}
-
-}  // namespace fingerprinting_protection_interventions::features
diff --git a/components/fingerprinting_protection_filter/interventions/common/interventions_features.h b/components/fingerprinting_protection_filter/interventions/common/interventions_features.h
deleted file mode 100644
index f68daca..0000000
--- a/components/fingerprinting_protection_filter/interventions/common/interventions_features.h
+++ /dev/null
@@ -1,28 +0,0 @@
-// Copyright 2024 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_FINGERPRINTING_PROTECTION_FILTER_INTERVENTIONS_COMMON_INTERVENTIONS_FEATURES_H_
-#define COMPONENTS_FINGERPRINTING_PROTECTION_FILTER_INTERVENTIONS_COMMON_INTERVENTIONS_FEATURES_H_
-
-#include "base/component_export.h"
-#include "base/feature_list.h"
-#include "base/metrics/field_trial_params.h"
-
-namespace fingerprinting_protection_interventions::features {
-
-COMPONENT_EXPORT(FINGERPRINTING_PROTECTION_INTERVENTIONS_FEATURES)
-BASE_DECLARE_FEATURE(kCanvasNoise);
-COMPONENT_EXPORT(FINGERPRINTING_PROTECTION_INTERVENTIONS_FEATURES)
-BASE_DECLARE_FEATURE_PARAM(bool, kCanvasNoiseInRegularMode);
-
-// Returns true if canvas interventions should be enabled for the provided
-// Incognito state.
-COMPONENT_EXPORT(FINGERPRINTING_PROTECTION_INTERVENTIONS_FEATURES)
-bool IsCanvasInterventionsEnabledForIncognitoState(bool is_incognito);
-
-// TODO(crbug.com/380463018): Add base::FeatureParams for signatures.
-
-}  // namespace fingerprinting_protection_interventions::features
-
-#endif  // COMPONENTS_FINGERPRINTING_PROTECTION_FILTER_INTERVENTIONS_COMMON_INTERVENTIONS_FEATURES_H_
diff --git a/components/legion/BUILD.gn b/components/legion/BUILD.gn
index cb56a98..09570b8 100644
--- a/components/legion/BUILD.gn
+++ b/components/legion/BUILD.gn
@@ -29,8 +29,6 @@
     "secure_session.h",
     "secure_session_impl.cc",
     "secure_session_impl.h",
-    "session_deserializer.cc",
-    "session_deserializer.h",
     "transport.h",
     "websocket_client.cc",
     "websocket_client.h",
@@ -57,7 +55,6 @@
     "crypter_unittest.cc",
     "secure_channel_impl_unittest.cc",
     "secure_session_impl_unittest.cc",
-    "session_deserializer_unittest.cc",
   ]
   deps = [
     ":legion",
diff --git a/components/legion/session_deserializer.cc b/components/legion/session_deserializer.cc
deleted file mode 100644
index 255304b..0000000
--- a/components/legion/session_deserializer.cc
+++ /dev/null
@@ -1,190 +0,0 @@
-// 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 "components/legion/session_deserializer.h"
-
-#include <cstdint>
-#include <optional>
-#include <string_view>
-#include <vector>
-
-#include "base/base64.h"
-#include "base/check_op.h"
-#include "base/containers/contains.h"
-#include "base/notimplemented.h"
-#include "base/strings/string_util.h"
-#include "base/values.h"
-#include "third_party/abseil-cpp/absl/strings/ascii.h"
-#include "third_party/oak/chromium/proto/session/session.pb.h"
-
-namespace legion {
-
-namespace {
-std::string SnakeToLowerCamelCase(absl::string_view input) {
-  std::string result;
-  if (input.empty()) {
-    return result;
-  }
-  result.reserve(input.size());
-  bool capitalize_next = false;
-
-  for (char c : input) {
-    if (c == '_') {
-      capitalize_next = true;
-    } else if (capitalize_next) {
-      result.push_back(absl::ascii_toupper(c));
-      capitalize_next = false;
-    } else {
-      result.push_back(c);
-    }
-  }
-  return result;
-}
-
-const base::Value* Find(const base::DictValue& value,
-                        std::string_view fieldname) {
-  // ProtoJSON handles camelCase and snake_case the same. The fieldname passed
-  // in should be snake_case.
-  DCHECK_EQ(fieldname, base::ToLowerASCII(fieldname));
-
-  if (auto* child = value.Find(fieldname)) {
-    return child;
-  }
-  if (auto* child = value.Find(SnakeToLowerCamelCase(fieldname))) {
-    return child;
-  }
-  return nullptr;
-}
-
-bool DeserializeBytes(const base::Value& value, std::string* out_string) {
-  if (!value.is_string()) {
-    return false;
-  }
-  return base::Base64Decode(value.GetString(), out_string);
-}
-
-bool DeserializeNoiseHandshakeMessage(
-    const base::Value& value,
-    oak::session::v1::NoiseHandshakeMessage* out_proto) {
-  if (!value.is_dict()) {
-    return false;
-  }
-  const base::Value::Dict& dict = value.GetDict();
-
-  if (auto* ephemeral_public_key = Find(dict, "ephemeral_public_key")) {
-    if (!DeserializeBytes(*ephemeral_public_key,
-                          out_proto->mutable_ephemeral_public_key())) {
-      return false;
-    }
-  }
-
-  if (auto* static_public_key = Find(dict, "static_public_key")) {
-    if (!DeserializeBytes(*static_public_key,
-                          out_proto->mutable_static_public_key())) {
-      return false;
-    }
-  }
-
-  if (auto* ciphertext = Find(dict, "ciphertext")) {
-    if (!DeserializeBytes(*ciphertext, out_proto->mutable_ciphertext())) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-bool DeserializeSessionBinding(const base::Value& value,
-                               oak::session::v1::SessionBinding* out_proto) {
-  if (!value.is_dict()) {
-    return false;
-  }
-  const base::Value::Dict& dict = value.GetDict();
-
-  if (auto* binding = Find(dict, "binding")) {
-    if (!DeserializeBytes(*binding, out_proto->mutable_binding())) {
-      return false;
-    }
-  }
-
-  return true;
-}
-
-bool DeserializeSessionBindingMap(
-    const base::Value& value,
-    google::protobuf::Map<std::string, oak::session::v1::SessionBinding>*
-        out_map) {
-  if (!value.is_dict()) {
-    return false;
-  }
-
-  for (auto it : value.GetDict()) {
-    const std::string& key = it.first;
-    const base::Value& session_binding_value = it.second;
-    if (!DeserializeSessionBinding(session_binding_value, &(*out_map)[key])) {
-      return false;
-    }
-  }
-  return true;
-}
-
-bool DeserializeHandshakeResponse(
-    const base::Value& value,
-    oak::session::v1::HandshakeResponse* out_proto) {
-  if (!value.is_dict()) {
-    return false;
-  }
-  const base::Value::Dict& dict = value.GetDict();
-
-  if (auto* noise_msg_value = Find(dict, "noise_handshake_message")) {
-    if (!DeserializeNoiseHandshakeMessage(
-            *noise_msg_value, out_proto->mutable_noise_handshake_message())) {
-      return false;
-    }
-  }
-
-  if (auto* attestation_bindings = Find(dict, "attestation_bindings")) {
-    if (!DeserializeSessionBindingMap(
-            *attestation_bindings, out_proto->mutable_attestation_bindings())) {
-      return false;
-    }
-  }
-
-  if (auto* assertion_bindings = Find(dict, "assertion_bindings")) {
-    if (!DeserializeSessionBindingMap(
-            *assertion_bindings, out_proto->mutable_assertion_bindings())) {
-      return false;
-    }
-  }
-
-  return true;
-}
-}  // namespace
-
-bool DeserializeSessionResponse(const base::Value& value,
-                                oak::session::v1::SessionResponse* out_proto) {
-  if (!value.is_dict()) {
-    return false;
-  }
-  const base::Value::Dict& dict = value.GetDict();
-
-  if (auto* handshake_response = Find(dict, "handshake_response")) {
-    if (!DeserializeHandshakeResponse(
-            *handshake_response, out_proto->mutable_handshake_response())) {
-      return false;
-    }
-  }
-
-  if (Find(dict, "attest_response")) {
-    NOTIMPLEMENTED();
-  }
-
-  if (Find(dict, "encrypted_message")) {
-    NOTIMPLEMENTED();
-  }
-
-  return true;
-}
-
-}  // namespace legion
diff --git a/components/legion/session_deserializer.h b/components/legion/session_deserializer.h
deleted file mode 100644
index 239101c..0000000
--- a/components/legion/session_deserializer.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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 COMPONENTS_LEGION_SESSION_DESERIALIZER_H_
-#define COMPONENTS_LEGION_SESSION_DESERIALIZER_H_
-
-#include "base/values.h"
-
-namespace oak::session::v1 {
-class SessionResponse;
-}
-
-namespace legion {
-
-// Deserializes a base::Value into a SessionResponse proto.
-// Returns true on success, false on failure.
-// Ideally this logic would be generated by proto_extras like the Serialize()
-// function.
-bool DeserializeSessionResponse(const base::Value& value,
-                                oak::session::v1::SessionResponse* out_proto);
-
-}  // namespace legion
-
-#endif  // COMPONENTS_LEGION_SESSION_DESERIALIZER_H_
diff --git a/components/legion/session_deserializer_unittest.cc b/components/legion/session_deserializer_unittest.cc
deleted file mode 100644
index 54bd350..0000000
--- a/components/legion/session_deserializer_unittest.cc
+++ /dev/null
@@ -1,130 +0,0 @@
-// 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 "components/legion/session_deserializer.h"
-
-#include "base/json/json_reader.h"
-#include "base/logging.h"
-#include "base/values.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "third_party/oak/chromium/proto/session/session.pb.h"
-#include "third_party/oak/chromium/proto/session/session.test.h"
-#include "third_party/oak/chromium/proto/session/session.to_value.h"
-
-namespace legion {
-
-namespace {
-
-using ::testing::IsEmpty;
-using ::testing::SizeIs;
-
-TEST(SessionDeserializerTest, DeserializeHandshakeResponseSuccess) {
-  const char kValidJson[] = R"(
-    {
-      "handshake_response": {
-        "noise_handshake_message": {
-          "ephemeral_public_key": "ZV9rZXk=",
-          "static_public_key": "c19rZXk=",
-          "ciphertext": "c2VjcmV0"
-        },
-        "attestation_bindings": {
-          "key1": {
-            "binding": "YmluZGluZzE="
-          }
-        },
-        "assertion_bindings": {
-          "key2": {
-            "binding": "YmluZGluZzI="
-          }
-        }
-      }
-    }
-  )";
-
-  std::optional<base::Value> value =
-      base::JSONReader::Read(kValidJson, base::JSON_PARSE_RFC);
-  ASSERT_TRUE(value.has_value());
-
-  oak::session::v1::SessionResponse session_response;
-  EXPECT_TRUE(DeserializeSessionResponse(*value, &session_response));
-  EXPECT_TRUE(session_response.has_handshake_response());
-
-  auto response = session_response.handshake_response();
-  EXPECT_EQ(response.noise_handshake_message().ephemeral_public_key(), "e_key");
-  EXPECT_EQ(response.noise_handshake_message().static_public_key(), "s_key");
-  EXPECT_EQ(response.noise_handshake_message().ciphertext(), "secret");
-
-  ASSERT_THAT(response.attestation_bindings(), SizeIs(1));
-  EXPECT_EQ(response.attestation_bindings().at("key1").binding(), "binding1");
-
-  ASSERT_THAT(response.assertion_bindings(), SizeIs(1));
-  EXPECT_EQ(response.assertion_bindings().at("key2").binding(), "binding2");
-}
-
-TEST(SessionDeserializerTest, DeserializeHandshakeResponseEmptyMaps) {
-  const char kJson[] = R"({
-    "handshake_response": {
-      "noise_handshake_message": {
-        "ephemeral_public_key": "ZV9rZXk="
-      }
-    }
-  })";
-
-  std::optional<base::Value> value =
-      base::JSONReader::Read(kJson, base::JSON_PARSE_RFC);
-  ASSERT_TRUE(value.has_value());
-
-  oak::session::v1::SessionResponse session_response;
-  EXPECT_TRUE(DeserializeSessionResponse(*value, &session_response));
-  EXPECT_TRUE(session_response.has_handshake_response());
-
-  auto response = session_response.handshake_response();
-
-  EXPECT_EQ(response.noise_handshake_message().ephemeral_public_key(), "e_key");
-  EXPECT_THAT(response.attestation_bindings(), IsEmpty());
-  EXPECT_THAT(response.assertion_bindings(), IsEmpty());
-}
-
-TEST(SessionDeserializerTest, DeserializeNotADictionary) {
-  base::Value value(base::Value::Type::LIST);
-  oak::session::v1::SessionResponse response;
-  EXPECT_FALSE(DeserializeSessionResponse(value, &response));
-}
-
-TEST(SessionDeserializerTest, DeserializeInvalidNestedType) {
-  const char kJson[] = R"({
-        "handshake_response": "not_a_dict"
-  })";
-
-  std::optional<base::Value> value =
-      base::JSONReader::Read(kJson, base::JSON_PARSE_RFC);
-  ASSERT_TRUE(value.has_value());
-
-  oak::session::v1::SessionResponse response;
-  EXPECT_FALSE(DeserializeSessionResponse(*value, &response));
-}
-
-TEST(SessionDeserializerTest, HandshakeResponseToJsonAndBack) {
-  oak::session::v1::SessionResponse session_proto;
-  auto* handshake_proto = session_proto.mutable_handshake_response();
-  handshake_proto->mutable_noise_handshake_message()->set_ephemeral_public_key(
-      "test_ephemeral_key");
-  handshake_proto->mutable_noise_handshake_message()->set_static_public_key(
-      "test_static_key");
-  handshake_proto->mutable_noise_handshake_message()->set_ciphertext(
-      "test_ciphertext");
-
-  base::Value value = oak::session::v1::Serialize(session_proto);
-
-  oak::session::v1::SessionResponse deserialized_proto;
-  ASSERT_TRUE(DeserializeSessionResponse(value, &deserialized_proto));
-
-  EXPECT_THAT(session_proto,
-              oak::session::v1::EqualsSessionResponse(deserialized_proto));
-}
-
-}  // namespace
-
-}  // namespace legion
diff --git a/components/password_manager/core/browser/features/password_features.cc b/components/password_manager/core/browser/features/password_features.cc
index 1ae18ce..f9165a5a 100644
--- a/components/password_manager/core/browser/features/password_features.cc
+++ b/components/password_manager/core/browser/features/password_features.cc
@@ -12,16 +12,16 @@
 #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)  // Desktop
 BASE_FEATURE(kActorActiveDisablesFillingOnPageLoad,
              base::FEATURE_ENABLED_BY_DEFAULT);
-BASE_FEATURE(kActorLogin, base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kActorLogin, base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kActorLoginFieldVisibilityCheck,
              base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kActorLoginFillingHeuristics, base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kActorLoginLocalClassificationModel,
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 BASE_FEATURE(kActorLoginReauthTaskRefocus, base::FEATURE_DISABLED_BY_DEFAULT);
 BASE_FEATURE(kActorLoginSameSiteIframeSupport,
              base::FEATURE_DISABLED_BY_DEFAULT);
-BASE_FEATURE(kEnableActorLoginPermissions, base::FEATURE_DISABLED_BY_DEFAULT);
+BASE_FEATURE(kEnableActorLoginPermissions, base::FEATURE_ENABLED_BY_DEFAULT);
 #endif  // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS)
 
 #if BUILDFLAG(IS_ANDROID)
diff --git a/components/pdf/browser/pdf_document_helper.cc b/components/pdf/browser/pdf_document_helper.cc
index c598b6f..079c507 100644
--- a/components/pdf/browser/pdf_document_helper.cc
+++ b/components/pdf/browser/pdf_document_helper.cc
@@ -417,6 +417,8 @@
     std::move(callback).Run();
   }
   document_load_complete_callbacks_.clear();
+
+  client_->OnDocumentLoadComplete(&render_frame_host());
 }
 
 void PDFDocumentHelper::SaveUrlAs(const GURL& url,
diff --git a/components/pdf/browser/pdf_document_helper.h b/components/pdf/browser/pdf_document_helper.h
index 82fc9cf0..2ba8efa 100644
--- a/components/pdf/browser/pdf_document_helper.h
+++ b/components/pdf/browser/pdf_document_helper.h
@@ -126,8 +126,11 @@
   // Registers `callback` to be run when document load completes successfully.
   // When the PDF is already loaded, `callback` is invoked immediately. Will not
   // be invoked when the load fails. This is useful to wait for document
-  // metadata to be loaded, before calls to `GetPdfBytes`, and `GetPageText`
+  // metadata to be loaded, before calls to `GetPdfBytes()`, and `GetPageText()`
   // should be made.
+  //
+  // This `callback` will run before
+  // `PDFDocumentHelperClient::OnDocumentLoadComplete()`.
   void RegisterForDocumentLoadComplete(base::OnceClosure callback);
 
 #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE)
diff --git a/components/pdf/browser/pdf_document_helper_client.h b/components/pdf/browser/pdf_document_helper_client.h
index 3918812..936cb4c 100644
--- a/components/pdf/browser/pdf_document_helper_client.h
+++ b/components/pdf/browser/pdf_document_helper_client.h
@@ -21,6 +21,12 @@
  public:
   virtual ~PDFDocumentHelperClient() = default;
 
+  // Notifies that the document load completed successfully. This runs after
+  // callbacks registered via
+  // `PDFDocumentHelper::RegisterForDocumentLoadComplete()` run.
+  virtual void OnDocumentLoadComplete(
+      content::RenderFrameHost* render_frame_host) {}
+
   virtual void UpdateContentRestrictions(
       content::RenderFrameHost* render_frame_host,
       int content_restrictions) {}
diff --git a/components/test/data/dom_distiller/list_classifier_tester.js b/components/test/data/dom_distiller/list_classifier_tester.js
new file mode 100644
index 0000000..9b140f7
--- /dev/null
+++ b/components/test/data/dom_distiller/list_classifier_tester.js
@@ -0,0 +1,97 @@
+// 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.
+
+/**
+ * @fileoverview Test suite for the ListClassifier class in
+ * dom_distiller_viewer.js.
+ */
+
+suite('ListClassifier', function() {
+  let testContainer;
+
+  setup(function() {
+    testContainer = document.createElement('div');
+    document.body.appendChild(testContainer);
+  });
+
+  teardown(function() {
+    document.body.removeChild(testContainer);
+  });
+
+  const runTest = async (html, expected) => {
+    const {assert} = await import('./chai.js');
+    testContainer.innerHTML = html;
+    ListClassifier.processListsIn(testContainer);
+    const el = testContainer.firstElementChild;
+    const hasClass = el.classList.contains('distilled-content-list');
+    assert.equal(hasClass, expected);
+  };
+
+  test('should reject empty lists', async function() {
+    await runTest('<ul></ul>', false);
+    await runTest('<ol></ol>', false);
+  });
+
+  test('should reject navigational lists', async function() {
+    const htmlByClass = '<ul class="menu"><li><a href="#">Item</a></li></ul>';
+    await runTest(htmlByClass, false);
+    const htmlById = '<ul id="sidebar-nav"><li><a href="#">Item</a></li></ul>';
+    await runTest(htmlById, false);
+  });
+
+  test('should accept ordered lists', async function() {
+    const html =
+        '<ol><li>Vanadium</li><li>Chromium</li><li>Manganese</li></ol>';
+    await runTest(html, true);
+  });
+
+  test('should accept lists with high punctuation ratio', async function() {
+    const html = '<ul><li>Invent.</li><li>Test?</li><li>Profit!</li></ul>';
+    await runTest(html, true);
+  });
+
+  test(
+      'should accept link-dominant lists with long link text',
+      async function() {
+        const html = `<ul>
+            <li><a href="#">To be, or not to be, that is the question</a></li>
+            <li><a href="#">Endless forms most beautiful</a></li>
+          </ul>`;
+        await runTest(html, true);
+      });
+
+  test(
+      'should reject link-dominant lists with short link text',
+      async function() {
+        const html = `<ul>
+            <li><a href="#">Strange</a></li>
+            <li><a href="#">Charm</a></li>
+          </ul>`;
+        await runTest(html, false);
+      });
+
+  test('should accept text-dominant lists', async function() {
+    const html = `<ul>
+        <li>Flavor text that comes with <a href="#">a link</a>.</li>
+      </ul>`;
+    await runTest(html, true);
+  });
+
+  test(
+      'should reject lists with substantive non-link elements',
+      async function() {
+        const html = `<ul>
+            <li><a href="#">Item 1</a><img src="image1.jpg"/></li>
+            <li><a href="#">Item 2</a></li>
+          </ul>`;
+        await runTest(html, false);
+      });
+
+  test('should accept link lists with simple wrappers', async function() {
+    const html = `<ul>
+          <li><span><a href="#">A link inside a span element</a></span></li>
+        </ul>`;
+    await runTest(html, true);
+  });
+});
diff --git a/components/test/data/dom_distiller/unit_tests_bundle_data.filelist b/components/test/data/dom_distiller/unit_tests_bundle_data.filelist
index cf4a74f..5de75b6 100644
--- a/components/test/data/dom_distiller/unit_tests_bundle_data.filelist
+++ b/components/test/data/dom_distiller/unit_tests_bundle_data.filelist
@@ -11,6 +11,7 @@
 //components/test/data/dom_distiller/identify_empty_svgs_tester.js
 //components/test/data/dom_distiller/image_classifier_tester.js
 //components/test/data/dom_distiller/invisible_style.html
+//components/test/data/dom_distiller/list_classifier_tester.js
 //components/test/data/dom_distiller/markup_article.html
 //components/test/data/dom_distiller/non_og_article.html
 //components/test/data/dom_distiller/og_article.html
diff --git a/components/viz/client/client_resource_provider.cc b/components/viz/client/client_resource_provider.cc
index 4cc00c2c..a784389b 100644
--- a/components/viz/client/client_resource_provider.cc
+++ b/components/viz/client/client_resource_provider.cc
@@ -489,8 +489,8 @@
     if (!imported.marked_for_deletion) {
       ++locked;
       auto resource_source = imported.resource.resource_source;
-      size_t resource_mem =
-          imported.resource.format.EstimatedSizeInBytes(imported.resource.size);
+      size_t resource_mem = imported.resource.format.EstimatedSizeInBytes(
+          imported.resource.GetSize());
       total_mem += resource_mem;
       mem_per_source[resource_source] += resource_mem;
 
diff --git a/components/viz/client/client_resource_provider_unittest.cc b/components/viz/client/client_resource_provider_unittest.cc
index bdd6844..836d7b5 100644
--- a/components/viz/client/client_resource_provider_unittest.cc
+++ b/components/viz/client/client_resource_provider_unittest.cc
@@ -153,7 +153,7 @@
   verified_sync_token.SetVerifyFlush();
   EXPECT_EQ(exported[0].id, id);
   EXPECT_EQ(exported[0].is_software, tran.is_software);
-  EXPECT_EQ(exported[0].size, tran.size);
+  EXPECT_EQ(exported[0].GetSize(), tran.GetSize());
   EXPECT_EQ(exported[0].mailbox(), tran.mailbox());
   EXPECT_EQ(exported[0].sync_token(), verified_sync_token);
   EXPECT_EQ(exported[0].texture_target(), tran.texture_target());
diff --git a/components/viz/service/display/display_resource_provider.cc b/components/viz/service/display/display_resource_provider.cc
index 98256f8..3588b8cb 100644
--- a/components/viz/service/display/display_resource_provider.cc
+++ b/components/viz/service/display/display_resource_provider.cc
@@ -86,9 +86,9 @@
 
     // Texture resources may not come with a size, in which case don't report
     // one.
-    if (!resource.transferable.size.IsEmpty()) {
+    if (!resource.transferable.GetSize().IsEmpty()) {
       uint64_t total_bytes = resource.transferable.format.EstimatedSizeInBytes(
-          resource.transferable.size);
+          resource.transferable.GetSize());
       dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameSize,
                       base::trace_event::MemoryAllocatorDump::kUnitsBytes,
                       static_cast<uint64_t>(total_bytes));
@@ -175,7 +175,7 @@
 
 const gfx::Size DisplayResourceProvider::GetResourceBackedSize(
     ResourceId id) const {
-  return GetResource(id)->transferable.size;
+  return GetResource(id)->transferable.GetSize();
 }
 
 SharedImageFormat DisplayResourceProvider::GetSharedImageFormat(
diff --git a/components/viz/service/display/external_use_client.cc b/components/viz/service/display/external_use_client.cc
index b71558bd..afa149a 100644
--- a/components/viz/service/display/external_use_client.cc
+++ b/components/viz/service/display/external_use_client.cc
@@ -29,7 +29,7 @@
     : mailbox_(resource.mailbox()),
       sync_token_(resource.sync_token()),
       texture_target_(resource.texture_target()),
-      size_(resource.size),
+      size_(resource.GetSize()),
       format_(resource.format),
       // SkColorSpace covers only RGB portion of the gfx::ColorSpace, YUV
       // portion is handled via SkYuvColorSpace at places where we create YUV
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
index effa015..c43f217 100644
--- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
+++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -1445,13 +1445,6 @@
     BeginFrameId frame_id,
     base::TimeTicks frame_time,
     base::TimeDelta vsync_interval) {
-  if (base::FeatureList::IsEnabled(features::kNoCompositorFrameAcks)) {
-    const int pending_frames_limit =
-        features::kNumberPendingFramesUntilThrottle.Get();
-    if (pending_frames_ >= pending_frames_limit) {
-      return RecordShouldSendBeginFrame("PendingAck", false);
-    }
-  }
   // Don't send the same BeginFrameId to a client twice. This could otherwise
   // happen if the client removes and then immediately re-adds a
   // BeginFrameObserver before the next BeginFrame arrives. See
@@ -1510,6 +1503,14 @@
     return RecordShouldSendBeginFrame("SendFrameTiming", true);
   }
 
+  if (base::FeatureList::IsEnabled(features::kNoCompositorFrameAcks)) {
+    const int pending_frames_limit =
+        features::kNumberPendingFramesUntilThrottle.Get();
+    if (pending_frames_ >= pending_frames_limit) {
+      return RecordShouldSendBeginFrame("PendingAck", false);
+    }
+  }
+
   if (!client_needs_begin_frame_ && !layer_context_wants_begin_frames_) {
     return RecordShouldSendBeginFrame("StopNotRequested", false);
   }
diff --git a/components/viz/service/layers/layer_context_impl.cc b/components/viz/service/layers/layer_context_impl.cc
index 5d41e74..3f6f81b 100644
--- a/components/viz/service/layers/layer_context_impl.cc
+++ b/components/viz/service/layers/layer_context_impl.cc
@@ -722,6 +722,8 @@
   layer.SetNearestNeighbor(extra->nearest_neighbor);
   layer.SetContentColorUsage(extra->content_color_usage);
   layer.SetRecordedBounds(extra->recorded_bounds);
+  layer.SetProposedTilingScalesForDeletion(
+      extra->proposed_tiling_scales_for_deletion);
 }
 
 base::expected<void, std::string> UpdateLayer(const mojom::Layer& wire,
@@ -990,8 +992,8 @@
       /*main_thread_release_callback=*/base::NullCallback(),
       /*evicted_callback=*/base::NullCallback());
 
-  return cc::TileDisplayLayerImpl::TileResource(resource_id, wire.resource.size,
-                                                wire.is_checkered);
+  return cc::TileDisplayLayerImpl::TileResource(
+      resource_id, wire.resource.GetSize(), wire.is_checkered);
 }
 
 base::expected<cc::TileDisplayLayerImpl::TileContents, std::string>
@@ -1892,8 +1894,8 @@
         return base::unexpected(
             "Invalid transferable resource in UI resource creation");
       }
-      if (ui_resource_request->transferable_resource->size.width() <= 0 ||
-          ui_resource_request->transferable_resource->size.height() <= 0) {
+      if (ui_resource_request->transferable_resource->GetSize().width() <= 0 ||
+          ui_resource_request->transferable_resource->GetSize().height() <= 0) {
         return base::unexpected(
             "Invalid dimensions for transferable UI resource.");
       }
@@ -1994,6 +1996,13 @@
   frame.origin_begin_main_frame_args = begin_frame_args;
   stage_breakdown.start_prepare_to_draw = base::TimeTicks::Now();
   host_impl_->PrepareToDraw(&frame);
+
+  // Notifies the client which of the tilings it nominated for deletion are
+  // actually safe to delete. This is done after PrepareToDraw() so that we have
+  // the most up-to-date information on which tilings were used for the current
+  // frame.
+  SendTilingsCleanupNotificationToClient();
+
   stage_breakdown.start_draw_layers = base::TimeTicks::Now();
   frame.set_trees_in_viz_timestamps(std::move(stage_breakdown));
   host_impl_->DrawLayers(&frame);
@@ -2001,6 +2010,20 @@
   host_impl_->DidFinishImplFrame(begin_frame_args);
 }
 
+void LayerContextImpl::SendTilingsCleanupNotificationToClient() {
+  for (cc::LayerImpl* layer : *host_impl_->active_tree()) {
+    if (layer->GetLayerType() == cc::mojom::LayerType::kTileDisplay) {
+      auto* tile_layer = static_cast<cc::TileDisplayLayerImpl*>(layer);
+      std::vector<float> scales_to_remove =
+          tile_layer->GetSafeToDeleteTilings();
+      if (!scales_to_remove.empty()) {
+        client_->get()->OnTilingsReadyForCleanup(tile_layer->id(),
+                                                 scales_to_remove);
+      }
+    }
+  }
+}
+
 void LayerContextImpl::UpdateDisplayTiling(mojom::TilingPtr tiling,
                                            bool update_damage) {
   CHECK(receiver_);
diff --git a/components/viz/service/layers/layer_context_impl.h b/components/viz/service/layers/layer_context_impl.h
index 121609d..b387034 100644
--- a/components/viz/service/layers/layer_context_impl.h
+++ b/components/viz/service/layers/layer_context_impl.h
@@ -161,6 +161,8 @@
   void DoDrawInternal(const BeginFrameArgs& begin_frame_args,
                       base::TimeTicks start_update_display_tree);
 
+  void SendTilingsCleanupNotificationToClient();
+
   const raw_ptr<CompositorFrameSinkSupport> compositor_sink_;
   const std::unique_ptr<cc::AnimationHost> animation_host_{
       cc::AnimationHost::CreateMainInstance()};
diff --git a/components/webauthn/android/BUILD.gn b/components/webauthn/android/BUILD.gn
index 1345bf8..18f7ba2 100644
--- a/components/webauthn/android/BUILD.gn
+++ b/components/webauthn/android/BUILD.gn
@@ -127,7 +127,6 @@
   testonly = true
   sources = [
     "java/src/org/chromium/components/webauthn/Fido2ApiTestHelper.java",
-    "java/src/org/chromium/components/webauthn/MockFido2CredentialRequest.java",
   ]
   deps = [
     ":java",
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/MockFido2CredentialRequest.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/MockFido2CredentialRequest.java
deleted file mode 100644
index 7d8983d..0000000
--- a/components/webauthn/android/java/src/org/chromium/components/webauthn/MockFido2CredentialRequest.java
+++ /dev/null
@@ -1,78 +0,0 @@
-// Copyright 2021 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-package org.chromium.components.webauthn;
-
-import android.content.Context;
-import android.os.Bundle;
-
-import org.chromium.blink.mojom.AuthenticatorStatus;
-import org.chromium.blink.mojom.GetCredentialOptions;
-import org.chromium.blink.mojom.PaymentOptions;
-import org.chromium.blink.mojom.PublicKeyCredentialCreationOptions;
-import org.chromium.content_public.browser.RenderFrameHost;
-import org.chromium.content_public.browser.WebContents;
-import org.chromium.url.Origin;
-
-/** A mock Fido2CredentialRequest that returns NOT_IMPLEMENTED for all calls. */
-public class MockFido2CredentialRequest extends Fido2CredentialRequest {
-    private static final AuthenticationContextProvider STUB_PROVIDER =
-            new AuthenticationContextProvider() {
-
-                @Override
-                public Context getContext() {
-                    return null;
-                }
-
-                @Override
-                public RenderFrameHost getRenderFrameHost() {
-                    return null;
-                }
-
-                @Override
-                public FidoIntentSender getIntentSender() {
-                    return null;
-                }
-
-                @Override
-                public WebContents getWebContents() {
-                    return null;
-                }
-            };
-
-    public MockFido2CredentialRequest() {
-        super(STUB_PROVIDER);
-    }
-
-    @Override
-    public void handleMakeCredentialRequest(
-            PublicKeyCredentialCreationOptions options,
-            Bundle browserOptions,
-            Origin origin,
-            Origin topOrigin,
-            PaymentOptions paymentOptions,
-            MakeCredentialResponseCallback callback,
-            AuthenticatorErrorResponseCallback errorCallback,
-            RecordOutcomeCallback recordingCallback) {
-        errorCallback.onError(AuthenticatorStatus.NOT_IMPLEMENTED);
-    }
-
-    @Override
-    public void handleGetCredentialRequest(
-            GetCredentialOptions options,
-            Origin callerOrigin,
-            Origin topOrigin,
-            PaymentOptions payment,
-            GetCredentialResponseCallback callback,
-            AuthenticatorErrorResponseCallback errorCallback,
-            RecordOutcomeCallback recordingCallback) {
-        errorCallback.onError(AuthenticatorStatus.NOT_IMPLEMENTED);
-    }
-
-    @Override
-    public void handleIsUserVerifyingPlatformAuthenticatorAvailableRequest(
-            IsUvpaaResponseCallback callback) {
-        callback.onIsUserVerifyingPlatformAuthenticatorAvailableResponse(false);
-    }
-}
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/CardboardOverlayDelegate.java b/components/webxr/android/java/src/org/chromium/components/webxr/CardboardOverlayDelegate.java
index 1d16d26..0c850aaa 100644
--- a/components/webxr/android/java/src/org/chromium/components/webxr/CardboardOverlayDelegate.java
+++ b/components/webxr/android/java/src/org/chromium/components/webxr/CardboardOverlayDelegate.java
@@ -130,7 +130,11 @@
     }
 
     @Override
-    public void configureSurfaceView(SurfaceView surfaceView) {}
+    public void configureSurfaceView(SurfaceView surfaceView) {
+        // Chrome compositor SurfaceView has setZOrderMediaOverlay set to true, but this should be
+        // above Chrome compositor SurfaceView, so needs to setZOrderMediaOverlay as well.
+        surfaceView.setZOrderMediaOverlay(true);
+    }
 
     @Override
     public void parentAndShowSurfaceView(SurfaceView surfaceView) {
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn
index 4c555d3..4d4d187a 100644
--- a/content/browser/BUILD.gn
+++ b/content/browser/BUILD.gn
@@ -116,7 +116,6 @@
     "//components/embedder_support:user_agent",
     "//components/file_access",
     "//components/filename_generation",
-    "//components/fingerprinting_protection_filter/interventions/common:features",
     "//components/history/core/browser:features",
     "//components/input",
     "//components/language/core/common",
@@ -1122,8 +1121,6 @@
     "find_in_page_client.h",
     "find_request_manager.cc",
     "find_request_manager.h",
-    "fingerprinting_protection/canvas_noise_token_data.cc",
-    "fingerprinting_protection/canvas_noise_token_data.h",
     "first_party_sets/database/first_party_sets_database.cc",
     "first_party_sets/database/first_party_sets_database.h",
     "first_party_sets/first_party_set_parser.cc",
diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
index a1b4659..28f7e51c 100644
--- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc
+++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc
@@ -604,6 +604,16 @@
 }
 
 IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
+                       AccessibilityEventsAlertShadowDomIgnoredReparented) {
+  RunEventTest(FILE_PATH_LITERAL("alert-shadow-dom-ignored-reparented.html"));
+}
+
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
+                       AccessibilityEventsAlertShadowDomIgnoredChanged) {
+  RunEventTest(FILE_PATH_LITERAL("alert-shadow-dom-ignored-changed.html"));
+}
+
+IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest,
                        AccessibilityEventsAddChild) {
   RunEventTest(FILE_PATH_LITERAL("add-child.html"));
 }
diff --git a/content/browser/back_forward_cache_basics_browsertest.cc b/content/browser/back_forward_cache_basics_browsertest.cc
index 7a51983..016e352 100644
--- a/content/browser/back_forward_cache_basics_browsertest.cc
+++ b/content/browser/back_forward_cache_basics_browsertest.cc
@@ -7,9 +7,11 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/test/bind.h"
+#include "base/time/time.h"
 #include "content/browser/back_forward_cache_browsertest.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/common/content_navigation_policy.h"
+#include "content/common/features.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/site_isolation_policy.h"
 #include "content/public/browser/web_contents.h"
@@ -19,6 +21,7 @@
 #include "content/public/test/content_browser_test_utils.h"
 #include "content/public/test/navigation_handle_observer.h"
 #include "content/public/test/test_navigation_observer.h"
+#include "content/public/test/test_utils.h"
 #include "content/public/test/url_loader_interceptor.h"
 #include "content/shell/browser/shell.h"
 #include "content/test/content_browser_test_utils_internal.h"
@@ -1409,6 +1412,98 @@
                     FROM_HERE);
 }
 
+class BackForwardCacheDelayedRfhDeletion : public BackForwardCacheBrowserTest {
+ protected:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    // Effectively never run the RFHs cleanup.
+    EnableFeatureAndSetParams(features::kDelayRfhDestructionsOnUnloadAndDetach,
+                              "task_delay", "1h");
+    BackForwardCacheBrowserTest::SetUpCommandLine(command_line);
+  }
+};
+
+// Check that a frame with a subframe that is pending deletion isn't stored
+// in the cache.
+IN_PROC_BROWSER_TEST_F(BackForwardCacheDelayedRfhDeletion,
+                       DoesNotRestoreSubframeReadyToBeDeleted) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+
+  GURL url(embedded_test_server()->GetURL("a.com", "/page_with_iframe.html"));
+
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  RenderFrameHostImplWrapper main_rfh(current_frame_host());
+  RenderFrameHostImplWrapper child_rfh(
+      main_rfh->child_at(0)->current_frame_host());
+
+  // 1) Detach subframe RFH, but prevent its deletion, due to artificially long
+  // delay for kDelayRfhDestructionsOnUnloadAndDetach.
+  EXPECT_TRUE(ExecJs(main_rfh.get(),
+                     "var f = document.querySelector('iframe');"
+                     "f.parentNode.removeChild(f);"));
+  EXPECT_EQ(child_rfh->lifecycle_state(),
+            RenderFrameHostImpl::LifecycleStateImpl::kReadyToBeDeleted);
+
+  // 2) Navigate away.
+  shell()->LoadURL(embedded_test_server()->GetURL("b.com", "/title1.html"));
+  EXPECT_TRUE(WaitForLoadStop(web_contents()));
+
+  // The page should be added to cache even with a subframe that was pending
+  // deletion at the time it was navigated away from.
+  EXPECT_TRUE(main_rfh->IsInBackForwardCache());
+
+  // 3) Go back.
+  ASSERT_TRUE(HistoryGoBack(web_contents()));
+  ExpectRestored(FROM_HERE);
+  EXPECT_TRUE(main_rfh->IsActive());
+  // The subframe remains ready to be deleted.
+  EXPECT_EQ(child_rfh->lifecycle_state(),
+            RenderFrameHostImpl::LifecycleStateImpl::kReadyToBeDeleted);
+}
+
+IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
+                       DoesNotRestoreSubframeRunningUnloadHandlers) {
+  ASSERT_TRUE(embedded_test_server()->Start());
+  // This test requires OOPIFs, so that the subframe can be detached in the
+  // browser process before issuing the main frame navigation.
+  IsolateOriginsForTesting(embedded_test_server(), shell()->web_contents(),
+                           {"b.com"});
+
+  GURL url(embedded_test_server()->GetURL(
+      "a.com", "/cross_site_iframe_factory.html?a(b)"));
+
+  EXPECT_TRUE(NavigateToURL(shell(), url));
+
+  RenderFrameHostImplWrapper main_rfh(current_frame_host());
+  RenderFrameHostImplWrapper child_rfh(
+      main_rfh->child_at(0)->current_frame_host());
+
+  // 1) Detach subframe RFH, but act as as if there was an infinite unload
+  // handler in the OOPIF.
+  child_rfh->DoNotDeleteForTesting();
+  child_rfh->SetSubframeUnloadTimeoutForTesting(base::Hours(1));
+  EXPECT_TRUE(ExecJs(main_rfh.get(),
+                     "var f = document.querySelector('iframe');"
+                     "f.parentNode.removeChild(f);"));
+  EXPECT_EQ(child_rfh->lifecycle_state(),
+            RenderFrameHostImpl::LifecycleStateImpl::kRunningUnloadHandlers);
+
+  // 2) Navigate away.
+  shell()->LoadURL(embedded_test_server()->GetURL("b.com", "/title1.html"));
+  EXPECT_TRUE(WaitForLoadStop(web_contents()));
+
+  // The page should be added to cache even with a subframe that was pending
+  // deletion at the time it was navigated away from.
+  EXPECT_TRUE(main_rfh->IsInBackForwardCache());
+
+  // 3) Go back.
+  ASSERT_TRUE(HistoryGoBack(web_contents()));
+  ExpectRestored(FROM_HERE);
+  EXPECT_TRUE(main_rfh->IsActive());
+  EXPECT_EQ(child_rfh->lifecycle_state(),
+            RenderFrameHostImpl::LifecycleStateImpl::kRunningUnloadHandlers);
+}
+
 // Check that a frame with an invalid url doesn't affect the back-forward cache
 // usage.
 IN_PROC_BROWSER_TEST_F(BackForwardCacheBrowserTest,
diff --git a/content/browser/browsing_data/browsing_data_remover_impl.cc b/content/browser/browsing_data/browsing_data_remover_impl.cc
index 9f3805b1..fcd3732 100644
--- a/content/browser/browsing_data/browsing_data_remover_impl.cc
+++ b/content/browser/browsing_data/browsing_data_remover_impl.cc
@@ -28,12 +28,10 @@
 #include "base/time/time.h"
 #include "base/trace_event/trace_event.h"
 #include "components/browsing_data/core/cookie_or_cache_deletion_choice.h"
-#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h"
 #include "content/browser/browser_context_impl.h"
 #include "content/browser/browsing_data/browsing_data_filter_builder_impl.h"
 #include "content/browser/btm/btm_service_impl.h"
 #include "content/browser/btm/btm_utils.h"
-#include "content/browser/fingerprinting_protection/canvas_noise_token_data.h"
 #include "content/browser/preloading/prefetch/prefetch_features.h"
 #include "content/browser/preloading/prefetch/prefetch_service.h"
 #include "content/browser/preloading/prefetch/prefetch_status.h"
@@ -749,20 +747,6 @@
     }
   }
 
-  //////////////////////////////////////////////////////////////////////////////
-  // Regenerate CanvasNoiseToken:
-  // Renegerate the noise token for canvas noising. Because these noise tokens
-  // are linked to the profile, it can be used to identify users. As such,
-  // regeneration of the randomized token must occur to prevent creating a
-  // stable identifier.
-  if (remove_mask & DATA_TYPE_COOKIES &&
-      base::FeatureList::IsEnabled(
-          fingerprinting_protection_interventions::features::kCanvasNoise) &&
-      filter_builder->MatchesMostOriginsAndDomains()) {
-    content::CanvasNoiseTokenData::SetNewToken(browser_context_);
-  }
-
-  //////////////////////////////////////////////////////////////////////////////
   // Embedder data.
   if (embedder_delegate_) {
     embedder_delegate_->RemoveEmbedderData(
diff --git a/content/browser/browsing_data/browsing_data_remover_impl_browsertest.cc b/content/browser/browsing_data/browsing_data_remover_impl_browsertest.cc
index 12037bb..6396e64 100644
--- a/content/browser/browsing_data/browsing_data_remover_impl_browsertest.cc
+++ b/content/browser/browsing_data/browsing_data_remover_impl_browsertest.cc
@@ -14,11 +14,9 @@
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/test_future.h"
-#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "content/browser/back_forward_cache_test_util.h"
 #include "content/browser/browsing_data/shared_storage_clear_site_data_tester.h"
-#include "content/browser/fingerprinting_protection/canvas_noise_token_data.h"
 #include "content/browser/preloading/prefetch/prefetch_document_manager.h"
 #include "content/browser/preloading/prefetch/prefetch_features.h"
 #include "content/browser/preloading/prefetch/prefetch_status.h"
@@ -1204,46 +1202,4 @@
       "Preloading.Prefetch.PrefetchStatus",
       PrefetchStatus::kPrefetchEvictedAfterBrowsingDataRemoved, 1);
 }
-
-class BrowsingDataRemoverCanvasNoiseTokenBrowserTest
-    : public CookiesBrowsingDataRemoverImplBrowserTest {
-  base::test::ScopedFeatureList features_{
-      fingerprinting_protection_interventions::features::kCanvasNoise};
-};
-
-IN_PROC_BROWSER_TEST_F(BrowsingDataRemoverCanvasNoiseTokenBrowserTest,
-                       CanvasNoiseTokenRegeneratesOnCookieRemoval) {
-  // Set a cookie.
-  GURL url = ssl_server().GetURL("/browsing_data/site_data.html");
-
-  content::BrowserContext* browser_context =
-      shell()->web_contents()->GetBrowserContext();
-
-  ASSERT_TRUE(NavigateToURL(shell(), url));
-
-  url::Origin origin = url::Origin::Create(url);
-
-  blink::NoiseToken original_token =
-      content::CanvasNoiseTokenData::GetToken(browser_context, origin);
-
-  constexpr uint64_t kRemoveMask =
-      content::BrowsingDataRemover::DATA_TYPE_COOKIES;
-  content::BrowsingDataRemover* remover =
-      browser_context->GetBrowsingDataRemover();
-  content::BrowsingDataRemoverCompletionObserver completion_observer(remover);
-  remover->RemoveAndReply(
-      base::Time(),       // delete_begin
-      base::Time::Max(),  // delete_end
-      kRemoveMask, content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB,
-      &completion_observer);
-
-  completion_observer.BlockUntilCompletion();
-
-  // Next navigation should update the token.
-  ASSERT_TRUE(NavigateToURL(shell(), url));
-
-  EXPECT_NE(content::CanvasNoiseTokenData::GetToken(browser_context, origin),
-            original_token);
-}
-
 }  // namespace content
diff --git a/content/browser/browsing_data/browsing_data_remover_impl_unittest.cc b/content/browser/browsing_data/browsing_data_remover_impl_unittest.cc
index 3583048..8156291 100644
--- a/content/browser/browsing_data/browsing_data_remover_impl_unittest.cc
+++ b/content/browser/browsing_data/browsing_data_remover_impl_unittest.cc
@@ -35,12 +35,10 @@
 #include "base/test/test_future.h"
 #include "base/threading/sequence_bound.h"
 #include "base/time/time.h"
-#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h"
 #include "content/browser/btm/btm_service_impl.h"
 #include "content/browser/btm/btm_storage.h"
 #include "content/browser/btm/btm_test_utils.h"
 #include "content/browser/btm/btm_utils.h"
-#include "content/browser/fingerprinting_protection/canvas_noise_token_data.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/browser_task_traits.h"
 #include "content/public/browser/browser_thread.h"
@@ -2261,26 +2259,4 @@
   }
 }
 
-TEST_F(BrowsingDataRemoverImplTest,
-       RemoveBrowsingHistoryRegeneratesNoiseToken) {
-  base::test::ScopedFeatureList features(
-      fingerprinting_protection_interventions::features::kCanvasNoise);
-
-  url::Origin origin = url::Origin::Create(GURL("https://example.test"));
-  blink::NoiseToken original_token =
-      content::CanvasNoiseTokenData::GetToken(GetBrowserContext(), origin);
-
-  BlockUntilBrowsingDataRemoved(base::Time(), base::Time::Max(),
-                                content::BrowsingDataRemover::DATA_TYPE_COOKIES,
-                                false);
-
-  EXPECT_EQ(content::BrowsingDataRemover::DATA_TYPE_COOKIES, GetRemovalMask());
-  EXPECT_EQ(content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB,
-            GetOriginTypeMask());
-
-  blink::NoiseToken updated_token =
-      content::CanvasNoiseTokenData::GetToken(GetBrowserContext(), origin);
-  EXPECT_NE(original_token, updated_token);
-}
-
 }  // namespace content
diff --git a/content/browser/fingerprinting_protection/DEPS b/content/browser/fingerprinting_protection/DEPS
deleted file mode 100644
index ec96158d..0000000
--- a/content/browser/fingerprinting_protection/DEPS
+++ /dev/null
@@ -1,3 +0,0 @@
-include_rules = [
-  "+components/fingerprinting_protection_filter/interventions/common",
-]
diff --git a/content/browser/fingerprinting_protection/OWNERS b/content/browser/fingerprinting_protection/OWNERS
deleted file mode 100644
index 5212975..0000000
--- a/content/browser/fingerprinting_protection/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-file://third_party/blink/public/common/fingerprinting_protection/OWNERS
-
diff --git a/content/browser/fingerprinting_protection/canvas_noise_token_data.cc b/content/browser/fingerprinting_protection/canvas_noise_token_data.cc
deleted file mode 100644
index eec809e..0000000
--- a/content/browser/fingerprinting_protection/canvas_noise_token_data.cc
+++ /dev/null
@@ -1,90 +0,0 @@
-// 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/fingerprinting_protection/canvas_noise_token_data.h"
-
-#include <cstdint>
-#include <memory>
-#include <string_view>
-
-#include "base/containers/span.h"
-#include "base/feature_list.h"
-#include "base/hash/hash.h"
-#include "base/numerics/byte_conversions.h"
-#include "base/strings/strcat.h"
-#include "base/strings/string_number_conversions.h"
-#include "base/supports_user_data.h"
-#include "base/types/pass_key.h"
-#include "base/unguessable_token.h"
-#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h"
-#include "content/public/browser/browser_context.h"
-#include "crypto/hash.h"
-#include "net/base/network_anonymization_key.h"
-#include "net/base/schemeful_site.h"
-#include "third_party/blink/public/common/features.h"
-#include "url/origin.h"
-#include "url/scheme_host_port.h"
-
-namespace content {
-
-namespace {
-const void* const kBrowserContextCanvasNoiseTokenKey =
-    &kBrowserContextCanvasNoiseTokenKey;
-
-// FNV constants
-// https://datatracker.ietf.org/doc/html/draft-eastlake-fnv#name-fnv-constants
-constexpr uint64_t kFnvPrime = 0x00000100000001b3;
-constexpr uint64_t kFnvOffset = 0xcbf29ce484222325;
-
-blink::NoiseToken DeriveInitialNoiseHash(blink::NoiseToken token,
-                                         std::string_view domain) {
-  uint64_t token_hash = kFnvOffset;
-  crypto::hash::Hasher hasher(crypto::hash::kSha256);
-  hasher.Update(base::U64ToLittleEndian(token.Value()));
-  hasher.Update(base::as_byte_span(domain));
-  std::array<uint8_t, crypto::hash::kSha256Size> digest;
-  hasher.Finish(digest);
-  token_hash ^= base::U64FromLittleEndian(base::span(digest).first<8>());
-  token_hash *= kFnvPrime;
-  return blink::NoiseToken(token_hash);
-}
-}  // namespace
-
-// static
-blink::NoiseToken CanvasNoiseTokenData::GetBrowserToken(
-    BrowserContext* context) {
-  CHECK(base::FeatureList::IsEnabled(
-      fingerprinting_protection_interventions::features::kCanvasNoise));
-
-  CanvasNoiseTokenData* data = static_cast<CanvasNoiseTokenData*>(
-      context->GetUserData(&kBrowserContextCanvasNoiseTokenKey));
-  if (data != nullptr) {
-    return data->session_token_;
-  }
-  return CanvasNoiseTokenData::SetNewToken(context);
-}
-
-// static
-blink::NoiseToken CanvasNoiseTokenData::GetToken(BrowserContext* context,
-                                                 const url::Origin& origin) {
-  if (!origin.opaque()) {
-    return DeriveInitialNoiseHash(GetBrowserToken(context), origin.Serialize());
-  }
-  return DeriveInitialNoiseHash(GetBrowserToken(context),
-                                base::UnguessableToken::Create().ToString());
-}
-
-// static
-blink::NoiseToken CanvasNoiseTokenData::SetNewToken(BrowserContext* context) {
-  CHECK(base::FeatureList::IsEnabled(
-      fingerprinting_protection_interventions::features::kCanvasNoise));
-
-  auto new_data = std::make_unique<CanvasNoiseTokenData>();
-  blink::NoiseToken token = new_data->session_token_;
-  context->SetUserData(&kBrowserContextCanvasNoiseTokenKey,
-                       std::move(new_data));
-  return token;
-}
-
-}  // namespace content
diff --git a/content/browser/fingerprinting_protection/canvas_noise_token_data.h b/content/browser/fingerprinting_protection/canvas_noise_token_data.h
deleted file mode 100644
index 81825009..0000000
--- a/content/browser/fingerprinting_protection/canvas_noise_token_data.h
+++ /dev/null
@@ -1,46 +0,0 @@
-// 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 CONTENT_BROWSER_FINGERPRINTING_PROTECTION_CANVAS_NOISE_TOKEN_DATA_H_
-#define CONTENT_BROWSER_FINGERPRINTING_PROTECTION_CANVAS_NOISE_TOKEN_DATA_H_
-
-#include <cstdint>
-
-#include "base/rand_util.h"
-#include "content/public/browser/browser_context.h"
-#include "third_party/blink/public/common/fingerprinting_protection/noise_token.h"
-#include "url/origin.h"
-
-namespace content {
-
-// TODO(https://crbug.com/442616874): Key CanvasNoiseTokens by (BrowserContext,
-// StorageKey) instead of (BrowserContext, Origin).
-
-// A user data class that generates and stores BrowserContext-associated noise
-// tokens used for canvas noising.
-class CONTENT_EXPORT CanvasNoiseTokenData
-    : public base::SupportsUserData::Data {
- public:
-  CanvasNoiseTokenData() = default;
-
-  // Gets the 64 bit BrowserContext-associated noise token computed with the
-  // main frame's |origin|. If the origin is opaque, a random value will be
-  // used.
-  static blink::NoiseToken GetToken(BrowserContext* context,
-                                    const url::Origin& origin);
-
-  // Regenerates the noise token, returning the updated token value.
-  static blink::NoiseToken SetNewToken(BrowserContext* context);
-
- private:
-  // Helper to generate the 64 bit BrowserContext-associated token, which will
-  // be different per BrowserContext.
-  static blink::NoiseToken GetBrowserToken(BrowserContext* context);
-
-  blink::NoiseToken session_token_{base::RandUint64()};
-};
-
-}  // namespace content
-
-#endif  // CONTENT_BROWSER_FINGERPRINTING_PROTECTION_CANVAS_NOISE_TOKEN_DATA_H_
diff --git a/content/browser/fingerprinting_protection/canvas_noise_token_data_browsertest.cc b/content/browser/fingerprinting_protection/canvas_noise_token_data_browsertest.cc
deleted file mode 100644
index c4ade0fe..0000000
--- a/content/browser/fingerprinting_protection/canvas_noise_token_data_browsertest.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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/fingerprinting_protection/canvas_noise_token_data.h"
-
-#include "base/test/scoped_feature_list.h"
-#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h"
-#include "content/browser/web_contents/web_contents_impl.h"
-#include "content/public/test/browser_test.h"
-#include "content/public/test/content_browser_test.h"
-#include "content/shell/browser/shell.h"
-#include "content/shell/browser/shell_browser_context.h"
-#include "mojo/public/cpp/bindings/remote.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace content {
-
-class CanvasNoiseTokenDataBrowserTest : public content::ContentBrowserTest {
- public:
-  CanvasNoiseTokenDataBrowserTest() = default;
-
-  void TearDown() override { scoped_feature_list_.Reset(); }
-
- private:
-  base::test::ScopedFeatureList scoped_feature_list_{
-      fingerprinting_protection_interventions::features::kCanvasNoise};
-};
-
-IN_PROC_BROWSER_TEST_F(CanvasNoiseTokenDataBrowserTest,
-                       DifferentBrowserContextDifferCanvasNoiseTokens) {
-  blink::NoiseToken normal_token = CanvasNoiseTokenData::GetToken(
-      CreateBrowser()->web_contents()->GetBrowserContext(),
-      url::Origin::Create(GURL("https://example.test")));
-  blink::NoiseToken incognito_token = CanvasNoiseTokenData::GetToken(
-      CreateOffTheRecordBrowser()->web_contents()->GetBrowserContext(),
-      url::Origin::Create(GURL("https://example.test")));
-
-  EXPECT_NE(normal_token.Value(), 0UL);
-  EXPECT_NE(incognito_token.Value(), 0UL);
-  EXPECT_NE(normal_token, incognito_token);
-}
-
-}  // namespace content
diff --git a/content/browser/manifest/manifest_manager_host.cc b/content/browser/manifest/manifest_manager_host.cc
index c5d633d7..62da42e 100644
--- a/content/browser/manifest/manifest_manager_host.cc
+++ b/content/browser/manifest/manifest_manager_host.cc
@@ -68,11 +68,7 @@
 }  // namespace
 
 ManifestManagerHost::ManifestManagerHost(Page& page)
-    : PageUserData<ManifestManagerHost>(page),
-      last_manifest_success_result_(
-          base::unexpected(blink::mojom::RequestManifestError::New(
-              blink::mojom::ManifestRequestResult::kManifestFailedToFetch,
-              std::vector<blink::mojom::ManifestErrorPtr>()))) {}
+    : PageUserData<ManifestManagerHost>(page) {}
 
 ManifestManagerHost::~ManifestManagerHost() {
   std::vector<GetManifestCallback> callbacks = ExtractPendingCallbacks();
@@ -218,18 +214,15 @@
     }
   }
   if (result.has_value()) {
-    last_manifest_success_result_ = std::move(result);
-    developer_manifest_callback_list_.Notify(last_manifest_success_result_);
+    last_manifest_success_result_ = std::move(result.value());
+    NotifySubscriptionsIfSuccessCached();
   } else {
     developer_manifest_callback_list_.Notify(result);
   }
 }
 
 void ManifestManagerHost::ManifestUrlChanged(const GURL& manifest_url) {
-  last_manifest_success_result_ =
-      base::unexpected(blink::mojom::RequestManifestError::New(
-          blink::mojom::ManifestRequestResult::kManifestFailedToFetch,
-          std::vector<blink::mojom::ManifestErrorPtr>()));
+  last_manifest_success_result_ = std::nullopt;
   static_cast<PageImpl&>(page()).UpdateManifestUrl(manifest_url);
   if (!developer_manifest_callback_list_.empty()) {
     MaybeFetchManifestForSubscriptions();
@@ -237,7 +230,8 @@
 }
 
 void ManifestManagerHost::MaybeFetchManifestForSubscriptions() {
-  if (!page().GetManifestUrl().has_value()) {
+  if (!page().GetManifestUrl().has_value() ||
+      !page().GetManifestUrl()->is_valid()) {
     return;
   }
   auto& manifest_manager = GetManifestManager();
@@ -248,7 +242,14 @@
 
 void ManifestManagerHost::NotifySubscriptionsIfSuccessCached() {
   if (last_manifest_success_result_.has_value()) {
-    developer_manifest_callback_list_.Notify(last_manifest_success_result_);
+    // This Clone COULD be avoided if we cached the full expected result.
+    // However - that gets really confusing if we also have it be optional.
+    // Since we only care about caching success, it is simpler to clone here,
+    // and just cache the success results as an optional.
+    base::expected<blink::mojom::ManifestPtr,
+                   blink::mojom::RequestManifestErrorPtr>
+        result = base::ok(last_manifest_success_result_->Clone());
+    developer_manifest_callback_list_.Notify(result);
   }
 }
 
diff --git a/content/browser/manifest/manifest_manager_host.h b/content/browser/manifest/manifest_manager_host.h
index 36f7c57..46dbbe3a 100644
--- a/content/browser/manifest/manifest_manager_host.h
+++ b/content/browser/manifest/manifest_manager_host.h
@@ -90,14 +90,8 @@
   mojo::Remote<blink::mojom::ManifestManager> manifest_manager_;
   CallbackMap callbacks_;
 
-  // Invariants:
-  // - The 'not yet fetched' manifest is represented via
-  //   blink::mojom::ManifestRequestResult::kManifestFailedToFetch
-  // - This is only 'saved' from a fetch if the result of the fetch was a
-  //   successful manifest.
-  base::expected<blink::mojom::ManifestPtr,
-                 blink::mojom::RequestManifestErrorPtr>
-      last_manifest_success_result_;
+  std::optional<blink::mojom::ManifestPtr> last_manifest_success_result_ =
+      std::nullopt;
 
   ManifestCallbackList developer_manifest_callback_list_;
 
diff --git a/content/browser/plugin_service_impl.cc b/content/browser/plugin_service_impl.cc
index 8c7e675..43d4fd9 100644
--- a/content/browser/plugin_service_impl.cc
+++ b/content/browser/plugin_service_impl.cc
@@ -187,37 +187,6 @@
   return filter_;
 }
 
-static const unsigned int kMaxCrashesPerInterval = 3;
-static const unsigned int kCrashesInterval = 120;
-
-void PluginServiceImpl::RegisterPluginCrash(const base::FilePath& path) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  auto i = crash_times_.find(path);
-  if (i == crash_times_.end()) {
-    crash_times_[path] = std::vector<base::Time>();
-    i = crash_times_.find(path);
-  }
-  if (i->second.size() == kMaxCrashesPerInterval) {
-    i->second.erase(i->second.begin());
-  }
-  base::Time time = base::Time::Now();
-  i->second.push_back(time);
-}
-
-bool PluginServiceImpl::IsPluginUnstable(const base::FilePath& path) {
-  DCHECK_CURRENTLY_ON(BrowserThread::UI);
-  std::map<base::FilePath, std::vector<base::Time> >::const_iterator i =
-      crash_times_.find(path);
-  if (i == crash_times_.end()) {
-    return false;
-  }
-  if (i->second.size() != kMaxCrashesPerInterval) {
-    return false;
-  }
-  base::TimeDelta delta = base::Time::Now() - i->second[0];
-  return delta.InSeconds() <= kCrashesInterval;
-}
-
 void PluginServiceImpl::RefreshPlugins() {
   DCHECK_CURRENTLY_ON(BrowserThread::UI);
   PluginList::Singleton()->RefreshPlugins();
diff --git a/content/browser/plugin_service_impl.h b/content/browser/plugin_service_impl.h
index 92318e3..3035883c1 100644
--- a/content/browser/plugin_service_impl.h
+++ b/content/browser/plugin_service_impl.h
@@ -5,13 +5,11 @@
 #ifndef CONTENT_BROWSER_PLUGIN_SERVICE_IMPL_H_
 #define CONTENT_BROWSER_PLUGIN_SERVICE_IMPL_H_
 
-#include <map>
 #include <optional>
 #include <vector>
 
 #include "base/memory/raw_ptr.h"
 #include "base/memory/singleton.h"
-#include "base/time/time.h"
 #include "build/build_config.h"
 #include "content/common/content_export.h"
 #include "content/public/browser/plugin_service.h"
@@ -58,16 +56,12 @@
   std::vector<WebPluginInfo> GetPluginsSynchronous() override;
   void SetFilter(PluginServiceFilter* filter) override;
   PluginServiceFilter* GetFilter() override;
-  bool IsPluginUnstable(const base::FilePath& plugin_path) override;
   void RefreshPlugins() override;
   void RegisterInternalPlugin(const WebPluginInfo& info,
                               bool add_at_beginning) override;
   void UnregisterInternalPlugin(const base::FilePath& path) override;
   void GetInternalPlugins(std::vector<WebPluginInfo>* plugins) override;
 
-  // Used to monitor plugin stability.
-  void RegisterPluginCrash(const base::FilePath& plugin_path);
-
  private:
   friend struct base::DefaultSingletonTraits<PluginServiceImpl>;
 
@@ -82,9 +76,6 @@
 
   // Weak pointer; set during the startup and must outlive us.
   raw_ptr<PluginServiceFilter, DanglingUntriaged> filter_ = nullptr;
-
-  // Used to detect if a given plugin is crashing over and over.
-  std::map<base::FilePath, std::vector<base::Time>> crash_times_;
 };
 
 }  // namespace content
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
index b3bbad6..289545aa 100644
--- a/content/browser/renderer_host/render_frame_host_impl.cc
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -2975,8 +2975,13 @@
   for (FrameTreeNode* node : FrameTree::SubtreeAndInnerTreeNodes(
            this,
            /*include_delegate_nodes_for_inner_frame_trees=*/true)) {
-    if (RenderFrameHostImpl* rfh = node->current_frame_host()) {
-      rfh->DidEnterBackForwardCacheInternal();
+    RenderFrameHostImpl* subframe = node->current_frame_host();
+    // The subframe can be pending deletion if the unload handlers or the
+    // cleanup didn't complete by the time the main frame enters the BFCache. If
+    // the rfh is not deleted by the time the main frame is getting restored
+    // it will be skipped from transitioning back to active.
+    if (subframe && !subframe->IsPendingDeletion()) {
+      subframe->DidEnterBackForwardCacheInternal();
     }
   }
 }
@@ -3009,7 +3014,7 @@
   }
 }
 
-// The frame as been restored from the BackForwardCache.
+// The frame being restored from the BackForwardCache.
 void RenderFrameHostImpl::WillLeaveBackForwardCache() {
   TRACE_EVENT0("navigation", "RenderFrameHostImpl::LeaveBackForwardCache");
   DCHECK(IsBackForwardCacheEnabled());
@@ -3022,8 +3027,9 @@
   for (FrameTreeNode* node : FrameTree::SubtreeAndInnerTreeNodes(
            this,
            /*include_delegate_nodes_for_inner_frame_trees=*/true)) {
-    if (RenderFrameHostImpl* rfh = node->current_frame_host()) {
-      rfh->WillLeaveBackForwardCacheInternal();
+    RenderFrameHostImpl* subframe = node->current_frame_host();
+    if (subframe && !subframe->IsPendingDeletion()) {
+      subframe->WillLeaveBackForwardCacheInternal();
     }
   }
 }
@@ -7128,6 +7134,12 @@
     return;
   }
 
+  // Don't show the dialog and indicate navigation should continue.
+  if (GetContentClient()->browser()->ShouldSkipBeforeUnloadDialog(this)) {
+    std::move(ipc_response_callback).Run(/*success=*/true);
+    return;
+  }
+
   // Allow at most one attempt to show a beforeunload dialog per navigation.
   RenderFrameHostImpl* beforeunload_initiator = GetBeforeUnloadInitiator();
   if (beforeunload_initiator) {
@@ -12018,6 +12030,7 @@
       !IsAvoidUnnecessaryBeforeUnloadCheckSyncEnabledFor(
           features::AvoidUnnecessaryBeforeUnloadCheckSyncMode::
               kWithoutSendBeforeUnload);
+
   const bool should_run_beforeunload =
       rfh->has_before_unload_handler_ || run_beforeunload_for_legacy_frame;
 
@@ -12258,14 +12271,16 @@
 void RenderFrameHostImpl::PendingDeletionCheckCompletedOnSubtreeNowOrLater() {
   if (base::FeatureList::IsEnabled(
           features::kDelayRfhDestructionsOnUnloadAndDetach)) {
-    base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask(
-        FROM_HERE, base::BindOnce(
-                       [](auto rfh) {
-                         if (rfh) {
-                           rfh->PendingDeletionCheckCompletedOnSubtree();
-                         }
-                       },
-                       GetWeakPtr()));
+    base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask(
+        FROM_HERE,
+        base::BindOnce(
+            [](auto rfh) {
+              if (rfh) {
+                rfh->PendingDeletionCheckCompletedOnSubtree();
+              }
+            },
+            GetWeakPtr()),
+        features::kRfhDestructionsOnUnloadAndDetachTaskDelay.Get());
   } else {
     // Some children with no unload handler may be eligible for deletion. Cut
     // the dead branches now. This is a performance optimization.
@@ -18489,9 +18504,15 @@
         // We should not encounter an Inner WebContents.
         CHECK(!ftn->IsOutermostMainFrame());
 
-        RenderFrameHostImpl* rfh = ftn->current_frame_host();
-        DCHECK_EQ(rfh->lifecycle_state(), lifecycle_state_);
-        rfh->SetLifecycleState(new_state);
+        RenderFrameHostImpl* subframe = ftn->current_frame_host();
+        // Do not reset the subframe lifecycle state back to active if it's
+        // pending deletion. This can happen if an unload handler didn't finish
+        // or subframe cleanup didn't run by the time parent frame enters or is
+        // getting restored from the BFCache.
+        if (!subframe->IsPendingDeletion()) {
+          DCHECK_EQ(subframe->lifecycle_state(), lifecycle_state_);
+          subframe->SetLifecycleState(new_state);
+        }
         ++node_iter;
       }
     }
diff --git a/content/browser/renderer_host/render_frame_host_impl_unittest.cc b/content/browser/renderer_host/render_frame_host_impl_unittest.cc
index b5378a0..8dc3b81 100644
--- a/content/browser/renderer_host/render_frame_host_impl_unittest.cc
+++ b/content/browser/renderer_host/render_frame_host_impl_unittest.cc
@@ -1586,6 +1586,40 @@
   SetBrowserClientForTesting(old_browser_client);
 }
 
+class SkipBeforeUnloadDialogAndNavigateContentBrowserClient
+    : public ContentBrowserClient {
+ public:
+  bool ShouldSkipBeforeUnloadDialog(content::RenderFrameHost* rfh) override {
+    called_ = true;
+    return true;
+  }
+
+  bool called() const { return called_; }
+
+ private:
+  bool called_ = false;
+};
+
+TEST_F(RenderFrameHostImplTest, RunBeforeUnloadConfirm_SkipDialogAndNavigate) {
+  SkipBeforeUnloadDialogAndNavigateContentBrowserClient skip_client;
+  ContentBrowserClient* old_browser_client =
+      SetBrowserClientForTesting(&skip_client);
+
+  TestRenderFrameHost* rfh = contents()->GetPrimaryMainFrame();
+
+  bool callback_ran = false;
+  rfh->RunBeforeUnloadConfirm(
+      /*is_reload=*/false, base::BindLambdaForTesting([&](bool success) {
+        EXPECT_TRUE(success);
+        callback_ran = true;
+      }));
+
+  EXPECT_TRUE(callback_ran);
+  EXPECT_TRUE(skip_client.called());
+
+  SetBrowserClientForTesting(old_browser_client);
+}
+
 class RenderFrameHostImplThirdPartyStorageTest
     : public RenderViewHostImplTestHarness,
       public testing::WithParamInterface<bool> {
diff --git a/content/browser/web_contents/web_contents_impl_browsertest.cc b/content/browser/web_contents/web_contents_impl_browsertest.cc
index cebe4b9..6799bff 100644
--- a/content/browser/web_contents/web_contents_impl_browsertest.cc
+++ b/content/browser/web_contents/web_contents_impl_browsertest.cc
@@ -38,7 +38,6 @@
 #include "base/time/time.h"
 #include "base/values.h"
 #include "build/build_config.h"
-#include "components/fingerprinting_protection_filter/interventions/common/interventions_features.h"
 #include "components/input/render_widget_host_input_event_router.h"
 #include "components/ukm/test_ukm_recorder.h"
 #include "components/url_formatter/url_formatter.h"
@@ -152,10 +151,7 @@
 
 class WebContentsImplBrowserTest : public ContentBrowserTest {
  public:
-  WebContentsImplBrowserTest() {
-    scoped_feature_list_.InitAndEnableFeature(
-        fingerprinting_protection_interventions::features::kCanvasNoise);
-  }
+  WebContentsImplBrowserTest() = default;
 
   void SetUp() override {
     RenderWidgetHostImpl::DisableResizeAckCheckForTesting();
diff --git a/content/common/features.cc b/content/common/features.cc
index 9d41647..d4ceee4a 100644
--- a/content/common/features.cc
+++ b/content/common/features.cc
@@ -6,6 +6,7 @@
 
 #include "base/feature_list.h"
 #include "base/metrics/field_trial_params.h"
+#include "base/time/time.h"
 #include "third_party/blink/public/common/features.h"
 
 namespace features {
@@ -157,6 +158,10 @@
 // PendingDeletionCheckCompletedOnSubTree.
 BASE_FEATURE(kDelayRfhDestructionsOnUnloadAndDetach,
              base::FEATURE_DISABLED_BY_DEFAULT);
+const base::FeatureParam<base::TimeDelta>
+    kRfhDestructionsOnUnloadAndDetachTaskDelay{
+        &kDelayRfhDestructionsOnUnloadAndDetach, "task_delay",
+        base::TimeDelta()};
 
 // Enable document policy negotiation mechanism.
 BASE_FEATURE(kDocumentPolicyNegotiation, base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/content/common/features.h b/content/common/features.h
index 43c0025..fbe32fbd 100644
--- a/content/common/features.h
+++ b/content/common/features.h
@@ -63,6 +63,8 @@
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCommittedOriginTracking);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kCriticalClientHint);
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kDelayRfhDestructionsOnUnloadAndDetach);
+CONTENT_EXPORT extern const base::FeatureParam<base::TimeDelta>
+    kRfhDestructionsOnUnloadAndDetachTaskDelay;
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kDocumentPolicyNegotiation);
 #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)
 CONTENT_EXPORT BASE_DECLARE_FEATURE(kEnableDevToolsJsErrorReporting);
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java
index 9ffd8c8..fb0c821 100644
--- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java
+++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityEventsTest.java
@@ -174,6 +174,22 @@
 
     @Test
     @SmallTest
+    public void test_alertShadowDomIgnoredReparented() {
+        performTest(
+                "alert-shadow-dom-ignored-reparented.html",
+                "alert-shadow-dom-ignored-reparented-expected-android.txt");
+    }
+
+    @Test
+    @SmallTest
+    public void test_alertShadowDomIgnoredChanged() {
+        performTest(
+                "alert-shadow-dom-ignored-changed.html",
+                "alert-shadow-dom-ignored-changed-expected-android.txt");
+    }
+
+    @Test
+    @SmallTest
     public void test_addChild() {
         performTest("add-child.html", "add-child-expected-android.txt");
     }
diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc
index 8e4e1a3..928667b 100644
--- a/content/public/browser/content_browser_client.cc
+++ b/content/public/browser/content_browser_client.cc
@@ -1798,6 +1798,11 @@
   return false;
 }
 
+bool ContentBrowserClient::ShouldSkipBeforeUnloadDialog(
+    content::RenderFrameHost* rfh) {
+  return false;
+}
+
 std::unique_ptr<ResponsivenessCalculatorDelegate>
 ContentBrowserClient::CreateResponsivenessCalculatorDelegate() {
   return nullptr;
@@ -2000,12 +2005,6 @@
   return std::nullopt;
 }
 
-bool ContentBrowserClient::ShouldEnableCanvasNoise(
-    BrowserContext* browser_context,
-    const GURL& origin) {
-  return false;
-}
-
 bool ContentBrowserClient::UsePrefetchPrerenderIntegration() {
   return false;
 }
diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h
index 038f760..4432cd1 100644
--- a/content/public/browser/content_browser_client.h
+++ b/content/public/browser/content_browser_client.h
@@ -3083,6 +3083,9 @@
   // extension origins.
   virtual bool ShouldUseFirstPartyStorageKey(const url::Origin& origin);
 
+  // Checks if the BeforeUnload Dialog event should be skipped.
+  virtual bool ShouldSkipBeforeUnloadDialog(content::RenderFrameHost* rfh);
+
   // Allows the embedder to return a delegate for the responsiveness calculator.
   // The default implementation returns nullptr.
   virtual std::unique_ptr<ResponsivenessCalculatorDelegate>
@@ -3340,12 +3343,6 @@
   GetClipboardTypesIfPolicyApplied(
       const ui::ClipboardSequenceNumberToken& seqno);
 
-  // Returns true if CanvasNoise should be enabled for `origin`'s navigation.
-  // Enablement depends on corresponding feature flag values, and whether the
-  // origin has an exception from Canvas noising. Default returns false.
-  virtual bool ShouldEnableCanvasNoise(BrowserContext* browser_context,
-                                       const GURL& origin);
-
   // Returns true if PrefetchPrerenderIntegration should be allowed, this
   // allows a prerender fall back to prefetch if available.
   virtual bool UsePrefetchPrerenderIntegration();
diff --git a/content/public/browser/plugin_service.h b/content/public/browser/plugin_service.h
index 32d4b96..39052f0 100644
--- a/content/public/browser/plugin_service.h
+++ b/content/public/browser/plugin_service.h
@@ -94,10 +94,6 @@
   virtual void SetFilter(PluginServiceFilter* filter) = 0;
   virtual PluginServiceFilter* GetFilter() = 0;
 
-  // Used to monitor plugin stability. An unstable plugin is one that has
-  // crashed more than a set number of times in a set time period.
-  virtual bool IsPluginUnstable(const base::FilePath& plugin_path) = 0;
-
   // Cause the plugin list to refresh next time they are accessed, regardless
   // of whether they are already loaded.
   virtual void RefreshPlugins() = 0;
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 25638e3..88911eb5 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -1577,7 +1577,6 @@
     "../browser/file_system_access/file_system_access_observer_browsertest.cc",
     "../browser/file_system_access/file_system_chooser_browsertest.cc",
     "../browser/find_request_manager_browsertest.cc",
-    "../browser/fingerprinting_protection/canvas_noise_token_data_browsertest.cc",
     "../browser/first_party_sets/first_party_sets_handler_impl_browsertest.cc",
     "../browser/first_party_sets/test/first_party_sets_initialization_browsertest.cc",
     "../browser/font_access/font_access_manager_browsertest.cc",
@@ -1933,7 +1932,6 @@
     "//components/discardable_memory/common",
     "//components/discardable_memory/service",
     "//components/favicon/content",
-    "//components/fingerprinting_protection_filter/interventions/common:features",
     "//components/history/core/browser:features",
     "//components/input",
     "//components/metrics/dwa:dwa_builders",
@@ -3250,7 +3248,6 @@
     "//cc/mojom",
     "//components/attribution_reporting:mojom",
     "//components/cbor",
-    "//components/fingerprinting_protection_filter/interventions/common:features",
     "//components/input",
     "//components/metrics/private_metrics",
     "//components/network_session_configurator/browser",
diff --git a/content/test/content_test_bundle_data.filelist b/content/test/content_test_bundle_data.filelist
index 0959960..dfe646a 100644
--- a/content/test/content_test_bundle_data.filelist
+++ b/content/test/content_test_bundle_data.filelist
@@ -2267,6 +2267,18 @@
 data/accessibility/event/add-alert-expected-mac.txt
 data/accessibility/event/add-alert-expected-uia-win.txt
 data/accessibility/event/add-alert-expected-win.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed-expected-auralinux.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed-expected-mac.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed-expected-uia-win.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed-expected-win.txt
+data/accessibility/event/alert-shadow-dom-ignored-changed.html
+data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android.txt
+data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-auralinux.txt
+data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-mac.txt
+data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-uia-win.txt
+data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-win.txt
+data/accessibility/event/alert-shadow-dom-ignored-reparented.html
 data/accessibility/event/add-alert-with-role-change-expected-android.txt
 data/accessibility/event/add-alert-with-role-change-expected-auralinux.txt
 data/accessibility/event/add-alert-with-role-change-expected-mac.txt
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android.txt
new file mode 100644
index 0000000..f6343683
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-android.txt
@@ -0,0 +1 @@
+TYPE_WINDOW_STATE_CHANGED - [contentTypes=16]
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-auralinux.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-auralinux.txt
new file mode 100644
index 0000000..a50d177
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-auralinux.txt
@@ -0,0 +1,4 @@
+CHILDREN-CHANGED:ADD index:0 CHILD:(role=ROLE_NOTIFICATION) role=ROLE_SECTION ENABLED,SENSITIVE,SHOWING,VISIBLE
+CHILDREN-CHANGED:ADD index:0 CHILD:(role=ROLE_NOTIFICATION) role=ROLE_SECTION ENABLED,SENSITIVE,SHOWING,VISIBLE
+CHILDREN-CHANGED:REMOVE index:0 CHILD:(role=ROLE_NOTIFICATION) role=ROLE_SECTION ENABLED,SENSITIVE,SHOWING,VISIBLE
+TEXT-INSERT (start=0 length=28 'Settings saved successfully!') role=ROLE_NOTIFICATION name='(null)' ENABLED,SENSITIVE,SHOWING,VISIBLE
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-mac.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-mac.txt
new file mode 100644
index 0000000..950afdb1
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-mac.txt
@@ -0,0 +1,2 @@
+AXLiveRegionChanged on AXGroup AXSubrole=AXApplicationAlert
+AXLiveRegionCreated on AXGroup AXSubrole=AXApplicationAlert
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-uia-win.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-uia-win.txt
new file mode 100644
index 0000000..cb12386a
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-uia-win.txt
@@ -0,0 +1 @@
+LiveRegionChanged on role=alert
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-win.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-win.txt
new file mode 100644
index 0000000..1238c0b
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed-expected-win.txt
@@ -0,0 +1,3 @@
+EVENT_OBJECT_REORDER on <test-alert#alert> role=ROLE_SYSTEM_GROUPING
+EVENT_OBJECT_SHOW on <div#container.visible> role=ROLE_SYSTEM_ALERT
+IA2_EVENT_TEXT_INSERTED on <test-alert#alert> role=ROLE_SYSTEM_GROUPING new_text={'<obj>' start=0 end=1}
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed.html b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed.html
new file mode 100644
index 0000000..1fa8d31
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-changed.html
@@ -0,0 +1,63 @@
+<!--
+Tests alert events when a shadow DOM element's own visibility and role change simultaneously.
+
+Key steps:
+- Shadow content element exists as IGNORED (visibility:hidden on itself)
+- Element's visibility changes to visible AND gains role="alert" (same element, same update)
+- Change type: NODE_CHANGED (element updates in place)
+- NotifyNodeAttributesHaveBeenChanged returns early for ignored transitions
+- OnIgnoredChanged fires Event::ALERT
+
+@UIA-WIN-DENY:*
+@UIA-WIN-ALLOW:SystemAlert*
+@UIA-WIN-ALLOW:LiveRegion*
+-->
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Alert on Property Change Test</title>
+</head>
+<body>
+  <!-- Custom element with shadow DOM, mimicking cr-toast -->
+  <test-alert id="alert"></test-alert>
+
+  <script>
+    class TestAlert extends HTMLElement {
+      constructor() {
+        super();
+        // Create shadow DOM with content that's initially hidden
+        this.attachShadow({ mode: 'open' });
+        this.shadowRoot.innerHTML = `
+          <style>
+            #container {
+              visibility: hidden;
+            }
+            #container.visible {
+              visibility: visible;
+            }
+          </style>
+          <div id="container">
+            Settings saved successfully!
+          </div>
+        `;
+      }
+
+      show() {
+        const container = this.shadowRoot.getElementById('container');
+        // Simultaneously make visible and add alert role
+        // This triggers NODE_CHANGED with ignored→unignored transition
+        container.classList.add('visible');
+        container.setAttribute('role', 'alert');
+      }
+    }
+
+    customElements.define('test-alert', TestAlert);
+
+    function go() {
+      const alert = document.getElementById('alert');
+      alert.show();
+      return false;
+    }
+  </script>
+</body>
+</html>
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android.txt
new file mode 100644
index 0000000..f6343683
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-android.txt
@@ -0,0 +1 @@
+TYPE_WINDOW_STATE_CHANGED - [contentTypes=16]
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-auralinux.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-auralinux.txt
new file mode 100644
index 0000000..fe509d5
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-auralinux.txt
@@ -0,0 +1,4 @@
+CHILDREN-CHANGED:ADD index:0 CHILD:(role=ROLE_NOTIFICATION) role=ROLE_SECTION ENABLED,SENSITIVE,SHOWING,VISIBLE
+CHILDREN-CHANGED:ADD index:0 CHILD:(role=ROLE_SECTION) role=ROLE_DOCUMENT_WEB ENABLED,FOCUSABLE,FOCUSED,SENSITIVE,SHOWING,VISIBLE
+CHILDREN-CHANGED:REMOVE index:0 CHILD:(role=ROLE_NOTIFICATION) role=ROLE_SECTION ENABLED,SENSITIVE,SHOWING,VISIBLE
+TEXT-INSERT (start=0 length=28 'Settings saved successfully!') role=ROLE_NOTIFICATION name='(null)' ENABLED,SENSITIVE,SHOWING,VISIBLE
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-mac.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-mac.txt
new file mode 100644
index 0000000..950afdb1
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-mac.txt
@@ -0,0 +1,2 @@
+AXLiveRegionChanged on AXGroup AXSubrole=AXApplicationAlert
+AXLiveRegionCreated on AXGroup AXSubrole=AXApplicationAlert
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-uia-win.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-uia-win.txt
new file mode 100644
index 0000000..cb12386a
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-uia-win.txt
@@ -0,0 +1 @@
+LiveRegionChanged on role=alert
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-win.txt b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-win.txt
new file mode 100644
index 0000000..10ef0c3f
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented-expected-win.txt
@@ -0,0 +1,4 @@
+EVENT_OBJECT_REORDER on <#document> role=ROLE_SYSTEM_DOCUMENT name="Add Alert with Shadow DOM Test" value~=[doc-url] FOCUSED,FOCUSABLE
+EVENT_OBJECT_REORDER on <test-alert#alert> role=ROLE_SYSTEM_GROUPING
+EVENT_OBJECT_SHOW on <test-alert#alert> role=ROLE_SYSTEM_GROUPING
+IA2_EVENT_TEXT_INSERTED on <#document> role=ROLE_SYSTEM_DOCUMENT name="Add Alert with Shadow DOM Test" value~=[doc-url] FOCUSED,FOCUSABLE new_text={'<obj>' start=0 end=1}
diff --git a/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented.html b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented.html
new file mode 100644
index 0000000..effe992
--- /dev/null
+++ b/content/test/data/accessibility/event/alert-shadow-dom-ignored-reparented.html
@@ -0,0 +1,68 @@
+<!--
+Tests alert events when host visibility change causes shadow content to be
+reparented (ignored subtree becomes accessible) while gaining role="alert".
+
+Key steps:
+- Host element visibility:hidden → entire shadow subtree IGNORED/omitted
+- Host becomes visible (via :host([open]) CSS) → shadow subtree reparented into tree
+- Shadow content gains role="alert" simultaneously
+- OnIgnoredChanged (or subtree creation) fires Event::ALERT
+
+@UIA-WIN-DENY:*
+@UIA-WIN-ALLOW:SystemAlert*
+@UIA-WIN-ALLOW:LiveRegion*
+-->
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Add Alert with Shadow DOM Test</title>
+  <style>
+    /* No CSS rules - element manages its own shadow DOM styles */
+  </style>
+</head>
+<body>
+  <!-- Custom element mimicking cr-toast with shadow DOM -->
+  <test-alert id="alert"></test-alert>
+
+  <script>
+    class TestAlert extends HTMLElement {
+      constructor() {
+        super();
+        this.attachShadow({ mode: 'open' });
+        this.shadowRoot.innerHTML = `
+          <style>
+            :host {
+              display: block;
+              visibility: hidden;
+            }
+            :host([open]) {
+              visibility: visible;
+            }
+          </style>
+          <div id="container">
+            <slot></slot>
+            Settings saved successfully!
+          </div>
+        `;
+      }
+
+      show() {
+        // Mimic cr-toast.show() sequence:
+        // 1. Set open attribute (triggers visibility via CSS on host)
+        this.setAttribute('open', '');
+        // 2. Set role="alert" on the shadow container that's transitioning
+        const container = this.shadowRoot.getElementById('container');
+        container.setAttribute('role', 'alert');
+      }
+    }
+
+    customElements.define('test-alert', TestAlert);
+
+    function go() {
+      const alert = document.getElementById('alert');
+      alert.show();
+      return false;
+    }
+  </script>
+</body>
+</html>
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
index a533eb2..4b62a7d4 100644
--- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -587,6 +587,11 @@
 crbug.com/450326412 [ win11 nvidia-0x2783 ] Pixel_WebGLGreenTriangle_NoAA_NoAlpha [ RetryOnFailure ]
 crbug.com/450326412 [ win11 nvidia-0x2783 ] Pixel_WebglResizedCanvas [ RetryOnFailure ]
 
+
+# ViewTransitions capturing incorrect image
+crbug.com/446157733 [ android-pixel-4 angle-opengles graphite-disabled ] Pixel_ViewTransitionsCapture [ Failure ]
+crbug.com/446157733 [ android-pixel-6 angle-vulkan ] Pixel_ViewTransitionsCapture [ Failure ]
+
 #######################################################################
 # Automated Entries After This Point - Do Not Manually Add Below Here #
 #######################################################################
diff --git a/device/fido/features.cc b/device/fido/features.cc
index 8dcbe9d..e76e3d2b 100644
--- a/device/fido/features.cc
+++ b/device/fido/features.cc
@@ -140,10 +140,10 @@
              "WebAuthenticationMicrosoftSoftwareUnexportableKeyProvider",
              base::FEATURE_ENABLED_BY_DEFAULT);
 
-// Not yet enabled by default.
+// Default enabled in M144. Remove in or after M147.
 BASE_FEATURE(kWebAuthnSignalApiHidePasskeys,
              "WebAuthenticationSignalApiHidePasskeys",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enabled by default as part of the WebAuthenticationImmediateGet feature. Do
 // not remove before WebAuthenticationImmediateGet is removed.
diff --git a/extensions/common/extension_urls.cc b/extensions/common/extension_urls.cc
index d46398e..51c266134 100644
--- a/extensions/common/extension_urls.cc
+++ b/extensions/common/extension_urls.cc
@@ -50,7 +50,8 @@
 const char kExtensionsMenuUtmSource[] = "ext_extensions_menu";
 const char kExtensionsSidebarUtmSource[] = "ext_sidebar";
 const char kCustomActionIphUtmSource[] = "ext_zero_state_promo_generic_iph";
-const char kCustomUiChipIphUtmSource[] = "ext_zero_state_promo_chips_iph";
+const char kCustomUiChipIphV1UtmSource[] = "ext_zero_state_promo_chips_iph";
+const char kCustomUiChipIphV2UtmSource[] = "ext_zero_state_promo_chips_iph_v2";
 const char kCustomUiPlainLinkIphUtmSource[] = "ext_zero_state_promo_links_iph";
 
 GURL GetWebstoreLaunchURL() {
diff --git a/extensions/common/extension_urls.h b/extensions/common/extension_urls.h
index ff3ee190..705ad46 100644
--- a/extensions/common/extension_urls.h
+++ b/extensions/common/extension_urls.h
@@ -46,8 +46,12 @@
 extern const char kExtensionsSidebarUtmSource[];
 // From the Extensions Zero State Promo custom action IPH.
 extern const char kCustomActionIphUtmSource[];
-// From the Extensions Zero State Promo, custom UI IPH, chips variant.
-extern const char kCustomUiChipIphUtmSource[];
+// From the Extensions Zero State Promo, custom UI IPH, chips variant,
+// version 1.
+extern const char kCustomUiChipIphV1UtmSource[];
+// From the Extensions Zero State Promo, custom UI IPH, chips variant,
+// version 2.
+extern const char kCustomUiChipIphV2UtmSource[];
 // From the Extensions Zero State Promo, custom UI IPH, text link variant.
 extern const char kCustomUiPlainLinkIphUtmSource[];
 
diff --git a/extensions/common/switches.cc b/extensions/common/switches.cc
index 91a1b109..eec6d91 100644
--- a/extensions/common/switches.cc
+++ b/extensions/common/switches.cc
@@ -51,7 +51,8 @@
 const char kZeroStatePromoIphVariantParamName[] =
     "extension-zero-state-iph-variant";
 const char kZeroStatePromoCustomActionIph[] = "custom-action-iph";
-const char kZeroStatePromoCustomUiChipIph[] = "custom-ui-chip-iph";
+const char kZeroStatePromoCustomUiChipIphV1[] = "custom-ui-chip-iph";
+const char kZeroStatePromoCustomUiChipIphV2[] = "custom-ui-chip-iph-v2";
 const char kZeroStatePromoCustomUiPlainLinkIph[] = "custom-ui-plain-link-iph";
 
 const char kExtensionsInstallVerification[] = "extensions-install-verification";
diff --git a/extensions/common/switches.h b/extensions/common/switches.h
index 63f1734c..c68a930 100644
--- a/extensions/common/switches.h
+++ b/extensions/common/switches.h
@@ -113,7 +113,13 @@
 // When the user has no extensions installed, display a custom UI IPH that
 // presents the user with different collections of extensions to explore,
 // each in a cr-chip button.
-extern const char kZeroStatePromoCustomUiChipIph[];
+extern const char kZeroStatePromoCustomUiChipIphV1[];
+
+// When the user has no extensions installed, display a custom UI IPH that
+// presents the user with different collections of extensions to explore,
+// each in a cr-chip button. This variation has a different color scheme
+// to highlight the chips.
+extern const char kZeroStatePromoCustomUiChipIphV2[];
 
 // When the user has no extensions installed, display a custom UI IPH that
 // presents the user with different collections of extensions to explore,
diff --git a/infra/config/PACKAGE.lock b/infra/config/PACKAGE.lock
index 358cb673..de21d52 100644
--- a/infra/config/PACKAGE.lock
+++ b/infra/config/PACKAGE.lock
@@ -31,7 +31,7 @@
 			"name": "@chromium-luci",
 			"source": {
 				"repo": "https://chromium.googlesource.com/infra/chromium/+/refs/heads/main",
-				"revision": "d32eb6269c44595510753283e4288ea36b45f640",
+				"revision": "133d552b8613e9a56025efdf91348ea2e2f8dcac",
 				"path": "starlark-libs/chromium-luci"
 			},
 			"lucicfg": "1.45.0"
diff --git a/infra/config/PACKAGE.star b/infra/config/PACKAGE.star
index 97ea7926..f039767 100644
--- a/infra/config/PACKAGE.star
+++ b/infra/config/PACKAGE.star
@@ -29,7 +29,7 @@
         repo = "infra/chromium",
         ref = "refs/heads/main",
         path = "starlark-libs/chromium-luci",
-        revision = "d32eb6269c44595510753283e4288ea36b45f640",
+        revision = "133d552b8613e9a56025efdf91348ea2e2f8dcac",
     ),
 )
 
diff --git a/infra/config/generated/builders/ci/Dawn Win10 x86 Builder/targets/chromium.dawn.json b/infra/config/generated/builders/ci/Dawn Win10 x86 Builder/targets/chromium.dawn.json
index e7d5eb46..cb2a3d04 100644
--- a/infra/config/generated/builders/ci/Dawn Win10 x86 Builder/targets/chromium.dawn.json
+++ b/infra/config/generated/builders/ci/Dawn Win10 x86 Builder/targets/chromium.dawn.json
@@ -1078,151 +1078,6 @@
     "gtest_tests": [
       {
         "args": [
-          "--enable-implicit-device-sync",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "ci_only": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_implicit_device_sync_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-toggles=skip_validation",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_skip_validation_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-backend-validation",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_validation_layers_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-wire",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_wire_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
           "--use-cmd-decoder=passthrough",
           "--use-gl=angle",
           "--use-gpu-in-tests"
@@ -1281,35 +1136,6 @@
     ],
     "isolated_scripts": [
       {
-        "args": [
-          "--override-steps=1",
-          "--gtest-benchmark-name=dawn_perf_tests",
-          "-v"
-        ],
-        "merge": {
-          "args": [
-            "--smoke-test-mode"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_perf_tests",
-        "module_scheme": "single",
-        "name": "dawn_perf_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_perf_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_perf_tests/"
-      },
-      {
         "merge": {
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
diff --git "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050NVIDIA\051/targets/chromium.dawn.json" "b/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050NVIDIA\051/targets/chromium.dawn.json"
index 39e251f..55a22f3 100644
--- "a/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050NVIDIA\051/targets/chromium.dawn.json"
+++ "b/infra/config/generated/builders/ci/Dawn Win10 x86 Release \050NVIDIA\051/targets/chromium.dawn.json"
@@ -3,151 +3,6 @@
     "gtest_tests": [
       {
         "args": [
-          "--enable-implicit-device-sync",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "ci_only": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_implicit_device_sync_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-toggles=skip_validation",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_skip_validation_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-backend-validation",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_validation_layers_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-wire",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_wire_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
           "--use-cmd-decoder=passthrough",
           "--use-gl=angle",
           "--use-gpu-in-tests"
@@ -206,35 +61,6 @@
     ],
     "isolated_scripts": [
       {
-        "args": [
-          "--override-steps=1",
-          "--gtest-benchmark-name=dawn_perf_tests",
-          "-v"
-        ],
-        "merge": {
-          "args": [
-            "--smoke-test-mode"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_perf_tests",
-        "module_scheme": "single",
-        "name": "dawn_perf_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_perf_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_perf_tests/"
-      },
-      {
         "merge": {
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
diff --git a/infra/config/generated/builders/try/dawn-try-win10-x86-rel/targets/chromium.dawn.json b/infra/config/generated/builders/try/dawn-try-win10-x86-rel/targets/chromium.dawn.json
index eb44eed..a9b019d 100644
--- a/infra/config/generated/builders/try/dawn-try-win10-x86-rel/targets/chromium.dawn.json
+++ b/infra/config/generated/builders/try/dawn-try-win10-x86-rel/targets/chromium.dawn.json
@@ -472,151 +472,6 @@
     "gtest_tests": [
       {
         "args": [
-          "--enable-implicit-device-sync",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "ci_only": true,
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_implicit_device_sync_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-toggles=skip_validation",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_skip_validation_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--enable-backend-validation",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_validation_layers_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
-          "--use-wire",
-          "--use-gpu-in-tests",
-          "--exclusive-device-type-preference=discrete,integrated",
-          "--test-launcher-retry-limit=0",
-          "--test-launcher-batch-limit=512"
-        ],
-        "merge": {
-          "script": "//testing/merge_scripts/standard_gtest_merge.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_end2end_tests",
-        "module_scheme": "gtest",
-        "name": "dawn_end2end_wire_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 2
-        },
-        "test": "dawn_end2end_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_end2end_tests/"
-      },
-      {
-        "args": [
           "--use-cmd-decoder=passthrough",
           "--use-gl=angle",
           "--use-gpu-in-tests"
@@ -675,35 +530,6 @@
     ],
     "isolated_scripts": [
       {
-        "args": [
-          "--override-steps=1",
-          "--gtest-benchmark-name=dawn_perf_tests",
-          "-v"
-        ],
-        "merge": {
-          "args": [
-            "--smoke-test-mode"
-          ],
-          "script": "//tools/perf/process_perf_results.py"
-        },
-        "module_name": "//third_party/dawn/src/dawn/tests:dawn_perf_tests",
-        "module_scheme": "single",
-        "name": "dawn_perf_tests",
-        "swarming": {
-          "dimensions": {
-            "display_attached": "1",
-            "gpu": "10de:2184-31.0.15.4601",
-            "os": "Windows-10-19045",
-            "pool": "chromium.tests.gpu"
-          },
-          "hard_timeout": 1800,
-          "io_timeout": 1800,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com"
-        },
-        "test": "dawn_perf_tests",
-        "test_id_prefix": "ninja://third_party/dawn/src/dawn/tests:dawn_perf_tests/"
-      },
-      {
         "merge": {
           "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
         },
diff --git a/infra/config/generated/cq-tests.md b/infra/config/generated/cq-tests.md
new file mode 100644
index 0000000..6b36d807
--- /dev/null
+++ b/infra/config/generated/cq-tests.md
@@ -0,0 +1,1987 @@
+# List of CQ test suites
+
+
+### absl_hardening_tests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### absl_hardening_tests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### absl_hardening_tests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### accessibility_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### android_browsertests
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [android-desktop-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-desktop-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-desktop-x64-rel%5C%22%22))
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### android_chrome_wpt_tests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### android_sync_integration_tests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### android_webview_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### android_webview_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### angle_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### app_shell_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### ash_components_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### ash_pixeltests
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### ash_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### ash_webui_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### aura_unittests
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### base_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### base_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### base_unittests iPad Pro 13-inch (M4) 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### base_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### base_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### blink_common_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### blink_fuzzer_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### blink_heap_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### blink_platform_unittests
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### blink_python_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### blink_pytype
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### blink_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### blink_web_tests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### blink_wpt_tests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### boringssl_crypto_tests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### boringssl_crypto_tests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### boringssl_crypto_tests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### boringssl_ssl_tests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### boringssl_ssl_tests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### boringssl_ssl_tests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### browser_tests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### build_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### capture_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### cast_runner_browsertests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+
+### cast_runner_integration_tests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+
+### cast_runner_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+
+### cast_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### cc_unittests
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### check_network_annotations
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### check_static_initializers
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+
+### checkdeps
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### checkperms
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### chrome_app_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### chrome_elf_unittests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### chrome_java_test_pagecontroller_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### chrome_junit_tests
+* [android-desktop-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-desktop-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-desktop-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### chrome_public_smoke_test
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### chrome_public_test_apk
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### chrome_public_test_apk_desktop
+* [android-desktop-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-desktop-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-desktop-x64-rel%5C%22%22))
+
+### chrome_public_test_apk_tablet
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### chrome_public_unit_test_apk
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### chrome_sizes
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### chrome_wpt_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### chromedriver_py_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### chromedriver_py_tests_headless_shell
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### chromedriver_replay_unittests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### chromedriver_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### chromeos_components_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### chromeos_integration_tests
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+
+### chromeos_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### component_storage_test
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+
+### components_browsertests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### components_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### components_perftests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### components_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### components_unittests iPad Pro 13-inch (M4) 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### components_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### components_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### compositor_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### content_browsertests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### content_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### content_shell_crash_test
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### content_shell_test_apk
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### content_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### context_lost_metal_passthrough_graphite_tests
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+
+### context_lost_passthrough_tests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### context_lost_validating_tests
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+
+### crashpad_tests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### cronet_sizes
+* [android-cronet-arm-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-cronet-arm-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-cronet-arm-rel%5C%22%22))
+
+### cronet_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### cronet_unittests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### crypto_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### crypto_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### crypto_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### dbus_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+
+### delayloads_unittests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### device_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### device_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### display_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### elevated_tracing_service_unittests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### elevation_service_unittests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### events_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### exo_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### expected_color_pixel_metal_passthrough_graphite_test
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+
+### expected_color_pixel_passthrough_test
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### expected_color_pixel_validating_test
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+
+### extensions_browsertests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### extensions_unittests
+* [android-desktop-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-desktop-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-desktop-x64-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### fake_libva_driver_unittest
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+
+### filesystem_service_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### flatbuffers_unittests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### fuchsia_pytype
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### fuzzing_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### gcm_unit_tests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### gcp_unittests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### gfx_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### gfx_unittests iPad Pro 13-inch (M4) 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### gfx_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### gfx_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### gin_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### gl_tests_passthrough
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### gl_tests_validating
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### gl_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### gl_unittests_ozone
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### gold_common_pytype
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### google_apis_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### google_apis_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### google_apis_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### gpu_process_launch_tests
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### gpu_pytype
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### gpu_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### grit_python_unittests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### gwp_asan_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### gwp_asan_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### gwp_asan_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### hardware_accelerated_feature_tests
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### headless_browsertests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### headless_shell_wpt_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### headless_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### high_dpi_blink_web_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### high_dpi_blink_wpt_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### high_dpi_headless_shell_wpt_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### info_collection_tests
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### install_static_unittests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### installer_util_unittests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### interactive_ui_tests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### ios_chrome_integration_eg2tests_module iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_chrome_integration_eg2tests_module iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_chrome_unittests iPad Pro 13-inch (M4) 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_chrome_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_chrome_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_components_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_components_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_credential_provider_extension_unittests iPad Pro 13-inch (M4) 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_credential_provider_extension_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_credential_provider_extension_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_net_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_net_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_testing_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_testing_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_inttests iPad Pro 13-inch (M4) 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_inttests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_inttests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_shell_eg2tests_module iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_shell_eg2tests_module iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_unittests iPad Pro 13-inch (M4) 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_view_inttests iPad Pro 13-inch (M4) 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_view_inttests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_view_inttests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_view_unittests iPad Pro 13-inch (M4) 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_view_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ios_web_view_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ipc_tests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### jni_zero_sample_apk_test
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### junit_unit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### keyboard_accessory_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### keyboard_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### latency_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### layer_list_mode_cc_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### libjingle_xmpp_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### liburlpattern_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### mac_signing_tests
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+
+### media_base_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### media_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### message_center_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### metrics_python_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### midi_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### mini_installer_tests
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### minidump_uploader_test
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### module_installer_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### mojo_python_unittests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### mojo_test_apk
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### mojo_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### native_theme_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### net_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### net_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### net_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### net_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### not_site_per_process_blink_web_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### not_site_per_process_blink_wpt_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+
+### not_site_per_process_headless_shell_wpt_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+
+### notification_helper_unittests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### one_time_tokens_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### openscreen_unittests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+
+### ozone_gl_unittests
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### ozone_unittests
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+
+### ozone_x11_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+
+### paint_preview_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### password_manager_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### pdf_unittests
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### perfetto_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### performance_test_suite
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+
+### pixel_browser_tests
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### pixel_interactive_ui_tests
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### pixel_skia_gold_metal_passthrough_graphite_test
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+
+### pixel_skia_gold_passthrough_test
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### pixel_skia_gold_validating_test
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+
+### polymer_tools_python_unittests
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### power_sampler_unittests
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+
+### ppapi_blink_web_tests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### printing_unittests
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### private_code_failure_test
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### profile_provider_unittest
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+
+### remoting_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### resource_sizes_cronet_sample_apk
+* [android-cronet-arm-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-cronet-arm-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-cronet-arm-rel%5C%22%22))
+
+### rust_gtest_interop_unittests
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+
+### sandbox_linux_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+
+### sandbox_unittests
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+
+### sbox_integration_tests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### sbox_unittests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### sbox_validation_tests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### screenshot_sync_metal_passthrough_graphite_tests
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+
+### screenshot_sync_passthrough_tests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### screenshot_sync_validating_tests
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+
+### services_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### services_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### services_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### services_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### setup_unittests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### shell_dialogs_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### shell_encryption_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### skia_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### skia_unittests iPad Pro 13-inch (M4) 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### skia_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### skia_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### snapshot_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### sql_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### sql_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### sql_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### storage_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### sync_integration_tests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### system_webview_shell_layout_test_apk
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### tab_capture_end2end_tests
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### telemetry_desktop_minidump_unittests
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### telemetry_gpu_unittests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### telemetry_perf_unittests
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+
+### telemetry_unittests
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+
+### test_env_py_unittests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### testing_pytype
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### touch_to_fill_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### trace_test
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### trichrome_chrome_bundle_smoke_test
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### ui_android_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### ui_base_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### ui_base_unittests iPad Pro 13-inch (M4) 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ui_base_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ui_base_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### ui_chromeos_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### ui_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### ui_touch_selection_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### ui_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### unit_tests
+* [android-desktop-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-desktop-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-desktop-x64-rel%5C%22%22))
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### updater_tests
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### updater_tests_system
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### url_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### url_unittests iPhone 15 18.2
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### url_unittests iPhone 16 26.0
+* [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/try/ios-simulator) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22ios-simulator%5C%22%22))
+
+### usage_time_limit_unittests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### vaapi_unittest
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+
+### video_encode_accelerator_tests
+* [android-desktop-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-desktop-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-desktop-x64-rel%5C%22%22))
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### views_ax_chromeos_browser_tests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### views_examples_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### views_perftests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### views_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### viz_unittests
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### vr_common_unittests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### vulkan_swiftshader_blink_web_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### vulkan_swiftshader_content_browsertests
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+
+### wayland_client_perftests
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### wayland_client_tests
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+
+### web_engine_browsertests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+
+### web_engine_integration_tests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+
+### web_engine_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+
+### webapk_client_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### webapk_shell_apk_h2o_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### webapk_shell_apk_junit_tests
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### webdriver_wpt_tests
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+
+### webgl_conformance_d3d11_passthrough_tests
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### webgl_conformance_metal_passthrough_graphite_tests
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+
+### webgl_conformance_tests
+* [chromeos-amd64-generic-rel-gtest](https://ci.chromium.org/ui/p/chromium/builders/try/chromeos-amd64-generic-rel-gtest) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22chromeos-amd64-generic-rel-gtest%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+
+### webgl_conformance_validating_tests
+* [android-arm64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-arm64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-arm64-rel%5C%22%22))
+
+### webkit_lint
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### webui_resources_tools_python_unittests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### webview_instrumentation_test_apk_multiple_process_mode
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### webview_trichrome_64_cts_hostside_tests full_mode
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### webview_trichrome_64_cts_hostside_tests instant_mode
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### webview_trichrome_64_cts_tests full_mode
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### webview_trichrome_64_cts_tests instant_mode
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+
+### webview_trichrome_cts_tests full_mode
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### webview_trichrome_cts_tests instant_mode
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### webview_ui_test_app_test_apk
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+
+### wm_unittests
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### wtf_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### xr_browser_tests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### xvfb_py_unittests
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### zlib_unittests
+* [android-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x64-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x64-rel%5C%22%22))
+* [android-x86-rel](https://ci.chromium.org/ui/p/chromium/builders/try/android-x86-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22android-x86-rel%5C%22%22))
+* [fuchsia-x64-cast-receiver-rel](https://ci.chromium.org/ui/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22fuchsia-x64-cast-receiver-rel%5C%22%22))
+* [linux-chromeos-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-compile-dbg%5C%22%22))
+* [linux-chromeos-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-chromeos-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-chromeos-rel%5C%22%22))
+* [linux-rel](https://ci.chromium.org/ui/p/chromium/builders/try/linux-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux-rel%5C%22%22))
+* [linux_chromium_asan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_asan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_asan_rel_ng%5C%22%22))
+* [linux_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_compile_dbg_ng%5C%22%22))
+* [linux_chromium_tsan_rel_ng](https://ci.chromium.org/ui/p/chromium/builders/try/linux_chromium_tsan_rel_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22linux_chromium_tsan_rel_ng%5C%22%22))
+* [mac-rel](https://ci.chromium.org/ui/p/chromium/builders/try/mac-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac-rel%5C%22%22))
+* [mac_chromium_compile_dbg_ng](https://ci.chromium.org/ui/p/chromium/builders/try/mac_chromium_compile_dbg_ng) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22mac_chromium_compile_dbg_ng%5C%22%22))
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
+
+### zucchini_unittests
+* [win-arm64-compile-dbg](https://ci.chromium.org/ui/p/chromium/builders/try/win-arm64-compile-dbg) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-arm64-compile-dbg%5C%22%22))
+* [win-rel](https://ci.chromium.org/ui/p/chromium/builders/try/win-rel) ([definition](https://cs.chromium.org/search?q=file:/try/.*%5C.star$%20%22name%20=%20%5C%22win-rel%5C%22%22))
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg
index e8c66ba..3145d63 100644
--- a/infra/config/generated/luci/commit-queue.cfg
+++ b/infra/config/generated/luci/commit-queue.cfg
@@ -353,6 +353,13 @@
         owner_whitelist_group: "project-chromium-robot-committers"
       }
       builders {
+        name: "chrome/try/ios-simulator"
+        includable_only: true
+        result_visibility: COMMENT_LEVEL_RESTRICTED
+        owner_whitelist_group: "googlers"
+        owner_whitelist_group: "project-chromium-robot-committers"
+      }
+      builders {
         name: "chrome/try/ipad-device"
         includable_only: true
         result_visibility: COMMENT_LEVEL_RESTRICTED
@@ -8289,7 +8296,6 @@
     projects {
       name: "chromium/src"
       ref_regexp: "refs/branch-heads/.*"
-      ref_regexp_exclude: "refs/branch-heads/6834"
       ref_regexp_exclude: "refs/branch-heads/7204"
       ref_regexp_exclude: "refs/branch-heads/7339"
       ref_regexp_exclude: "refs/branch-heads/7390"
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 764bf8af..47557075 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -5656,7 +5656,7 @@
       name: "CrWinAsan"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -5775,7 +5775,7 @@
       name: "CrWinAsan(dll)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -30089,7 +30089,7 @@
       name: "ToTRustWin(dbg)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -30208,7 +30208,7 @@
       name: "ToTWin"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -30327,7 +30327,7 @@
       name: "ToTWin(dbg)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -30446,7 +30446,7 @@
       name: "ToTWin(dll)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -30565,7 +30565,7 @@
       name: "ToTWin64"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -30684,7 +30684,7 @@
       name: "ToTWin64(dbg)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -30803,7 +30803,7 @@
       name: "ToTWin64(dll)"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -30922,7 +30922,7 @@
       name: "ToTWin64PGO"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -31041,7 +31041,7 @@
       name: "ToTWinASanLibfuzzer"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -31160,7 +31160,7 @@
       name: "ToTWinArm64PGO"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
@@ -31267,7 +31267,7 @@
       name: "ToTWindowsCoverage"
       swarming_host: "chromium-swarm.appspot.com"
       dimensions: "builderless:1"
-      dimensions: "cores:32|64"
+      dimensions: "cores:64"
       dimensions: "cpu:x86-64"
       dimensions: "free_space:high"
       dimensions: "os:Windows-10"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg
index 97573b1..aa20512 100644
--- a/infra/config/generated/luci/luci-milo.cfg
+++ b/infra/config/generated/luci/luci-milo.cfg
@@ -343,10 +343,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -1298,10 +1294,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -2041,10 +2033,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -2624,10 +2612,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -3010,10 +2994,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -3925,10 +3905,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -4441,10 +4417,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -4882,10 +4854,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -5260,10 +5228,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -5641,10 +5605,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -6017,10 +5977,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -6473,10 +6429,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -7484,10 +7436,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -8255,10 +8203,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -8631,10 +8575,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -9287,10 +9227,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -9698,10 +9634,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -10069,10 +10001,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -10529,10 +10457,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -10970,10 +10894,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -11340,10 +11260,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -11864,10 +11780,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -12300,10 +12212,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -12926,10 +12834,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -13522,10 +13426,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -14153,10 +14053,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -14629,10 +14525,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -15027,10 +14919,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -15633,10 +15521,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -16228,10 +16112,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -16655,10 +16535,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -17425,10 +17301,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -17824,10 +17696,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -18600,10 +18468,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -19010,10 +18874,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -19470,10 +19330,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -19941,10 +19797,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -20417,10 +20269,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -20793,10 +20641,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -21163,10 +21007,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -21569,10 +21409,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -21980,10 +21816,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -22536,10 +22368,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -22942,10 +22770,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -23379,10 +23203,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -23820,10 +23640,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -24201,10 +24017,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -24582,10 +24394,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -25063,10 +24871,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -25433,10 +25237,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -25803,10 +25603,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -26414,10 +26210,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -26816,10 +26608,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -27229,10 +27017,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
@@ -27620,10 +27404,6 @@
     links {
       name: "Branch Consoles"
       links {
-        text: "m132"
-        url: "/p/chromium-m132/g/main/console"
-      }
-      links {
         text: "m138"
         url: "/p/chromium-m138/g/main/console"
       }
diff --git a/infra/config/generated/luci/realms.cfg b/infra/config/generated/luci/realms.cfg
index 56e31456..5b4e21b 100644
--- a/infra/config/generated/luci/realms.cfg
+++ b/infra/config/generated/luci/realms.cfg
@@ -565,7 +565,6 @@
     role: "role/swarming.poolUser"
     principals: "group:mdb/chrome-build-access-sphinx"
     principals: "project:angle"
-    principals: "project:chromium-m132"
     principals: "project:chromium-m138"
     principals: "project:chromium-m140"
     principals: "project:chromium-m141"
@@ -622,7 +621,6 @@
     principals: "group:mdb/chrome-build-access-sphinx"
     principals: "project:angle"
     principals: "project:chromium-infra"
-    principals: "project:chromium-m132"
     principals: "project:chromium-m138"
     principals: "project:chromium-m140"
     principals: "project:chromium-m141"
diff --git a/infra/config/main.star b/infra/config/main.star
index 4f8902b0..577a2b8 100755
--- a/infra/config/main.star
+++ b/infra/config/main.star
@@ -41,6 +41,7 @@
         "builders/gn_args_locations.json",
         "builder-owners/*.txt",
         "cq-builders.md",
+        "cq-tests.md",
         "cq-usage/default.cfg",
         "cq-usage/full.cfg",
         "cq-usage/mega_cq_bots.txt",
@@ -181,6 +182,9 @@
     mega_cq_excluded_gardener_rotations = mega_cq_excluded_gardener_rotations,
     standalone_trybot_excluded_builder_groups = standalone_trybot_excluded_builder_groups,
     standalone_trybot_excluded_builders = standalone_trybot_excluded_builders,
+    cq_groups_to_generate_test_coverage_files = {
+        "cq": "cq-tests.md",
+    },
 )
 
 chromium_luci.configure_builder_health_indicators(
diff --git a/infra/config/milestones.json b/infra/config/milestones.json
index 235f104..8b78cb7 100644
--- a/infra/config/milestones.json
+++ b/infra/config/milestones.json
@@ -1,9 +1,4 @@
 {
-    "132": {
-        "name": "m132",
-        "project": "chromium-m132",
-        "ref": "refs/branch-heads/6834"
-    },
     "138": {
         "name": "m138",
         "project": "chromium-m138",
diff --git a/infra/config/subprojects/chrome/try.star b/infra/config/subprojects/chrome/try.star
index 5e9f6f7..31929d5 100644
--- a/infra/config/subprojects/chrome/try.star
+++ b/infra/config/subprojects/chrome/try.star
@@ -277,6 +277,10 @@
 )
 
 chrome_internal_verifier(
+    builder = "ios-simulator",
+)
+
+chrome_internal_verifier(
     builder = "ipad-device",
 )
 
diff --git a/infra/config/subprojects/chromium/ci/chromium.clang.star b/infra/config/subprojects/chromium/ci/chromium.clang.star
index 15e5863d..13e9827 100644
--- a/infra/config/subprojects/chromium/ci/chromium.clang.star
+++ b/infra/config/subprojects/chromium/ci/chromium.clang.star
@@ -262,7 +262,7 @@
             "win10",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
@@ -312,7 +312,7 @@
             "win10",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
@@ -1287,7 +1287,7 @@
             "win10",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
@@ -1340,7 +1340,7 @@
             "win10",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
@@ -1389,7 +1389,7 @@
             "win10",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
@@ -1437,7 +1437,7 @@
             "win10",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
@@ -1485,7 +1485,7 @@
             "win10",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
@@ -1534,7 +1534,7 @@
             "win10",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
@@ -1581,7 +1581,7 @@
             "win10",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
@@ -1631,7 +1631,7 @@
             "win11",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     gardener_rotations = args.ignore_default(None),
@@ -1656,7 +1656,7 @@
             "x64",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
@@ -1704,7 +1704,7 @@
             "win10",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
@@ -2271,7 +2271,7 @@
             "win10",
         ],
     ),
-    cores = "32|64",
+    cores = "64",
     os = os.WINDOWS_DEFAULT,
     free_space = builders.free_space.high,
     console_view_entry = consoles.console_view_entry(
diff --git a/infra/config/subprojects/chromium/ci/chromium.dawn.star b/infra/config/subprojects/chromium/ci/chromium.dawn.star
index 288ce26..6eabbb7 100644
--- a/infra/config/subprojects/chromium/ci/chromium.dawn.star
+++ b/infra/config/subprojects/chromium/ci/chromium.dawn.star
@@ -3161,9 +3161,9 @@
     ),
     targets = targets.bundle(
         targets = [
+            "dawn_chromium_isolated_scripts",
+            "gpu_common_gtests_passthrough",
             "gpu_dawn_telemetry_tests_fxc",
-            "gpu_dawn_integration_gtests_passthrough",
-            "gpu_dawn_isolated_scripts",
         ],
         mixins = [
             "win10_nvidia_gtx_1660_stable",
diff --git a/internal b/internal
index 845011c..9e5f666 160000
--- a/internal
+++ b/internal
@@ -1 +1 @@
-Subproject commit 845011ccd348813cfca94dcb3e740a5c69b81b91
+Subproject commit 9e5f666260cf9ec52730c2f7093c7966a21bb956
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd
index 1b7e4cb..3d04663 100644
--- a/ios/chrome/app/strings/ios_chromium_strings.grd
+++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -273,6 +273,12 @@
       <message name="IDS_IOS_CREDENTIAL_BOTTOM_SHEET_TITLE" desc="Title of the credential bottom sheet. [iOS only]">
           Password Manager
       </message>
+      <message name="IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_DISCLAIMER" desc="The bottom text displayed on Credential Exchange import screen to declare that the data will be saved to the user's password manager. [iOS only]">
+        Your data will be saved to Password Manager for <ph name="USER_EMAIL">$1<ex>elisa.g.beckett@gmail.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_TITLE" desc="Credential import screen that handles the credential exchange import process - Title. [iOS only]">
+        Import to Password Manager
+      </message>
       <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_INSTRUCTIONS_SUBTITLE" desc="Subitle text of the instructions page on how to set up Chromium as the Credential Provider. [iOS only]">
         From "<ph name="TEXT_OF_THE_SETTINGS_MENU_ITEM">$1<ex>Password Options</ex></ph>" settings, toggle "Chromium" on
       </message>
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_DISCLAIMER.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_DISCLAIMER.png.sha1
new file mode 100644
index 0000000..3e00df6
--- /dev/null
+++ b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_DISCLAIMER.png.sha1
@@ -0,0 +1 @@
+19ecbdcac3b8d4207ab90ff2f35a69c628843e8f
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_TITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_TITLE.png.sha1
new file mode 100644
index 0000000..d308a96b
--- /dev/null
+++ b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_TITLE.png.sha1
@@ -0,0 +1 @@
+f21d1411f7a28cb23eb53377f16966b5b36221d4
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd
index a9af063..acf3c79e 100644
--- a/ios/chrome/app/strings/ios_google_chrome_strings.grd
+++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -273,6 +273,12 @@
       <message name="IDS_IOS_CREDENTIAL_BOTTOM_SHEET_TITLE" desc="Title of the credential bottom sheet. [iOS only]">
           Google Password Manager
       </message>
+      <message name="IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_DISCLAIMER" desc="The bottom text displayed on Credential Exchange import screen to declare that the data will be saved to the user's password manager. [iOS only]">
+        Your data will be saved to Google Password Manager for <ph name="USER_EMAIL">$1<ex>elisa.g.beckett@gmail.com</ex></ph>
+      </message>
+      <message name="IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_TITLE" desc="Credential import screen that handles the credential exchange import process - Title. [iOS only]">
+        Import to Google Password Manager
+      </message>
       <message name="IDS_IOS_CREDENTIAL_PROVIDER_PROMO_INSTRUCTIONS_SUBTITLE" desc="Subitle text of the instructions page on how to set up Chrome as the Credential Provider. [iOS only]">
         From "<ph name="TEXT_OF_THE_SETTINGS_MENU_ITEM">$1<ex>Password Options</ex></ph>" settings, toggle "Chrome" on
       </message>
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_DISCLAIMER.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_DISCLAIMER.png.sha1
new file mode 100644
index 0000000..3e00df6
--- /dev/null
+++ b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_DISCLAIMER.png.sha1
@@ -0,0 +1 @@
+19ecbdcac3b8d4207ab90ff2f35a69c628843e8f
\ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_TITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_TITLE.png.sha1
new file mode 100644
index 0000000..d308a96b
--- /dev/null
+++ b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_TITLE.png.sha1
@@ -0,0 +1 @@
+f21d1411f7a28cb23eb53377f16966b5b36221d4
\ No newline at end of file
diff --git a/ios/chrome/browser/badges/ui_bundled/BUILD.gn b/ios/chrome/browser/badges/ui_bundled/BUILD.gn
index b814dfd..4cd0ee1 100644
--- a/ios/chrome/browser/badges/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/badges/ui_bundled/BUILD.gn
@@ -73,6 +73,7 @@
     "//ios/chrome/browser/infobars/model:public",
     "//ios/chrome/browser/infobars/model/overlays",
     "//ios/chrome/browser/infobars/model/overlays:util",
+    "//ios/chrome/browser/intelligence/features",
     "//ios/chrome/browser/location_bar/ui_bundled:constants",
     "//ios/chrome/browser/overlays/model",
     "//ios/chrome/browser/overlays/model/public/common/infobars",
diff --git a/ios/chrome/browser/badges/ui_bundled/DEPS b/ios/chrome/browser/badges/ui_bundled/DEPS
index d58a460..31eb883 100644
--- a/ios/chrome/browser/badges/ui_bundled/DEPS
+++ b/ios/chrome/browser/badges/ui_bundled/DEPS
@@ -4,4 +4,5 @@
   "+ios/chrome/browser/popup_menu/ui_bundled/public",
   "+ios/chrome/browser/fullscreen/ui_bundled/fullscreen_ui_element.h",
   "+ios/chrome/browser/location_bar/ui_bundled/location_bar_constants.h",
+  "+ios/chrome/browser/intelligence/features",
 ]
diff --git a/ios/chrome/browser/badges/ui_bundled/badge_button_factory.mm b/ios/chrome/browser/badges/ui_bundled/badge_button_factory.mm
index 1626ac6..9809817 100644
--- a/ios/chrome/browser/badges/ui_bundled/badge_button_factory.mm
+++ b/ios/chrome/browser/badges/ui_bundled/badge_button_factory.mm
@@ -15,6 +15,7 @@
 #import "ios/chrome/browser/badges/ui_bundled/badge_delegate.h"
 #import "ios/chrome/browser/badges/ui_bundled/badge_overflow_menu_util.h"
 #import "ios/chrome/browser/infobars/model/infobar_ios.h"
+#import "ios/chrome/browser/intelligence/features/features.h"
 #import "ios/chrome/browser/shared/ui/symbols/symbols.h"
 #import "ios/chrome/common/ui/colors/semantic_color_names.h"
 #import "ios/chrome/grit/ios_strings.h"
@@ -176,6 +177,11 @@
 - (BadgeButton*)overflowBadgeButton {
   UIImage* image = DefaultSymbolWithPointSize(kEllipsisCircleFillSymbol,
                                               kInfobarSymbolPointSize);
+  if (IsProactiveSuggestionsFrameworkEnabled()) {
+    image = [image imageWithTintColor:[UIColor whiteColor]
+                        renderingMode:UIImageRenderingModeAlwaysOriginal];
+  }
+
   BadgeButton* button = [self createButtonForType:kBadgeTypeOverflow
                                             image:image];
   button.accessibilityIdentifier = kBadgeButtonOverflowAccessibilityIdentifier;
diff --git a/ios/chrome/browser/context_menu/ui_bundled/BUILD.gn b/ios/chrome/browser/context_menu/ui_bundled/BUILD.gn
index dd11cbf..607bae78 100644
--- a/ios/chrome/browser/context_menu/ui_bundled/BUILD.gn
+++ b/ios/chrome/browser/context_menu/ui_bundled/BUILD.gn
@@ -143,6 +143,7 @@
     "//components/strings",
     "//components/url_formatter",
     "//ios/chrome/app/strings",
+    "//ios/chrome/browser/enterprise/data_controls/test:eg_test_support+eg2",
     "//ios/chrome/browser/fullscreen/ui_bundled/test:eg_test_support+eg2",
     "//ios/chrome/browser/metrics/model:eg_test_support+eg2",
     "//ios/chrome/browser/popup_menu/ui_bundled:constants",
@@ -153,6 +154,7 @@
     "//ios/chrome/browser/tabs/model/inactive_tabs:features",
     "//ios/chrome/test:eg_test_support+eg2",
     "//ios/chrome/test/earl_grey:eg_test_support+eg2",
+    "//ios/components/enterprise/data_controls:features",
     "//ios/testing/earl_grey:eg_test_support+eg2",
     "//ios/testing/earl_grey:launch_configuration",
     "//ios/web/common:features",
diff --git a/ios/chrome/browser/context_menu/ui_bundled/DEPS b/ios/chrome/browser/context_menu/ui_bundled/DEPS
index 6d5ef6c7..4347cf7c 100644
--- a/ios/chrome/browser/context_menu/ui_bundled/DEPS
+++ b/ios/chrome/browser/context_menu/ui_bundled/DEPS
@@ -15,4 +15,5 @@
   "+ios/chrome/browser/text_selection/model/text_classifier_util.h",
   "+ios/chrome/browser/url_loading/model",
   "+ios/chrome/browser/web/model",
+  "+ios/components/enterprise/data_controls/features.h",
 ]
diff --git a/ios/chrome/browser/context_menu/ui_bundled/context_menu_egtest.mm b/ios/chrome/browser/context_menu/ui_bundled/context_menu_egtest.mm
index 375df59..a067c80 100644
--- a/ios/chrome/browser/context_menu/ui_bundled/context_menu_egtest.mm
+++ b/ios/chrome/browser/context_menu/ui_bundled/context_menu_egtest.mm
@@ -14,6 +14,7 @@
 #import "components/strings/grit/components_strings.h"
 #import "components/url_formatter/url_formatter.h"
 #import "ios/chrome/browser/context_menu/ui_bundled/constants.h"
+#import "ios/chrome/browser/enterprise/data_controls/test/data_controls_app_interface.h"
 #import "ios/chrome/browser/fullscreen/ui_bundled/test/fullscreen_app_interface.h"
 #import "ios/chrome/browser/metrics/model/metrics_app_interface.h"
 #import "ios/chrome/browser/popup_menu/ui_bundled/popup_menu_constants.h"
@@ -30,6 +31,7 @@
 #import "ios/chrome/test/earl_grey/chrome_xcui_actions.h"
 #import "ios/chrome/test/earl_grey/scoped_block_popups_pref.h"
 #import "ios/chrome/test/scoped_eg_synchronization_disabler.h"
+#import "ios/components/enterprise/data_controls/features.h"
 #import "ios/testing/earl_grey/app_launch_configuration.h"
 #import "ios/testing/earl_grey/app_launch_manager.h"
 #import "ios/testing/earl_grey/disabled_test_macros.h"
@@ -334,6 +336,14 @@
       data_sharing::features::kDataSharingFeature);
   config.features_enabled.push_back(kEnableReaderMode);
   config.features_disabled.push_back(web::features::kSmoothScrollingDefault);
+
+  if ([self isRunningTest:@selector(testCopyImageBlockedByPolicy)] ||
+      [self isRunningTest:@selector(testCopyImageWarnByPolicyProceed)] ||
+      [self isRunningTest:@selector(testCopyImageWarnByPolicyCancel)]) {
+    config.features_enabled.push_back(
+        data_controls::kEnableClipboardDataControlsIOS);
+  }
+
   return config;
 }
 
@@ -382,6 +392,87 @@
   [ChromeEarlGrey clearPasteboard];
 }
 
+// Tests that copying an image is blocked when the DataControlsRule policy is
+// set to do so.
+- (void)testCopyImageBlockedByPolicy {
+  [DataControlsAppInterface setBlockCopyRule];
+
+  [ChromeEarlGrey clearPasteboard];
+  [ChromeEarlGrey loadURL:self.testServer->GetURL(kLogoPagePath)];
+  [ChromeEarlGrey waitForWebStateContainingText:kLogoPageText];
+
+  [ChromeEarlGreyUI
+      longPressElementOnWebView:LogoPageChromiumImageIdSelector()];
+
+  TapOnContextMenuButton(CopyImageButton());
+
+  // Check that the snackbar is shown.
+  id<GREYMatcher> snackbarMessage = grey_text(
+      l10n_util::GetNSString(IDS_POLICY_ACTION_BLOCKED_BY_ORGANIZATION));
+  [ChromeEarlGrey waitForUIElementToAppearWithMatcher:snackbarMessage];
+
+  // Check that the image was not copied.
+  GREYAssertFalse([ChromeEarlGrey pasteboardHasImages],
+                  @"Image should not have been copied");
+  [DataControlsAppInterface clearDataControlRules];
+}
+
+// Tests that copying an image is allowed after the user proceeds through the
+// warning triggered by DataControlRules policy.
+- (void)testCopyImageWarnByPolicyProceed {
+  [DataControlsAppInterface setWarnCopyRule];
+
+  [ChromeEarlGrey clearPasteboard];
+  [ChromeEarlGrey loadURL:self.testServer->GetURL(kLogoPagePath)];
+  [ChromeEarlGrey waitForWebStateContainingText:kLogoPageText];
+
+  [ChromeEarlGreyUI
+      longPressElementOnWebView:LogoPageChromiumImageIdSelector()];
+
+  TapOnContextMenuButton(CopyImageButton());
+
+  // Tap the "Copy anyways" button on the warning dialog.
+  [[EarlGrey selectElementWithMatcher:
+                 chrome_test_util::AlertItemWithAccessibilityLabelId(
+                     IDS_DATA_CONTROLS_COPY_WARN_CONTINUE_BUTTON)]
+      performAction:grey_tap()];
+
+  // Check that the image was copied.
+  GREYCondition* copyCondition =
+      [GREYCondition conditionWithName:@"Image copied condition"
+                                 block:^BOOL {
+                                   return [ChromeEarlGrey pasteboardHasImages];
+                                 }];
+  GREYAssertTrue([copyCondition waitWithTimeout:5], @"Copying image failed");
+  [ChromeEarlGrey clearPasteboard];
+  [DataControlsAppInterface clearDataControlRules];
+}
+
+// Tests that copying an image is cancelled when the user cancels on the warning
+// triggered by DataControlRules policy.
+- (void)testCopyImageWarnByPolicyCancel {
+  [DataControlsAppInterface setWarnCopyRule];
+
+  [ChromeEarlGrey clearPasteboard];
+  [ChromeEarlGrey loadURL:self.testServer->GetURL(kLogoPagePath)];
+  [ChromeEarlGrey waitForWebStateContainingText:kLogoPageText];
+
+  [ChromeEarlGreyUI
+      longPressElementOnWebView:LogoPageChromiumImageIdSelector()];
+
+  TapOnContextMenuButton(CopyImageButton());
+
+  // Tap the "cancel" button on the warning dialog.
+  [[EarlGrey selectElementWithMatcher:
+                 chrome_test_util::AlertItemWithAccessibilityLabelId(
+                     IDS_DATA_CONTROLS_COPY_WARN_CANCEL_BUTTON)]
+      performAction:grey_tap()];
+  // Check that the image was not copied.
+  GREYAssertFalse([ChromeEarlGrey pasteboardHasImages],
+                  @"Image should not have been copied");
+  [DataControlsAppInterface clearDataControlRules];
+}
+
 // Tests that selecting "Open Image" from the context menu properly opens the
 // image in the current tab.
 - (void)testOpenImageInCurrentTabFromContextMenu {
diff --git a/ios/chrome/browser/credential_exchange/DEPS b/ios/chrome/browser/credential_exchange/DEPS
new file mode 100644
index 0000000..93ba27d4
--- /dev/null
+++ b/ios/chrome/browser/credential_exchange/DEPS
@@ -0,0 +1,3 @@
+include_rules = [
+  "+ios/chrome/browser/data_import",
+]
diff --git a/ios/chrome/browser/credential_exchange/coordinator/BUILD.gn b/ios/chrome/browser/credential_exchange/coordinator/BUILD.gn
index 3f1140d6..ee8263c 100644
--- a/ios/chrome/browser/credential_exchange/coordinator/BUILD.gn
+++ b/ios/chrome/browser/credential_exchange/coordinator/BUILD.gn
@@ -10,7 +10,15 @@
     "credential_import_mediator.mm",
   ]
   public_deps = [ "//ios/chrome/browser/shared/coordinator/chrome_coordinator" ]
-  deps = [ "//ios/chrome/browser/credential_exchange/model" ]
+  deps = [
+    "//base",
+    "//components/signin/public/identity_manager",
+    "//ios/chrome/browser/credential_exchange/model",
+    "//ios/chrome/browser/credential_exchange/ui",
+    "//ios/chrome/browser/data_import/public",
+    "//ios/chrome/browser/data_import/ui",
+    "//ios/chrome/browser/signin/model",
+  ]
   frameworks = [ "Foundation.framework" ]
 }
 
diff --git a/ios/chrome/browser/credential_exchange/coordinator/credential_import_coordinator.mm b/ios/chrome/browser/credential_exchange/coordinator/credential_import_coordinator.mm
index ff4925c..aef7110 100644
--- a/ios/chrome/browser/credential_exchange/coordinator/credential_import_coordinator.mm
+++ b/ios/chrome/browser/credential_exchange/coordinator/credential_import_coordinator.mm
@@ -4,7 +4,14 @@
 
 #import "ios/chrome/browser/credential_exchange/coordinator/credential_import_coordinator.h"
 
+#import "components/signin/public/identity_manager/account_info.h"
+#import "components/signin/public/identity_manager/identity_manager.h"
 #import "ios/chrome/browser/credential_exchange/coordinator/credential_import_mediator.h"
+#import "ios/chrome/browser/credential_exchange/ui/credential_import_view_controller.h"
+#import "ios/chrome/browser/signin/model/identity_manager_factory.h"
+
+@interface CredentialImportCoordinator () <CredentialImportMediatorDelegate>
+@end
 
 @implementation CredentialImportCoordinator {
   // Handles interaction with the model.
@@ -12,6 +19,12 @@
 
   // Token received from the OS during app launch needed to receive credentials.
   NSUUID* _UUID;
+
+  // Presents the `_viewController` controlled by this coordinator.
+  UINavigationController* _navigationController;
+
+  // The view controller for the import flow.
+  CredentialImportViewController* _viewController;
 }
 
 - (instancetype)initWithBaseViewController:(UIViewController*)viewController
@@ -25,7 +38,25 @@
 }
 
 - (void)start {
-  _mediator = [[CredentialImportMediator alloc] initWithUUID:_UUID];
+  _viewController = [[CredentialImportViewController alloc] init];
+  std::string email = IdentityManagerFactory::GetForProfile(self.profile)
+                          ->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)
+                          .email;
+  _mediator = [[CredentialImportMediator alloc] initWithUUID:_UUID
+                                                    delegate:self
+                                                   userEmail:std::move(email)];
+  _mediator.consumer = _viewController;
+  _navigationController = [[UINavigationController alloc]
+      initWithRootViewController:_viewController];
+  _navigationController.navigationBarHidden = NO;
+}
+
+#pragma mark - CredentialImportMediatorDelegate
+
+- (void)showImportScreen {
+  [self.baseViewController presentViewController:_navigationController
+                                        animated:YES
+                                      completion:nil];
 }
 
 @end
diff --git a/ios/chrome/browser/credential_exchange/coordinator/credential_import_mediator.h b/ios/chrome/browser/credential_exchange/coordinator/credential_import_mediator.h
index a557f5a..60c8243d 100644
--- a/ios/chrome/browser/credential_exchange/coordinator/credential_import_mediator.h
+++ b/ios/chrome/browser/credential_exchange/coordinator/credential_import_mediator.h
@@ -7,14 +7,31 @@
 
 #import <Foundation/Foundation.h>
 
+#import <string>
+
+@protocol CredentialImportConsumer;
+
+// Delegate for CredentialImportMediator.
+@protocol CredentialImportMediatorDelegate <NSObject>
+
+// Notifies the delegate to display the import screen.
+- (void)showImportScreen;
+
+@end
+
 // Mediator for the credential exchange import flow.
 @interface CredentialImportMediator : NSObject
 
 // `UUID` is a token received from the OS during app launch, required to be
 // passed back to the OS to receive the credential data.
-- (instancetype)initWithUUID:(NSUUID*)UUID NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithUUID:(NSUUID*)UUID
+                    delegate:(id<CredentialImportMediatorDelegate>)delegate
+                   userEmail:(std::string)userEmail NS_DESIGNATED_INITIALIZER;
 - (instancetype)init NS_UNAVAILABLE;
 
+// Consumer of this mediator.
+@property(nonatomic, weak) id<CredentialImportConsumer> consumer;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_CREDENTIAL_EXCHANGE_COORDINATOR_CREDENTIAL_IMPORT_MEDIATOR_H_
diff --git a/ios/chrome/browser/credential_exchange/coordinator/credential_import_mediator.mm b/ios/chrome/browser/credential_exchange/coordinator/credential_import_mediator.mm
index 712c1fc..796bc84c 100644
--- a/ios/chrome/browser/credential_exchange/coordinator/credential_import_mediator.mm
+++ b/ios/chrome/browser/credential_exchange/coordinator/credential_import_mediator.mm
@@ -5,18 +5,62 @@
 #import "ios/chrome/browser/credential_exchange/coordinator/credential_import_mediator.h"
 
 #import "ios/chrome/browser/credential_exchange/model/credential_importer.h"
+#import "ios/chrome/browser/credential_exchange/ui/credential_import_consumer.h"
+#import "ios/chrome/browser/data_import/public/import_data_item.h"
+
+@interface CredentialImportMediator () <CredentialImporterDelegate>
+@end
 
 @implementation CredentialImportMediator {
+  // Responsible for interacting with the OS credential exchange libraries.
   CredentialImporter* _credentialImporter;
+
+  // Delegate for this mediator.
+  id<CredentialImportMediatorDelegate> _delegate;
+
+  // Email of the signed in user account.
+  std::string _userEmail;
 }
 
-- (instancetype)initWithUUID:(NSUUID*)UUID {
+- (instancetype)initWithUUID:(NSUUID*)UUID
+                    delegate:(id<CredentialImportMediatorDelegate>)delegate
+                   userEmail:(std::string)userEmail {
   self = [super init];
   if (self) {
-    _credentialImporter = [[CredentialImporter alloc] init];
+    _credentialImporter = [[CredentialImporter alloc] initWithDelegate:self];
     [_credentialImporter startImport:UUID];
+    _delegate = delegate;
+    _userEmail = std::move(userEmail);
   }
   return self;
 }
 
+- (void)setConsumer:(id<CredentialImportConsumer>)consumer {
+  if (_consumer == consumer) {
+    return;
+  }
+
+  _consumer = consumer;
+  [_consumer setUserEmail:_userEmail];
+}
+
+#pragma mark - CredentialImporterDelegate
+
+- (void)showImportScreenWithPasswordCount:(NSInteger)passwordCount
+                             passkeyCount:(NSInteger)passkeyCount {
+  [_consumer
+      setImportDataItem:[[ImportDataItem alloc]
+                            initWithType:ImportDataItemType::kPasswords
+                                  status:ImportDataItemImportStatus::kReady
+                                   count:passwordCount]];
+  [_consumer
+      setImportDataItem:[[ImportDataItem alloc]
+                            // TODO(crbug.com/450982128): Add passkey type.
+                            initWithType:ImportDataItemType::kBookmarks
+                                  status:ImportDataItemImportStatus::kReady
+                                   count:passkeyCount]];
+
+  [_delegate showImportScreen];
+}
+
 @end
diff --git a/ios/chrome/browser/credential_exchange/model/credential_importer.h b/ios/chrome/browser/credential_exchange/model/credential_importer.h
index 971c7052..7e719382 100644
--- a/ios/chrome/browser/credential_exchange/model/credential_importer.h
+++ b/ios/chrome/browser/credential_exchange/model/credential_importer.h
@@ -7,11 +7,22 @@
 
 #import <Foundation/Foundation.h>
 
+// Delegate for CredentialImporter.
+@protocol CredentialImporterDelegate <NSObject>
+
+// Displays the initial import screen with counts of received credentials.
+- (void)showImportScreenWithPasswordCount:(NSInteger)passwordCount
+                             passkeyCount:(NSInteger)passkeyCount;
+
+@end
+
 // Handles importing credentials using the Credential Exchange Format
 // (https://fidoalliance.org/specifications-credential-exchange-specifications).
 @interface CredentialImporter : NSObject
 
-- (instancetype)init NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithDelegate:(id<CredentialImporterDelegate>)delegate
+    NS_DESIGNATED_INITIALIZER;
+- (instancetype)init NS_UNAVAILABLE;
 
 // Called when the app is launched to perform credential import. `UUID` is a
 // token provided by the OS on app launch, required to receive the credential
diff --git a/ios/chrome/browser/credential_exchange/model/credential_importer.mm b/ios/chrome/browser/credential_exchange/model/credential_importer.mm
index d7a6c93..d064e01 100644
--- a/ios/chrome/browser/credential_exchange/model/credential_importer.mm
+++ b/ios/chrome/browser/credential_exchange/model/credential_importer.mm
@@ -14,13 +14,23 @@
 @implementation CredentialImporter {
   // Imports credentials through the OS ASCredentialImportManager API.
   CredentialImportManager* _credentialImportManager;
+
+  // Delegate for CredentialImporter.
+  id<CredentialImporterDelegate> _delegate;
+
+  // Passwords received from the exporting credential manager.
+  NSArray<CredentialExchangePassword*>* _passwords;
+
+  // Passkeys received from the exporting credential manager.
+  NSArray<CredentialExchangePasskey*>* _passkeys;
 }
 
-- (instancetype)init {
+- (instancetype)initWithDelegate:(id<CredentialImporterDelegate>)delegate {
   self = [super init];
   if (self) {
     _credentialImportManager = [[CredentialImportManager alloc] init];
     _credentialImportManager.delegate = self;
+    _delegate = delegate;
   }
   return self;
 }
@@ -37,7 +47,10 @@
             (NSArray<CredentialExchangePassword*>*)passwords
                                 passkeys:(NSArray<CredentialExchangePasskey*>*)
                                              passkeys {
-  // TODO(crbug.com/445889719): Handle imported data.
+  _passwords = passwords;
+  _passkeys = passkeys;
+  [_delegate showImportScreenWithPasswordCount:passwords.count
+                                  passkeyCount:passkeys.count];
 }
 
 @end
diff --git a/ios/chrome/browser/credential_exchange/ui/BUILD.gn b/ios/chrome/browser/credential_exchange/ui/BUILD.gn
index 91e18ea..6ba4711 100644
--- a/ios/chrome/browser/credential_exchange/ui/BUILD.gn
+++ b/ios/chrome/browser/credential_exchange/ui/BUILD.gn
@@ -8,13 +8,20 @@
     "credential_export_view_controller.h",
     "credential_export_view_controller.mm",
     "credential_export_view_controller_presentation_delegate.h",
+    "credential_import_consumer.h",
+    "credential_import_view_controller.h",
+    "credential_import_view_controller.mm",
   ]
   deps = [
     "//components/password_manager/core/browser/ui",
+    "//components/strings",
     "//ios/chrome/app/strings",
+    "//ios/chrome/browser/data_import/public",
+    "//ios/chrome/browser/data_import/ui",
     "//ios/chrome/browser/settings/ui_bundled/password:ui",
     "//ios/chrome/browser/shared/ui/table_view:utils",
     "//ios/chrome/browser/shared/ui/table_view/cells",
+    "//ios/chrome/common/ui/promo_style",
     "//ui/base",
   ]
   frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/credential_exchange/ui/credential_import_consumer.h b/ios/chrome/browser/credential_exchange/ui/credential_import_consumer.h
new file mode 100644
index 0000000..77b20b0
--- /dev/null
+++ b/ios/chrome/browser/credential_exchange/ui/credential_import_consumer.h
@@ -0,0 +1,25 @@
+// 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_CREDENTIAL_EXCHANGE_UI_CREDENTIAL_IMPORT_CONSUMER_H_
+#define IOS_CHROME_BROWSER_CREDENTIAL_EXCHANGE_UI_CREDENTIAL_IMPORT_CONSUMER_H_
+
+#import <Foundation/Foundation.h>
+
+#import <string>
+
+@class ImportDataItem;
+@class ImportDataItemTableView;
+
+@protocol CredentialImportConsumer <NSObject>
+
+// Sets import data item to be displayed in the table view.
+- (void)setImportDataItem:(ImportDataItem*)importDataItem;
+
+// Sets the email of the signed-in user's account.
+- (void)setUserEmail:(const std::string&)userEmail;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_CREDENTIAL_EXCHANGE_UI_CREDENTIAL_IMPORT_CONSUMER_H_
diff --git a/ios/chrome/browser/credential_exchange/ui/credential_import_view_controller.h b/ios/chrome/browser/credential_exchange/ui/credential_import_view_controller.h
new file mode 100644
index 0000000..3405270
--- /dev/null
+++ b/ios/chrome/browser/credential_exchange/ui/credential_import_view_controller.h
@@ -0,0 +1,17 @@
+// 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_CREDENTIAL_EXCHANGE_UI_CREDENTIAL_IMPORT_VIEW_CONTROLLER_H_
+#define IOS_CHROME_BROWSER_CREDENTIAL_EXCHANGE_UI_CREDENTIAL_IMPORT_VIEW_CONTROLLER_H_
+
+#import "ios/chrome/browser/credential_exchange/ui/credential_import_consumer.h"
+#import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h"
+
+// Main screen for credential import, displaying different stages of import.
+@interface CredentialImportViewController
+    : PromoStyleViewController <CredentialImportConsumer>
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_CREDENTIAL_EXCHANGE_UI_CREDENTIAL_IMPORT_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/credential_exchange/ui/credential_import_view_controller.mm b/ios/chrome/browser/credential_exchange/ui/credential_import_view_controller.mm
new file mode 100644
index 0000000..dfaaffa
--- /dev/null
+++ b/ios/chrome/browser/credential_exchange/ui/credential_import_view_controller.mm
@@ -0,0 +1,84 @@
+// 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/credential_exchange/ui/credential_import_view_controller.h"
+
+#import "base/strings/utf_string_conversions.h"
+#import "components/strings/grit/components_strings.h"
+#import "ios/chrome/browser/data_import/public/import_data_item.h"
+#import "ios/chrome/browser/data_import/public/import_data_item_consumer.h"
+#import "ios/chrome/browser/data_import/ui/import_data_item_table_view.h"
+#import "ios/chrome/grit/ios_branded_strings.h"
+#import "ios/chrome/grit/ios_strings.h"
+#import "ui/base/l10n/l10n_util.h"
+
+namespace {
+
+// Number of expected items in the table.
+constexpr int kExpectedItemCount = 2;
+
+}  // namespace
+
+@implementation CredentialImportViewController {
+  // Displays the status of importing specific credential types.
+  ImportDataItemTableView* _tableView;
+}
+
+- (void)viewDidLoad {
+  // TODO(crbug.com/450982128): Use correct banner.
+  self.bannerName = @"safari_data_import";
+  self.titleText =
+      l10n_util::GetNSString(IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_TITLE);
+  self.primaryActionString = l10n_util::GetNSString(IDS_CONTINUE);
+  self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]
+      initWithBarButtonSystemItem:UIBarButtonSystemItemCancel
+                           target:self
+                           action:@selector(cancelButtonTapped)];
+  [super viewDidLoad];
+}
+
+#pragma mark - CredentialImportConsumer
+
+- (void)setImportDataItem:(ImportDataItem*)importDataItem {
+  if (!_tableView) {
+    [self createTableView];
+  }
+
+  [_tableView populateItem:importDataItem];
+}
+
+- (void)setUserEmail:(const std::string&)userEmail {
+  self.disclaimerText =
+      l10n_util::GetNSStringF(IDS_IOS_CREDENTIAL_EXCHANGE_IMPORT_DISCLAIMER,
+                              base::UTF8ToUTF16(userEmail));
+}
+
+#pragma mark - Actions
+
+// Invoked when the user taps the "Cancel" button.
+- (void)cancelButtonTapped {
+  // TODO(crbug.com/450982128): Handle button taps.
+}
+
+#pragma mark - Private
+
+// Creates the table view for this view controller.
+- (void)createTableView {
+  _tableView =
+      [[ImportDataItemTableView alloc] initWithItemCount:kExpectedItemCount];
+  UIView* specificContentView = self.specificContentView;
+  [specificContentView addSubview:_tableView];
+  [NSLayoutConstraint activateConstraints:@[
+    [_tableView.topAnchor
+        constraintEqualToAnchor:specificContentView.topAnchor],
+    [_tableView.bottomAnchor
+        constraintLessThanOrEqualToAnchor:specificContentView.bottomAnchor],
+    [_tableView.leadingAnchor
+        constraintEqualToAnchor:specificContentView.leadingAnchor],
+    [_tableView.trailingAnchor
+        constraintEqualToAnchor:specificContentView.trailingAnchor],
+  ]];
+}
+
+@end
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index 949fd27..83a30999 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -2897,6 +2897,9 @@
      flag_descriptions::kWebPageReportedImagesSheetName,
      flag_descriptions::kWebPageReportedImagesSheetDescription,
      flags_ui::kOsIos, FEATURE_VALUE_TYPE(kWebPageReportedImagesSheet)},
+    {"ios-fusebox", flag_descriptions::kIOSFuseboxName,
+     flag_descriptions::kIOSFuseboxDescription, flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(kIOSFusebox)},
 });
 
 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 05483e2..642d70bde 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -737,6 +737,10 @@
     "When enabled, users will be able to attempt to log in using a recovery "
     "password if the main one didn't work.";
 
+const char kIOSFuseboxName[] = "IOSFusebox";
+const char kIOSFuseboxDescription[] =
+    "When enabled, shows the fusebox instead of the regular omnibox.";
+
 const char kIOSKeyboardAccessoryTwoBubbleName[] =
     "Enable the two-bubble design for the Keyboard Accessory view";
 const char kIOSKeyboardAccessoryTwoBubbleDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index 382226f..60bf953 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -437,6 +437,9 @@
 extern const char kIOSFillRecoveryPasswordName[];
 extern const char kIOSFillRecoveryPasswordDescription[];
 
+extern const char kIOSFuseboxName[];
+extern const char kIOSFuseboxDescription[];
+
 extern const char kIOSKeyboardAccessoryTwoBubbleName[];
 extern const char kIOSKeyboardAccessoryTwoBubbleDescription[];
 
diff --git a/ios/chrome/browser/intelligence/bwg/coordinator/bwg_mediator.mm b/ios/chrome/browser/intelligence/bwg/coordinator/bwg_mediator.mm
index 6c94130..4ae9a7c 100644
--- a/ios/chrome/browser/intelligence/bwg/coordinator/bwg_mediator.mm
+++ b/ios/chrome/browser/intelligence/bwg/coordinator/bwg_mediator.mm
@@ -145,18 +145,55 @@
 
   // Configure the callback to be executed once the page context is ready.
   __weak __typeof(self) weakSelf = self;
+  web::WebState* activeWebState = _webStateList->GetActiveWebState();
   base::OnceCallback<void(PageContextWrapperCallbackResponse)>
-      page_context_completion_callback =
-          base::BindOnce(^void(PageContextWrapperCallbackResponse response) {
-            [weakSelf openBWGOverlayForPage:std::move(response)];
-          });
+      page_context_completion_callback;
+  if (IsGeminiImmediateOverlayEnabled()) {
+    // Present the overlay immediately without page context.
+    [self openPendingBWGOverlay];
+
+    page_context_completion_callback =
+        base::BindOnce(^void(PageContextWrapperCallbackResponse response) {
+          [weakSelf updateBWGOverlayForWebState:activeWebState
+                     pageContextWrapperResponse:std::move(response)];
+        });
+  } else {
+    page_context_completion_callback =
+        base::BindOnce(^void(PageContextWrapperCallbackResponse response) {
+          [weakSelf openBWGOverlayForPage:std::move(response)];
+        });
+  }
 
   // Collect the PageContext and execute the callback once it's ready.
   _pageContextWrapper = [[PageContextWrapper alloc]
-        initWithWebState:_webStateList->GetActiveWebState()
+        initWithWebState:activeWebState
       completionCallback:std::move(page_context_completion_callback)];
   [_pageContextWrapper setShouldGetAnnotatedPageContent:YES];
   [_pageContextWrapper setShouldGetSnapshot:YES];
+  // Attempt to populate page context fields. If the page is still loading,
+  // processing will start once the page has loaded.
+  if (IsGeminiImmediateOverlayEnabled() && activeWebState &&
+      activeWebState->IsLoading()) {
+    BwgTabHelper* BWGTabHelper = [self activeWebStateBWGTabHelper];
+    base::OnceCallback<void()> pageContextPopulateCallback =
+        base::BindOnce(^void() {
+          [weakSelf populatePageContextFieldsAsync];
+        });
+    if (BWGTabHelper) {
+      BWGTabHelper->SetPageLoadedCallback(
+          std::move(pageContextPopulateCallback));
+    }
+  } else {
+    [_pageContextWrapper populatePageContextFieldsAsync];
+  }
+}
+
+// Begins asynchronous work to populate page context fields for the current
+// page.
+- (void)populatePageContextFieldsAsync {
+  if (!_pageContextWrapper) {
+    return;
+  }
   [_pageContextWrapper populatePageContextFieldsAsync];
 }
 
@@ -183,6 +220,45 @@
       base::TimeTicks::Now() - _BWGOverlayPreparationStartTime);
 }
 
+// Opens the BWG overlay in a pending state, since page context is not yet
+// ready.
+- (void)openPendingBWGOverlay {
+  _pageContextWrapper = nil;
+
+  web::WebState* activeWebState = _webStateList->GetActiveWebState();
+  CHECK(activeWebState);
+  CHECK(_BWGService->IsBwgAvailableForWebState(activeWebState));
+
+  _BWGBrowserAgent->PresentPendingBwgOverlay(self.baseViewController);
+
+  base::UmaHistogramLongTimes100(
+      _didPresentBWGFRE ? kStartupTimeWithFREHistogram
+                        : kStartupTimeNoFREHistogram,
+      base::TimeTicks::Now() - _BWGOverlayPreparationStartTime);
+}
+
+// Updates the BWG overlay with a given PageContextWrapperCallbackResponse.
+- (void)updateBWGOverlayForWebState:(web::WebState*)webState
+         pageContextWrapperResponse:
+             (PageContextWrapperCallbackResponse)response {
+  _pageContextWrapper = nil;
+
+  // The original web state may no longer be eligible for Gemini by the time
+  // this is called. If this is the case, the overlay should not update.
+  if (!webState || !_BWGService->IsBwgAvailableForWebState(webState)) {
+    return;
+  }
+
+  // The current web state may have changed. If so, do not update the overlay.
+  web::WebState* activeWebState = _webStateList->GetActiveWebState();
+  if (!activeWebState || activeWebState->GetUniqueIdentifier() !=
+                             webState->GetUniqueIdentifier()) {
+    return;
+  }
+
+  _BWGBrowserAgent->UpdateBwgOverlayPageContext(std::move(response));
+}
+
 // Notifies the currently active WebState's BWG tab helper that the FRE will be
 // backgrounded.
 - (void)FREWillBeBackgrounded {
diff --git a/ios/chrome/browser/intelligence/bwg/model/bwg_browser_agent.h b/ios/chrome/browser/intelligence/bwg/model/bwg_browser_agent.h
index f70a5e9..5f0b0175 100644
--- a/ios/chrome/browser/intelligence/bwg/model/bwg_browser_agent.h
+++ b/ios/chrome/browser/intelligence/bwg/model/bwg_browser_agent.h
@@ -15,6 +15,11 @@
 
 enum class PageContextWrapperError;
 
+namespace ios::provider {
+enum class BWGPageContextComputationState;
+enum class BWGPageContextAttachmentState;
+}  // namespace ios::provider
+
 namespace optimization_guide::proto {
 class PageContext;
 }  // namespace optimization_guide::proto
@@ -22,6 +27,7 @@
 @class BWGLinkOpeningHandler;
 @class BWGPageStateChangeHandler;
 @class BWGSessionHandler;
+@class GeminiPageContext;
 @class GeminiSuggestionHandler;
 
 @protocol BWGGatewayProtocol;
@@ -42,10 +48,32 @@
       base::expected<std::unique_ptr<optimization_guide::proto::PageContext>,
                      PageContextWrapperError> expected_page_context);
 
+  // Presents the BWG overlay on a given view controller in a pending state
+  // without a PageContext.
+  void PresentPendingBwgOverlay(UIViewController* base_view_controller);
+
+  // Updates the page context for the BWG overlay.
+  void UpdateBwgOverlayPageContext(
+      base::expected<std::unique_ptr<optimization_guide::proto::PageContext>,
+                     PageContextWrapperError> expected_page_context);
+
  private:
   explicit BwgBrowserAgent(Browser* browser);
   friend class BrowserUserData<BwgBrowserAgent>;
 
+  // Presents the BWG overlay on a given view controller with page context,
+  // given specific computation and attachment states.
+  void PresentBwgOverlayWithState(
+      UIViewController* base_view_controller,
+      std::unique_ptr<optimization_guide::proto::PageContext>
+          page_context_proto,
+      ios::provider::BWGPageContextComputationState computation_state,
+      ios::provider::BWGPageContextAttachmentState attachment_state);
+
+  // Adjusts the configuration around the Gemini page context based on user
+  // prefs.
+  void ApplyUserPrefsToPageContext(GeminiPageContext* gemini_page_context);
+
   // Sets the UI command handlers on the session handler. This cannot be called
   // in the constructor because some objects fail the protocol conformance test
   // at that time.
diff --git a/ios/chrome/browser/intelligence/bwg/model/bwg_browser_agent.mm b/ios/chrome/browser/intelligence/bwg/model/bwg_browser_agent.mm
index 9676940..c9707a3 100644
--- a/ios/chrome/browser/intelligence/bwg/model/bwg_browser_agent.mm
+++ b/ios/chrome/browser/intelligence/bwg/model/bwg_browser_agent.mm
@@ -78,13 +78,67 @@
     UIViewController* base_view_controller,
     base::expected<std::unique_ptr<optimization_guide::proto::PageContext>,
                    PageContextWrapperError> expected_page_context) {
+  if (expected_page_context.has_value()) {
+    PresentBwgOverlayWithState(
+        base_view_controller, std::move(expected_page_context.value()),
+        ios::provider::BWGPageContextComputationState::kSuccess,
+        ios::provider::BWGPageContextAttachmentState::kAttached);
+  } else {
+    PresentBwgOverlayWithState(
+        base_view_controller,
+        /*page_context_proto=*/nullptr,
+        BWGPageContextComputationStateFromPageContextWrapperError(
+            expected_page_context.error()),
+        ios::provider::BWGPageContextAttachmentState::kAttached);
+  }
+}
+
+void BwgBrowserAgent::PresentPendingBwgOverlay(
+    UIViewController* base_view_controller) {
+  PresentBwgOverlayWithState(
+      base_view_controller,
+      /*page_context_proto=*/nullptr,
+      ios::provider::BWGPageContextComputationState::kPending,
+      ios::provider::BWGPageContextAttachmentState::kDetached);
+}
+
+void BwgBrowserAgent::UpdateBwgOverlayPageContext(
+    base::expected<std::unique_ptr<optimization_guide::proto::PageContext>,
+                   PageContextWrapperError> expected_page_context) {
+  GeminiPageContext* gemini_page_context = [[GeminiPageContext alloc] init];
+  gemini_page_context.BWGPageContextComputationState =
+      ios::provider::BWGPageContextComputationState::kSuccess;
+  gemini_page_context.BWGPageContextAttachmentState =
+      ios::provider::BWGPageContextAttachmentState::kAttached;
+
+  std::unique_ptr<optimization_guide::proto::PageContext> page_context_proto =
+      nullptr;
+  if (expected_page_context.has_value()) {
+    page_context_proto = std::move(expected_page_context.value());
+  } else {
+    gemini_page_context.BWGPageContextComputationState =
+        BWGPageContextComputationStateFromPageContextWrapperError(
+            expected_page_context.error());
+  }
+  gemini_page_context.uniquePageContext = std::move(page_context_proto);
+
+  ApplyUserPrefsToPageContext(gemini_page_context);
+  ios::provider::UpdatePageContext(gemini_page_context);
+}
+
+#pragma mark - Private
+
+void BwgBrowserAgent::PresentBwgOverlayWithState(
+    UIViewController* base_view_controller,
+    std::unique_ptr<optimization_guide::proto::PageContext> page_context_proto,
+    ios::provider::BWGPageContextComputationState computation_state,
+    ios::provider::BWGPageContextAttachmentState attachment_state) {
   SetSessionCommandHandlers();
   [bwg_page_state_change_handler_ setBaseViewController:base_view_controller];
 
   web::WebState* web_state = browser_->GetWebStateList()->GetActiveWebState();
 
   BWGConfiguration* config = [[BWGConfiguration alloc] init];
-  config.pageContext = [[GeminiPageContext alloc] init];
   config.baseViewController = base_view_controller;
   config.authService =
       AuthenticationServiceFactory::GetForProfile(browser_->GetProfile());
@@ -111,29 +165,12 @@
   config.BWGLocationPermissionState =
       ios::provider::BWGLocationPermissionState::kUnknown;
 
-  // Set the page context itself and page context computation state for the
-  // current web state.
-  std::unique_ptr<optimization_guide::proto::PageContext> pageContext = nullptr;
-  if (expected_page_context.has_value()) {
-    pageContext = std::move(expected_page_context.value());
-    config.pageContext.BWGPageContextComputationState =
-        ios::provider::BWGPageContextComputationState::kSuccess;
-  } else {
-    config.pageContext.BWGPageContextComputationState =
-        BWGPageContextComputationStateFromPageContextWrapperError(
-            expected_page_context.error());
-  }
-  config.pageContext.uniquePageContext = std::move(pageContext);
-
-  // Set the page context attachment state.
-  PrefService* pref_service = browser_->GetProfile()->GetPrefs();
-  if (!pref_service->GetBoolean(prefs::kIOSBWGPageContentSetting)) {
-    config.pageContext.BWGPageContextAttachmentState =
-        ios::provider::BWGPageContextAttachmentState::kUserDisabled;
-  } else {
-    config.pageContext.BWGPageContextAttachmentState =
-        ios::provider::BWGPageContextAttachmentState::kAttached;
-  }
+  // Set the page context itself and page context computation/attachment state
+  // for the current web state.
+  config.pageContext = [[GeminiPageContext alloc] init];
+  config.pageContext.BWGPageContextComputationState = computation_state;
+  config.pageContext.BWGPageContextAttachmentState = attachment_state;
+  config.pageContext.uniquePageContext = std::move(page_context_proto);
 
   // Use the cached favicon of the web state. If it's not available, use a
   // default favicon instead.
@@ -151,13 +188,22 @@
         DefaultSymbolWithConfiguration(kGlobeAmericasSymbol, configuration);
   }
   config.pageContext.favicon = page_favicon;
+  ApplyUserPrefsToPageContext(config.pageContext);
 
   // Start the overlay and update the tab helper to reflect this.
   ios::provider::StartBwgOverlay(config);
   bwg_tab_helper->SetBwgUiShowing(true);
 }
 
-#pragma mark - Private
+void BwgBrowserAgent::ApplyUserPrefsToPageContext(
+    GeminiPageContext* gemini_page_context) {
+  // Disable the page context attachment state based on user prefs.
+  PrefService* pref_service = browser_->GetProfile()->GetPrefs();
+  if (!pref_service->GetBoolean(prefs::kIOSBWGPageContentSetting)) {
+    gemini_page_context.BWGPageContextAttachmentState =
+        ios::provider::BWGPageContextAttachmentState::kUserDisabled;
+  }
+}
 
 void BwgBrowserAgent::SetSessionCommandHandlers() {
   id<SettingsCommands> settings_handler =
diff --git a/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.h b/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.h
index 4397195..dbdb6d3 100644
--- a/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.h
+++ b/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.h
@@ -91,9 +91,14 @@
   // Setter for `prevent_contextual_panel_entry_point_`.
   void SetPreventContextualPanelEntryPoint(bool should_prevent);
 
+  // Sets a callback to be run when the page has finished loading.
+  void SetPageLoadedCallback(base::OnceClosure callback);
+
   // WebStateObserver:
   void WasShown(web::WebState* web_state) override;
   void WasHidden(web::WebState* web_state) override;
+  void DidStartNavigation(web::WebState* web_state,
+                          web::NavigationContext* navigation_context) override;
   void DidFinishNavigation(web::WebState* web_state,
                            web::NavigationContext* navigation_context) override;
   void DidStartLoading(web::WebState* web_state) override;
@@ -194,6 +199,9 @@
   // The zero-state suggestions for the current page.
   std::optional<std::vector<std::string>> zero_state_suggestions_;
 
+  // Callback to be run when the page has finished loading.
+  base::OnceClosure page_loaded_callback_;
+
   base::WeakPtrFactory<BwgTabHelper> weak_ptr_factory_{this};
 };
 
diff --git a/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.mm b/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.mm
index 9b58eaaa..924fe7d 100644
--- a/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.mm
+++ b/ios/chrome/browser/intelligence/bwg/model/bwg_tab_helper.mm
@@ -180,6 +180,10 @@
   prevent_contextual_panel_entry_point_ = shouldPrevent;
 }
 
+void BwgTabHelper::SetPageLoadedCallback(base::OnceClosure callback) {
+  page_loaded_callback_ = std::move(callback);
+}
+
 bool BwgTabHelper::GetIsBwgSessionActiveInBackground() {
   return is_bwg_session_active_in_background_;
 }
@@ -299,6 +303,14 @@
   UpdateWebStateSnapshotInStorage();
 }
 
+void BwgTabHelper::DidStartNavigation(
+    web::WebState* web_state,
+    web::NavigationContext* navigation_context) {
+  // Cancel the callback that runs on page load, since we're now going to a new
+  // page.
+  page_loaded_callback_.Reset();
+}
+
 void BwgTabHelper::DidFinishNavigation(
     web::WebState* web_state,
     web::NavigationContext* navigation_context) {
@@ -332,6 +344,10 @@
 void BwgTabHelper::PageLoaded(
     web::WebState* web_state,
     web::PageLoadCompletionStatus load_completion_status) {
+  if (page_loaded_callback_) {
+    std::move(page_loaded_callback_).Run();
+  }
+
   ProfileIOS* profile =
       ProfileIOS::FromBrowserState(web_state->GetBrowserState());
   bool floaty_shown = profile->GetPrefs()->GetBoolean(prefs::kIOSBwgConsent);
diff --git a/ios/chrome/browser/intelligence/features/features.h b/ios/chrome/browser/intelligence/features/features.h
index ca96682..9830ad0 100644
--- a/ios/chrome/browser/intelligence/features/features.h
+++ b/ios/chrome/browser/intelligence/features/features.h
@@ -185,6 +185,13 @@
 BASE_DECLARE_FEATURE(kGeminiLatencyImprovement);
 bool IsGeminiLatencyImprovementEnabled();
 
+// Feature flag for showing the Gemini floaty immediately.
+//
+// This feature exists so the overlay can open without having to wait for the
+// page to finish loading.
+BASE_DECLARE_FEATURE(kGeminiImmediateOverlay);
+bool IsGeminiImmediateOverlayEnabled();
+
 // Feature flag for the discovery onboarding cards.
 BASE_DECLARE_FEATURE(kGeminiOnboardingCards);
 bool IsGeminiOnboardingCardsEnabled();
diff --git a/ios/chrome/browser/intelligence/features/features.mm b/ios/chrome/browser/intelligence/features/features.mm
index b22100b..81ba07f4 100644
--- a/ios/chrome/browser/intelligence/features/features.mm
+++ b/ios/chrome/browser/intelligence/features/features.mm
@@ -236,6 +236,12 @@
   return base::FeatureList::IsEnabled(kGeminiLatencyImprovement);
 }
 
+BASE_FEATURE(kGeminiImmediateOverlay, base::FEATURE_DISABLED_BY_DEFAULT);
+
+bool IsGeminiImmediateOverlayEnabled() {
+  return base::FeatureList::IsEnabled(kGeminiImmediateOverlay);
+}
+
 BASE_FEATURE(kGeminiOnboardingCards, base::FEATURE_DISABLED_BY_DEFAULT);
 
 bool IsGeminiOnboardingCardsEnabled() {
diff --git a/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.mm b/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.mm
index f752d3b..9b9e6b9 100644
--- a/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.mm
+++ b/ios/chrome/browser/intelligence/page_action_menu/coordinator/page_action_menu_mediator.mm
@@ -124,8 +124,12 @@
 }
 
 - (BOOL)isGeminiAvailable {
-  return !_webState->IsLoading() &&
-         _BWGService->IsBwgAvailableForWebState(_webState);
+  if (IsGeminiImmediateOverlayEnabled()) {
+    return _BWGService->IsBwgAvailableForWebState(_webState);
+  } else {
+    return !_webState->IsLoading() &&
+           _BWGService->IsBwgAvailableForWebState(_webState);
+  }
 }
 
 - (BOOL)isReaderModeAvailable {
diff --git a/ios/chrome/browser/location_bar/ui_bundled/location_bar_coordinator.mm b/ios/chrome/browser/location_bar/ui_bundled/location_bar_coordinator.mm
index 7d55617..01648c1 100644
--- a/ios/chrome/browser/location_bar/ui_bundled/location_bar_coordinator.mm
+++ b/ios/chrome/browser/location_bar/ui_bundled/location_bar_coordinator.mm
@@ -428,6 +428,12 @@
   [_sharingCoordinator stop];
   _sharingCoordinator = nil;
 
+  if (IsAskGeminiChipEnabled() || IsProactiveSuggestionsFrameworkEnabled() ||
+      IsLocationBarBadgeMigrationEnabled()) {
+    [self.locationBarBadgeCoordinator stop];
+    self.locationBarBadgeCoordinator = nil;
+  }
+
   [self.contextualPanelEntrypointCoordinator stop];
   self.contextualPanelEntrypointCoordinator.delegate = nil;
   self.contextualPanelEntrypointCoordinator = nil;
diff --git a/ios/chrome/browser/omnibox/coordinator/omnibox_coordinator.mm b/ios/chrome/browser/omnibox/coordinator/omnibox_coordinator.mm
index b9dc36f..9fa3070 100644
--- a/ios/chrome/browser/omnibox/coordinator/omnibox_coordinator.mm
+++ b/ios/chrome/browser/omnibox/coordinator/omnibox_coordinator.mm
@@ -189,6 +189,7 @@
   _omniboxMetricsRecorder =
       [[OmniboxMetricsRecorder alloc] initWithClient:_client.get()
                                            textModel:_omniboxTextModel.get()];
+  viewController.metricsRecorder = _omniboxMetricsRecorder;
   [_omniboxMetricsRecorder
       setAutocompleteController:[_omniboxAutocompleteController
                                     autocompleteController]];
diff --git a/ios/chrome/browser/omnibox/model/BUILD.gn b/ios/chrome/browser/omnibox/model/BUILD.gn
index 6a7dc6a7..c6f509c 100644
--- a/ios/chrome/browser/omnibox/model/BUILD.gn
+++ b/ios/chrome/browser/omnibox/model/BUILD.gn
@@ -65,6 +65,7 @@
     "//ios/chrome/browser/shared/model/prefs:pref_names",
     "//ios/chrome/browser/shared/model/profile",
     "//ios/chrome/browser/shared/model/url:constants",
+    "//ios/chrome/browser/shared/public/features",
     "//ios/chrome/browser/shared/ui/util",
     "//ios/chrome/common:string_conversions",
     "//ios/chrome/common/ui/favicon",
diff --git a/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.h b/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.h
index 46ce9b08..a354d12 100644
--- a/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.h
+++ b/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.h
@@ -47,6 +47,9 @@
                  isAction:(BOOL)isAction
              isPastedText:(BOOL)isPastedText;
 
+// Records the number of lines in the omnibox text view.
+- (void)setNumberOfLines:(NSInteger)numberOfLines;
+
 @end
 
 #endif  // IOS_CHROME_BROWSER_OMNIBOX_MODEL_OMNIBOX_METRICS_RECORDER_H_
diff --git a/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm b/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm
index 2e16096b8..6a00aba 100644
--- a/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm
+++ b/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm
@@ -27,6 +27,7 @@
 #import "components/search_engines/template_url_service.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_autocomplete_controller.h"
 #import "ios/chrome/browser/omnibox/model/omnibox_text_model.h"
+#import "ios/chrome/browser/shared/public/features/features.h"
 #import "net/cookies/cookie_util.h"
 #import "third_party/metrics_proto/omnibox_event.pb.h"
 #import "third_party/metrics_proto/omnibox_focus_type.pb.h"
@@ -50,6 +51,8 @@
   /// The autocomplete controller.
   raw_ptr<const AutocompleteController, DanglingUntriaged>
       _autocompleteController;
+  /// The number of lines in the omnibox text view.
+  NSInteger _numberOfLines;
 }
 
 - (instancetype)initWithClient:(OmniboxClient*)omniboxClient
@@ -74,6 +77,10 @@
   _autocompleteController = autocompleteController;
 }
 
+- (void)setNumberOfLines:(NSInteger)numberOfLines {
+  _numberOfLines = numberOfLines;
+}
+
 - (void)recordOpenMatch:(AutocompleteMatch)match
            destinationURL:(GURL)destinationURL
                 inputText:(const std::u16string&)inputText
@@ -81,6 +88,10 @@
     windowOpenDisposition:(WindowOpenDisposition)disposition
                  isAction:(BOOL)isAction
              isPastedText:(BOOL)isPastedText {
+  if (_numberOfLines) {
+    base::UmaHistogramExactLinear("IOS.Omnibox.NumberOfLines", _numberOfLines,
+                                  20);
+  }
   const base::TimeTicks& now(base::TimeTicks::Now());
   base::TimeDelta elapsedTimeSinceUserFirstModifiedOmnibox(
       now - _omniboxTextModel->time_user_first_modified_omnibox);
diff --git a/ios/chrome/browser/omnibox/ui/omnibox_container_view.h b/ios/chrome/browser/omnibox/ui/omnibox_container_view.h
index e8c14cf..2d6ad52 100644
--- a/ios/chrome/browser/omnibox/ui/omnibox_container_view.h
+++ b/ios/chrome/browser/omnibox/ui/omnibox_container_view.h
@@ -12,6 +12,7 @@
 
 @class LayoutGuideCenter;
 @protocol OmniboxTextInput;
+@class OmniboxMetricsRecorder;
 
 /// The omnibox container view is the view that is shown in the location bar's
 /// edit state. It contains the omnibox textfield and the buttons on the left
@@ -21,6 +22,9 @@
 /// The contained omnibox textfield.
 @property(nonatomic, strong, readonly) id<OmniboxTextInput> textInput;
 
+/// The metrics recorder.
+@property(nonatomic, weak) OmniboxMetricsRecorder* metricsRecorder;
+
 /// The contained clear button. Hide with `setClearButtonHidden`.
 @property(nonatomic, strong, readonly) UIButton* clearButton;
 
diff --git a/ios/chrome/browser/omnibox/ui/omnibox_container_view.mm b/ios/chrome/browser/omnibox/ui/omnibox_container_view.mm
index 506b399..b6b6c7bc 100644
--- a/ios/chrome/browser/omnibox/ui/omnibox_container_view.mm
+++ b/ios/chrome/browser/omnibox/ui/omnibox_container_view.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/omnibox/ui/omnibox_container_view.h"
 
 #import "components/strings/grit/components_strings.h"
+#import "ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.h"
 #import "ios/chrome/browser/omnibox/public/omnibox_constants.h"
 #import "ios/chrome/browser/omnibox/public/omnibox_ui_features.h"
 #import "ios/chrome/browser/omnibox/ui/omnibox_text_field_ios.h"
@@ -357,6 +358,9 @@
   }
   CGFloat newHeight = userTextHeight + verticalPadding;
 
+  NSInteger numberOfLines = round(userTextHeight / singleLineHeight);
+  [self.metricsRecorder setNumberOfLines:numberOfLines];
+
   newHeight = MIN(newHeight, maxHeight);
   if (!_textInputHeightConstraint) {
     _textInputHeightConstraint =
diff --git a/ios/chrome/browser/omnibox/ui/omnibox_text_view_ios.mm b/ios/chrome/browser/omnibox/ui/omnibox_text_view_ios.mm
index 07d2465d..e3f5cbf 100644
--- a/ios/chrome/browser/omnibox/ui/omnibox_text_view_ios.mm
+++ b/ios/chrome/browser/omnibox/ui/omnibox_text_view_ios.mm
@@ -98,7 +98,7 @@
     self.textAlignment = NSTextAlignmentNatural;
     self.keyboardType = UIKeyboardTypeWebSearch;
     self.smartQuotesType = UITextSmartQuotesTypeNo;
-    self.textContainer.lineFragmentPadding = 0;
+    self.textContainer.lineFragmentPadding = 3;
     self.dataDetectorTypes = UIDataDetectorTypeNone;
     self.allowsEditingTextAttributes = NO;
     if (@available(iOS 18, *)) {
diff --git a/ios/chrome/browser/omnibox/ui/omnibox_view_controller.h b/ios/chrome/browser/omnibox/ui/omnibox_view_controller.h
index 5cf4f53..ae1a7365 100644
--- a/ios/chrome/browser/omnibox/ui/omnibox_view_controller.h
+++ b/ios/chrome/browser/omnibox/ui/omnibox_view_controller.h
@@ -18,6 +18,7 @@
 @protocol OmniboxKeyboardDelegate;
 @protocol OmniboxTextInput;
 @protocol TextFieldViewContaining;
+@class OmniboxMetricsRecorder;
 
 @interface OmniboxViewController : UIViewController <EditViewAnimatee,
                                                      LocationBarOffsetProvider,
@@ -26,6 +27,9 @@
 /// Mutator of the omnibox.
 @property(nonatomic, weak) id<OmniboxMutator> mutator;
 
+/// The metrics recorder.
+@property(nonatomic, weak) OmniboxMetricsRecorder* metricsRecorder;
+
 /// Whether the UI is configured for search-only mode.
 @property(nonatomic, assign) BOOL searchOnlyUI;
 
diff --git a/ios/chrome/browser/omnibox/ui/omnibox_view_controller.mm b/ios/chrome/browser/omnibox/ui/omnibox_view_controller.mm
index a0e9bbe..1fe1d58c 100644
--- a/ios/chrome/browser/omnibox/ui/omnibox_view_controller.mm
+++ b/ios/chrome/browser/omnibox/ui/omnibox_view_controller.mm
@@ -113,6 +113,7 @@
                                                  iconTint:iconTintColor
                                       presentationContext:_presentationContext];
   self.view.layoutGuideCenter = self.layoutGuideCenter;
+  self.view.metricsRecorder = self.metricsRecorder;
   _clearButton = self.view.clearButton;
 
   self.view.shouldGroupAccessibilityChildren = YES;
@@ -218,6 +219,11 @@
   return self.view;
 }
 
+- (void)setMetricsRecorder:(OmniboxMetricsRecorder*)metricsRecorder {
+  _metricsRecorder = metricsRecorder;
+  self.view.metricsRecorder = metricsRecorder;
+}
+
 #pragma mark - public methods
 
 - (id<OmniboxTextInput>)textInput {
diff --git a/ios/chrome/browser/policy/model/policy_egtest.mm b/ios/chrome/browser/policy/model/policy_egtest.mm
index ca2170bc..f0f92976 100644
--- a/ios/chrome/browser/policy/model/policy_egtest.mm
+++ b/ios/chrome/browser/policy/model/policy_egtest.mm
@@ -810,9 +810,9 @@
 }
 
 // Tests enterprise mode in the Privacy Safe Browsing settings as if the
-// enterprise selected Enhanced Protection as the choice of protection.
-- (void)testEnhancedSafeBrowsing {
-  SetPolicy(2, policy::key::kSafeBrowsingProtectionLevel);
+// enterprise selected No Protection as the choice of protection.
+- (void)testEnterpriseBubbleInEnhancedSafeBrowsingPage {
+  SetPolicy(0, policy::key::kSafeBrowsingProtectionLevel);
   [ChromeEarlGreyUI openSettingsMenu];
   [ChromeEarlGreyUI
       tapSettingsMenuButton:chrome_test_util::SettingsMenuPrivacyButton()];
@@ -822,12 +822,12 @@
 
   // Tap the info button on row. Accessibility point has been changed in this
   // TableViewInfoButtonItem to be on the center of the row instead of on the
-  // "i" button. To tap the "i" button, we select the info button as the matcher
-  // instead of the row.
+  // "i" button. To tap the "i" button, we select the info button as the
+  // matcher instead of the row.
   [[EarlGrey
       selectElementWithMatcher:
           grey_allOf(grey_ancestor(grey_accessibilityID(
-                         kSettingsSafeBrowsingStandardProtectionCellId)),
+                         kSettingsSafeBrowsingEnhancedProtectionCellId)),
                      grey_accessibilityID(kTableViewCellInfoButtonViewId),
                      grey_sufficientlyVisible(), nil)]
       performAction:grey_tap()];
@@ -840,7 +840,7 @@
   // Tap outside of the bubble.
   [[EarlGrey
       selectElementWithMatcher:
-          grey_accessibilityID(kSettingsSafeBrowsingStandardProtectionCellId)]
+          grey_accessibilityID(kSettingsSafeBrowsingEnhancedProtectionCellId)]
       performAction:grey_tap()];
 
   // Check if the contextual bubble is hidden.
diff --git a/ios/chrome/browser/popup_menu/ui_bundled/overflow_menu/overflow_menu_mediator.mm b/ios/chrome/browser/popup_menu/ui_bundled/overflow_menu/overflow_menu_mediator.mm
index b2cd5ec..bc15eb1 100644
--- a/ios/chrome/browser/popup_menu/ui_bundled/overflow_menu/overflow_menu_mediator.mm
+++ b/ios/chrome/browser/popup_menu/ui_bundled/overflow_menu/overflow_menu_mediator.mm
@@ -1570,7 +1570,8 @@
   }
 
   if ([self isGeminiAvailable]) {
-    self.askBWGAction.enabled = !_webState->IsLoading();
+    self.askBWGAction.enabled =
+        IsGeminiImmediateOverlayEnabled() || !_webState->IsLoading();
   }
 
   if (base::FeatureList::IsEnabled(kHideToolbarsInOverflowMenu)) {
diff --git a/ios/chrome/browser/safe_mode/ui_bundled/safe_mode_egtest.mm b/ios/chrome/browser/safe_mode/ui_bundled/safe_mode_egtest.mm
index 8548a1b..a20dd1c2 100644
--- a/ios/chrome/browser/safe_mode/ui_bundled/safe_mode_egtest.mm
+++ b/ios/chrome/browser/safe_mode/ui_bundled/safe_mode_egtest.mm
@@ -152,6 +152,13 @@
 
 // Tests that an NTP is shown after 2 crashes.
 - (void)testPostCrashNTP {
+  // TODO(crbug.com/456803766): Test is flaky on iOS 18 iPad devices.
+#if !TARGET_OS_SIMULATOR
+  if ([ChromeEarlGrey isIPadIdiom] && !base::ios::IsRunningOnIOS26OrLater()) {
+    EARL_GREY_TEST_DISABLED(@"Test disabled on pre iOS 26 iPad devices.");
+  }
+#endif
+
   [SafeModeAppInterface setFailedStartupAttemptCount:0];
   [ChromeEarlGrey closeAllTabsInCurrentMode];
   [ChromeEarlGrey openNewTab];
diff --git a/ios/chrome/browser/settings/ui_bundled/privacy/privacy_safe_browsing_egtest.mm b/ios/chrome/browser/settings/ui_bundled/privacy/privacy_safe_browsing_egtest.mm
index 96f895b..4d5c605 100644
--- a/ios/chrome/browser/settings/ui_bundled/privacy/privacy_safe_browsing_egtest.mm
+++ b/ios/chrome/browser/settings/ui_bundled/privacy/privacy_safe_browsing_egtest.mm
@@ -103,8 +103,11 @@
 - (AppLaunchConfiguration)appConfigurationForTestCase {
   AppLaunchConfiguration config;
   // TODO: crbug.com/336547987 - Remove when this is fully deployed.
-  config.features_disabled.push_back(
+  config.features_enabled.push_back(
       safe_browsing::kExtendedReportingRemovePrefDependencyIos);
+  // TODO: crbug.com/444244681 - Remove this and tests when fully deployed.
+  config.features_enabled.push_back(
+      safe_browsing::kMovePasswordLeakDetectionToggleIos);
   return config;
 }
 
@@ -290,160 +293,6 @@
       assertWithMatcher:grey_notNil()];
 }
 
-// Tests that Standard Protection page can be navigated to and populated
-// correctly.
-- (void)testStandardProtectionSettingsPage {
-  OpenPrivacySafeBrowsingSettings();
-  PressInfoButtonForCell(kSettingsSafeBrowsingStandardProtectionCellId);
-  [ElementInteractionWithGreyMatcher(
-      grey_accessibilityID(kSafeBrowsingStandardProtectionPasswordLeakCellId),
-      grey_accessibilityID(kSafeBrowsingStandardProtectionTableViewId))
-      assertWithMatcher:grey_notNil()];
-  [ElementInteractionWithGreyMatcher(
-      grey_accessibilityID(kSafeBrowsingExtendedReportingCellId),
-      grey_accessibilityID(kSafeBrowsingStandardProtectionTableViewId))
-      assertWithMatcher:grey_notNil()];
-}
-
-// Tests that password leak detection can only be toggled if Safe Browsing is
-// enabled for signed in user.
-- (void)testTogglePasswordLeakCheckForSignedInUser {
-  // Ensure that Safe Browsing and password leak detection opt-outs start in
-  // their default (opted-in) state.
-  [ChromeEarlGrey setBoolValue:YES forUserPref:prefs::kSafeBrowsingEnabled];
-  [ChromeEarlGrey
-      setBoolValue:YES
-       forUserPref:password_manager::prefs::kPasswordLeakDetectionEnabled];
-
-  // Sign in.
-  FakeSystemIdentity* fakeIdentity = [FakeSystemIdentity fakeIdentity1];
-  [SigninEarlGrey signinWithFakeIdentity:fakeIdentity];
-  // Open Privacy Safe Browsing settings.
-  OpenPrivacySafeBrowsingSettings();
-
-  // Check that Safe Browsing is enabled, and toggle it off.
-  GREYAssertFalse([ChromeEarlGrey userBooleanPref:prefs::kSafeBrowsingEnhanced],
-                  @"Failed to keep Enhanced Safe Browsing off");
-  GREYAssertTrue([ChromeEarlGrey userBooleanPref:prefs::kSafeBrowsingEnabled],
-                 @"Failed to keep Standard Safe Browsing on");
-  [self turnOffSafeBrowsing];
-
-  // Open Standard Protection menu.
-  PressInfoButtonForCell(kSettingsSafeBrowsingStandardProtectionCellId);
-  [[EarlGrey
-      selectElementWithMatcher:grey_accessibilityID(
-                                   kSafeBrowsingStandardProtectionTableViewId)]
-      assertWithMatcher:grey_notNil()];
-
-  // Check that the password leak check toggle is both toggled off and disabled.
-  [ElementInteractionWithGreyMatcher(
-      chrome_test_util::TableViewSwitchCell(
-          kSafeBrowsingStandardProtectionPasswordLeakCellId,
-          /*is_toggled_on=*/NO,
-          /*enabled=*/NO),
-      grey_accessibilityID(kSafeBrowsingStandardProtectionTableViewId))
-      assertWithMatcher:grey_notNil()];
-
-  // Toggle Safe Browsing on.
-  [ChromeEarlGrey setBoolValue:YES forUserPref:prefs::kSafeBrowsingEnabled];
-
-  // Check that the password leak check toggle is enabled, and toggle it off.
-  [ElementInteractionWithGreyMatcher(
-      chrome_test_util::TableViewSwitchCell(
-          kSafeBrowsingStandardProtectionPasswordLeakCellId,
-          /*is_toggled_on=*/YES,
-          /*enabled=*/YES),
-      grey_accessibilityID(kSafeBrowsingStandardProtectionTableViewId))
-      performAction:chrome_test_util::TurnTableViewSwitchOn(NO)];
-
-  // Check the underlying pref value.
-  GREYAssertFalse(
-      [ChromeEarlGrey userBooleanPref:password_manager::prefs::
-                                          kPasswordLeakDetectionEnabled],
-      @"Failed to toggle-off password leak checks");
-
-  // Toggle password leak check detection back on.
-  [ElementInteractionWithGreyMatcher(
-      chrome_test_util::TableViewSwitchCell(
-          kSafeBrowsingStandardProtectionPasswordLeakCellId,
-          /*is_toggled_on=*/NO,
-          /*enabled=*/YES),
-      grey_accessibilityID(kSafeBrowsingStandardProtectionTableViewId))
-      performAction:chrome_test_util::TurnTableViewSwitchOn(YES)];
-
-  // Check the underlying pref value.
-  GREYAssertTrue(
-      [ChromeEarlGrey userBooleanPref:password_manager::prefs::
-                                          kPasswordLeakDetectionEnabled],
-      @"Failed to toggle-on password leak checks");
-}
-
-// Tests that password leak detection can only be toggled if Safe Browsing is
-// enabled for signed out user.
-- (void)testTogglePasswordLeakCheckForSignedOutUser {
-  // Ensure that Safe Browsing and password leak detection opt-outs start in
-  // their default (opted-in) state.
-  [ChromeEarlGrey setBoolValue:YES forUserPref:prefs::kSafeBrowsingEnabled];
-  [ChromeEarlGrey
-      setBoolValue:YES
-       forUserPref:password_manager::prefs::kPasswordLeakDetectionEnabled];
-
-  // Open Privacy Safe Browsing settings.
-  OpenPrivacySafeBrowsingSettings();
-
-  // Check that Safe Browsing is enabled, and toggle it off.
-  GREYAssertFalse([ChromeEarlGrey userBooleanPref:prefs::kSafeBrowsingEnhanced],
-                  @"Failed to keep Enhanced Safe Browsing off");
-  GREYAssertTrue([ChromeEarlGrey userBooleanPref:prefs::kSafeBrowsingEnabled],
-                 @"Failed to keep Standard Safe Browsing on");
-  [self turnOffSafeBrowsing];
-
-  // Enter Standard Protection settings page.
-  PressInfoButtonForCell(kSettingsSafeBrowsingStandardProtectionCellId);
-
-  // Check that the password leak check toggle is both toggled off and disabled.
-  [ElementInteractionWithGreyMatcher(
-      chrome_test_util::TableViewSwitchCell(
-          kSafeBrowsingStandardProtectionPasswordLeakCellId,
-          /*is_toggled_on=*/NO,
-          /*enabled=*/NO),
-      grey_accessibilityID(kSafeBrowsingStandardProtectionTableViewId))
-      assertWithMatcher:grey_notNil()];
-
-  // Toggle Safe Browsing on.
-  [ChromeEarlGrey setBoolValue:YES forUserPref:prefs::kSafeBrowsingEnabled];
-
-  // Check that the password leak check toggle is enabled, and toggle it off.
-  [ElementInteractionWithGreyMatcher(
-      chrome_test_util::TableViewSwitchCell(
-          kSafeBrowsingStandardProtectionPasswordLeakCellId,
-          /*is_toggled_on=*/YES,
-          /*enabled=*/YES),
-      grey_accessibilityID(kSafeBrowsingStandardProtectionTableViewId))
-      performAction:chrome_test_util::TurnTableViewSwitchOn(NO)];
-
-  // Check the underlying pref value.
-  GREYAssertFalse(
-      [ChromeEarlGrey userBooleanPref:password_manager::prefs::
-                                          kPasswordLeakDetectionEnabled],
-      @"Failed to toggle-off password leak checks");
-
-  // Toggle password leak check detection back on.
-  [ElementInteractionWithGreyMatcher(
-      chrome_test_util::TableViewSwitchCell(
-          kSafeBrowsingStandardProtectionPasswordLeakCellId,
-          /*is_toggled_on=*/NO,
-          /*enabled=*/YES),
-      grey_accessibilityID(kSafeBrowsingStandardProtectionTableViewId))
-      performAction:chrome_test_util::TurnTableViewSwitchOn(YES)];
-
-  // Check the underlying pref value.
-  GREYAssertTrue(
-      [ChromeEarlGrey userBooleanPref:password_manager::prefs::
-                                          kPasswordLeakDetectionEnabled],
-      @"Failed to toggle-on password leak checks");
-}
-
 #pragma mark - Helpers
 
 // Taps "No Protection" and then the "Turn Off" Button on pop-up.
@@ -494,8 +343,12 @@
 @implementation SafeBrowsingExtendedReportingDeprecationEnabled
 - (AppLaunchConfiguration)appConfigurationForTestCase {
   AppLaunchConfiguration config;
+  // TODO: crbug.com/444243524 - Remove when this is fully deployed.
   config.features_enabled.push_back(
       safe_browsing::kExtendedReportingRemovePrefDependencyIos);
+  // TODO: crbug.com/444244681 - Remove when this is fully deployed.
+  config.features_enabled.push_back(
+      safe_browsing::kMovePasswordLeakDetectionToggleIos);
   // TODO (crbug.com/1285974) Remove when bug is resolved.
   config.features_disabled.push_back(kNewOverflowMenu);
   return config;
@@ -503,11 +356,12 @@
 
 - (void)testSBERCellIsRemoved {
   OpenPrivacySafeBrowsingSettings();
-  PressInfoButtonForCell(kSettingsSafeBrowsingStandardProtectionCellId);
-  [ElementInteractionWithGreyMatcher(
-      grey_accessibilityID(kSafeBrowsingExtendedReportingCellId),
-      grey_accessibilityID(kSafeBrowsingStandardProtectionTableViewId))
-      assertWithMatcher:grey_nil()];
+  [[EarlGrey
+      selectElementWithMatcher:
+          grey_allOf(grey_ancestor(grey_accessibilityID(
+                         kSettingsSafeBrowsingStandardProtectionCellId)),
+                     grey_accessibilityID(kTableViewCellInfoButtonViewId), nil)]
+      assertWithMatcher:grey_notVisible()];
 }
 @end
 
@@ -516,6 +370,10 @@
 @implementation SafeBrowsingPasswordLeakCheckToggleMoveDisabled
 - (AppLaunchConfiguration)appConfigurationForTestCase {
   AppLaunchConfiguration config;
+  // TODO: crbug.com/444243524 - Remove after the SBER deprecation rolls out.
+  config.features_enabled.push_back(
+      safe_browsing::kExtendedReportingRemovePrefDependencyIos);
+  // TODO: crbug.com/444244681 - Remove when this is fully deployed.
   config.features_disabled.push_back(
       safe_browsing::kMovePasswordLeakDetectionToggleIos);
   return config;
@@ -561,13 +419,16 @@
 @implementation SafeBrowsingPasswordLeakCheckToggleMoveEnabled
 - (AppLaunchConfiguration)appConfigurationForTestCase {
   AppLaunchConfiguration config;
+  // TODO: crbug.com/444243524 - Remove when this is fully deployed.
+  config.features_enabled.push_back(
+      safe_browsing::kExtendedReportingRemovePrefDependencyIos);
+  // TODO: crbug.com/444244681 - Remove when this is fully deployed.
   config.features_enabled.push_back(
       safe_browsing::kMovePasswordLeakDetectionToggleIos);
   return config;
 }
 
-// TODO(crbug.com/456158030): Fails on ios-fieldtrial-rel bot.
-- (void)DISABLED_testPasswordLeakCheckToggle_MissingWhenFeatureFlagEnabled {
+- (void)testPasswordLeakCheckToggle_MissingWhenFeatureFlagEnabled {
   // Ensure that Safe Browsing and password leak detection opt-outs start in
   // their default (opted-in) state.
   [ChromeEarlGrey setBoolValue:YES forUserPref:prefs::kSafeBrowsingEnabled];
@@ -582,7 +443,6 @@
   // Open Privacy Safe Browsing settings.
   OpenPrivacySafeBrowsingSettings();
 
-  // Check that there is no info button for the Standard Protection cell.
   [[EarlGrey
       selectElementWithMatcher:
           grey_allOf(grey_ancestor(grey_accessibilityID(
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h
index 4affdcd0..44c4be86 100644
--- a/ios/chrome/browser/shared/public/features/features.h
+++ b/ios/chrome/browser/shared/public/features/features.h
@@ -1167,4 +1167,10 @@
 // Returns true if the LocationBarBadgeMigration feature is enabled.
 bool IsLocationBarBadgeMigrationEnabled();
 
+// Enables the IOSFusebox feature.
+BASE_DECLARE_FEATURE(kIOSFusebox);
+
+// Returns true if the IOSFusebox feature is enabled.
+bool IsIOSFuseboxEnabled();
+
 #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 7deebffa..f7e76b2 100644
--- a/ios/chrome/browser/shared/public/features/features.mm
+++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -1264,3 +1264,9 @@
 bool IsLocationBarBadgeMigrationEnabled() {
   return base::FeatureList::IsEnabled(kLocationBarBadgeMigration);
 }
+
+BASE_FEATURE(kIOSFusebox, base::FEATURE_DISABLED_BY_DEFAULT);
+
+bool IsIOSFuseboxEnabled() {
+  return base::FeatureList::IsEnabled(kIOSFusebox);
+}
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
index 6dbfb179..1a285d4 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-944b3fad931a3f26652a3eb80fd2b87ebcf97cc0
\ No newline at end of file
+122bda87810c0337dd42879fedff887591f9b16a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
index 8f9ab4c..92b4235a 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-a6e9faf4858a8c063cf10cd7ea05397476462928
\ No newline at end of file
+2816fb020bc4cac17cf7ae160dcfb0ef61b31918
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index 67b0c7c5..37335f15 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-c23df5d9df516ebd87be1d9fc0efbe2cac882b12
\ No newline at end of file
+89af5c2a2a92e157dc69bd566537ec1f192f685e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
index e744857..33e23ca 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-2f6f1a83807926aaeb744385c3fb4d06abd87271
\ No newline at end of file
+27b80ad0005ca42414ca1393a21401043d51156d
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index e8446df..856da708e 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-690d45b3525266673d5ae92f1fea516605acb691
\ No newline at end of file
+02fcdfd4347352af51974beb7adee707275a947f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
index f15dc32..635da75 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-b5c7016252c7e6a44e547c74c51a1503c685e68b
\ No newline at end of file
+e73965ef9a37b0044882f3dddb5eceb09db60f34
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
index 2946605..9134573 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-8a58fc4de6197f8116babaddaa713eff6f12fb35
\ No newline at end of file
+1d275f4117516be66e4b695d2bc3406ebf6104f2
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
index 487013cc..b627597 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-5630673d64a7e82e58687c0744ec623a82665604
\ No newline at end of file
+d711c9f9188709d43caec62387418461cfcbdb95
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
index 15f595e5..67380276 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-d99baaf6da1d38c6a498c9d358b6d7a052e74b9c
\ No newline at end of file
+a49a957ac59fc8265f0b4a0033a9438414f588e2
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
index b8bbde8..53a98d86 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-5c1db53a3381289d7327d0105d2ec35d56d63330
\ No newline at end of file
+c6ba5b70a958e5ca1cc319cc2f9aa2225dfa1ad2
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 83ec621..6ea3454c 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-11eb343c410bec433dcbe70e8b95f8735c50844d
\ No newline at end of file
+78c98bec5b98595f48b4e27f1585c4a2ed926625
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
index b6a3ae5..5d930a2 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-1f84296d1a68aef3dcaa9b807f616c85ca7c32f0
\ No newline at end of file
+54b31cbf2ab6a7a66f06768e14bec36fddb5a075
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index 0c213af..80762a6 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-d51805a34fceea2e7c0e0778866c2b29ab2fed5f
\ No newline at end of file
+b77e540f2b9cb48112880dcca780c3a02e16688b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 75de34fc..96c9040 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-38741b2fa6678d117a27e518e633e961b45ca68c
\ No newline at end of file
+ea24611d5d442cd785c79aac3dd72ec913a34f20
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index d7131eed..39395950 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-13aa978f81e257cc07748aeb8c52b6f70f846217
\ No newline at end of file
+db5f0b3ec0bd7e5157ca31f910a2d3e35bb58e26
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
index dd4bbf9..c065950 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-b4603a0531f7812cbf429e3aef140d62bb41ba62
\ No newline at end of file
+bd31ee793aa51c2057f1c5e06ca4d816d05882c9
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 8284e1ba..650ef1dc4 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-424e0e9603f6dae0f7fc254d12e92c4bd5ca7510
\ No newline at end of file
+64cbda6ad58761f3ed2d79fab50b2e3510bd60fc
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
index d2821140..3accf05 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-73a6403709d4c7646094ee38f9da8b5704b381af
\ No newline at end of file
+8de71e1b17e2c7c10eb43eb2b0202a4f6159f670
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index 967ecf49..d462b27 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-bce696becc93bf6cfeb9d997b52f9d35bfe67b03
\ No newline at end of file
+4b8c1efe670ecc67783b538e2ffd821e93b8c0d9
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index 91bfa69..5117a10a 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-fb6449968f9edede12601b37c8a38d89c0a3d0f3
\ No newline at end of file
+330d9cc8ac67d6b04dec31f2d867a129cecdae1a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index 3b51be03..9b0c00a 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-56560b15c8c235a6d60d46030ccc11a9c0ca769c
\ No newline at end of file
+dd501e9c7bc9f52c817e5bf6471e7412ffff5de5
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
index 1698a60..34aa70d 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-6a1dd7b32662b1cab79e5112a19fead6d2e6dbdf
\ No newline at end of file
+e9e09abf6bd885599e2f31f8091e8751f1dafe2b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 72a35fcb..1bd4dc7 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-f6041763a23db7db4b065cee7a97ce2e9a267436
\ No newline at end of file
+b3520676d913a10a9584c23ab344a6770972df9f
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 4b94b2d..d5811795 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-8b692639bf7940bd5b2270a1396b03f682fee80f
\ No newline at end of file
+2903eb720ab1cda61d43f9c60f7548e57b6045b6
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index 5ed7d53..dfa3c32 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-8d46f27b37ad9e9d42b071720c3ea1e69fd07512
\ No newline at end of file
+0c71ad32636a7cc1c924a4998d5c6e2c812e8571
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
index 20d9b1b..9955f79 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-c4f635b615d5a92dc8937fe53d80585e399beb0e
\ No newline at end of file
+d94d2991d64caab772b6d14d3271ad46db48ada4
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index 8ff2b65f1..0a9d98ed 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-0933402a1f1d9236e26407da03ef27c1497869dd
\ No newline at end of file
+bb091231417d8ff0ed057848294125b5ce78dc5b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
index dde981e..1a9a93b 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-bb027bee63955e9bfa12376a79b162e74e138862
\ No newline at end of file
+e723f17b7582943186e927de0c28cd8e0ffcf36d
\ No newline at end of file
diff --git a/ios_internal b/ios_internal
index 4102194..4c70012 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit 4102194b650c41229ac604fd91c57bad852df153
+Subproject commit 4c70012304bc82fac60d30099af72c309722ca86
diff --git a/media/base/ipc/media_param_traits_macros.h b/media/base/ipc/media_param_traits_macros.h
index d75a070..0a4e78d 100644
--- a/media/base/ipc/media_param_traits_macros.h
+++ b/media/base/ipc/media_param_traits_macros.h
@@ -112,7 +112,7 @@
 IPC_ENUM_TRAITS_MAX_VALUE(media::PipelineStatusCodes,
                           media::PipelineStatusCodes::PIPELINE_STATUS_MAX)
 
-IPC_ENUM_TRAITS_MAX_VALUE(media::SampleFormat, media::kSampleFormatMax)
+IPC_ENUM_TRAITS_MAX_VALUE(media::SampleFormat, media::SampleFormat::kMaxValue)
 
 IPC_ENUM_TRAITS_MAX_VALUE(media::VideoCodec, media::VideoCodec::kMaxValue)
 
diff --git a/media/base/pipeline_status.h b/media/base/pipeline_status.h
index d70d978..279f2c9 100644
--- a/media/base/pipeline_status.h
+++ b/media/base/pipeline_status.h
@@ -73,8 +73,12 @@
   // Issued when a component in the pipeline runs out of memory.
   PIPELINE_ERROR_OUT_OF_MEMORY = 26,
 
+  // Used when a Progressive Demuxer cannot be created because it is disabled,
+  // rather than it being unsupported.
+  DEMUXER_ERROR_PROGRESSIVE_DISABLED = 27,
+
   // Must be equal to the largest value ever logged.
-  PIPELINE_STATUS_MAX = PIPELINE_ERROR_OUT_OF_MEMORY,
+  PIPELINE_STATUS_MAX = DEMUXER_ERROR_PROGRESSIVE_DISABLED,
 };
 
 MEDIA_EXPORT std::string_view PipelineStatusCodeToString(
@@ -108,6 +112,7 @@
       STRINGIFY_STATUS_CASE(DEMUXER_ERROR_COULD_NOT_PARSE);
       STRINGIFY_STATUS_CASE(DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
       STRINGIFY_STATUS_CASE(DEMUXER_ERROR_DETECTED_HLS);
+      STRINGIFY_STATUS_CASE(DEMUXER_ERROR_PROGRESSIVE_DISABLED);
       STRINGIFY_STATUS_CASE(DECODER_ERROR_NOT_SUPPORTED);
       STRINGIFY_STATUS_CASE(DEMUXER_ERROR_BITSTREAM_CONVERSION_FAILED);
       STRINGIFY_STATUS_CASE(CHUNK_DEMUXER_ERROR_APPEND_FAILED);
diff --git a/media/base/sample_format.h b/media/base/sample_format.h
index faa5125..76a2184 100644
--- a/media/base/sample_format.h
+++ b/media/base/sample_format.h
@@ -33,7 +33,7 @@
   kSampleFormatDtse,        // Compressed DTS Express audio bitstream.
 
   // Must always be equal to largest value ever logged.
-  kSampleFormatMax = kSampleFormatDtse,
+  kMaxValue = kSampleFormatDtse,
 };
 
 // Returns the number of bytes used per channel for the specified
diff --git a/media/base/watch_time_keys.cc b/media/base/watch_time_keys.cc
index bb19f8b7..ae34f4e8 100644
--- a/media/base/watch_time_keys.cc
+++ b/media/base/watch_time_keys.cc
@@ -228,6 +228,10 @@
       return kWatchTimeAudioVideoMutedAuxiliaryVisibleContent;
     case WatchTimeKey::kAudioVideoMediaFoundationAll:
       return kWatchTimeAudioVideoMediaFoundationAll;
+    case WatchTimeKey::kAudioVideoMediaFoundationHdrAll:
+      return kWatchTimeAudioVideoMediaFoundationHdrAll;
+    case WatchTimeKey::kAudioVideoMediaFoundationHdrEme:
+      return kWatchTimeAudioVideoMediaFoundationHdrEme;
     case WatchTimeKey::kAudioVideoMediaFoundationEme:
       return kWatchTimeAudioVideoMediaFoundationEme;
     // WARNING: Returning a non-empty value will log the key to UMA.
@@ -240,6 +244,8 @@
     case WatchTimeKey::kAudioDisplayPictureInPicture:
     case WatchTimeKey::kAudioVideoSdrAll:
     case WatchTimeKey::kAudioVideoSdrEme:
+    case WatchTimeKey::kAudioVideoMediaFoundationSdrAll:
+    case WatchTimeKey::kAudioVideoMediaFoundationSdrEme:
     case WatchTimeKey::kAudioVideoMutedBattery:
     case WatchTimeKey::kAudioVideoMutedAc:
     case WatchTimeKey::kAudioVideoMutedEmbeddedExperience:
diff --git a/media/base/watch_time_keys.h b/media/base/watch_time_keys.h
index ac17008a..0b8286d 100644
--- a/media/base/watch_time_keys.h
+++ b/media/base/watch_time_keys.h
@@ -77,6 +77,10 @@
   kAudioVideoMutedNativeControlsOff,
   kAudioVideoMediaFoundationAll,
   kAudioVideoMediaFoundationEme,
+  kAudioVideoMediaFoundationHdrAll,
+  kAudioVideoMediaFoundationHdrEme,
+  kAudioVideoMediaFoundationSdrAll,
+  kAudioVideoMediaFoundationSdrEme,
   kAudioVideoSdrAll,
   kAudioVideoSdrEme,
   kVideoAll,
@@ -169,6 +173,10 @@
     "Media.WatchTime.AudioVideo.HDR.All";
 inline constexpr std::string_view kWatchTimeAudioVideoHdrEme =
     "Media.WatchTime.AudioVideo.HDR.EME";
+inline constexpr std::string_view kWatchTimeAudioVideoMediaFoundationHdrAll =
+    "Media.WatchTime.AudioVideo.MediaFoundation.HDR.All";
+inline constexpr std::string_view kWatchTimeAudioVideoMediaFoundationHdrEme =
+    "Media.WatchTime.AudioVideo.MediaFoundation.HDR.EME";
 
 // Returns the UMA key name associated with a given WatchTimeKey or an empty
 // string if they key should not be logged to UMA.
diff --git a/media/filters/demuxer_manager.cc b/media/filters/demuxer_manager.cc
index fb89e86..4c42e2fc 100644
--- a/media/filters/demuxer_manager.cc
+++ b/media/filters/demuxer_manager.cc
@@ -316,7 +316,7 @@
 #if BUILDFLAG(ENABLE_FFMPEG)
     SetDemuxer(CreateFFmpegDemuxer());
 #else
-    return DEMUXER_ERROR_COULD_NOT_OPEN;
+    return DEMUXER_ERROR_PROGRESSIVE_DISABLED;
 #endif
   } else {
     DCHECK(!HasDataSource());
diff --git a/media/mojo/common/media_type_converters.cc b/media/mojo/common/media_type_converters.cc
index d2a48e4..a8e71410e 100644
--- a/media/mojo/common/media_type_converters.cc
+++ b/media/mojo/common/media_type_converters.cc
@@ -220,7 +220,8 @@
     return media::AudioBuffer::CreateEOSBuffer();
 
   if (input->frame_count <= 0 ||
-      static_cast<size_t>(input->sample_format) > media::kSampleFormatMax ||
+      static_cast<size_t>(input->sample_format) >
+          media::SampleFormat::kMaxValue ||
       static_cast<size_t>(input->channel_layout) > media::CHANNEL_LAYOUT_MAX ||
       ChannelLayoutToChannelCount(input->channel_layout) !=
           input->channel_count) {
diff --git a/media/mojo/services/watch_time_recorder_unittest.cc b/media/mojo/services/watch_time_recorder_unittest.cc
index 595e158..7697d22f 100644
--- a/media/mojo/services/watch_time_recorder_unittest.cc
+++ b/media/mojo/services/watch_time_recorder_unittest.cc
@@ -312,6 +312,10 @@
       case WatchTimeKey::kAudioVideoHdrEme:
       case WatchTimeKey::kAudioVideoSdrAll:
       case WatchTimeKey::kAudioVideoSdrEme:
+      case WatchTimeKey::kAudioVideoMediaFoundationHdrAll:
+      case WatchTimeKey::kAudioVideoMediaFoundationHdrEme:
+      case WatchTimeKey::kAudioVideoMediaFoundationSdrAll:
+      case WatchTimeKey::kAudioVideoMediaFoundationSdrEme:
       case WatchTimeKey::kAudioVideoDominantVisibleContent:
       case WatchTimeKey::kAudioVideoAuxiliaryVisibleContent:
       case WatchTimeKey::kAudioVideoMutedDominantVisibleContent:
@@ -490,6 +494,10 @@
       case WatchTimeKey::kAudioVideoHdrEme:
       case WatchTimeKey::kAudioVideoSdrAll:
       case WatchTimeKey::kAudioVideoSdrEme:
+      case WatchTimeKey::kAudioVideoMediaFoundationHdrAll:
+      case WatchTimeKey::kAudioVideoMediaFoundationHdrEme:
+      case WatchTimeKey::kAudioVideoMediaFoundationSdrAll:
+      case WatchTimeKey::kAudioVideoMediaFoundationSdrEme:
       case WatchTimeKey::kAudioVideoDominantVisibleContent:
       case WatchTimeKey::kAudioVideoAuxiliaryVisibleContent:
       case WatchTimeKey::kAudioVideoMutedDominantVisibleContent:
@@ -2352,6 +2360,95 @@
   histogram_tester_->ExpectTotalCount(kWatchTimeAudioVideoHdrEme, 0);
 }
 
+TEST_F(WatchTimeRecorderTest, HdrWatchTime_MediaFoundationAllOnlyRecorded) {
+  mojom::PlaybackPropertiesPtr properties = mojom::PlaybackProperties::New(
+      true, true, false, false, /*is_eme=*/false, false,
+      mojom::MediaStreamType::kNone, RendererType::kMediaFoundation,
+      DemuxerType::kChunkDemuxer);
+  Initialize(properties.Clone());
+
+  constexpr base::TimeDelta kWatchTime = base::Seconds(25);
+  wtr_->RecordWatchTime(WatchTimeKey::kAudioVideoMediaFoundationHdrAll,
+                        kWatchTime);
+  wtr_->FinalizeWatchTime({});
+
+  wtr_.reset();
+  base::RunLoop().RunUntilIdle();
+
+  // We don't record UKMs for HDR watch times.
+  const auto& entries = test_recorder_->GetEntriesByName(UkmEntry::kEntryName);
+  EXPECT_EQ(0u, entries.size());
+
+  // Only MediaFoundation HDR all watch time UMA is expected.
+  ExpectWatchTime({kWatchTimeAudioVideoMediaFoundationHdrAll}, kWatchTime);
+  histogram_tester_->ExpectTotalCount(kWatchTimeAudioVideoMediaFoundationHdrEme,
+                                      0);
+}
+
+TEST_F(WatchTimeRecorderTest, HdrWatchTime_MediaFoundationAllAndEmeRecorded) {
+  mojom::PlaybackPropertiesPtr properties = mojom::PlaybackProperties::New(
+      true, true, false, false, /*is_eme=*/true, false,
+      mojom::MediaStreamType::kNone, RendererType::kMediaFoundation,
+      DemuxerType::kChunkDemuxer);
+  Initialize(properties.Clone());
+
+  constexpr base::TimeDelta kWatchTime = base::Seconds(25);
+  wtr_->RecordWatchTime(WatchTimeKey::kAudioVideoMediaFoundationHdrAll,
+                        kWatchTime);
+  wtr_->RecordWatchTime(WatchTimeKey::kAudioVideoMediaFoundationHdrEme,
+                        kWatchTime);
+  wtr_->FinalizeWatchTime({});
+
+  wtr_.reset();
+  base::RunLoop().RunUntilIdle();
+
+  // We don't record UKMs for HDR watch times.
+  const auto& entries = test_recorder_->GetEntriesByName(UkmEntry::kEntryName);
+  EXPECT_EQ(0u, entries.size());
+
+  // Both MediaFoundation HDR all & eme watch time UMAs are expected.
+  ExpectWatchTime({kWatchTimeAudioVideoMediaFoundationHdrAll,
+                   kWatchTimeAudioVideoMediaFoundationHdrEme},
+                  kWatchTime);
+}
+
+TEST_F(WatchTimeRecorderTest, HdrWatchTime_MediaFoundationSdrNeverRecorded) {
+  mojom::PlaybackPropertiesPtr properties = mojom::PlaybackProperties::New(
+      true, true, false, false, /*is_eme=*/true, false,
+      mojom::MediaStreamType::kNone, RendererType::kMediaFoundation,
+      DemuxerType::kChunkDemuxer);
+  Initialize(properties.Clone());
+
+  constexpr base::TimeDelta kWatchTime = base::Seconds(25);
+  wtr_->RecordWatchTime(WatchTimeKey::kAudioVideoMediaFoundationSdrAll,
+                        kWatchTime);
+  wtr_->RecordWatchTime(WatchTimeKey::kAudioVideoMediaFoundationSdrEme,
+                        kWatchTime);
+  wtr_->FinalizeWatchTime({});
+
+  wtr_.reset();
+  base::RunLoop().RunUntilIdle();
+
+  // We don't record UKMs for MediaFoundation SDR/HDR watch times.
+  const auto& entries = test_recorder_->GetEntriesByName(UkmEntry::kEntryName);
+  EXPECT_EQ(0u, entries.size());
+
+  // We are not interested in MediaFoundationSDR watch times thus no UMA key for
+  // SDR exists.
+  auto sdr_all_key_str = ConvertWatchTimeKeyToStringForUma(
+      WatchTimeKey::kAudioVideoMediaFoundationSdrAll);
+  auto sdr_eme_key_str = ConvertWatchTimeKeyToStringForUma(
+      WatchTimeKey::kAudioVideoMediaFoundationSdrEme);
+  ASSERT_TRUE(sdr_all_key_str.empty());
+  ASSERT_TRUE(sdr_eme_key_str.empty());
+
+  // No MediaFoundation HDR watch time UMAs are expected.
+  histogram_tester_->ExpectTotalCount(kWatchTimeAudioVideoMediaFoundationHdrAll,
+                                      0);
+  histogram_tester_->ExpectTotalCount(kWatchTimeAudioVideoMediaFoundationHdrEme,
+                                      0);
+}
+
 #undef EXPECT_UKM
 #undef EXPECT_NO_UKM
 #undef EXPECT_HAS_UKM
diff --git a/pdf/pdf_ink_module.cc b/pdf/pdf_ink_module.cc
index a805be0..ac2bc8f 100644
--- a/pdf/pdf_ink_module.cc
+++ b/pdf/pdf_ink_module.cc
@@ -369,19 +369,26 @@
   }
 
   gfx::PointF position = normalized_event.PositionInWidget();
-  if (is_drawing_stroke()) {
-    MaybeFinishStrokeForMissingMouseUpEvent();
-
-    if (IsHighlightingTextAtPosition(position)) {
-      return StartTextHighlight(position, event.ClickCount(),
-                                ink::StrokeInput::ToolType::kMouse);
-    }
-
-    return StartStroke(position, event.TimeStamp(),
-                       ink::StrokeInput::ToolType::kMouse);
+  if (is_erasing_stroke()) {
+    return StartEraseStroke(position, ink::StrokeInput::ToolType::kMouse);
   }
 
-  return StartEraseStroke(position, ink::StrokeInput::ToolType::kMouse);
+  if (is_drawing_stroke()) {
+    MaybeFinishStrokeForMissingMouseUpEvent();
+  } else if (features::kPdfInk2TextHighlighting.Get() &&
+             is_text_highlighting()) {
+    const EventDetails& event_details = text_highlight_state().input_last_event;
+    FinishTextHighlight(event_details.position,
+                        /*is_multi_click=*/false, event_details.tool_type);
+  }
+
+  if (IsHighlightingTextAtPosition(position)) {
+    return StartTextHighlight(position, event.ClickCount(),
+                              ink::StrokeInput::ToolType::kMouse);
+  }
+
+  return StartStroke(position, event.TimeStamp(),
+                     ink::StrokeInput::ToolType::kMouse);
 }
 
 bool PdfInkModule::OnMouseUp(const blink::WebMouseEvent& event) {
@@ -482,17 +489,25 @@
   }
 
   gfx::PointF position = event.touches[0].PositionInWidget();
-  if (is_drawing_stroke()) {
-    MaybeFinishStrokeForMissingMouseUpEvent();
-
-    if (IsHighlightingTextAtPosition(position)) {
-      // Multi-click text selection for touch is not supported.
-      return StartTextHighlight(position, /*click_count=*/1, tool_type);
-    }
-    return StartStroke(position, event.TimeStamp(), tool_type);
+  if (is_erasing_stroke()) {
+    return StartEraseStroke(position, tool_type);
   }
 
-  return StartEraseStroke(position, tool_type);
+  if (is_drawing_stroke()) {
+    MaybeFinishStrokeForMissingMouseUpEvent();
+  } else if (features::kPdfInk2TextHighlighting.Get() &&
+             is_text_highlighting()) {
+    const EventDetails& event_details = text_highlight_state().input_last_event;
+    FinishTextHighlight(event_details.position,
+                        /*is_multi_click=*/false, event_details.tool_type);
+  }
+
+  if (IsHighlightingTextAtPosition(position)) {
+    // Multi-click text selection for touch is not supported.
+    return StartTextHighlight(position, /*click_count=*/1, tool_type);
+  }
+
+  return StartStroke(position, event.TimeStamp(), tool_type);
 }
 
 bool PdfInkModule::OnTouchEnd(const blink::WebTouchEvent& event) {
@@ -1029,11 +1044,15 @@
     return true;
   }
 
-  // Reset state back to a drawing highlighter brush.
+  // Reset state back to a drawing highlighter brush. `position` may reference a
+  // field in `TextHighlightState`, which would be destroyed after resetting, so
+  // check for selectable text or link area first.
+  const bool is_text_or_link_area =
+      client_->IsSelectableTextOrLinkArea(position);
   current_tool_state_.emplace<DrawingStrokeState>();
   drawing_stroke_state().brush_type = PdfInkBrush::Type::kHighlighter;
 
-  if (!client_->IsSelectableTextOrLinkArea(position)) {
+  if (!is_text_or_link_area) {
     MaybeSetCursor();
   }
   return true;
diff --git a/pdf/pdf_ink_module_unittest.cc b/pdf/pdf_ink_module_unittest.cc
index be954ee..49f3b3c 100644
--- a/pdf/pdf_ink_module_unittest.cc
+++ b/pdf/pdf_ink_module_unittest.cc
@@ -4303,6 +4303,76 @@
   EXPECT_TRUE(CollectVisibleStrokes().empty());
 }
 
+TEST_P(PdfInkModuleTextHighlightTest,
+       TextHighlightMissedEndEventThenMouseDown) {
+  EnableDrawAnnotationMode();
+  InitializeSimpleSinglePageBasicLayout();
+
+  SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams);
+
+  SetSelectionRectsOnFirstPage(base::span_from_ref(kHorizontalSelection));
+  SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0));
+
+  EXPECT_CALL(client(), OnTextOrLinkAreaClick(kStartPointInsidePage0,
+                                              /*click_count=*/1))
+      .Times(2);
+  EXPECT_CALL(client(), ExtendSelectionByPoint(kEndPointInsidePage0));
+
+  blink::WebMouseEvent mouse_down_event =
+      MouseEventBuilder()
+          .CreateLeftClickAtPosition(kStartPointInsidePage0)
+          .Build();
+  EXPECT_TRUE(ink_module().HandleInputEvent(mouse_down_event));
+
+  blink::WebMouseEvent mouse_move_event =
+      CreateMouseMoveWithLeftButtonEventAtPoint(kEndPointInsidePage0);
+  EXPECT_TRUE(ink_module().HandleInputEvent(mouse_move_event));
+
+  // If the mouse up event went missing during stroking, the next mouse down
+  // event should not cause a crash.
+  EXPECT_TRUE(ink_module().HandleInputEvent(mouse_down_event));
+
+  EXPECT_EQ(2, client().stroke_started_count());
+  EXPECT_EQ(1, client().modified_stroke_finished_count());
+  EXPECT_EQ(0, client().unmodified_stroke_finished_count());
+}
+
+TEST_P(PdfInkModuleTextHighlightTest,
+       TextHighlightWithNoEndEventThenTouchStart) {
+  EnableDrawAnnotationMode();
+  InitializeSimpleSinglePageBasicLayout();
+
+  SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams);
+
+  SetSelectionRectsOnFirstPage(base::span_from_ref(kHorizontalSelection));
+  SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0));
+
+  EXPECT_CALL(client(), OnTextOrLinkAreaClick(kStartPointInsidePage0,
+                                              /*click_count=*/1))
+      .Times(2);
+  EXPECT_CALL(client(), ExtendSelectionByPoint(kEndPointInsidePage0));
+
+  blink::WebMouseEvent mouse_down_event =
+      MouseEventBuilder()
+          .CreateLeftClickAtPosition(kStartPointInsidePage0)
+          .Build();
+  EXPECT_TRUE(ink_module().HandleInputEvent(mouse_down_event));
+
+  blink::WebMouseEvent mouse_move_event =
+      CreateMouseMoveWithLeftButtonEventAtPoint(kEndPointInsidePage0);
+  EXPECT_TRUE(ink_module().HandleInputEvent(mouse_move_event));
+
+  // If the mouse up event has yet to happen, the next touch start event
+  // should not cause a crash.
+  EXPECT_TRUE(ink_module().HandleInputEvent(
+      CreateTouchEvent(blink::WebInputEvent::Type::kTouchStart,
+                       base::span_from_ref(kStartPointInsidePage0))));
+
+  EXPECT_EQ(2, client().stroke_started_count());
+  EXPECT_EQ(1, client().modified_stroke_finished_count());
+  EXPECT_EQ(0, client().unmodified_stroke_finished_count());
+}
+
 class PdfInkModuleTextHighlightMetricsTest
     : public PdfInkModuleMetricsTestBase,
       public PdfInkModuleTextHighlightTest {
diff --git a/services/metrics/public/cpp/ukm_recorder.cc b/services/metrics/public/cpp/ukm_recorder.cc
index ace23b3e..c47ea745 100644
--- a/services/metrics/public/cpp/ukm_recorder.cc
+++ b/services/metrics/public/cpp/ukm_recorder.cc
@@ -109,6 +109,16 @@
 }
 
 // static
+ukm::SourceId UkmRecorder::GetSourceIdForExtensionUrl(
+    base::PassKey<extensions::ExtensionContextMenuModel>,
+    const GURL& extension_url) {
+  // UkmRecorderImpl will verify the extension URL (and the corresponding
+  // extension) prior to emitting the record.
+  return UkmRecorder::GetSourceIdFromScopeImpl(extension_url,
+                                               SourceIdType::EXTENSION_ID);
+}
+
+// static
 ukm::SourceId UkmRecorder::GetSourceIdForNotificationPermission(
     base::PassKey<ChromePermissionsClient>,
     const GURL& url) {
diff --git a/services/metrics/public/cpp/ukm_recorder.h b/services/metrics/public/cpp/ukm_recorder.h
index afa3cbc..966536e 100644
--- a/services/metrics/public/cpp/ukm_recorder.h
+++ b/services/metrics/public/cpp/ukm_recorder.h
@@ -50,6 +50,7 @@
 namespace extensions {
 class ExtensionMessagePort;
 class ManifestV2ExperimentManager;
+class ExtensionContextMenuModel;
 }
 
 namespace safe_browsing {
@@ -149,6 +150,9 @@
   static SourceId GetSourceIdForExtensionUrl(
       base::PassKey<extensions::ManifestV2ExperimentManager>,
       const GURL& extension_url);
+  static SourceId GetSourceIdForExtensionUrl(
+      base::PassKey<extensions::ExtensionContextMenuModel>,
+      const GURL& extension_url);
 
   // Gets a new SourceId of REDIRECT_ID type and updates the source URL to the
   // given domain. This method should only be called in the BtmServiceImpl
diff --git a/services/viz/public/mojom/compositing/layer.mojom b/services/viz/public/mojom/compositing/layer.mojom
index 015a46fb..18ac245 100644
--- a/services/viz/public/mojom/compositing/layer.mojom
+++ b/services/viz/public/mojom/compositing/layer.mojom
@@ -127,6 +127,9 @@
   // This is also used during AppendQuads to decide if a quad needs to be
   // drawn.
   gfx.mojom.Rect recorded_bounds;
+
+  // Scales of tilings that the renderer proposes can be deleted.
+  array<float> proposed_tiling_scales_for_deletion;
 };
 
 // Extra fields in a cc::ScrollbarLayerImplBase that has been added
diff --git a/services/viz/public/mojom/compositing/layer_context.mojom b/services/viz/public/mojom/compositing/layer_context.mojom
index 67020fa..9739bd3 100644
--- a/services/viz/public/mojom/compositing/layer_context.mojom
+++ b/services/viz/public/mojom/compositing/layer_context.mojom
@@ -236,6 +236,12 @@
   // the client had previously indicated that it wants an opporunity to make
   // changes to the tree before that frame is drawn.
   OnRequestCommitForFrame(BeginFrameArgs args);
+
+  // Notifies the client(Renderer) that tilings corresponding to
+  // |tiling_scales_to_clean_up| in the given layer can be safely deleted by
+  // the client.
+  OnTilingsReadyForCleanup(int32 layer_id,
+      array<float> tiling_scales_to_clean_up);
 };
 
 // Parameters needed to bind a LayerContext endpoint via a CompositorFrameSink.
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index 596af34..d17495e6 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -13603,6 +13603,21 @@
             ]
         }
     ],
+    "IOSProactiveSuggestionsFramework": [
+        {
+            "platforms": [
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "IOSProactiveSuggestionsFramework"
+                    ]
+                }
+            ]
+        }
+    ],
     "IOSReaderMode": [
         {
             "platforms": [
@@ -16037,6 +16052,21 @@
             ]
         }
     ],
+    "MovePasswordLeakDetectionToggleIos": [
+        {
+            "platforms": [
+                "ios"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "MovePasswordLeakDetectionToggleIos"
+                    ]
+                }
+            ]
+        }
+    ],
     "MultiCalendarSupport": [
         {
             "platforms": [
diff --git a/third_party/blink/renderer/core/clipboard/build.gni b/third_party/blink/renderer/core/clipboard/build.gni
index e94d09d..b5ae482a 100644
--- a/third_party/blink/renderer/core/clipboard/build.gni
+++ b/third_party/blink/renderer/core/clipboard/build.gni
@@ -23,10 +23,6 @@
   "system_clipboard.h",
 ]
 
-if (is_win) {
-  blink_core_sources_clipboard += [ "clipboard_utilities_win.cc" ]
-}
-
 blink_core_tests_clipboard = [
   "clipboard_utilities_test.cc",
   "data_object_test.cc",
diff --git a/third_party/blink/renderer/core/clipboard/clipboard_utilities.h b/third_party/blink/renderer/core/clipboard/clipboard_utilities.h
index 2508dc10..cd0e3f3 100644
--- a/third_party/blink/renderer/core/clipboard/clipboard_utilities.h
+++ b/third_party/blink/renderer/core/clipboard/clipboard_utilities.h
@@ -39,9 +39,6 @@
 
 namespace blink {
 
-#if BUILDFLAG(IS_WIN)
-CORE_EXPORT void ReplaceNewlinesWithWindowsStyleNewlines(String&);
-#endif
 CORE_EXPORT void ReplaceNBSPWithSpace(String&);
 CORE_EXPORT String ConvertURIListToURL(const String& uri_list);
 CORE_EXPORT String URLToImageMarkup(const KURL&, const String& title);
diff --git a/third_party/blink/renderer/core/clipboard/clipboard_utilities_win.cc b/third_party/blink/renderer/core/clipboard/clipboard_utilities_win.cc
deleted file mode 100644
index 3d19660c..0000000
--- a/third_party/blink/renderer/core/clipboard/clipboard_utilities_win.cc
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2009 Apple Inc.  All rights reserved.
- * Copyright (C) 2009 Google Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "third_party/blink/renderer/core/clipboard/clipboard_utilities.h"
-
-#include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
-#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
-
-namespace blink {
-
-void ReplaceNewlinesWithWindowsStyleNewlines(String& str) {
-  DEFINE_STATIC_LOCAL(String, windows_newline, ("\r\n"));
-  StringBuilder result;
-  for (unsigned index = 0; index < str.length(); ++index) {
-    if (str[index] != '\n' || (index > 0 && str[index - 1] == '\r'))
-      result.Append(str[index]);
-    else
-      result.Append(windows_newline);
-  }
-  str = result.ToString();
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/clipboard/data_transfer.cc b/third_party/blink/renderer/core/clipboard/data_transfer.cc
index f3d3ddb..74854c3 100644
--- a/third_party/blink/renderer/core/clipboard/data_transfer.cc
+++ b/third_party/blink/renderer/core/clipboard/data_transfer.cc
@@ -66,6 +66,10 @@
 #include "ui/base/dragdrop/mojom/drag_drop_types.mojom-blink.h"
 #include "ui/gfx/geometry/rect_conversions.h"
 
+#if BUILDFLAG(IS_WIN)
+#include "third_party/blink/renderer/platform/wtf/text/line_ending.h"
+#endif
+
 namespace blink {
 
 namespace {
@@ -568,7 +572,7 @@
 
   String str = selection.SelectedTextForClipboard();
 #if BUILDFLAG(IS_WIN)
-  ReplaceNewlinesWithWindowsStyleNewlines(str);
+  str = NormalizeLineEndingsToCRLF(str);
 #endif
   ReplaceNBSPWithSpace(str);
   data_object_->SetData(ui::kMimeTypePlainText, str);
diff --git a/third_party/blink/renderer/core/clipboard/system_clipboard.cc b/third_party/blink/renderer/core/clipboard/system_clipboard.cc
index 2fbea25..461d5802 100644
--- a/third_party/blink/renderer/core/clipboard/system_clipboard.cc
+++ b/third_party/blink/renderer/core/clipboard/system_clipboard.cc
@@ -17,18 +17,11 @@
 #include "third_party/blink/public/platform/browser_interface_broker_proxy.h"
 #include "third_party/blink/public/platform/platform.h"
 #include "third_party/blink/public/platform/web_drag_data.h"
-#include "third_party/blink/public/platform/web_string.h"
-#include "third_party/blink/public/web/web_local_frame.h"
-#include "third_party/blink/public/web/web_local_frame_client.h"
 #include "third_party/blink/renderer/core/clipboard/clipboard_utilities.h"
 #include "third_party/blink/renderer/core/clipboard/data_object.h"
-#include "third_party/blink/renderer/core/dom/document_fragment.h"
-#include "third_party/blink/renderer/core/dom/element_traversal.h"
 #include "third_party/blink/renderer/core/frame/local_dom_window.h"
 #include "third_party/blink/renderer/core/frame/local_frame.h"
-#include "third_party/blink/renderer/core/frame/local_frame_client.h"
 #include "third_party/blink/renderer/core/frame/settings.h"
-#include "third_party/blink/renderer/core/html/html_image_element.h"
 #include "third_party/blink/renderer/platform/graphics/image.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
@@ -36,6 +29,10 @@
 #include "ui/base/clipboard/clipboard_constants.h"
 #include "ui/base/ui_base_features.h"
 
+#if BUILDFLAG(IS_WIN)
+#include "third_party/blink/renderer/platform/wtf/text/line_ending.h"
+#endif
+
 namespace blink {
 
 namespace {
@@ -149,7 +146,7 @@
   // currently under-specified.
   String text = plain_text;
 #if BUILDFLAG(IS_WIN)
-  ReplaceNewlinesWithWindowsStyleNewlines(text);
+  text = NormalizeLineEndingsToCRLF(text);
 #endif
   clipboard_->WriteText(NonNullString(text));
 }
diff --git a/third_party/blink/renderer/core/dom/document.cc b/third_party/blink/renderer/core/dom/document.cc
index 27f41c6..05974e6 100644
--- a/third_party/blink/renderer/core/dom/document.cc
+++ b/third_party/blink/renderer/core/dom/document.cc
@@ -8748,9 +8748,9 @@
   popover_pointerdown_target_ = popover;
 }
 
-void Document::SetCustomizableSelectMousedownLocation(
+void Document::SetPopoverPickerMousedownLocation(
     std::optional<gfx::PointF> point) {
-  customizable_select_mousedown_location_ = point;
+  popover_picker_mousedown_location_ = point;
 }
 
 const HTMLDialogElement* Document::DialogPointerdownTarget() const {
diff --git a/third_party/blink/renderer/core/dom/document.h b/third_party/blink/renderer/core/dom/document.h
index 95f0b40..f7a56ce 100644
--- a/third_party/blink/renderer/core/dom/document.h
+++ b/third_party/blink/renderer/core/dom/document.h
@@ -1718,10 +1718,10 @@
     return popover_pointerdown_target_.Get();
   }
   void SetPopoverPointerdownTarget(const HTMLElement*);
-  std::optional<gfx::PointF> CustomizableSelectMousedownLocation() const {
-    return customizable_select_mousedown_location_;
+  std::optional<gfx::PointF> PopoverPickerMousedownLocation() const {
+    return popover_picker_mousedown_location_;
   }
-  void SetCustomizableSelectMousedownLocation(std::optional<gfx::PointF>);
+  void SetPopoverPickerMousedownLocation(std::optional<gfx::PointF>);
   const HTMLDialogElement* DialogPointerdownTarget() const;
   void SetDialogPointerdownTarget(const HTMLDialogElement*);
 
@@ -2925,8 +2925,8 @@
   HeapVector<Member<HTMLElement>> popover_hint_stack_;
   // The popover (if any) that received the most recent pointerdown event.
   Member<const HTMLElement> popover_pointerdown_target_;
-  // The mouse location for the mousedown that opened the select, if any.
-  std::optional<gfx::PointF> customizable_select_mousedown_location_;
+  // The mouse location for the mousedown that opened the picker, if any.
+  std::optional<gfx::PointF> popover_picker_mousedown_location_;
   // The dialog (if any) that received the most recent pointerdown event. This
   // is distinct from popover_pointerdown_target_ because the same pointer
   // action could trigger light dismiss on a containing popover and not a
diff --git a/third_party/blink/renderer/core/dom/events/event_dispatcher.cc b/third_party/blink/renderer/core/dom/events/event_dispatcher.cc
index 74b8923..33c0d26 100644
--- a/third_party/blink/renderer/core/dom/events/event_dispatcher.cc
+++ b/third_party/blink/renderer/core/dom/events/event_dispatcher.cc
@@ -433,7 +433,7 @@
   }
 
   if (event_->IsMouseEvent() && event_->type() == event_type_names::kMouseup) {
-    node_->GetDocument().SetCustomizableSelectMousedownLocation(std::nullopt);
+    node_->GetDocument().SetPopoverPickerMousedownLocation(std::nullopt);
   }
 
   // Track the usage of sending a mousedown event to a select element to force
diff --git a/third_party/blink/renderer/core/frame/deprecation/deprecation.json5 b/third_party/blink/renderer/core/frame/deprecation/deprecation.json5
index 2d8cb5b..3d343fe3 100644
--- a/third_party/blink/renderer/core/frame/deprecation/deprecation.json5
+++ b/third_party/blink/renderer/core/frame/deprecation/deprecation.json5
@@ -602,5 +602,16 @@
         "kXMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload",
       ],
     },
+    {
+      name: "XSLT",
+      message: "XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon.",
+      translation_note: "Warning displayed to developers that they are using either the XSLTProcessor API, or XSLT processing instructions, both of which have been deprecated and are scheduled to be removed.",
+      web_features: [
+        "kXSLProcessingInstruction",
+        "kXSLTProcessor",
+      ],
+      chrome_status_feature: 4709671889534976,
+      milestone: 143,
+    },
   ],
 }
diff --git a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
index 3b508307..6566e16 100644
--- a/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
+++ b/third_party/blink/renderer/core/frame/web_local_frame_impl.cc
@@ -288,6 +288,7 @@
 #if BUILDFLAG(IS_WIN)
 #include "third_party/blink/public/web/win/web_font_family_names.h"
 #include "third_party/blink/renderer/core/layout/layout_font_accessor_win.h"
+#include "third_party/blink/renderer/platform/wtf/text/line_ending.h"
 #endif
 
 #if BUILDFLAG(IS_IOS)
@@ -1486,7 +1487,7 @@
         TextIteratorBehavior::EmitsObjectReplacementCharacterBehavior());
   }
 #if BUILDFLAG(IS_WIN)
-  ReplaceNewlinesWithWindowsStyleNewlines(text);
+  text = NormalizeLineEndingsToCRLF(text);
 #endif
   ReplaceNBSPWithSpace(text);
   return text;
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.cc b/third_party/blink/renderer/core/html/forms/html_button_element.cc
index c2c6027..685b211 100644
--- a/third_party/blink/renderer/core/html/forms/html_button_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_button_element.cc
@@ -186,199 +186,14 @@
   }
 }
 
-// static
-Element* HTMLButtonElement::RetrieveCommandForTargetElement(
-    const HTMLElement& invoker) {
-  if (!invoker.IsInTreeScope() || invoker.IsDisabledFormControl()) {
-    return nullptr;
-  }
-
-  if (auto* button = DynamicTo<HTMLButtonElement>(invoker);
-      button && button->IsFormAssociatedSubmitButton()) {
-    return nullptr;
-  }
-
-  return invoker.GetElementAttributeResolvingReferenceTarget(
-      html_names::kCommandforAttr);
+bool HTMLButtonElement::CanBeCommandInvoker() const {
+  return !IsFormAssociatedSubmitButton();
 }
 
 bool HTMLButtonElement::IsFormAssociatedSubmitButton() const {
   return Form() && FastHasAttribute(html_names::kTypeAttr) && type_ == kSubmit;
 }
 
-Element* HTMLButtonElement::commandForElement() const {
-  return RetrieveCommandForTargetElement(*this);
-}
-
-void HTMLButtonElement::setCommand(const AtomicString& type) {
-  setAttribute(html_names::kCommandAttr, type);
-}
-
-// static
-AtomicString HTMLButtonElement::GetCommand(
-    const AtomicString& action,
-    ExecutionContext* execution_context) {
-  const CommandEventType type = GetCommandEventType(action, execution_context);
-  switch (type) {
-    case CommandEventType::kNone:
-      return g_empty_atom;
-    case CommandEventType::kCustom:
-      return action;
-    default: {
-      const AtomicString& lower_action = action.LowerASCII();
-      DCHECK_EQ(GetCommandEventType(lower_action, execution_context), type);
-      return lower_action;
-    }
-  }
-}
-
-AtomicString HTMLButtonElement::command() const {
-  return GetCommand(FastGetAttribute(html_names::kCommandAttr),
-                    GetExecutionContext());
-}
-
-// static
-CommandEventType HTMLButtonElement::GetCommandEventType(
-    const AtomicString& action,
-    ExecutionContext* execution_context) {
-  if (action.IsNull() || action.empty()) {
-    return CommandEventType::kNone;
-  }
-
-  // Custom Invoke Action
-  if (action.StartsWith("--")) {
-    return CommandEventType::kCustom;
-  }
-
-  // Popover Cases
-  if (EqualIgnoringASCIICase(action, keywords::kTogglePopover)) {
-    return CommandEventType::kTogglePopover;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kShowPopover)) {
-    return CommandEventType::kShowPopover;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kHidePopover)) {
-    return CommandEventType::kHidePopover;
-  }
-
-  // Dialog Cases
-  if (EqualIgnoringASCIICase(action, keywords::kClose)) {
-    return CommandEventType::kClose;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kShowModal)) {
-    return CommandEventType::kShowModal;
-  }
-
-  if (RuntimeEnabledFeatures::HTMLCommandRequestCloseEnabled() &&
-      EqualIgnoringASCIICase(action, keywords::kRequestClose)) {
-    return CommandEventType::kRequestClose;
-  }
-
-  // Menu Cases
-  if (RuntimeEnabledFeatures::MenuElementsEnabled()) {
-    if (EqualIgnoringASCIICase(action, keywords::kToggleMenu)) {
-      return CommandEventType::kToggleMenu;
-    }
-    if (EqualIgnoringASCIICase(action, keywords::kShowMenu)) {
-      return CommandEventType::kShowMenu;
-    }
-    if (EqualIgnoringASCIICase(action, keywords::kHideMenu)) {
-      return CommandEventType::kHideMenu;
-    }
-  }
-
-  // V2 commands go below this point
-
-  if (!RuntimeEnabledFeatures::HTMLCommandActionsV2Enabled()) {
-    return CommandEventType::kNone;
-  }
-
-  // Input/Select Cases
-  if (EqualIgnoringASCIICase(action, keywords::kShowPicker)) {
-    return CommandEventType::kShowPicker;
-  }
-
-  // Number Input Cases
-  if (EqualIgnoringASCIICase(action, keywords::kStepUp)) {
-    return CommandEventType::kStepUp;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kStepDown)) {
-    return CommandEventType::kStepDown;
-  }
-
-  // Fullscreen Cases
-  if (EqualIgnoringASCIICase(action, keywords::kToggleFullscreen)) {
-    return CommandEventType::kToggleFullscreen;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kRequestFullscreen)) {
-    return CommandEventType::kRequestFullscreen;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kExitFullscreen)) {
-    return CommandEventType::kExitFullscreen;
-  }
-
-  // Details cases
-  if (EqualIgnoringASCIICase(action, keywords::kToggle)) {
-    return CommandEventType::kToggle;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kOpen)) {
-    return CommandEventType::kOpen;
-  }
-  // CommandEventType::kClose handled above in Dialog
-
-  // Media cases
-  if (EqualIgnoringASCIICase(action, keywords::kPlayPause)) {
-    return CommandEventType::kPlayPause;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kPause)) {
-    return CommandEventType::kPause;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kPlay)) {
-    return CommandEventType::kPlay;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kToggleMuted)) {
-    return CommandEventType::kToggleMuted;
-  }
-
-  return CommandEventType::kNone;
-}
-
-// static
-void HTMLButtonElement::HandleCommandForActivation(Event& event,
-                                                   HTMLElement& element) {
-  if (event.type() != event_type_names::kDOMActivate) {
-    return;
-  }
-
-  // Buttons with a commandfor will dispatch a CommandEvent on the target of the
-  // invoker, and run `HandleCommandInternal` to perform default logic.
-  if (Element* command_target = RetrieveCommandForTargetElement(element)) {
-    // commandfor & popovertarget shouldn't be combined, so warn.
-    if (element.FastHasAttribute(html_names::kPopovertargetAttr)) {
-      element.AddConsoleMessage(
-          mojom::blink::ConsoleMessageSource::kOther,
-          mojom::blink::ConsoleMessageLevel::kWarning,
-          "popovertarget is ignored on elements with commandfor.");
-    }
-    const AtomicString& action =
-        element.FastGetAttribute(html_names::kCommandAttr);
-    const auto command_event_type =
-        GetCommandEventType(action, element.GetExecutionContext());
-    bool is_valid_builtin =
-        command_target->IsValidBuiltinCommand(element, command_event_type);
-    if (is_valid_builtin || command_event_type == CommandEventType::kCustom) {
-      Event* command_event = CommandEvent::Create(
-          event_type_names::kCommand,
-          GetCommand(action, element.GetExecutionContext()), &element);
-      command_target->DispatchEvent(*command_event);
-      if (is_valid_builtin && !command_event->defaultPrevented()) {
-        command_target->HandleCommandInternal(element, command_event_type);
-      }
-    }
-    event.SetDefaultHandled();
-  }
-}
-
 void HTMLButtonElement::DefaultEventHandler(Event& event) {
   if (event.type() == event_type_names::kDOMActivate) {
     if (auto* form = Form();
@@ -425,9 +240,10 @@
     }
   }
 
-  HandleCommandForActivation(event, *this);
-  if (event.DefaultHandled()) {
-    return;
+  if (event.type() == event_type_names::kDOMActivate) {
+    if (HandleCommandForActivation()) {
+      return;
+    }
   }
 
   if (HandleKeyboardActivation(event)) {
diff --git a/third_party/blink/renderer/core/html/forms/html_button_element.h b/third_party/blink/renderer/core/html/forms/html_button_element.h
index 2bea33d8..6ba81e6 100644
--- a/third_party/blink/renderer/core/html/forms/html_button_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_button_element.h
@@ -50,15 +50,7 @@
   // child of a <select>.
   HTMLSelectElement* OwnerSelect() const;
 
-  // Invoker Commands (https://github.com/whatwg/html/pull/9841)
-  Element* commandForElement() const;
-  AtomicString command() const;
-  void setCommand(const AtomicString& type);
-
-  static CommandEventType GetCommandEventType(
-      const AtomicString& type,
-      ExecutionContext* execution_context);
-  static void HandleCommandForActivation(Event& event, HTMLElement& element);
+  bool CanBeCommandInvoker() const override;
 
  private:
   // The type attribute of HTMLButtonElement is an enumerated attribute:
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
index 8a9ca5f1..475f512f 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.cc
@@ -352,7 +352,7 @@
 }
 
 // static
-bool HTMLFormControlElement::IsValidPopoverElement(const HTMLElement& element) {
+bool HTMLFormControlElement::IsValidPopoverTrigger(const HTMLElement& element) {
   if (!element.IsInTreeScope() ||
       element.SupportsPopoverTriggering() == PopoverTriggerSupport::kNone ||
       element.IsDisabledFormControl()) {
@@ -375,7 +375,7 @@
 HTMLFormControlElement::popoverTargetElement(HTMLElement& element) {
   const PopoverTargetElement no_element{.popover = nullptr,
                                         .action = PopoverTriggerAction::kNone};
-  if (!IsValidPopoverElement(element)) {
+  if (!IsValidPopoverTrigger(element)) {
     return no_element;
   }
 
@@ -417,16 +417,9 @@
 void HTMLFormControlElement::HandlePopoverActivation(Event& event,
                                                      HTMLElement& element) {
   if (event.type() != event_type_names::kDOMActivate ||
-      !IsValidPopoverElement(element)) {
+      !IsValidPopoverTrigger(element)) {
     return;
   }
-  // CommandFor should have been handled in
-  // HTMLButtonElement::DefaultEventHandler
-  DCHECK((RuntimeEnabledFeatures::ElementInternalsDotTypeEnabled() &&
-          element.IsCustomButton()) ||
-         !IsA<HTMLButtonElement>(element) ||
-         !DynamicTo<HTMLButtonElement>(element)->commandForElement());
-
   auto popover = popoverTargetElement(element);
   if (popover.popover) {
     bool event_target_was_nested_popover = false;
@@ -477,10 +470,13 @@
 }
 
 void HTMLFormControlElement::DefaultEventHandler(Event& event) {
+  HTMLElement::DefaultEventHandler(event);
+  if (event.DefaultHandled()) {
+    return;
+  }
   // Buttons that aren't form participants might be Invoker buttons or Popover
   // buttons.
   HTMLFormControlElement::HandlePopoverActivation(event, *this);
-  HTMLElement::DefaultEventHandler(event);
 }
 
 // static
diff --git a/third_party/blink/renderer/core/html/forms/html_form_control_element.h b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
index 73f846b..2dcb1a2c 100644
--- a/third_party/blink/renderer/core/html/forms/html_form_control_element.h
+++ b/third_party/blink/renderer/core/html/forms/html_form_control_element.h
@@ -182,7 +182,7 @@
                                PopoverTriggerAction action);
   // Checks if the element exists, is a valid Popover element, and (if it's a
   // form control) supports popover triggering.
-  static bool IsValidPopoverElement(const HTMLElement& element);
+  static bool IsValidPopoverTrigger(const HTMLElement& element);
 
   enum WebAutofillState autofill_state_;
 
diff --git a/third_party/blink/renderer/core/html/forms/html_option_element.cc b/third_party/blink/renderer/core/html/forms/html_option_element.cc
index 93be5dd..f262977c1 100644
--- a/third_party/blink/renderer/core/html/forms/html_option_element.cc
+++ b/third_party/blink/renderer/core/html/forms/html_option_element.cc
@@ -602,7 +602,7 @@
       //     (post zoom, page-relative) of the location of the mousedown. I.e.
       //     the mouse was not dragged between mousedown and mouseup.
       std::optional<gfx::PointF> mouse_down_loc =
-          GetDocument().CustomizableSelectMousedownLocation();
+          GetDocument().PopoverPickerMousedownLocation();
       constexpr float kEpsilon = 5;  // 5 pixels in any direction
       bool mouse_moved = !mouse_down_loc.has_value() ||
                          !mouse_down_loc->IsWithinDistance(
@@ -610,10 +610,10 @@
       if (mouse_moved) {
         ChooseOption(event);
       }
-      GetDocument().SetCustomizableSelectMousedownLocation(std::nullopt);
+      GetDocument().SetPopoverPickerMousedownLocation(std::nullopt);
       return;
     } else if (event.type() == event_type_names::kMousedown) {
-      GetDocument().SetCustomizableSelectMousedownLocation(std::nullopt);
+      GetDocument().SetPopoverPickerMousedownLocation(std::nullopt);
     }
   }
 
diff --git a/third_party/blink/renderer/core/html/forms/select_type.cc b/third_party/blink/renderer/core/html/forms/select_type.cc
index a696060..cf5d868 100644
--- a/third_party/blink/renderer/core/html/forms/select_type.cc
+++ b/third_party/blink/renderer/core/html/forms/select_type.cc
@@ -493,7 +493,7 @@
           // Keep track of the mouse pixel location, so that when the mouseup
           // happens, we can see whether there was a mouse drag to pick an
           // option.
-          select_->GetDocument().SetCustomizableSelectMousedownLocation(
+          select_->GetDocument().SetPopoverPickerMousedownLocation(
               mouse_event->AbsoluteLocation());
         }
         ShowPopup(mouse_event->FromTouch() ? PopupMenu::kTouch
@@ -506,7 +506,7 @@
       mouse_event->button() ==
           static_cast<int16_t>(WebPointerProperties::Button::kLeft) &&
       PickerIsPopover() && !mouse_event->FromTouch()) {
-    select_->GetDocument().SetCustomizableSelectMousedownLocation(std::nullopt);
+    select_->GetDocument().SetPopoverPickerMousedownLocation(std::nullopt);
   }
   return false;
 }
diff --git a/third_party/blink/renderer/core/html/html_details_element.cc b/third_party/blink/renderer/core/html/html_details_element.cc
index 532f9aaf..b750cb6 100644
--- a/third_party/blink/renderer/core/html/html_details_element.cc
+++ b/third_party/blink/renderer/core/html/html_details_element.cc
@@ -305,8 +305,9 @@
 
 bool HTMLDetailsElement::HandleCommandInternal(HTMLElement& invoker,
                                                CommandEventType command) {
-  CHECK(IsValidBuiltinCommand(invoker, command));
-
+  if (!IsValidBuiltinCommand(invoker, command)) {
+    return false;
+  }
   if (HTMLElement::HandleCommandInternal(invoker, command)) {
     return true;
   }
diff --git a/third_party/blink/renderer/core/html/html_dialog_element.cc b/third_party/blink/renderer/core/html/html_dialog_element.cc
index b097775..7390328 100644
--- a/third_party/blink/renderer/core/html/html_dialog_element.cc
+++ b/third_party/blink/renderer/core/html/html_dialog_element.cc
@@ -345,8 +345,9 @@
 
 bool HTMLDialogElement::HandleCommandInternal(HTMLElement& invoker,
                                               CommandEventType command) {
-  CHECK(IsValidBuiltinCommand(invoker, command));
-
+  if (!IsValidBuiltinCommand(invoker, command)) {
+    return false;
+  }
   if (HTMLElement::HandleCommandInternal(invoker, command)) {
     return true;
   }
diff --git a/third_party/blink/renderer/core/html/html_element.cc b/third_party/blink/renderer/core/html/html_element.cc
index 10257f21..baeab4f6 100644
--- a/third_party/blink/renderer/core/html/html_element.cc
+++ b/third_party/blink/renderer/core/html/html_element.cc
@@ -50,6 +50,7 @@
 #include "third_party/blink/renderer/core/css_value_keywords.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/document_fragment.h"
+#include "third_party/blink/renderer/core/dom/element.h"
 #include "third_party/blink/renderer/core/dom/element_rare_data_vector.h"
 #include "third_party/blink/renderer/core/dom/element_traversal.h"
 #include "third_party/blink/renderer/core/dom/events/event_listener.h"
@@ -72,6 +73,7 @@
 #include "third_party/blink/renderer/core/editing/serializers/serialization.h"
 #include "third_party/blink/renderer/core/editing/spellcheck/spell_checker.h"
 #include "third_party/blink/renderer/core/event_type_names.h"
+#include "third_party/blink/renderer/core/events/command_event.h"
 #include "third_party/blink/renderer/core/events/keyboard_event.h"
 #include "third_party/blink/renderer/core/events/pointer_event.h"
 #include "third_party/blink/renderer/core/events/toggle_event.h"
@@ -131,6 +133,7 @@
 #include "third_party/blink/renderer/platform/scheduler/public/post_cancellable_task.h"
 #include "third_party/blink/renderer/platform/text/bidi_paragraph.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
+#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
 #include "third_party/blink/renderer/platform/wtf/text/character_names.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 
@@ -2485,8 +2488,9 @@
 
 bool HTMLElement::HandleCommandInternal(HTMLElement& invoker,
                                         CommandEventType command) {
-  CHECK(IsValidBuiltinCommand(invoker, command));
-
+  if (!IsValidBuiltinCommand(invoker, command)) {
+    return false;
+  }
   if (Element::HandleCommandInternal(invoker, command)) {
     return true;
   }
@@ -2518,19 +2522,13 @@
                      /*exception_state=*/nullptr,
                      /*include_event_handler_text=*/true, &document) &&
       (command == CommandEventType::kTogglePopover ||
-       command == CommandEventType::kShowPopover ||
-       (RuntimeEnabledFeatures::MenuElementsEnabled() &&
-        (command == CommandEventType::kToggleMenu ||
-         command == CommandEventType::kShowMenu)));
+       command == CommandEventType::kShowPopover);
   bool can_hide =
       IsPopoverReady(PopoverTriggerAction::kHide,
                      /*exception_state=*/nullptr,
                      /*include_event_handler_text=*/true, &document) &&
       (command == CommandEventType::kTogglePopover ||
-       command == CommandEventType::kHidePopover ||
-       (RuntimeEnabledFeatures::MenuElementsEnabled() &&
-        (command == CommandEventType::kToggleMenu ||
-         command == CommandEventType::kHideMenu)));
+       command == CommandEventType::kHidePopover);
   if (can_hide) {
     HidePopoverInternal(
         &invoker, HidePopoverFocusBehavior::kFocusPreviousElement,
@@ -2585,6 +2583,186 @@
   return false;
 }
 
+bool HTMLElement::CanBeCommandInvoker() const {
+  return RuntimeEnabledFeatures::ElementInternalsDotTypeEnabled() &&
+         IsCustomButton();
+}
+
+bool HTMLElement::HandleCommandForActivation() {
+  if (!CanBeCommandInvoker()) {
+    return false;
+  }
+
+  // Buttons with a commandfor will dispatch a CommandEvent on the target of the
+  // invoker, and run `HandleCommandInternal` to perform default logic.
+  Element* command_target = commandForElement();
+  if (!command_target) {
+    return false;
+  }
+  // commandfor & popovertarget shouldn't be combined, so warn.
+  if (FastHasAttribute(html_names::kPopovertargetAttr)) {
+    AddConsoleMessage(mojom::blink::ConsoleMessageSource::kOther,
+                      mojom::blink::ConsoleMessageLevel::kWarning,
+                      "popovertarget is ignored on elements with commandfor.");
+  }
+  const AtomicString& action = command();
+  if (action.empty()) {
+    return false;
+  }
+  DCHECK_NE(GetCommandEventType(FastGetAttribute(html_names::kCommandAttr),
+                                GetExecutionContext()),
+            CommandEventType::kNone);
+  const auto command_event_type =
+      GetCommandEventType(action, GetExecutionContext());
+  Event* command_event =
+      CommandEvent::Create(event_type_names::kCommand, action, this);
+  command_target->DispatchEvent(*command_event);
+  if (!command_event->defaultPrevented() &&
+      command_event_type != CommandEventType::kCustom) {
+    command_target->HandleCommandInternal(*this, command_event_type);
+  }
+  return true;
+}
+
+Element* HTMLElement::commandForElement() const {
+  if (!IsInTreeScope() || IsDisabledFormControl()) {
+    return nullptr;
+  }
+  if (!CanBeCommandInvoker()) {
+    return nullptr;
+  }
+  return GetElementAttributeResolvingReferenceTarget(
+      html_names::kCommandforAttr);
+}
+
+AtomicString HTMLElement::command() const {
+  if (!CanBeCommandInvoker()) {
+    return g_empty_atom;
+  }
+  const AtomicString& action = FastGetAttribute(html_names::kCommandAttr);
+  CommandEventType type = GetCommandEventType(action, GetExecutionContext());
+  switch (type) {
+    case CommandEventType::kNone:
+      return g_empty_atom;
+    case CommandEventType::kCustom:
+      return action;
+    default: {
+      const AtomicString& lower_action = action.LowerASCII();
+      DCHECK_EQ(GetCommandEventType(lower_action, GetExecutionContext()), type);
+      return lower_action;
+    }
+  }
+}
+
+void HTMLElement::setCommand(const AtomicString& type) {
+  setAttribute(html_names::kCommandAttr, type);
+}
+
+CommandEventType HTMLElement::GetCommandEventType(
+    const AtomicString& action,
+    ExecutionContext* execution_context) const {
+  if (action.IsNull() || action.empty()) {
+    return CommandEventType::kNone;
+  }
+
+  // Custom Invoke Action
+  if (action.StartsWith("--")) {
+    return CommandEventType::kCustom;
+  }
+
+  // Popover Cases
+  if (EqualIgnoringASCIICase(action, keywords::kTogglePopover)) {
+    return CommandEventType::kTogglePopover;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kShowPopover)) {
+    return CommandEventType::kShowPopover;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kHidePopover)) {
+    return CommandEventType::kHidePopover;
+  }
+
+  // Dialog Cases
+  if (EqualIgnoringASCIICase(action, keywords::kClose)) {
+    return CommandEventType::kClose;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kShowModal)) {
+    return CommandEventType::kShowModal;
+  }
+
+  if (RuntimeEnabledFeatures::HTMLCommandRequestCloseEnabled() &&
+      EqualIgnoringASCIICase(action, keywords::kRequestClose)) {
+    return CommandEventType::kRequestClose;
+  }
+
+  // Menu Cases
+  if (RuntimeEnabledFeatures::MenuElementsEnabled()) {
+    if (EqualIgnoringASCIICase(action, keywords::kToggleMenu)) {
+      return CommandEventType::kToggleMenu;
+    }
+    if (EqualIgnoringASCIICase(action, keywords::kShowMenu)) {
+      return CommandEventType::kShowMenu;
+    }
+    if (EqualIgnoringASCIICase(action, keywords::kHideMenu)) {
+      return CommandEventType::kHideMenu;
+    }
+  }
+
+  // V2 commands go below this point
+
+  if (!RuntimeEnabledFeatures::HTMLCommandActionsV2Enabled()) {
+    return CommandEventType::kNone;
+  }
+
+  // Input/Select Cases
+  if (EqualIgnoringASCIICase(action, keywords::kShowPicker)) {
+    return CommandEventType::kShowPicker;
+  }
+
+  // Number Input Cases
+  if (EqualIgnoringASCIICase(action, keywords::kStepUp)) {
+    return CommandEventType::kStepUp;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kStepDown)) {
+    return CommandEventType::kStepDown;
+  }
+
+  // Fullscreen Cases
+  if (EqualIgnoringASCIICase(action, keywords::kToggleFullscreen)) {
+    return CommandEventType::kToggleFullscreen;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kRequestFullscreen)) {
+    return CommandEventType::kRequestFullscreen;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kExitFullscreen)) {
+    return CommandEventType::kExitFullscreen;
+  }
+
+  // Details cases
+  if (EqualIgnoringASCIICase(action, keywords::kToggle)) {
+    return CommandEventType::kToggle;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kOpen)) {
+    return CommandEventType::kOpen;
+  }
+  // CommandEventType::kClose handled above in Dialog
+
+  // Media cases
+  if (EqualIgnoringASCIICase(action, keywords::kPlayPause)) {
+    return CommandEventType::kPlayPause;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kPause)) {
+    return CommandEventType::kPause;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kPlay)) {
+    return CommandEventType::kPlay;
+  }
+  if (EqualIgnoringASCIICase(action, keywords::kToggleMuted)) {
+    return CommandEventType::kToggleMuted;
+  }
+
+  return CommandEventType::kNone;
+}
+
 PopoverTriggerSupport HTMLElement::SupportsPopoverTriggering() const {
   return RuntimeEnabledFeatures::ElementInternalsDotTypeEnabled() &&
                  IsCustomButton()
@@ -3092,12 +3270,14 @@
 void HTMLElement::DefaultEventHandler(Event& event) {
   auto* keyboard_event = DynamicTo<KeyboardEvent>(event);
 
-  if (RuntimeEnabledFeatures::ElementInternalsDotTypeEnabled() &&
-      IsCustomButton()) {
-    HTMLButtonElement::HandleCommandForActivation(event, *this);
-    if (event.DefaultHandled()) {
+  if (event.type() == event_type_names::kDOMActivate) {
+    if (HandleCommandForActivation()) {
       return;
     }
+  }
+
+  if (RuntimeEnabledFeatures::ElementInternalsDotTypeEnabled() &&
+      IsCustomButton()) {
     HTMLFormControlElement::HandlePopoverActivation(event, *this);
   }
 
diff --git a/third_party/blink/renderer/core/html/html_element.h b/third_party/blink/renderer/core/html/html_element.h
index 6c219ea0..6467b06 100644
--- a/third_party/blink/renderer/core/html/html_element.h
+++ b/third_party/blink/renderer/core/html/html_element.h
@@ -361,6 +361,18 @@
                                     CommandEventType command);
   bool HandleCommandInternal(HTMLElement& invoker,
                              CommandEventType command) override;
+  // This is true if this element *can* be a command invoker: it is an element
+  // type that supports command invokers (e.g. buttons and menuitems), and the
+  // element isn't in a state that disqualifies it (e.g. a disabled state). This
+  // function doesn't connect directly to the `command*` attributes themselves;
+  // i.e. this will not change state if the `commandfor` attribute is changed.
+  virtual bool CanBeCommandInvoker() const;
+  CommandEventType GetCommandEventType(const AtomicString& type,
+                                       ExecutionContext*) const;
+  bool HandleCommandForActivation();
+  Element* commandForElement() const;
+  AtomicString command() const;
+  void setCommand(const AtomicString& type);
 
   // This allows developers to enable or disable browser-provided writing
   // suggestions. If the attribute is not explicitly set on an element, it
diff --git a/third_party/blink/renderer/core/html/html_menu_item_element.cc b/third_party/blink/renderer/core/html/html_menu_item_element.cc
index 8a271c4..1abac26 100644
--- a/third_party/blink/renderer/core/html/html_menu_item_element.cc
+++ b/third_party/blink/renderer/core/html/html_menu_item_element.cc
@@ -4,12 +4,15 @@
 
 #include "third_party/blink/renderer/core/html/html_menu_item_element.h"
 
+#include "third_party/blink/public/common/input/web_pointer_properties.h"
 #include "third_party/blink/renderer/core/css/selector_checker.h"
 #include "third_party/blink/renderer/core/dom/document.h"
 #include "third_party/blink/renderer/core/dom/events/event.h"
 #include "third_party/blink/renderer/core/dom/popover_data.h"
+#include "third_party/blink/renderer/core/event_type_names.h"
 #include "third_party/blink/renderer/core/events/command_event.h"
 #include "third_party/blink/renderer/core/events/keyboard_event.h"
+#include "third_party/blink/renderer/core/events/mouse_event.h"
 #include "third_party/blink/renderer/core/execution_context/execution_context.h"
 #include "third_party/blink/renderer/core/html/forms/html_field_set_element.h"
 #include "third_party/blink/renderer/core/html/html_menu_bar_element.h"
@@ -55,69 +58,6 @@
   }
 }
 
-Element* HTMLMenuItemElement::commandForElement() const {
-  if (!IsInTreeScope() || IsDisabledFormControl()) {
-    return nullptr;
-  }
-
-  return GetElementAttributeResolvingReferenceTarget(
-      html_names::kCommandforAttr);
-}
-
-void HTMLMenuItemElement::setCommand(const AtomicString& type) {
-  setAttribute(html_names::kCommandAttr, type);
-}
-
-AtomicString HTMLMenuItemElement::command() const {
-  const AtomicString& action = FastGetAttribute(html_names::kCommandAttr);
-  CommandEventType type = GetCommandEventType(action);
-  switch (type) {
-    case CommandEventType::kNone:
-      return g_empty_atom;
-    case CommandEventType::kCustom:
-      return action;
-    default: {
-      const AtomicString& lower_action = action.LowerASCII();
-      DCHECK_EQ(GetCommandEventType(lower_action), type);
-      return lower_action;
-    }
-  }
-}
-
-CommandEventType HTMLMenuItemElement::GetCommandEventType(
-    const AtomicString& action) const {
-  if (action.IsNull() || action.empty()) {
-    return CommandEventType::kNone;
-  }
-
-  // Custom Invoke Action
-  if (action.StartsWith("--")) {
-    return CommandEventType::kCustom;
-  }
-
-  // Popover cases.
-  if (EqualIgnoringASCIICase(action, keywords::kTogglePopover)) {
-    return CommandEventType::kTogglePopover;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kShowPopover)) {
-    return CommandEventType::kShowPopover;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kHidePopover)) {
-    return CommandEventType::kHidePopover;
-  }
-  // Menu specific cases.
-  if (EqualIgnoringASCIICase(action, keywords::kToggleMenu)) {
-    return CommandEventType::kToggleMenu;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kShowMenu)) {
-    return CommandEventType::kShowMenu;
-  }
-  if (EqualIgnoringASCIICase(action, keywords::kHideMenu)) {
-    return CommandEventType::kHideMenu;
-  }
-  return CommandEventType::kNone;
-}
-
 bool HTMLMenuItemElement::IsCheckable() const {
   return nearest_ancestor_menu_list_ && nearest_ancestor_field_set_ &&
          nearest_ancestor_field_set_->FastGetAttribute(
@@ -128,42 +68,12 @@
   return is_checked_;
 }
 
-void HTMLMenuItemElement::setChecked(bool checked) {
-  is_dirty_ = true;
-  // Some menu items are not "checkable", and the `checked` IDL attribute is
-  // only stateful for checkable menu items.
-  if (is_checked_ == checked || (checked && !IsCheckable())) {
-    return;
-  }
-
-  is_checked_ = checked;
-  PseudoStateChanged(CSSSelector::kPseudoChecked);
-
-  // Only update the exclusivity of all other menu items rooted under the same
-  // fieldset *if* `this` is becoming checked under a fieldset that enforces
-  // exclusivity. If it is becoming unchecked, we don't have to worry about
-  // manually unchecking other menu items in the exclusive set, because it is
-  // permitted to have zero menu items checked.
-  DCHECK(nearest_ancestor_field_set_);
-  const AtomicString& checkable =
-      nearest_ancestor_field_set_->FastGetAttribute(html_names::kCheckableAttr);
-  if (is_checked_ && EqualIgnoringASCIICase(checkable, keywords::kSingle)) {
-    nearest_ancestor_field_set_->UpdateMenuItemCheckableExclusivity(this);
-  }
-
-  // TODO(crbug.com/425682466): Accessibility mapping.
-}
-
 bool HTMLMenuItemElement::ShouldAppearChecked() const {
   // `this` should only appear checked if we are checked, and we're in a
   // checkable <fieldset> in a <menulist>.
   return IsCheckable() && checked();
 }
 
-void HTMLMenuItemElement::SetDirty(bool value) {
-  is_dirty_ = value;
-}
-
 bool HTMLMenuItemElement::IsDisabledFormControl() const {
   return FastHasAttribute(html_names::kDisabledAttr);
 }
@@ -192,263 +102,376 @@
   return SelectorChecker::MatchesFocusVisiblePseudoClass(*this);
 }
 
-void HTMLMenuItemElement::DefaultEventHandler(Event& event) {
-  if (event.type() == event_type_names::kDOMActivate) {
-    // A menu item's checkability and ability to invoke a command are
-    // exclusive. That is, we don't explicitly disallow checkable menu items
-    // that do both, so we always give `setChecked()` the chance to set `this`
-    // as checked—this will only take effect if `IsCheckable()` is true.
-    setChecked(!checked());
-
-    // Menuitems with a commandfor will dispatch a CommandEvent on the
-    // target of the invoker, and run HandleCommandInternal to perform default
-    // logic.
-    if (auto* command_target = commandForElement()) {
-      auto action =
-          GetCommandEventType(FastGetAttribute(html_names::kCommandAttr));
-      bool is_valid_builtin =
-          command_target->IsValidBuiltinCommand(*this, action);
-      bool should_dispatch =
-          is_valid_builtin || action == CommandEventType::kCustom;
-      if (should_dispatch) {
-        Event* commandEvent =
-            CommandEvent::Create(event_type_names::kCommand, command(), this);
-        command_target->DispatchEvent(*commandEvent);
-        if (is_valid_builtin && !commandEvent->defaultPrevented()) {
-          command_target->HandleCommandInternal(*this, action);
-        }
-      }
-      return;
-    }
+HTMLElement* HTMLMenuItemElement::InvokesSubmenuOrPopover() const {
+  HTMLElement* invoked_element = DynamicTo<HTMLElement>(commandForElement());
+  if (!invoked_element || !invoked_element->IsPopover()) {
+    return nullptr;
   }
-  // Handle arrow key navigation for menuitems.
-  if (HandleKeyboardActivation(event)) {
+  CommandEventType type = GetCommandEventType(
+      FastGetAttribute(html_names::kCommandAttr), GetExecutionContext());
+  if (type != CommandEventType::kTogglePopover &&
+      type != CommandEventType::kShowPopover &&
+      type != CommandEventType::kHidePopover &&
+      type != CommandEventType::kToggleMenu &&
+      type != CommandEventType::kShowMenu &&
+      type != CommandEventType::kHideMenu) {
+    return nullptr;
+  }
+  return invoked_element;
+}
+
+HTMLMenuListElement* HTMLMenuItemElement::InvokesSubmenu() const {
+  return DynamicTo<HTMLMenuListElement>(InvokesSubmenuOrPopover());
+}
+
+bool HTMLMenuItemElement::CanBeCommandInvoker() const {
+  return !FastHasAttribute(html_names::kDisabledAttr);
+}
+
+bool HTMLMenuItemElement::setChecked(bool checked) {
+  bool checkable = IsCheckable();
+  is_checked_ = checked && checkable;
+  PseudoStateChanged(CSSSelector::kPseudoChecked);
+
+  if (!checkable) {
+    // Not checkable - close the containing menulist unless this item invokes
+    // a sub-menu or a popover.
+    return !InvokesSubmenuOrPopover();
+  }
+
+  // Only update the exclusivity of all other menu items rooted under the same
+  // fieldset *if* `this` is becoming checked under a fieldset that enforces
+  // exclusivity. If it is becoming unchecked, we don't have to worry about
+  // manually unchecking other menu items in the exclusive set, because it is
+  // permitted to have zero menu items checked.
+  DCHECK(nearest_ancestor_field_set_);
+  const AtomicString& checkable_keyword =
+      nearest_ancestor_field_set_->FastGetAttribute(html_names::kCheckableAttr);
+  if (is_checked_ &&
+      EqualIgnoringASCIICase(checkable_keyword, keywords::kSingle)) {
+    nearest_ancestor_field_set_->UpdateMenuItemCheckableExclusivity(this);
+    // Exclusive checkbox - close the containing menulist after changing.
+    return true;
+  } else {
+    // Nop-exclusive checkbox - don't close the containing menulist, so that
+    // multiple values can be chosen.
+    return false;
+  }
+}
+
+void HTMLMenuItemElement::ActivateMenuItem() {
+  // A menu item's checkability and ability to invoke a command are
+  // exclusive. If the item is checkable, that takes precedence, and the sub-
+  // menu invoker will NOT be respected.
+  bool close_containing_menulist = setChecked(!checked());
+
+  // If this menu item isn't a submenu invoker, or it's a checkable menu item
+  // that wants us to close after changing, then close the containing menu.
+  if (close_containing_menulist) {
+    DCHECK(IsCheckable() || !InvokesSubmenu());
+    CloseOutermostContainingMenuList();
+  }
+  if (!IsCheckable() && InvokesSubmenuOrPopover()) {
+    HandleCommandForActivation();
+  }
+}
+
+HTMLMenuListElement* HTMLMenuItemElement::CloseOutermostContainingMenuList(
+    Element** invoker) {
+  HTMLMenuListElement* containing_menulist = OwnerMenuListElement();
+  if (invoker) {
+    *invoker = nullptr;
+  }
+  if (!containing_menulist) {
+    // This <menuitem> isn't inside a <menulist>.
+    return nullptr;
+  }
+  while (true) {
+    auto* invoking_menulist = DynamicTo<HTMLMenuListElement>(
+        HTMLElement::TopLayerElementPopoverAncestor(
+            *containing_menulist, TopLayerElementType::kPopover));
+    if (!invoking_menulist) {
+      break;
+    }
+    containing_menulist = const_cast<HTMLMenuListElement*>(invoking_menulist);
+  }
+  Element* upstream_invoker = containing_menulist->GetPopoverData()->invoker();
+  containing_menulist->HidePopoverInternal(
+      upstream_invoker, HidePopoverFocusBehavior::kNone,
+      HidePopoverTransitionBehavior::kFireEventsAndWaitForTransitions,
+      /*exception_state=*/nullptr);
+  if (invoker) {
+    *invoker = upstream_invoker;
+  }
+  return containing_menulist;
+}
+
+void HTMLMenuItemElement::HandleMenuKeyboardEvents(Event& event) {
+  auto* keyboard_event = DynamicTo<KeyboardEvent>(event);
+  if (!keyboard_event || event.type() != event_type_names::kKeydown) {
     return;
   }
-  auto* keyboard_event = DynamicTo<KeyboardEvent>(event);
+
+  // TODO(crbug.com/425708944): This is the same ignore list as option event
+  // handling and can be consolidated together.
   int tab_ignore_modifiers = WebInputEvent::kControlKey |
                              WebInputEvent::kAltKey | WebInputEvent::kMetaKey;
   int ignore_modifiers = WebInputEvent::kShiftKey | tab_ignore_modifiers;
-  FocusParams focus_params(FocusTrigger::kUserGesture);
+  if (keyboard_event->GetModifiers() & ignore_modifiers) {
+    return;
+  }
 
-  if (keyboard_event && event.type() == event_type_names::kKeydown) {
-    const AtomicString key(keyboard_event->key());
-    // TODO(crbug.com/425708944): This is the same ignore list as option event
-    // handling and can be consolidated together.
-    if (!(keyboard_event->GetModifiers() & ignore_modifiers)) {
-      if ((key == " " || key == keywords::kCapitalEnter)) {
-        // TODO(crbug.com/425682465): implement chooseItem(event).
+  FocusParams focus_params(FocusTrigger::kUserGesture);
+  const AtomicString key(keyboard_event->key());
+  if ((key == " " || key == keywords::kCapitalEnter)) {
+    // TODO(crbug.com/425682465): implement chooseItem(event).
+    // TODO: Do we need this?
+    return;
+  }
+
+  if (auto* menulist = OwnerMenuListElement()) {
+    MenuItemList menuitems = menulist->GetItemList();
+    // Nothing below can do anything, if the list is empty.
+    if (menuitems.Empty()) {
+      return;
+    }
+    if (key == keywords::kArrowUp) {
+      if (auto* previous = menuitems.PreviousFocusableMenuItem(*this)) {
+        previous->Focus(focus_params);
+      }
+      event.SetDefaultHandled();
+      return;
+    } else if (key == keywords::kArrowDown) {
+      if (auto* next = menuitems.NextFocusableMenuItem(*this)) {
+        next->Focus(focus_params);
+      }
+      event.SetDefaultHandled();
+      return;
+    } else if (key == keywords::kHome) {
+      if (auto* first = menuitems.NextFocusableMenuItem(*menuitems.begin(),
+                                                        /*inclusive=*/true)) {
+        first->Focus(focus_params);
+        event.SetDefaultHandled();
         return;
       }
-      if (auto* menulist = OwnerMenuListElement()) {
-        MenuItemList menuitems = menulist->GetItemList();
-        // Nothing below can do anything, if the list is empty.
-        if (menuitems.Empty()) {
+    } else if (key == keywords::kEnd) {
+      if (auto* last = menuitems.PreviousFocusableMenuItem(
+              *menuitems.last(), /*inclusive=*/true)) {
+        last->Focus(focus_params);
+        event.SetDefaultHandled();
+        return;
+      }
+    } else if (key == keywords::kArrowRight) {
+      // If this invokes a menulist and is itself in a menulist, then
+      // arrow right should open the invoked menulist and focus its first
+      // menuitem.
+      if (auto* invoked_menulist = InvokesSubmenu()) {
+        if (!invoked_menulist->popoverOpen()) {
+          invoked_menulist->InvokePopover(*this);
+        }
+        MenuItemList invoked_menuitems = invoked_menulist->GetItemList();
+        if (auto* first = invoked_menuitems.NextFocusableMenuItem(
+                *invoked_menuitems.begin(), /*inclusive=*/true)) {
+          first->Focus(focus_params);
+          event.SetDefaultHandled();
           return;
         }
-        if (key == keywords::kArrowUp) {
-          if (auto* previous = menuitems.PreviousFocusableMenuItem(*this)) {
-            previous->Focus(focus_params);
-          }
-          event.SetDefaultHandled();
-          return;
-        } else if (key == keywords::kArrowDown) {
-          if (auto* next = menuitems.NextFocusableMenuItem(*this)) {
-            next->Focus(focus_params);
-          }
-          event.SetDefaultHandled();
-          return;
-        } else if (key == keywords::kHome) {
-          if (auto* first = menuitems.NextFocusableMenuItem(
-                  *menuitems.begin(), /*inclusive*/ true)) {
-            first->Focus(focus_params);
-            event.SetDefaultHandled();
-            return;
-          }
-        } else if (key == keywords::kEnd) {
-          if (auto* last = menuitems.PreviousFocusableMenuItem(
-                  *menuitems.last(), /*inclusive*/ true)) {
-            last->Focus(focus_params);
-            event.SetDefaultHandled();
-            return;
-          }
-        } else if (key == keywords::kArrowRight) {
-          auto& document = GetDocument();
-          // If this invokes a menulist and is itself in a menulist, then
-          // arrow right should open the invoked menulist and focus its first
-          // menuitem.
-          if (auto* invoked_menulist =
-                  DynamicTo<HTMLMenuListElement>(commandForElement())) {
-            CommandEventType type =
-                GetCommandEventType(FastGetAttribute(html_names::kCommandAttr));
-            bool can_show =
-                (type == CommandEventType::kTogglePopover ||
-                 type == CommandEventType::kShowPopover ||
-                 type == CommandEventType::kToggleMenu ||
-                 type == CommandEventType::kShowMenu) &&
-                invoked_menulist->IsPopoverReady(
-                    PopoverTriggerAction::kShow,
-                    /*exception_state=*/nullptr,
-                    /*include_event_handler_text=*/false, &document);
-            if (can_show) {
-              invoked_menulist->InvokePopover(*this);
-            }
-            MenuItemList invoked_menuitems = invoked_menulist->GetItemList();
-            if (auto* first = invoked_menuitems.NextFocusableMenuItem(
-                    *invoked_menuitems.begin(), /*inclusive=*/true)) {
-              first->Focus(focus_params);
-              event.SetDefaultHandled();
-              return;
-            }
-          } else {
-            // Else, this menuitem does not invoke a menulist and we close all
-            // ancestor menulists. Loop to find the invoker of the lowest layer
-            // menulist ancestor.
-            HTMLElement* ancestor_menulist = menulist;
-            Element* invoker = nullptr;
-            // While the ancestor is an open menulist, it should be closed.
-            while (IsA<HTMLMenuListElement>(ancestor_menulist) &&
-                   ancestor_menulist->popoverOpen()) {
-              invoker = ancestor_menulist->GetPopoverData()->invoker();
-              ancestor_menulist = const_cast<HTMLElement*>(
-                  HTMLElement::TopLayerElementPopoverAncestor(
-                      *ancestor_menulist, TopLayerElementType::kPopover));
-            }
-            HTMLElement::HideAllPopoversUntil(
-                ancestor_menulist, document, HidePopoverFocusBehavior::kNone,
-                HidePopoverTransitionBehavior::
-                    kFireEventsAndWaitForTransitions);
-            if (invoker) {
-              // If ancestor menulist is invoked from a menubar, focus on next
-              // menuitem within the menubar.
-              if (HTMLMenuItemElement* invoker_menuitem =
-                      DynamicTo<HTMLMenuItemElement>(invoker)) {
-                if (auto* ancestor_menubar =
-                        invoker_menuitem->OwnerMenuBarElement()) {
-                  MenuItemList ancestor_menuitems =
-                      ancestor_menubar->GetItemList();
-                  if (auto* next = ancestor_menuitems.NextFocusableMenuItem(
-                          *invoker_menuitem)) {
-                    next->Focus(focus_params);
-                    event.SetDefaultHandled();
-                    return;
-                  }
-                }
-              }
-              // Else, focus on the invoker (it can be a menuitem or a button).
-              invoker->Focus(focus_params);
-              event.SetDefaultHandled();
-              return;
-            }
-          }
-
-        } else if (key == keywords::kArrowLeft) {
-          // If this is itself in a menulist, then arrow left should close the
-          // current menulist.
-          Element* invoker = menulist->GetPopoverData()->invoker();
-          bool can_hide = menulist->IsPopoverReady(
-              PopoverTriggerAction::kHide,
-              /*exception_state=*/nullptr,
-              /*include_event_handler_text=*/false, &GetDocument());
-          if (can_hide) {
-            menulist->HidePopoverInternal(
-                invoker, HidePopoverFocusBehavior::kNone,
-                HidePopoverTransitionBehavior::kFireEventsAndWaitForTransitions,
-                /*exception_state=*/nullptr);
-          }
-          if (auto* invoker_menuitem =
+      } else {
+        // Else, this menuitem does not invoke a menulist and we close all
+        // ancestor menulists. Loop to find the invoker of the lowest layer
+        // menulist ancestor.
+        Element* invoker;
+        CloseOutermostContainingMenuList(&invoker);
+        if (invoker) {
+          // If ancestor menulist is invoked from a menubar, focus on next
+          // menuitem within the menubar.
+          if (HTMLMenuItemElement* invoker_menuitem =
                   DynamicTo<HTMLMenuItemElement>(invoker)) {
-            if (auto* first_menubar = invoker_menuitem->OwnerMenuBarElement()) {
-              // Focus on previous if it is in menubar.
-              MenuItemList first_menuitems = first_menubar->GetItemList();
-              if (auto* previous = first_menuitems.PreviousFocusableMenuItem(
+            if (auto* ancestor_menubar =
+                    invoker_menuitem->OwnerMenuBarElement()) {
+              MenuItemList ancestor_menuitems = ancestor_menubar->GetItemList();
+              if (auto* next = ancestor_menuitems.NextFocusableMenuItem(
                       *invoker_menuitem)) {
-                previous->Focus(focus_params);
+                next->Focus(focus_params);
                 event.SetDefaultHandled();
                 return;
               }
             }
-            // Else, focus on invoker (it can be a button, a menuitem in a
-            // menulist or a standalone menuitem).
-            invoker->Focus(focus_params);
+          }
+          // Else, focus on the invoker (it can be a menuitem or a button).
+          invoker->Focus(focus_params);
+          event.SetDefaultHandled();
+          return;
+        }
+      }
+
+    } else if (key == keywords::kArrowLeft) {
+      // If this is itself in a menulist, then arrow left should close the
+      // current menulist.
+      Element* invoker = menulist->GetPopoverData()->invoker();
+      bool can_hide = menulist->IsPopoverReady(
+          PopoverTriggerAction::kHide,
+          /*exception_state=*/nullptr,
+          /*include_event_handler_text=*/false, &GetDocument());
+      if (can_hide) {
+        menulist->HidePopoverInternal(
+            invoker, HidePopoverFocusBehavior::kNone,
+            HidePopoverTransitionBehavior::kFireEventsAndWaitForTransitions,
+            /*exception_state=*/nullptr);
+      }
+      if (auto* invoker_menuitem = DynamicTo<HTMLMenuItemElement>(invoker)) {
+        if (auto* invoker_menubar = invoker_menuitem->OwnerMenuBarElement()) {
+          // Focus on previous if it is in menubar.
+          MenuItemList invoker_menuitems = invoker_menubar->GetItemList();
+          if (auto* previous = invoker_menuitems.PreviousFocusableMenuItem(
+                  *invoker_menuitem)) {
+            previous->Focus(focus_params);
             event.SetDefaultHandled();
             return;
           }
         }
-        // TODO(crbug.com/425682464): implement scrolling to visible menuitem,
-        // for kPageDown/kPageUp.
-      } else if (auto* menubar = OwnerMenuBarElement()) {
-        MenuItemList menuitems = menubar->GetItemList();
-        // Nothing below can do anything, if the list is empty.
-        if (menuitems.Empty()) {
-          return;
+        // Else, focus on invoker (it can be a button, a menuitem in a
+        // menulist or a standalone menuitem).
+        invoker->Focus(focus_params);
+        event.SetDefaultHandled();
+        return;
+      }
+    }
+    // TODO(crbug.com/425682464): implement scrolling to visible menuitem,
+    // for kPageDown/kPageUp.
+  } else if (auto* menubar = OwnerMenuBarElement()) {
+    MenuItemList menuitems = menubar->GetItemList();
+    // Nothing below can do anything, if the list is empty.
+    if (menuitems.Empty()) {
+      return;
+    }
+    if (key == keywords::kArrowLeft) {
+      if (auto* previous = menuitems.PreviousFocusableMenuItem(*this)) {
+        previous->Focus(focus_params);
+      }
+      event.SetDefaultHandled();
+      return;
+    } else if (key == keywords::kArrowRight) {
+      if (auto* next = menuitems.NextFocusableMenuItem(*this)) {
+        next->Focus(focus_params);
+      }
+      event.SetDefaultHandled();
+      return;
+    } else if (key == keywords::kHome) {
+      if (auto* first = menuitems.NextFocusableMenuItem(*menuitems.begin(),
+                                                        /*inclusive=*/true)) {
+        first->Focus(focus_params);
+        event.SetDefaultHandled();
+        return;
+      }
+    } else if (key == keywords::kEnd) {
+      if (auto* last = menuitems.PreviousFocusableMenuItem(
+              *menuitems.last(), /*inclusive=*/true)) {
+        last->Focus(focus_params);
+        event.SetDefaultHandled();
+        return;
+      }
+    } else if (key == keywords::kArrowDown || key == keywords::kArrowUp) {
+      // If this invokes a menulist and is in a menubar, then arrow down/up
+      // should open the menulist and go to first/last menuitem in it.
+      if (auto* invoked_menulist = InvokesSubmenu()) {
+        if (!invoked_menulist->popoverOpen()) {
+          invoked_menulist->InvokePopover(*this);
         }
-        if (key == keywords::kArrowLeft) {
-          if (auto* previous = menuitems.PreviousFocusableMenuItem(*this)) {
-            previous->Focus(focus_params);
-          }
-          event.SetDefaultHandled();
-          return;
-        } else if (key == keywords::kArrowRight) {
-          if (auto* next = menuitems.NextFocusableMenuItem(*this)) {
-            next->Focus(focus_params);
-          }
-          event.SetDefaultHandled();
-          return;
-        } else if (key == keywords::kHome) {
-          if (auto* first = menuitems.NextFocusableMenuItem(
-                  *menuitems.begin(), /*inclusive*/ true)) {
+        MenuItemList invoked_menuitems = invoked_menulist->GetItemList();
+        if (key == keywords::kArrowDown) {
+          if (auto* first = invoked_menuitems.NextFocusableMenuItem(
+                  *invoked_menuitems.begin(), /*inclusive=*/true)) {
             first->Focus(focus_params);
             event.SetDefaultHandled();
             return;
           }
-        } else if (key == keywords::kEnd) {
-          if (auto* last = menuitems.PreviousFocusableMenuItem(
-                  *menuitems.last(), /*inclusive*/ true)) {
+        } else if (key == keywords::kArrowUp) {
+          if (auto* last = invoked_menuitems.PreviousFocusableMenuItem(
+                  *invoked_menuitems.last(), /*inclusive=*/true)) {
             last->Focus(focus_params);
             event.SetDefaultHandled();
             return;
           }
-        } else if (key == keywords::kArrowDown || key == keywords::kArrowUp) {
-          // If this invokes a menulist and is in a menubar, then arrow down/up
-          // should open the menulist and go to first/last menuitem in it.
-          if (auto* invoked_menulist =
-                  DynamicTo<HTMLMenuListElement>(commandForElement())) {
-            CommandEventType type =
-                GetCommandEventType(FastGetAttribute(html_names::kCommandAttr));
-            bool can_show =
-                (type == CommandEventType::kTogglePopover ||
-                 type == CommandEventType::kShowPopover ||
-                 type == CommandEventType::kToggleMenu ||
-                 type == CommandEventType::kShowMenu) &&
-                invoked_menulist->IsPopoverReady(
-                    PopoverTriggerAction::kShow,
-                    /*exception_state=*/nullptr,
-                    /*include_event_handler_text=*/false, &GetDocument());
-            if (can_show) {
-              invoked_menulist->InvokePopover(*this);
-            }
-            MenuItemList invoked_menuitems = invoked_menulist->GetItemList();
-            if (key == keywords::kArrowDown) {
-              if (auto* first = invoked_menuitems.NextFocusableMenuItem(
-                      *invoked_menuitems.begin(), /*inclusive=*/true)) {
-                first->Focus(focus_params);
-                event.SetDefaultHandled();
-                return;
-              }
-            } else if (key == keywords::kArrowUp) {
-              if (auto* last = invoked_menuitems.PreviousFocusableMenuItem(
-                      *invoked_menuitems.last(), /*inclusive=*/true)) {
-                last->Focus(focus_params);
-                event.SetDefaultHandled();
-                return;
-              }
-            }
-          }
         }
       }
     }
   }
+}
+
+bool HTMLMenuItemElement::HandleMenuPointerEvents(Event& event) {
+  // This implements the special "mouse down, drag to menu item, mouse up"
+  // behavior. This is a mouse-only behavior - it should not apply to pointer
+  // events for touchscreens. Touch events will be handled by the normal input
+  // system behavior of sending a DOMActivate event. This also does not apply
+  // to checkable menu items, which also rely on DOMActivate.
+  const auto* mouse_event = DynamicTo<MouseEvent>(event);
+  if (!mouse_event || mouse_event->FromTouch() ||
+      mouse_event->button() !=
+          static_cast<int16_t>(WebPointerProperties::Button::kLeft) ||
+      (event.type() != event_type_names::kMouseup &&
+       event.type() != event_type_names::kMousedown)) {
+    return false;
+  }
+
+  if (event.type() == event_type_names::kMouseup) {
+    // We leave the picker open, and do not "pick" a menu item, iff:
+    //  1. The mousedown was on a <menuitem> that triggers a sub-menu via
+    //     `commandfor`, so we have a mousedown location stored, and
+    //  2. The mouseup on this <menuitem> was within kEpsilon layout units
+    //     (post zoom, page-relative) of the location of the mousedown. I.e.
+    //     the mouse was not dragged between mousedown and mouseup. I.e. this
+    //     was just a "click" to open the menuitem's sub-menu - it shouldn't
+    //     pick anything yet.
+    std::optional<gfx::PointF> mouse_down_loc =
+        GetDocument().PopoverPickerMousedownLocation();
+    GetDocument().SetPopoverPickerMousedownLocation(std::nullopt);
+    // TODO(masonf) This kEpsilon should be combined with the one in
+    // html_option_element.cc.
+    constexpr float kEpsilon = 5;  // 5 pixels in any direction
+    bool activate_menu_item = !mouse_down_loc.has_value() ||
+                              !mouse_down_loc->IsWithinDistance(
+                                  mouse_event->AbsoluteLocation(), kEpsilon);
+    if (activate_menu_item) {
+      // The mouse moved, so select this menu item.
+      ActivateMenuItem();
+    }
+    // TODO(crbug.com/406566432): This is a hack, and isn't strictly correct.
+    // We need a better way to ignore the synthetic `click` that triggers the
+    // `DOMActivate` that would double-trigger the menu in this case.
+    ignore_next_dom_activate_ = true;
+  } else {
+    DCHECK_EQ(event.type(), event_type_names::kMousedown);
+    if (!InvokesSubmenu()) {
+      return false;
+    }
+    GetDocument().SetPopoverPickerMousedownLocation(
+        mouse_event->FromTouch()
+            ? std::nullopt
+            : std::optional(mouse_event->AbsoluteLocation()));
+    // Activate sub-menus on mouse *down*, so that the user can drag and release
+    // to choose a sub-menu item.
+    ActivateMenuItem();
+  }
+  return true;
+}
+
+void HTMLMenuItemElement::DefaultEventHandler(Event& event) {
+  if (HandleKeyboardActivation(event)) {
+    return;
+  }
+  if (event.type() == event_type_names::kDOMActivate) {
+    if (ignore_next_dom_activate_) {
+      ignore_next_dom_activate_ = false;
+    } else {
+      ActivateMenuItem();
+    }
+    return;
+  }
+  if (HandleMenuPointerEvents(event)) {
+    return;
+  }
+  HandleMenuKeyboardEvents(event);
   HTMLElement::DefaultEventHandler(event);
 }
 
diff --git a/third_party/blink/renderer/core/html/html_menu_item_element.h b/third_party/blink/renderer/core/html/html_menu_item_element.h
index 94274c4..e5e38b4 100644
--- a/third_party/blink/renderer/core/html/html_menu_item_element.h
+++ b/third_party/blink/renderer/core/html/html_menu_item_element.h
@@ -26,19 +26,16 @@
 
   bool IsCheckable() const;
   bool checked() const;
-  // This only sets `this` to checked if `IsCheckable()` is true.
-  void setChecked(bool);
+  // This only sets `this` to checked if `IsCheckable()` is true. The return
+  // value is true if this is a checkable menu item *and* a containing menu list
+  // should be closed after changing the checked state.
+  bool setChecked(bool);
   bool ShouldAppearChecked() const;
 
   HTMLMenuBarElement* OwnerMenuBarElement() const;
   HTMLMenuListElement* OwnerMenuListElement() const;
 
-  // Invoker Commands (https://github.com/whatwg/html/pull/9841)
-  // TODO: Have command and commandfor attributes specced for menuitem.
-  Element* commandForElement() const;
-  AtomicString command() const;
-  void setCommand(const AtomicString& type);
-  CommandEventType GetCommandEventType(const AtomicString& type) const;
+  bool CanBeCommandInvoker() const override;
 
   Node::InsertionNotificationRequest InsertedInto(ContainerNode&) override;
   void RemovedFrom(ContainerNode&) override;
@@ -47,9 +44,8 @@
   bool IsKeyboardFocusableSlow(
       UpdateBehavior update_behavior =
           UpdateBehavior::kStyleAndLayout) const override;
-  void DefaultEventHandler(Event&) override;
 
-  void SetDirty(bool);
+  void DefaultEventHandler(Event&) override;
 
  private:
   bool MatchesDefaultPseudoClass() const override;
@@ -60,6 +56,19 @@
   FocusableState SupportsFocus(UpdateBehavior update_behavior) const override;
   bool ShouldHaveFocusAppearance() const override;
 
+  HTMLElement* InvokesSubmenuOrPopover() const;
+  HTMLMenuListElement* InvokesSubmenu() const;
+  // This is generally used when a menuitem has been selected, and the "tree" of
+  // menus should now close. It finds the innermost (nearest ancestor) menulist
+  // containing this menuitem, and then walks the tree of command invokers up
+  // to find any nested containing menulist's. It then closes the outermost
+  // such menulist, which (via popover close behavior) closes the tree.
+  HTMLMenuListElement* CloseOutermostContainingMenuList(
+      Element** invoker = nullptr);
+  void ActivateMenuItem();
+  bool HandleMenuPointerEvents(Event&);
+  void HandleMenuKeyboardEvents(Event&);
+
   // Traverse ancestors to find the nearest menubar or menulist ancestor.
   void ResetNearestAncestorMenuBarOrMenuList();
   // Traverse ancestors to find the nearest fieldset ancestor.
@@ -73,9 +82,8 @@
 
   // Represents 'checkedness'.
   bool is_checked_;
-  // Represents 'dirty checkness flag'. This controls whether changing the
-  // checked attribute has any effect on whether the element is checked or not.
-  bool is_dirty_ = false;
+  // This is used to avoid double-invoking target menus and popovers.
+  bool ignore_next_dom_activate_ = false;
 
   friend class HTMLMenuItemElementTest;
 };
diff --git a/third_party/blink/renderer/core/html/html_menu_list_element.cc b/third_party/blink/renderer/core/html/html_menu_list_element.cc
index 7e19d43..ec508c5 100644
--- a/third_party/blink/renderer/core/html/html_menu_list_element.cc
+++ b/third_party/blink/renderer/core/html/html_menu_list_element.cc
@@ -25,4 +25,49 @@
          command == CommandEventType::kHideMenu;
 }
 
+bool HTMLMenuListElement::HandleCommandInternal(HTMLElement& invoker,
+                                                CommandEventType command) {
+  DCHECK(RuntimeEnabledFeatures::MenuElementsEnabled());
+  if (!IsValidBuiltinCommand(invoker, command)) {
+    return false;
+  }
+  if (HTMLElement::HandleCommandInternal(invoker, command)) {
+    return true;
+  }
+  if (command != CommandEventType::kToggleMenu &&
+      command != CommandEventType::kShowMenu &&
+      command != CommandEventType::kHideMenu) {
+    return false;
+  }
+
+  auto& document = GetDocument();
+  bool can_show =
+      IsPopoverReady(PopoverTriggerAction::kShow,
+                     /*exception_state=*/nullptr,
+                     /*include_event_handler_text=*/true, &document) &&
+      (command == CommandEventType::kToggleMenu ||
+       command == CommandEventType::kShowMenu);
+  bool can_hide =
+      IsPopoverReady(PopoverTriggerAction::kHide,
+                     /*exception_state=*/nullptr,
+                     /*include_event_handler_text=*/true, &document) &&
+      (command == CommandEventType::kToggleMenu ||
+       command == CommandEventType::kHideMenu);
+  // If the triggering invoker is a `<menuitem>` that is also checkable, then
+  // the `return true`'s below will cause the checkable behavior not to fire.
+  if (can_hide) {
+    HidePopoverInternal(
+        &invoker, HidePopoverFocusBehavior::kFocusPreviousElement,
+        HidePopoverTransitionBehavior::kFireEventsAndWaitForTransitions,
+        /*exception_state=*/nullptr);
+    return true;
+  } else if (can_show) {
+    // TODO(crbug.com/1121840) HandleCommandInternal is called for both
+    // `popovertarget` and `commandfor`.
+    InvokePopover(invoker);
+    return true;
+  }
+  return false;
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/html/html_menu_list_element.h b/third_party/blink/renderer/core/html/html_menu_list_element.h
index e69367e3e..c4d1933 100644
--- a/third_party/blink/renderer/core/html/html_menu_list_element.h
+++ b/third_party/blink/renderer/core/html/html_menu_list_element.h
@@ -18,6 +18,9 @@
 
   bool IsValidBuiltinCommand(HTMLElement& invoker,
                              CommandEventType command) override;
+  bool HandleCommandInternal(HTMLElement& invoker,
+                             CommandEventType command) override;
+
   // This returns an iterable list of menuitems whose owner is this.
   MenuItemList GetItemList() const { return MenuItemList(*this); }
 };
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index 29cb954..53a1c03 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -1515,8 +1515,9 @@
 
 bool HTMLMediaElement::HandleCommandInternal(HTMLElement& invoker,
                                              CommandEventType command) {
-  CHECK(IsValidBuiltinCommand(invoker, command));
-
+  if (!IsValidBuiltinCommand(invoker, command)) {
+    return false;
+  }
   if (HTMLElement::HandleCommandInternal(invoker, command)) {
     return true;
   }
diff --git a/third_party/blink/renderer/core/html/resources/html.css b/third_party/blink/renderer/core/html/resources/html.css
index 24d59c2..bd06ab147 100644
--- a/third_party/blink/renderer/core/html/resources/html.css
+++ b/third_party/blink/renderer/core/html/resources/html.css
@@ -2365,6 +2365,7 @@
   menubar, menulist {
     menuitem {
       align-items: center;
+      user-select: none;
 
       /* The min-*-size rules below were inspired by the same rules for
        * customizable select, and mostly cater to WCAG accessibility guidelines
diff --git a/third_party/blink/renderer/core/layout/anchor_evaluator_impl.cc b/third_party/blink/renderer/core/layout/anchor_evaluator_impl.cc
index 7db77c87..bff41e7 100644
--- a/third_party/blink/renderer/core/layout/anchor_evaluator_impl.cc
+++ b/third_party/blink/renderer/core/layout/anchor_evaluator_impl.cc
@@ -10,7 +10,6 @@
 #include "third_party/blink/renderer/core/css/anchor_query.h"
 #include "third_party/blink/renderer/core/dom/layout_tree_builder_traversal.h"
 #include "third_party/blink/renderer/core/layout/anchor_position_scroll_data.h"
-#include "third_party/blink/renderer/core/layout/anchor_query_map.h"
 #include "third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h"
 #include "third_party/blink/renderer/core/layout/layout_box.h"
 #include "third_party/blink/renderer/core/layout/transform_utils.h"
@@ -378,28 +377,6 @@
   }
 }
 
-const PhysicalAnchorQuery* AnchorEvaluatorImpl::AnchorQuery() const {
-  // TODO(crbug.com/436305267): Remove these two members when
-  // StitchedAnchorQueries is removed.
-  DCHECK((!anchor_queries_ && !containing_block_) ||
-         !RuntimeEnabledFeatures::CSSAnchorSimplifiedFragmentationEnabled());
-
-  if (anchor_query_)
-    return anchor_query_;
-  if (anchor_queries_) {
-    DCHECK(containing_block_);
-    anchor_query_ = anchor_queries_->AnchorQuery(*containing_block_);
-    if (!anchor_query_) {
-      // The above operation is expensive. If there were no anchors for the
-      // containing block, make sure that we don't try again every time this
-      // function is called.
-      anchor_queries_ = nullptr;
-    }
-    return anchor_query_;
-  }
-  return nullptr;
-}
-
 std::optional<LayoutUnit> AnchorEvaluatorImpl::Evaluate(
     const class AnchorQuery& anchor_query,
     const ScopedCSSName* position_anchor,
@@ -422,23 +399,20 @@
   if (!anchor_specifier.IsNamed() && !position_anchor && !implicit_anchor_) {
     return nullptr;
   }
-  const PhysicalAnchorQuery* anchor_query = AnchorQuery();
-  if (!anchor_query) {
+  if (!anchor_query_) {
     return nullptr;
   }
-  DCHECK(RuntimeEnabledFeatures::CSSAnchorSimplifiedFragmentationEnabled() ||
-         !query_box_actual_containing_block_);
   if (anchor_specifier.IsNamed()) {
-    return anchor_query->AnchorReference(
+    return anchor_query_->AnchorReference(
         *query_box_, query_box_actual_containing_block_,
         ToAnchorScopedName(anchor_specifier.GetName(), *query_box_));
   }
   if (anchor_specifier.IsDefault() && position_anchor) {
-    return anchor_query->AnchorReference(
+    return anchor_query_->AnchorReference(
         *query_box_, query_box_actual_containing_block_,
         ToAnchorScopedName(*position_anchor, *query_box_));
   }
-  return anchor_query->AnchorReference(
+  return anchor_query_->AnchorReference(
       *query_box_, query_box_actual_containing_block_,
       To<Element>(implicit_anchor_->GetNode()));
 }
diff --git a/third_party/blink/renderer/core/layout/anchor_evaluator_impl.h b/third_party/blink/renderer/core/layout/anchor_evaluator_impl.h
index 0c176b72..889a5ec 100644
--- a/third_party/blink/renderer/core/layout/anchor_evaluator_impl.h
+++ b/third_party/blink/renderer/core/layout/anchor_evaluator_impl.h
@@ -27,7 +27,6 @@
 class Element;
 class LayoutBox;
 class LayoutObject;
-class StitchedAnchorQueries;
 class PaintLayer;
 class PhysicalFragment;
 
@@ -260,28 +259,6 @@
     DCHECK(anchor_query_);
   }
 
-  // This constructor takes |StitchedAnchorQueries| and |containing_block|
-  // instead of |PhysicalAnchorQuery|.
-  AnchorEvaluatorImpl(const LayoutBox& query_box,
-                      const StitchedAnchorQueries& anchor_queries,
-                      const LayoutObject* implicit_anchor,
-                      const LayoutObject& containing_block,
-                      WritingDirectionMode container_writing_direction,
-                      const PhysicalRect& container_rect,
-                      const std::optional<PhysicalRect>& scroll_rect)
-      : query_box_(&query_box),
-        anchor_queries_(&anchor_queries),
-        implicit_anchor_(implicit_anchor),
-        containing_block_(&containing_block),
-        container_writing_direction_(container_writing_direction),
-        container_rect_(container_rect),
-        scroll_rect_(scroll_rect),
-        display_locks_affected_by_anchors_(
-            MakeGarbageCollected<GCedHeapHashSet<Member<Element>>>()) {
-    DCHECK(anchor_queries_);
-    DCHECK(containing_block_);
-  }
-
   // Returns true if any anchor reference in the axis is in the same scroll
   // container as the default anchor, in which case we need scroll adjustment in
   // the axis after layout.
@@ -306,7 +283,7 @@
   std::optional<PhysicalOffset> ComputeAnchorCenterOffsets(
       const ComputedStyleBuilder&) override;
 
-  const PhysicalAnchorQuery* AnchorQuery() const;
+  const PhysicalAnchorQuery* AnchorQuery() const { return anchor_query_; }
 
   // Given the computed value of `position-anchor`, returns the default anchor.
   const LayoutObject* DefaultAnchor(const ScopedCSSName* position_anchor) const;
@@ -378,13 +355,8 @@
 
   const LayoutBox* query_box_ = nullptr;
   mutable const PhysicalAnchorQuery* anchor_query_ = nullptr;
-  mutable const StitchedAnchorQueries* anchor_queries_ = nullptr;
   const LayoutObject* implicit_anchor_ = nullptr;
 
-  // TODO(crbug.com/436305267): Remove this when StitchedAnchorQueries is
-  // removed.
-  const LayoutObject* containing_block_ = nullptr;
-
   // The (CSS) containing block of the querying element. This should only be set
   // if the containing block in the physical fragment tree is not the same as
   // this. This inconsistency happens when OOFs participate in block
diff --git a/third_party/blink/renderer/core/layout/anchor_query_map.cc b/third_party/blink/renderer/core/layout/anchor_query_map.cc
deleted file mode 100644
index a3ee4f1..0000000
--- a/third_party/blink/renderer/core/layout/anchor_query_map.cc
+++ /dev/null
@@ -1,466 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "third_party/blink/renderer/core/layout/anchor_query_map.h"
-
-#include "third_party/blink/renderer/core/dom/element.h"
-#include "third_party/blink/renderer/core/layout/geometry/writing_mode_converter.h"
-#include "third_party/blink/renderer/core/layout/inline/inline_cursor.h"
-#include "third_party/blink/renderer/core/layout/logical_fragment_link.h"
-#include "third_party/blink/renderer/core/layout/pagination_utils.h"
-#include "third_party/blink/renderer/core/layout/physical_box_fragment.h"
-#include "third_party/blink/renderer/platform/runtime_enabled_features.h"
-
-namespace blink {
-
-namespace {
-
-LogicalFragmentLink GetFragmentainerLink(
-    const LogicalFragmentLink& fragmentation_context_root_child) {
-  // Multicol:
-  if (fragmentation_context_root_child->IsColumnBox()) {
-    return fragmentation_context_root_child;
-  }
-  // Pagination:
-  if (fragmentation_context_root_child->GetBoxType() ==
-      PhysicalFragment::kPageContainer) {
-    // The fragmentainer is the page area, which is wrapped inside a page border
-    // box fragment inside a page container fragment. Offsets don't matter here,
-    // as each page establishes its own coordinate system.
-    const PhysicalBoxFragment& page_area = GetPageArea(GetPageBorderBox(
-        *To<PhysicalBoxFragment>(fragmentation_context_root_child.get())));
-    return LogicalFragmentLink(page_area, LogicalOffset());
-  }
-
-  return LogicalFragmentLink();
-}
-
-// Represents a fragmentainer. This is in the logical coordinate system
-// for convenience reasons.
-struct FragmentainerContext {
-  STACK_ALLOCATED();
-
- public:
-  LogicalOffset offset;
-  // The block offset when all fragments are stitched in the block direction.
-  // That is, the sum of block offsets of preceding fragments.
-  LayoutUnit stitched_offset;
-  WritingModeConverter converter;
-};
-
-// This struct is a variation of |AnchorReference|, using the stitched
-// coordinate system for the block-fragmented out-of-flow positioned objects.
-struct StitchedAnchorReference
-    : public GarbageCollected<StitchedAnchorReference> {
-  StitchedAnchorReference(const Element& element,
-                          const LogicalRect& rect,
-                          const FragmentainerContext& fragmentainer)
-      : element(&element),
-        rect_in_first_fragmentainer(rect),
-        first_fragmentainer_offset(fragmentainer.offset),
-        first_fragmentainer_stitched_offset(fragmentainer.stitched_offset) {}
-
-  LogicalRect StitchedRect() const {
-    LogicalRect stitched_rect = rect_in_first_fragmentainer;
-    stitched_rect.offset.block_offset += first_fragmentainer_stitched_offset;
-    return stitched_rect;
-  }
-
-  PhysicalAnchorReference* GetStitchedAnchorReference(
-      const WritingModeConverter& converter) const {
-    PhysicalRect physical_rect = converter.ToPhysical(StitchedRect());
-    TransformState transform_state(TransformState::kApplyTransformDirection,
-                                   gfx::QuadF(gfx::RectF(physical_rect)));
-
-    return MakeGarbageCollected<PhysicalAnchorReference>(
-        *element, transform_state, physical_rect, /*is_out_of_flow=*/false,
-        nullptr);
-  }
-
-  void Unite(const LogicalRect& other_rect,
-             const LogicalOffset& fragmentainer_offset) {
-    // To unite fragments in the physical coordinate system as defined in the
-    // spec while keeping the |reference.rect| relative to the first
-    // fragmentainer, make the |fragmentainer_offset| relative to the first
-    // fragmentainer.
-    const LogicalRect other_rect_in_first_fragmentainer =
-        other_rect + (fragmentainer_offset - first_fragmentainer_offset);
-    rect_in_first_fragmentainer.Unite(other_rect_in_first_fragmentainer);
-  }
-
-  void Trace(Visitor* visitor) const { visitor->Trace(element); }
-
-  Member<const Element> element;
-  // The |rect_in_first_fragmentainer| is relative to the first fragmentainer,
-  // so that it can a) unite following fragments in the physical coordinate
-  // system, and b) compute the result in the stitched coordinate system.
-  LogicalRect rect_in_first_fragmentainer;
-  LogicalOffset first_fragmentainer_offset;
-  // The block offset when all fragments are stitched in the block direction.
-  LayoutUnit first_fragmentainer_stitched_offset;
-};
-
-// This creates anchor queries in the stitched coordinate system. The result
-// can be converted to a |PhysicalAnchorQuery|.
-struct StitchedAnchorQuery : public GarbageCollected<StitchedAnchorQuery>,
-                             public AnchorQueryBase<StitchedAnchorReference> {
-  using Base = AnchorQueryBase<StitchedAnchorReference>;
-
-  // Convert |this| to a |PhysicalAnchorQuery|. The result is a regular
-  // |PhysicalAnchorQuery| except that its coordinate system is stitched
-  // (i.e., as if they weren't fragmented.)
-  PhysicalAnchorQuery* GetStitchedAnchorQuery(
-      const WritingModeConverter& converter) const {
-    auto* anchor_query = MakeGarbageCollected<PhysicalAnchorQuery>();
-    for (const auto entry : *this) {
-      anchor_query->Set(entry.key,
-                        entry.value->GetStitchedAnchorReference(converter));
-    }
-    return anchor_query;
-  }
-
-  enum class Conflict {
-    // The last entry wins. The calls must be in the tree order.
-    kLastInCallOrder,
-    // Overwrite existing entry if the new one is before the existing one.
-    kOverwriteIfAfter,
-  };
-
-  void AddAnchorQuery(const PhysicalFragment& fragment,
-                      const PhysicalOffset& offset_from_fragmentainer,
-                      const FragmentainerContext& fragmentainer) {
-    const PhysicalAnchorQuery* anchor_query = fragment.AnchorQuery();
-    if (!anchor_query)
-      return;
-    for (auto entry : *anchor_query) {
-      DCHECK(entry.value->GetLayoutObject());
-      // TODO(crbug.com/425388879): Handle transforms correctly (ideally just
-      // delete all this code (the entire file), which what the referenced bug
-      // is about).
-      AddAnchorReference(
-          entry.key, *entry.value->GetLayoutObject(),
-          entry.value->RectWithoutTransforms() + offset_from_fragmentainer,
-          fragmentainer, Conflict::kLastInCallOrder);
-    }
-  }
-
-  void AddAnchorReference(const AnchorKey& key,
-                          const LayoutObject& new_object,
-                          const PhysicalRect& physical_rect_in_fragmentainer,
-                          const FragmentainerContext& fragmentainer,
-                          Conflict conflict) {
-    const LogicalRect rect_in_fragmentainer =
-        fragmentainer.converter.ToLogical(physical_rect_in_fragmentainer);
-    auto* new_value = MakeGarbageCollected<StitchedAnchorReference>(
-        *To<Element>(new_object.GetNode()), rect_in_fragmentainer,
-        fragmentainer);
-    const auto result = Base::insert(key, new_value);
-    if (result.is_new_entry)
-      return;
-
-    // If this is a fragment of the existing box, unite it with other fragments.
-    StitchedAnchorReference* existing = *result.stored_value;
-    const Element* existing_element = existing->element;
-    const LayoutObject* existing_object = existing_element->GetLayoutObject();
-    DCHECK(existing_object);
-    if (existing_element == new_object.GetNode()) {
-      existing->Unite(rect_in_fragmentainer, fragmentainer.offset);
-      return;
-    }
-
-    // If this is the same anchor-name on a different box, the last one in the
-    // pre-order wins. Normally, the call order is in the layout-order, which is
-    // pre-order of the box tree. But OOFs may be laid out later, check the tree
-    // order in such case.
-    switch (conflict) {
-      case Conflict::kLastInCallOrder:
-        DCHECK(existing_object->IsBeforeInPreOrder(new_object));
-        *existing = *new_value;
-        break;
-      case Conflict::kOverwriteIfAfter:
-        if (!new_object.IsBeforeInPreOrder(*existing_object)) {
-          *existing = *new_value;
-        }
-        break;
-    }
-  }
-};
-
-// This collects |StitchedAnchorQuery| for each containing block.
-struct StitchedAnchorQueryCollector {
-  STACK_ALLOCATED();
-
- public:
-  StitchedAnchorQueryCollector(const LayoutBox& root,
-                               const HeapHashSet<Member<const LayoutObject>>&
-                                   anchored_oof_containers_and_ancestors)
-      : anchored_oof_containers_and_ancestors_(
-            anchored_oof_containers_and_ancestors),
-        root_(root) {}
-
-  void AddFragmentainerChildren(base::span<const LogicalFragmentLink> children,
-                                WritingDirectionMode writing_direction) {
-    LayoutUnit fragmentainer_stitched_offset;
-    for (const LogicalFragmentLink& candidate : children) {
-      LogicalFragmentLink child = GetFragmentainerLink(candidate);
-      if (!child) {
-        // Skip the child if it isn't a fragmentainer. This may for instance be
-        // a column spanner or a list item marker. They are are direct child
-        // fragments of a multicol container fragment, but do not participate in
-        // fragmentation.
-        continue;
-      }
-
-      const FragmentainerContext fragmentainer{
-          child.offset,
-          fragmentainer_stitched_offset,
-          {writing_direction, child->Size()}};
-      AddChild(*child, /* offset_from_fragmentainer */ {}, fragmentainer);
-      if (const auto* token = To<BlockBreakToken>(child->GetBreakToken())) {
-        fragmentainer_stitched_offset = token->ConsumedBlockSize();
-      }
-    }
-  }
-
-  void AddChild(const PhysicalFragment& fragment,
-                const PhysicalOffset& offset_from_fragmentainer,
-                const FragmentainerContext& fragmentainer) {
-    if (const auto* box = DynamicTo<PhysicalBoxFragment>(&fragment)) {
-      AddBoxChild(*box, offset_from_fragmentainer, fragmentainer);
-    }
-  }
-
-  void AddBoxChild(const PhysicalBoxFragment& fragment,
-                   const PhysicalOffset& offset_from_fragmentainer,
-                   const FragmentainerContext& fragmentainer) {
-    if (fragment.IsOutOfFlowPositioned()) {
-      AddOutOfFlowChild(fragment, offset_from_fragmentainer, fragmentainer);
-      return;
-    }
-
-    // Return early if the |fragment| doesn't have any anchors. No need to
-    // traverse descendants.
-    const PhysicalAnchorQuery* anchor_query = fragment.AnchorQuery();
-    if (!anchor_query)
-      return;
-
-    // Create |StitchedAnchorQuery| if this is a containing block.
-    if (const LayoutObject* layout_object = fragment.GetLayoutObject()) {
-      if (!anchored_oof_containers_and_ancestors_.Contains(layout_object))
-        return;
-      if (layout_object->CanContainAbsolutePositionObjects() ||
-          layout_object->CanContainFixedPositionObjects()) {
-        EnsureStitchedAnchorQuery(*layout_object)
-            .AddAnchorQuery(fragment, offset_from_fragmentainer, fragmentainer);
-      }
-    } else if (fragment.GetBoxType() == PhysicalFragment::kPageArea) {
-      // The initial containing block (LayoutView) is on the outside of the
-      // fragmentation context, so special attention is required when processing
-      // page area fragmentainers.
-      EnsureStitchedAnchorQuery(*fragment.OwnerLayoutBox())
-          .AddAnchorQuery(fragment, offset_from_fragmentainer, fragmentainer);
-    }
-
-    if (fragment.IsFragmentationContextRoot()) {
-      AddFragmentationContextRootChild(fragment, offset_from_fragmentainer,
-                                       fragmentainer);
-      return;
-    }
-
-    // Add inline children if any.
-    if (const FragmentItems* items = fragment.Items()) {
-      for (InlineCursor cursor(fragment, *items); cursor; cursor.MoveToNext()) {
-        if (cursor.Current().IsInlineBox()) {
-          DCHECK(cursor.Current().BoxFragment());
-          AddBoxChild(*cursor.Current().BoxFragment(),
-                      offset_from_fragmentainer +
-                          cursor.Current()->OffsetInContainerFragment(),
-                      fragmentainer);
-        }
-      }
-    }
-
-    // Add block children if any.
-    for (const PhysicalFragmentLink& child : fragment.Children()) {
-      DCHECK(!child->IsFragmentainerBox());
-      const auto child_offset_from_fragmentainer =
-          offset_from_fragmentainer + child.offset;
-      AddChild(*child, child_offset_from_fragmentainer, fragmentainer);
-    }
-  }
-
-  void AddFragmentationContextRootChild(
-      const PhysicalBoxFragment& fragment,
-      const PhysicalOffset& offset_from_fragmentainer,
-      const FragmentainerContext& fragmentainer) {
-    DCHECK(fragment.IsFragmentationContextRoot());
-    DCHECK(!fragment.Items());
-    HeapVector<LogicalFragmentLink> children;
-    for (const PhysicalFragmentLink& child : fragment.Children()) {
-      const LogicalOffset child_offset =
-          fragmentainer.converter.ToLogical(
-              offset_from_fragmentainer + child.offset, child->Size()) +
-          fragmentainer.offset;
-      children.push_back(LogicalFragmentLink(*child.fragment, child_offset));
-    }
-    AddFragmentainerChildren(children,
-                             fragmentainer.converter.GetWritingDirection());
-  }
-
-  void AddOutOfFlowChild(const PhysicalBoxFragment& fragment,
-                         const PhysicalOffset& offset_from_fragmentainer,
-                         const FragmentainerContext& fragmentainer) {
-    DCHECK(fragment.IsOutOfFlowPositioned());
-    if (!fragment.HasAnchorQueryToPropagate()) {
-      return;
-    }
-    // OOF fragments in block-fragmentation context are children of the
-    // fragmentainers, but they should be added to anchor queries of their
-    // containing block chain. Traverse the containing block chain and add
-    // references to all |LayoutObject|, up to the |root_|.
-    const LayoutObject* layout_object = fragment.GetLayoutObject();
-    DCHECK(layout_object);
-    LayoutObject::AncestorSkipInfo skip_info(&root_);
-    const LayoutObject* containing_block = layout_object->Container(&skip_info);
-    // If the OOF is to be laid out in the fragmentation context, its containing
-    // block should be a descendant of the |root_|.
-    DCHECK(containing_block);
-    DCHECK_NE(containing_block, &root_);
-    DCHECK(!skip_info.AncestorSkipped());
-    // Skip the first containing block, because the spec defines "If el has the
-    // same containing block as query el, el is not absolutely positioned." That
-    // said, for absolutely positioned anchors should be invalid for the first
-    // containing block.
-    // https://drafts.csswg.org/css-anchor-1/#determining
-    containing_block = containing_block->Container(&skip_info);
-    while (containing_block && containing_block != root_ &&
-           !skip_info.AncestorSkipped()) {
-      StitchedAnchorQuery& query = EnsureStitchedAnchorQuery(*containing_block);
-      if (fragment.IsExplicitAnchor()) {
-        for (const ScopedCSSName* name :
-             fragment.Style().AnchorName()->GetNames()) {
-          AnchorScopedName* anchor_scoped_name =
-              ToAnchorScopedName(*name, *layout_object);
-          query.AddAnchorReference(
-              anchor_scoped_name, *fragment.GetLayoutObject(),
-              {offset_from_fragmentainer, fragment.Size()}, fragmentainer,
-              StitchedAnchorQuery::Conflict::kOverwriteIfAfter);
-        }
-      }
-      if (fragment.IsImplicitAnchor()) {
-        query.AddAnchorReference(
-            To<Element>(layout_object->GetNode()), *fragment.GetLayoutObject(),
-            {offset_from_fragmentainer, fragment.Size()}, fragmentainer,
-            StitchedAnchorQuery::Conflict::kOverwriteIfAfter);
-      }
-      query.AddAnchorQuery(fragment, offset_from_fragmentainer, fragmentainer);
-      containing_block = containing_block->Container(&skip_info);
-    }
-  }
-
-  StitchedAnchorQuery& EnsureStitchedAnchorQuery(
-      const LayoutObject& containing_block) {
-    const auto result = anchor_queries_.insert(
-        &containing_block, MakeGarbageCollected<StitchedAnchorQuery>());
-    DCHECK(result.stored_value->value);
-    return *result.stored_value->value;
-  }
-
-  HeapHashMap<Member<const LayoutObject>, Member<StitchedAnchorQuery>>
-      anchor_queries_;
-  // The set of |LayoutObject| to traverse. When adding children, children not
-  // in this set are skipped.
-  const HeapHashSet<Member<const LayoutObject>>&
-      anchored_oof_containers_and_ancestors_;
-  const LayoutBox& root_;
-};
-
-}  // namespace
-
-StitchedAnchorQueries::StitchedAnchorQueries(
-    const LayoutBox& root_box,
-    LogicalSize container_size,
-    const LogicalFragmentLinkVector& children,
-    WritingDirectionMode writing_direction)
-    : root_box_(root_box),
-      container_size_(container_size),
-      writing_direction_(writing_direction) {
-  DCHECK(!RuntimeEnabledFeatures::CSSAnchorSimplifiedFragmentationEnabled());
-  DCHECK(&root_box);
-  SetChildren(children);
-}
-
-void StitchedAnchorQueries::SetChildren(
-    const LogicalFragmentLinkVector& children) {
-  children_ = &children;
-
-  // Invalidate the cache when children may have changed.
-  computed_for_ = nullptr;
-
-  // To allow early returns, check if any child has anchor queries.
-  has_anchor_queries_ = false;
-  for (const LogicalFragmentLink& child : children) {
-    LogicalFragmentLink fragmentainer = GetFragmentainerLink(child);
-    if (fragmentainer && fragmentainer->HasAnchorQuery()) {
-      has_anchor_queries_ = true;
-      break;
-    }
-  }
-}
-
-const PhysicalAnchorQuery* StitchedAnchorQueries::AnchorQuery(
-    const LayoutObject& containing_block) const {
-  DCHECK(&containing_block);
-  DCHECK(containing_block.CanContainAbsolutePositionObjects() ||
-         containing_block.CanContainFixedPositionObjects());
-
-  if (!has_anchor_queries_) {
-    return nullptr;
-  }
-
-  // Update |queries_| if it hasn't computed for |containing_block|.
-  if (!computed_for_ || !computed_for_->IsDescendantOf(&containing_block))
-    Update(containing_block);
-
-  const auto& it = queries_.find(&containing_block);
-  if (it != queries_.end()) {
-    return it->value;
-  }
-  return nullptr;
-}
-
-// Update |queries_| for the given |layout_object| and its ancestors. This is
-// `const`, modifies `mutable` caches only, so that other `const` functions such
-// as |AnchorQuery| can call.
-void StitchedAnchorQueries::Update(const LayoutObject& layout_object) const {
-  // Compute descendants to collect anchor queries from. This helps reducing the
-  // number of descendants to traverse.
-  HeapHashSet<Member<const LayoutObject>> anchored_oof_containers_and_ancestors;
-  for (const LayoutObject* runner = &layout_object;
-       runner && runner != &root_box_; runner = runner->Parent()) {
-    anchored_oof_containers_and_ancestors.insert(runner);
-  }
-
-  // Traverse descendants and collect anchor queries for each containing block.
-  StitchedAnchorQueryCollector stitched_anchor_queries(
-      root_box_, anchored_oof_containers_and_ancestors);
-  stitched_anchor_queries.AddFragmentainerChildren(*children_,
-                                                   writing_direction_);
-
-  WritingModeConverter converter(writing_direction_, container_size_);
-
-  // TODO(kojii): Currently this clears and rebuilds all anchor queries on
-  // incremental updates. It may be possible to reduce the computation when
-  // there are previous results.
-  queries_.clear();
-  for (const auto& it : stitched_anchor_queries.anchor_queries_) {
-    const auto result =
-        queries_.insert(it.key, it.value->GetStitchedAnchorQuery(converter));
-    DCHECK(result.is_new_entry);
-  }
-
-  computed_for_ = &layout_object;
-}
-
-}  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/anchor_query_map.h b/third_party/blink/renderer/core/layout/anchor_query_map.h
deleted file mode 100644
index ce8f1f26..0000000
--- a/third_party/blink/renderer/core/layout/anchor_query_map.h
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_ANCHOR_QUERY_MAP_H_
-#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_ANCHOR_QUERY_MAP_H_
-
-#include "third_party/blink/renderer/core/core_export.h"
-
-#include "third_party/blink/renderer/core/layout/anchor_evaluator_impl.h"
-#include "third_party/blink/renderer/core/layout/inline/fragment_items_builder.h"
-#include "third_party/blink/renderer/core/layout/logical_fragment_link.h"
-#include "third_party/blink/renderer/platform/text/writing_direction_mode.h"
-
-namespace blink {
-
-class LayoutBox;
-class LayoutObject;
-
-// This computes anchor queries for each containing block by traversing
-// descendants.
-//
-// Normally anchor queries are propagated to the containing block chain during
-// the layout. However, there are some exceptions.
-// 1. When the containing block is an inline box, all OOFs are added to their
-// inline formatting context.
-// 2. When the containing block is in block fragmentation context, all OOFs are
-// added to their fragmentainers.
-// In such cases, traversing descendants is needed to compute anchor queries.
-class CORE_EXPORT StitchedAnchorQueries {
-  STACK_ALLOCATED();
-
- public:
-  // This constructor is for when the size of the container is not known yet.
-  // This happens when laying out OOFs in a block fragmentation context, and
-  // assumes children are fragmentainers.
-  StitchedAnchorQueries(const LayoutBox& root_box,
-                        LogicalSize container_size,
-                        const LogicalFragmentLinkVector& children,
-                        WritingDirectionMode writing_direction);
-
-  bool IsEmpty() const { return !has_anchor_queries_; }
-
-  // Get |PhysicalAnchorQuery| in the stitched coordinate system for the given
-  // containing block. If there is no anchor query for the containing block,
-  // returns an empty instance.
-  const PhysicalAnchorQuery* AnchorQuery(
-      const LayoutObject& containing_block) const;
-
-  // Update |children| when their anchor queries are changed.
-  void SetChildren(const LogicalFragmentLinkVector& children);
-
- private:
-  void Update(const LayoutObject& layout_object) const;
-
-  mutable HeapHashMap<Member<const LayoutObject>, Member<PhysicalAnchorQuery>>
-      queries_;
-  mutable const LayoutObject* computed_for_ = nullptr;
-  const LayoutBox& root_box_;
-  const LogicalSize container_size_;
-  const LogicalFragmentLinkVector* children_ = nullptr;
-  WritingDirectionMode writing_direction_;
-  bool has_anchor_queries_ = false;
-};
-
-}  // namespace blink
-
-#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_ANCHOR_QUERY_MAP_H_
diff --git a/third_party/blink/renderer/core/layout/build.gni b/third_party/blink/renderer/core/layout/build.gni
index a897ba4..661b65f 100644
--- a/third_party/blink/renderer/core/layout/build.gni
+++ b/third_party/blink/renderer/core/layout/build.gni
@@ -33,8 +33,6 @@
   "anchor_position_scroll_data.h",
   "anchor_position_visibility_observer.cc",
   "anchor_position_visibility_observer.h",
-  "anchor_query_map.cc",
-  "anchor_query_map.h",
   "anchor_scope.cc",
   "anchor_scope.h",
   "background_bleed_avoidance.h",
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 1a33c9f..b8b98af 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
@@ -19,7 +19,6 @@
 #include "third_party/blink/renderer/core/layout/absolute_utils.h"
 #include "third_party/blink/renderer/core/layout/anchor_position_scroll_data.h"
 #include "third_party/blink/renderer/core/layout/anchor_position_visibility_observer.h"
-#include "third_party/blink/renderer/core/layout/anchor_query_map.h"
 #include "third_party/blink/renderer/core/layout/column_layout_algorithm.h"
 #include "third_party/blink/renderer/core/layout/constraint_space_builder.h"
 #include "third_party/blink/renderer/core/layout/disable_layout_side_effects_scope.h"
@@ -410,8 +409,7 @@
     // the actual (CSS) containing block in such cases, in order to determine
     // which anchors in the list are acceptable.
     const LayoutObject* actual_containing_block = nullptr;
-    if (anchored_box.MightBeInsideFragmentationContext() &&
-        RuntimeEnabledFeatures::CSSAnchorSimplifiedFragmentationEnabled()) {
+    if (anchored_box.MightBeInsideFragmentationContext()) {
       actual_containing_block = anchored_box.Container();
     }
 
@@ -1512,12 +1510,6 @@
 
   // Layout the OOF positioned elements inside the inner multicol.
   OutOfFlowLayoutPart inner_part(&limited_multicol_container_builder);
-  if (!RuntimeEnabledFeatures::CSSAnchorSimplifiedFragmentationEnabled()) {
-    // TODO(crbug.com/436305267): Remove `outer_oof_layout_part_` when the
-    // runtime flag is removed.
-    inner_part.outer_oof_layout_part_ =
-        outer_oof_layout_part_ ? outer_oof_layout_part_ : this;
-  }
   inner_part.LayoutFragmentainerDescendants(
       &oof_nodes_to_layout, fragmentainer_progression,
       multicol_info->fixedpos_containing_block.Fragment(), &multicol_children);
@@ -1605,39 +1597,6 @@
   outer_context_has_fixedpos_container_ = outer_context_has_fixedpos_container;
   DCHECK(multicol_children_ || !outer_context_has_fixedpos_container_);
 
-  OutOfFlowLayoutPart* layout_part_for_anchor_query = this;
-  std::optional<StitchedAnchorQueries> stitched_anchor_queries;
-  if (!RuntimeEnabledFeatures::CSSAnchorSimplifiedFragmentationEnabled()) {
-    if (outer_oof_layout_part_) {
-      // If this is an inner layout of the nested block fragmentation, and if
-      // this block fragmentation context is block fragmented,
-      // |multicol_children| doesn't have correct block offsets of
-      // fragmentainers anchor query needs.  Calculate the anchor query from the
-      // outer block fragmentation context instead in order to get the correct
-      // offsets.
-      for (const MulticolChildInfo& multicol_child : *multicol_children) {
-        if (multicol_child.parent_break_token) {
-          layout_part_for_anchor_query = outer_oof_layout_part_;
-          break;
-        }
-      }
-    }
-
-    BoxFragmentBuilder* builder_for_anchor_query =
-        layout_part_for_anchor_query->container_builder_;
-    stitched_anchor_queries.emplace(
-        *builder_for_anchor_query->Node().GetLayoutBox(),
-        builder_for_anchor_query->SizeForAnchorQueries(),
-        layout_part_for_anchor_query->FragmentationContextChildren(),
-        builder_for_anchor_query->GetWritingDirection());
-  }
-
-  const bool may_have_anchors_on_oof =
-      std::any_of(descendants->begin(), descendants->end(),
-                  [](const LogicalOofPositionedNode& node) {
-                    return node.box->MayHaveAnchorQuery();
-                  });
-
   HeapVector<HeapVector<NodeToLayout>> descendants_to_layout;
   ClearCollectionScope<HeapVector<HeapVector<NodeToLayout>>>
       descendants_to_layout_scope(&descendants_to_layout);
@@ -1707,11 +1666,9 @@
 
         NodeInfo node_info = SetupNodeInfo(descendant);
         NodeToLayout node_to_layout = {
-            node_info, CalculateOffset(node_info,
-                                       /*is_inside_fragmentation_context=*/true,
-                                       stitched_anchor_queries
-                                           ? &stitched_anchor_queries.value()
-                                           : nullptr)};
+            node_info,
+            CalculateOffset(node_info,
+                            /*is_inside_fragmentation_context=*/true)};
         node_to_layout.containing_block_fragment =
             descendant.containing_block.Fragment();
         node_to_layout.offset_info.original_offset =
@@ -1832,13 +1789,6 @@
 
       if (!has_new_descendants_span)
         break;
-      // If laying out by containing blocks and there are more containing blocks
-      // to be laid out, move on to the next containing block. Before laying
-      // them out, if OOFs have anchors, update the anchor queries.
-      if (stitched_anchor_queries && may_have_anchors_on_oof) {
-        stitched_anchor_queries->SetChildren(
-            layout_part_for_anchor_query->FragmentationContextChildren());
-      }
     }
 
     // Sweep any descendants that might have been bubbled up from the fragment
@@ -1869,8 +1819,7 @@
 AnchorEvaluatorImpl OutOfFlowLayoutPart::CreateAnchorEvaluator(
     const ContainingBlockInfo& container_info,
     const BlockNode& candidate,
-    bool is_inside_fragmentation_context,
-    const StitchedAnchorQueries* anchor_queries) const {
+    bool is_inside_fragmentation_context) const {
   const LayoutObject* implicit_anchor = nullptr;
   const LayoutBox& candidate_layout_box = *candidate.GetLayoutBox();
   if (const Element* element =
@@ -1892,23 +1841,9 @@
                 container_converter.ToPhysical(*container_info.scroll_rect))
           : std::nullopt;
 
-  if (anchor_queries) {
-    DCHECK(!RuntimeEnabledFeatures::CSSAnchorSimplifiedFragmentationEnabled());
-    // When the containing block is block-fragmented, the |container_builder_|
-    // is the fragmentainer, not the containing block, and the coordinate system
-    // is stitched. Use the given |anchor_query|.
-    const LayoutObject* css_containing_block = candidate_layout_box.Container();
-    CHECK(css_containing_block);
-    return AnchorEvaluatorImpl(candidate_layout_box, *anchor_queries,
-                               implicit_anchor, *css_containing_block,
-                               container_info.writing_direction, container_rect,
-                               scroll_rect);
-  }
-
   const PhysicalAnchorQuery* anchor_query = nullptr;
   const LayoutObject* actual_containing_block = nullptr;
-  if (is_inside_fragmentation_context &&
-      RuntimeEnabledFeatures::CSSAnchorSimplifiedFragmentationEnabled()) {
+  if (is_inside_fragmentation_context) {
     // The containing block of the OOF is part of the fragmentation context
     // established by this container. Imagine that fragmentainers are stitched
     // together, for the purpose of calculating the bounding box of anchors.
@@ -2242,8 +2177,7 @@
 
 OutOfFlowLayoutPart::OffsetInfo OutOfFlowLayoutPart::CalculateOffset(
     const NodeInfo& node_info,
-    bool is_inside_fragmentation_context,
-    const StitchedAnchorQueries* anchor_queries) {
+    bool is_inside_fragmentation_context) {
   // See non_overflowing_scroll_range.h for documentation.
   HeapVector<NonOverflowingScrollRange> non_overflowing_scroll_ranges;
 
@@ -2251,7 +2185,7 @@
   // writing-mode/position-anchor.
   AnchorEvaluatorImpl anchor_evaluator =
       CreateAnchorEvaluator(node_info.base_container_info, node_info.node,
-                            is_inside_fragmentation_context, anchor_queries);
+                            is_inside_fragmentation_context);
 
   const ComputedStyle& current_style = node_info.node.Style();
   bool has_try_fallbacks = !!current_style.GetPositionTryFallbacks();
diff --git a/third_party/blink/renderer/core/layout/out_of_flow_layout_part.h b/third_party/blink/renderer/core/layout/out_of_flow_layout_part.h
index 9e43b5df..f378978 100644
--- a/third_party/blink/renderer/core/layout/out_of_flow_layout_part.h
+++ b/third_party/blink/renderer/core/layout/out_of_flow_layout_part.h
@@ -328,8 +328,7 @@
   AnchorEvaluatorImpl CreateAnchorEvaluator(
       const ContainingBlockInfo& container_info,
       const BlockNode& candidate,
-      bool is_inside_fragmentation_context,
-      const StitchedAnchorQueries* anchor_queries) const;
+      bool is_inside_fragmentation_context) const;
 
   LogicalRect ApplyPositionAreaOffsets(
       const LogicalRect& base_rect,
@@ -346,10 +345,8 @@
 
   // TODO(almaher): We are calculating more than just the offset. Consider
   // changing this to a more accurate name.
-  OffsetInfo CalculateOffset(
-      const NodeInfo& node_info,
-      bool is_inside_fragmentation_context,
-      const StitchedAnchorQueries* anchor_queries = nullptr);
+  OffsetInfo CalculateOffset(const NodeInfo& node_info,
+                             bool is_inside_fragmentation_context);
   // Calculates offsets with the given ComputedStyle. Returns nullopt if
   // |try_fit_available_space| is true and the layout result does not fit the
   // available space.
@@ -447,9 +444,6 @@
   const BlockBreakToken* PreviousFragmentainerBreakToken(wtf_size_t) const;
 
   BoxFragmentBuilder* container_builder_;
-  // The OutOfFlowLayoutPart for the outer block fragmentation context when this
-  // is an inner layout of nested block fragmentation.
-  OutOfFlowLayoutPart* outer_oof_layout_part_ = nullptr;
   ContainingBlockInfo default_containing_block_;
   std::optional<ContainingBlockInfo> viewport_containing_block_;
   HeapHashMap<Member<const LayoutObject>, ContainingBlockInfo>
diff --git a/third_party/blink/renderer/core/scheduler_integration_tests/DEPS b/third_party/blink/renderer/core/scheduler_integration_tests/DEPS
index 078ed75..c0e7d5a 100644
--- a/third_party/blink/renderer/core/scheduler_integration_tests/DEPS
+++ b/third_party/blink/renderer/core/scheduler_integration_tests/DEPS
@@ -2,4 +2,7 @@
   ".*test\.cc": [
     "+base/run_loop.h",
   ],
+  "scheduler_policy_test.cc": [
+    "+components/viz/common/surfaces/parent_local_surface_id_allocator.h",
+  ],
 }
diff --git a/third_party/blink/renderer/core/scheduler_integration_tests/build.gni b/third_party/blink/renderer/core/scheduler_integration_tests/build.gni
index bdf79f8..e136e40 100644
--- a/third_party/blink/renderer/core/scheduler_integration_tests/build.gni
+++ b/third_party/blink/renderer/core/scheduler_integration_tests/build.gni
@@ -6,6 +6,7 @@
   "frame_scheduler_test.cc",
   "frame_throttling_test.cc",
   "scheduler_affecting_features_test.cc",
+  "scheduler_policy_test.cc",
   "throttling_test.cc",
   "virtual_time_test.cc",
 ]
diff --git a/third_party/blink/renderer/core/scheduler_integration_tests/scheduler_policy_test.cc b/third_party/blink/renderer/core/scheduler_integration_tests/scheduler_policy_test.cc
new file mode 100644
index 0000000..f7efe22
--- /dev/null
+++ b/third_party/blink/renderer/core/scheduler_integration_tests/scheduler_policy_test.cc
@@ -0,0 +1,218 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in LICENSE file.
+
+#include <memory>
+
+#include "base/test/bind.h"
+#include "base/test/task_environment.h"
+#include "cc/trees/layer_tree_host.h"
+#include "components/viz/common/surfaces/parent_local_surface_id_allocator.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/common/input/web_keyboard_event.h"
+#include "third_party/blink/renderer/bindings/core/v8/script_evaluation_result.h"
+#include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_core.h"
+#include "third_party/blink/renderer/core/dom/document.h"
+#include "third_party/blink/renderer/core/frame/frame_test_helpers.h"
+#include "third_party/blink/renderer/core/frame/local_dom_window.h"
+#include "third_party/blink/renderer/core/frame/local_frame.h"
+#include "third_party/blink/renderer/core/script/classic_script.h"
+#include "third_party/blink/renderer/core/testing/sim/sim_compositor.h"
+#include "third_party/blink/renderer/core/testing/sim/sim_request.h"
+#include "third_party/blink/renderer/core/testing/sim/sim_test.h"
+#include "third_party/blink/renderer/platform/keyboard_codes.h"
+#include "third_party/blink/renderer/platform/scheduler/public/frame_scheduler.h"
+#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h"
+#include "v8/include/v8.h"
+
+namespace blink {
+
+class SchedulerPolicyTest : public SimTest {
+ protected:
+  SchedulerPolicyTest()
+      : SimTest(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
+
+  void SetUp() override {
+    SimTest::SetUp();
+    WebView().GetSettings()->SetJavaScriptEnabled(true);
+
+    // An invalid surface ID causes main frames to be deferred, so initialize
+    // this here to avoid this from preventing task deferral policies.
+    allocator_.GenerateId();
+    Compositor().LayerTreeHost()->SetLocalSurfaceIdFromParent(
+        allocator_.GetCurrentLocalSurfaceId());
+  }
+
+  int32_t ExtractJsIntValue(const char* expr) {
+    v8::HandleScope scope(Window().GetIsolate());
+    v8::Local<v8::Value> result =
+        ClassicScript::CreateUnspecifiedScript(expr)
+            ->RunScriptAndReturnValue(GetDocument().domWindow())
+            .GetSuccessValueOrEmpty();
+    NonThrowableExceptionState exceptionState;
+    return ToInt32(scope.GetIsolate(), result,
+                   IntegerConversionConfiguration::kNormalConversion,
+                   exceptionState);
+  }
+
+  void DispatchKeyEvent() {
+    WebKeyboardEvent key_event(WebInputEvent::Type::kRawKeyDown,
+                               WebInputEvent::kNoModifiers,
+                               WebInputEvent::GetStaticTimeStampForTests());
+    key_event.dom_key = ui::DomKey::FromCharacter('a');
+    key_event.windows_key_code = VKEY_A;
+    GetWebFrameWidget().DispatchThroughCcInputHandler(key_event);
+  }
+
+  // Scheduling policy changes related to main frames happen in OnTaskCompleted,
+  // so run BeginFrame in a task to better simulate BeginMainFrame.
+  void ScheduleBeginFrame() {
+    Window().GetFrame()->GetFrameScheduler()->CompositorTaskRunner()->PostTask(
+        FROM_HERE,
+        base::BindLambdaForTesting([&]() { Compositor().BeginFrame(); }));
+  }
+
+  bool IsDeferringCommits() {
+    return Compositor().LayerTreeHost()->IsDeferringCommits();
+  }
+
+  bool IsRenderingPaused() {
+    return Compositor().LayerTreeHost()->IsRenderingPaused();
+  }
+
+  bool MainFrameUpdatesAreDeferred() {
+    // This considers more than `SimCompositor::DeferMainFrameUpdate()`,
+    // specifically whether there's a valid surface ID.
+    return Compositor().LayerTreeHost()->MainFrameUpdatesAreDeferred();
+  }
+
+ private:
+  viz::ParentLocalSurfaceIdAllocator allocator_;
+};
+
+class DeferRendererTasksAfterInputTest : public SchedulerPolicyTest {};
+
+namespace {
+// Initial page contents for DeferRendererTasksAfterInput tests. This installs
+// a script that installs a keydown handler that:
+//   1. Increments an inputCount counter.
+//   2. Forces a SetNeedsAnimate via requestAnimationFrame. The scheduling
+//      policy requires a frame-was-requested signal for the policy to take
+//      effect. This is not technically needed because the default event
+//      handlers typically result in requesting a frame, but we don't want to
+//      rely on that.
+//   3. Schedules a deferrable task that updates the taskCount counter. If the
+//      policy takes effect, this task will be deferred until after the next
+//      main frame runs.
+const char* kDeferRendererTasksInitialPageContents = R"HTML(
+    <!DOCTYPE html>
+    <title>Test Page</title>
+    <script>
+      window.taskCount = 0;
+      window.inputCount = 0;
+
+      window.addEventListener('keydown', () => {
+        ++window.inputCount;
+        requestAnimationFrame(() => {});
+        scheduler.postTask(() => {
+          ++window.taskCount;
+        });
+      });
+    </script>
+  )HTML";
+}  // namespace
+
+TEST_F(DeferRendererTasksAfterInputTest, TasksNotDeferredDuringEarlyLoading) {
+  SimRequest main_resource("https://example.com/test.html", "text/html");
+  LoadURL("https://example.com/test.html");
+  main_resource.Write(kDeferRendererTasksInitialPageContents);
+
+  // Main frames should be deferred because the head is still being processed.
+  // This should prevent tasks from being deferred due to input (see also
+  // crbug.com/451389811).
+  EXPECT_TRUE(MainFrameUpdatesAreDeferred());
+  EXPECT_FALSE(IsDeferringCommits());
+
+  DispatchKeyEvent();
+  task_environment().RunUntilIdle();
+
+  EXPECT_EQ(ExtractJsIntValue("window.inputCount;"), 1);
+  EXPECT_EQ(ExtractJsIntValue("window.taskCount;"), 1);
+
+  // The <p> should cause unblock main frame updates.
+  main_resource.Write("<p>Contents</p>");
+  EXPECT_FALSE(MainFrameUpdatesAreDeferred());
+  // ...but commits are deferred because of paint holding, which also triggers
+  // input suppression. So even though tasks would be deferred, the input is
+  // dropped and the counts remain the same.
+  EXPECT_TRUE(IsDeferringCommits());
+  DispatchKeyEvent();
+  task_environment().RunUntilIdle();
+
+  EXPECT_EQ(ExtractJsIntValue("window.inputCount;"), 1);
+  EXPECT_EQ(ExtractJsIntValue("window.taskCount;"), 1);
+
+  main_resource.Finish();
+}
+
+TEST_F(DeferRendererTasksAfterInputTest, TasksNotDeferredWhileRenderingPaused) {
+  SimRequest main_resource("https://example.com/test.html", "text/html");
+  LoadURL("https://example.com/test.html");
+  main_resource.Write(kDeferRendererTasksInitialPageContents);
+
+  // The <p> should cause unblock main frame updates.
+  main_resource.Write("<p>Contents</p>");
+  EXPECT_FALSE(MainFrameUpdatesAreDeferred());
+
+  // Force a main frame to get past FCP paint holding.
+  EXPECT_TRUE(IsDeferringCommits());
+  ScheduleBeginFrame();
+  task_environment().RunUntilIdle();
+  EXPECT_FALSE(IsDeferringCommits());
+  EXPECT_FALSE(MainFrameUpdatesAreDeferred());
+
+  // Pausing rendering should prevent task deferral.
+  EXPECT_FALSE(IsRenderingPaused());
+  std::unique_ptr<cc::ScopedPauseRendering> scoped_pauser =
+      Compositor().LayerTreeHost()->PauseRendering();
+  EXPECT_TRUE(IsRenderingPaused());
+  DispatchKeyEvent();
+  task_environment().RunUntilIdle();
+  EXPECT_EQ(ExtractJsIntValue("window.inputCount;"), 1);
+  EXPECT_EQ(ExtractJsIntValue("window.taskCount;"), 1);
+
+  main_resource.Finish();
+}
+
+TEST_F(DeferRendererTasksAfterInputTest, TasksDeferredWhenMainFramesExpected) {
+  SimRequest main_resource("https://example.com/test.html", "text/html");
+  LoadURL("https://example.com/test.html");
+  main_resource.Write(kDeferRendererTasksInitialPageContents);
+
+  // The <p> should cause unblock main frame updates.
+  main_resource.Write("<p>Contents</p>");
+  EXPECT_FALSE(MainFrameUpdatesAreDeferred());
+
+  // Force a main frame to get past FCP paint holding.
+  EXPECT_TRUE(IsDeferringCommits());
+  ScheduleBeginFrame();
+  task_environment().RunUntilIdle();
+  EXPECT_FALSE(IsDeferringCommits());
+  EXPECT_FALSE(MainFrameUpdatesAreDeferred());
+
+  // Dispatching the key event should now cause tasks to be deferred until the
+  // subsequent frame.
+  DispatchKeyEvent();
+  task_environment().RunUntilIdle();
+  EXPECT_EQ(ExtractJsIntValue("window.inputCount;"), 1);
+  EXPECT_EQ(ExtractJsIntValue("window.taskCount;"), 0);
+
+  ScheduleBeginFrame();
+  task_environment().RunUntilIdle();
+  EXPECT_EQ(ExtractJsIntValue("window.inputCount;"), 1);
+  EXPECT_EQ(ExtractJsIntValue("window.taskCount;"), 1);
+
+  main_resource.Finish();
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/core/xml/document_xslt.cc b/third_party/blink/renderer/core/xml/document_xslt.cc
index 039456d..41ce9ae 100644
--- a/third_party/blink/renderer/core/xml/document_xslt.cc
+++ b/third_party/blink/renderer/core/xml/document_xslt.cc
@@ -71,7 +71,7 @@
 void DocumentXSLT::ApplyXSLTransform(Document& document,
                                      ProcessingInstruction* pi) {
   DCHECK(!pi->IsLoading());
-  UseCounter::Count(document, WebFeature::kXSLProcessingInstruction);
+  document.CountDeprecation(WebFeature::kXSLProcessingInstruction);
   XSLTProcessor* processor = XSLTProcessor::Create(document);
   processor->SetXSLStyleSheet(To<XSLStyleSheet>(pi->sheet()));
   String result_mime_type;
diff --git a/third_party/blink/renderer/core/xml/xslt_processor.cc b/third_party/blink/renderer/core/xml/xslt_processor.cc
index be864c8a..ae14a9e0 100644
--- a/third_party/blink/renderer/core/xml/xslt_processor.cc
+++ b/third_party/blink/renderer/core/xml/xslt_processor.cc
@@ -64,13 +64,17 @@
   CHECK(RuntimeEnabledFeatures::XSLTEnabled());
 
   if (auto* window = document.domWindow()) {
+    // This should already be deprecation/use counted by either the DeprecateAs
+    // in xslt_processor.idl, or by DocumentXSLT. Just add an explicit console
+    // message here for visibility, due to crbug.com/40069336.
     window->AddConsoleMessage(
         MakeGarbageCollected<ConsoleMessage>(
             ConsoleMessage::Source::kDeprecation,
             ConsoleMessage::Level::kWarning,
-            "crbug.com/435623334: This page uses XSLT, which being considered "
-            "for removal from the web. If that happens, it is possible that "
-            "this page will need to be updated to maintain functionality."),
+            "XSLTProcessor and XSLT Processing Instructions have been "
+            "deprecated by all browsers. These features will be removed from "
+            "this browser soon. See "
+            "https://chromestatus.com/feature/4709671889534976."),
         /*discard_duplicates=*/true);
   }
 }
diff --git a/third_party/blink/renderer/core/xml/xslt_processor.idl b/third_party/blink/renderer/core/xml/xslt_processor.idl
index 4160ecd..cdb79b19 100644
--- a/third_party/blink/renderer/core/xml/xslt_processor.idl
+++ b/third_party/blink/renderer/core/xml/xslt_processor.idl
@@ -31,7 +31,7 @@
 // https://hg.mozilla.org/mozilla-central/file/012853bd80b7/dom/webidl/XSLTProcessor.webidl
 
 [ Exposed=Window, RuntimeEnabled=XSLT ] interface XSLTProcessor {
-    [CallWith=Document, MeasureAs=XSLTProcessor] constructor();
+    [CallWith=Document, DeprecateAs=XSLTProcessor] constructor();
 
     undefined importStylesheet(Node style);
     // TODO(foolip): In Gecko, the transformTo*() methods throw an exception in
diff --git a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
index bd96749d..c4fef20 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_node_object.cc
@@ -186,6 +186,7 @@
 #include "third_party/blink/renderer/platform/text/platform_locale.h"
 #include "third_party/blink/renderer/platform/text/text_direction.h"
 #include "third_party/blink/renderer/platform/weborigin/kurl.h"
+#include "third_party/blink/renderer/platform/wtf/casting.h"
 #include "third_party/blink/renderer/platform/wtf/text/strcat.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
 #include "third_party/skia/include/core/SkImage.h"
@@ -3319,32 +3320,18 @@
     return is_expanded ? kExpandedExpanded : kExpandedCollapsed;
   }
 
-  HTMLElement* command_for_element = nullptr;
-  if (auto* button = DynamicTo<HTMLButtonElement>(element)) {
-    command_for_element = DynamicTo<HTMLElement>(button->commandForElement());
-  } else if (auto* menuitem = DynamicTo<HTMLMenuItemElement>(element)) {
-    DCHECK(RuntimeEnabledFeatures::MenuElementsEnabled());
-    command_for_element = DynamicTo<HTMLElement>(menuitem->commandForElement());
-  }
-
-  // For menuitem and button elements that act as commandFor triggers,
-  // aria-expanded may be set depending on the command type. This results in the
-  // same mapping as popovertarget, but takes precedence in the case of
-  // conflicting markup as the HTML spec invokers commandfor functionality
-  // first, and only.
-  if (command_for_element) {
-    const AtomicString& action =
-        element->FastGetAttribute(html_names::kCommandAttr);
-    bool is_valid_popover_command =
-        command_for_element->IsValidBuiltinPopoverCommand(
-            *DynamicTo<HTMLElement>(element),
-            HTMLButtonElement::GetCommandEventType(
-                action,
-                command_for_element->GetDocument().GetExecutionContext()));
-    bool is_child =
-        element->IsDescendantOrShadowDescendantOf(command_for_element);
-    // Popover invokers should indicate the expanded/collapsed state.
-    if (is_valid_popover_command && !is_child) {
+  // For commandFor triggers, aria-expanded may be set depending on the command
+  // type. This results in the same mapping as popovertarget, but takes
+  // precedence over popovertarget.
+  if (auto* html_element = DynamicTo<HTMLElement>(element)) {
+    HTMLElement* command_for_element =
+        DynamicTo<HTMLElement>(html_element->commandForElement());
+    CommandEventType command = command_for_element->GetCommandEventType(
+        html_element->command(), html_element->GetExecutionContext());
+    bool is_popover_command = command_for_element->IsValidBuiltinPopoverCommand(
+        *html_element, command);
+    if (command_for_element && is_popover_command &&
+        !element->IsDescendantOrShadowDescendantOf(command_for_element)) {
       return command_for_element->popoverOpen() ? kExpandedExpanded
                                                 : kExpandedCollapsed;
     }
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.cc b/third_party/blink/renderer/modules/accessibility/ax_object.cc
index ebf9bad..96e814d 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.cc
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.cc
@@ -2439,7 +2439,7 @@
   }
 
   // Add aria-details for a command invoker.
-  if (AXObject* command_for = GetCommandForElement()) {
+  if (AXObject* command_for = GetCommandForElementForDetailsRelation()) {
     node_data->AddIntListAttribute(
         ax::mojom::blink::IntListAttribute::kDetailsIds,
         {static_cast<int32_t>(command_for->AXObjectID())});
@@ -2531,59 +2531,55 @@
 // their target element, when: a) the element is valid, and the command
 // attribute is a valid command b) not the next element in the DOM (depth first
 // search order), and c) either not a hint or a rich hint.
-AXObject* AXObject::GetCommandForElement() const {
-  auto* button_element = DynamicTo<HTMLButtonElement>(GetElement());
-  if (!button_element) {
+AXObject* AXObject::GetCommandForElementForDetailsRelation() const {
+  auto* html_element = DynamicTo<HTMLElement>(GetElement());
+  if (!html_element) {
+    return nullptr;
+  }
+  auto* command_for = DynamicTo<HTMLElement>(html_element->commandForElement());
+  if (!command_for || !command_for->popoverOpen()) {
     return nullptr;
   }
 
-  auto* command_for =
-      DynamicTo<HTMLElement>(button_element->commandForElement());
-  if (!command_for) {
+  // The next element is already the target element.
+  if (ElementTraversal::NextSkippingChildren(*html_element) == command_for) {
     return nullptr;
   }
 
-  if (command_for->popoverOpen()) {
-    // A button with commandfor might point to an open popover, but the command
-    // might be unrelated - for example `show-modal`. Commands that aren't related
-    // to the showing or hiding of popovers should not establish a details relation
-    // in these cases.
-    const AtomicString& action =
-        button_element->FastGetAttribute(html_names::kCommandAttr);
-    if (!command_for->IsValidBuiltinPopoverCommand(
-            *button_element,
-            HTMLButtonElement::GetCommandEventType(
-                action, command_for->GetDocument().GetExecutionContext()))) {
-      return nullptr;
-    }
-
-    // The next element is already the popover.
-    if (ElementTraversal::NextSkippingChildren(*button_element) ==
-        command_for) {
-      return nullptr;
-    }
-
-    // Hint popovers that represent plain text content should not estbablish a details
-    // relation - as they are used to derive the text alternative - as if they are a
-    // tooltip. See the TextAlternativeFromTooltip function for more on this.
-    AXObject* ax_popover = AXObjectCache().Get(command_for);
-    if (command_for->PopoverType() == PopoverValueType::kHint &&
-        ax_popover->IsPlainContent()) {
-      return nullptr;
-    }
-
-    // Only expose a details relationship if the trigger isn't
-    // contained within the popover itself (shadow-including). E.g. a close
-    // button within the popover should not get a details relationship back
-    // to the containing popover.
-    if (button_element->IsDescendantOrShadowDescendantOf(command_for)) {
-      return nullptr;
-    }
-
-    return ax_popover;
+  // Only expose a details relationship if the trigger isn't
+  // contained within the popover itself (shadow-including). E.g. a close
+  // button within the popover should not get a details relationship back
+  // to the containing popover.
+  if (html_element->IsDescendantOrShadowDescendantOf(command_for)) {
+    return nullptr;
   }
 
-  return nullptr;
+  // A button with commandfor might point to an open popover, but the command
+  // might be unrelated - for example `show-modal`. Commands that aren't related
+  // to the showing or hiding of popovers should not establish a details
+  // relation in these cases.
+  CommandEventType action = html_element->GetCommandEventType(
+      html_element->command(), html_element->GetExecutionContext());
+  if (action != CommandEventType::kTogglePopover &&
+      action != CommandEventType::kShowPopover &&
+      action != CommandEventType::kHidePopover &&
+      action != CommandEventType::kToggleMenu &&
+      action != CommandEventType::kShowMenu &&
+      action != CommandEventType::kHideMenu) {
+    return nullptr;
+  }
+
+  // Hint popovers that represent plain text content should not estbablish a
+  // details relation - as they are used to derive the text alternative - as if
+  // they are a tooltip. See the TextAlternativeFromTooltip function for more on
+  // this.
+  AXObject* ax_popover = AXObjectCache().Get(command_for);
+  if (command_for->PopoverType() == PopoverValueType::kHint &&
+      ax_popover->IsPlainContent()) {
+    return nullptr;
+  }
+
+  return ax_popover;
 }
 
 // Interest for invoking elements (with the `interestfor` attribute) should
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object.h b/third_party/blink/renderer/modules/accessibility/ax_object.h
index f5ed608..867fc7e0 100644
--- a/third_party/blink/renderer/modules/accessibility/ax_object.h
+++ b/third_party/blink/renderer/modules/accessibility/ax_object.h
@@ -951,9 +951,9 @@
   // Heuristic to get the target popover for an invoking element.
   AXObject* GetPopoverTargetForInvoker() const;
 
-  // Heuristic to get the target element defined by the `commandfor` attribute
-  // on an invoking element.
-  AXObject* GetCommandForElement() const;
+  // Retrieves the target element defined by the `commandfor` attribute
+  // on an invoking element, if a details relationship should be set up.
+  AXObject* GetCommandForElementForDetailsRelation() const;
 
   // Heuristic to get the target element for an element with the `interestfor`
   // attribute. Returns null if the `interestfor` can be exposed as a
diff --git a/third_party/blink/renderer/platform/media/watch_time_reporter.cc b/third_party/blink/renderer/platform/media/watch_time_reporter.cc
index d487133..a925b61 100644
--- a/third_party/blink/renderer/platform/media/watch_time_reporter.cc
+++ b/third_party/blink/renderer/platform/media/watch_time_reporter.cc
@@ -818,13 +818,30 @@
          : (is_eme ? media::WatchTimeKey::kAudioVideoSdrEme  \
                    : media::WatchTimeKey::kAudioVideoSdrAll)
 
+#define MEDIA_FOUNDATION_HDR_KEY(is_eme, is_hdr)                            \
+  is_hdr ? (is_eme ? media::WatchTimeKey::kAudioVideoMediaFoundationHdrEme  \
+                   : media::WatchTimeKey::kAudioVideoMediaFoundationHdrAll) \
+         : (is_eme ? media::WatchTimeKey::kAudioVideoMediaFoundationSdrEme  \
+                   : media::WatchTimeKey::kAudioVideoMediaFoundationSdrAll)
+
 std::unique_ptr<WatchTimeComponent<bool>>
 WatchTimeReporter::CreateHdrComponent() {
   Vector<media::WatchTimeKey> keys_to_finalize{HDR_KEY(false, true),
                                                HDR_KEY(false, false)};
+  const auto is_media_foundation =
+      properties_->renderer_type == media::RendererType::kMediaFoundation;
+  if (is_media_foundation) {
+    keys_to_finalize.emplace_back(MEDIA_FOUNDATION_HDR_KEY(false, true));
+    keys_to_finalize.emplace_back(MEDIA_FOUNDATION_HDR_KEY(false, false));
+  }
   if (properties_->is_eme) {
-    keys_to_finalize.emplace_back(HDR_KEY(true, true));
-    keys_to_finalize.emplace_back(HDR_KEY(true, false));
+    if (is_media_foundation) {
+      keys_to_finalize.emplace_back(MEDIA_FOUNDATION_HDR_KEY(true, true));
+      keys_to_finalize.emplace_back(MEDIA_FOUNDATION_HDR_KEY(true, false));
+    } else {
+      keys_to_finalize.emplace_back(HDR_KEY(true, true));
+      keys_to_finalize.emplace_back(HDR_KEY(true, false));
+    }
   }
 
   return std::make_unique<WatchTimeComponent<bool>>(
@@ -835,9 +852,20 @@
 }
 
 Vector<media::WatchTimeKey> WatchTimeReporter::GetHdrKeys(bool is_hdr) {
+  const auto is_media_foundation =
+      properties_->renderer_type == media::RendererType::kMediaFoundation;
   if (properties_->is_eme) {
+    if (is_media_foundation) {
+      return {HDR_KEY(false, is_hdr), HDR_KEY(true, is_hdr),
+              MEDIA_FOUNDATION_HDR_KEY(false, is_hdr),
+              MEDIA_FOUNDATION_HDR_KEY(true, is_hdr)};
+    }
     return {HDR_KEY(false, is_hdr), HDR_KEY(true, is_hdr)};
   }
+
+  if (is_media_foundation) {
+    return {HDR_KEY(false, is_hdr), MEDIA_FOUNDATION_HDR_KEY(false, is_hdr)};
+  }
   return {HDR_KEY(false, is_hdr)};
 }
 
diff --git a/third_party/blink/renderer/platform/media/watch_time_reporter_unittest.cc b/third_party/blink/renderer/platform/media/watch_time_reporter_unittest.cc
index f22acc6..26f3ae1b 100644
--- a/third_party/blink/renderer/platform/media/watch_time_reporter_unittest.cc
+++ b/third_party/blink/renderer/platform/media/watch_time_reporter_unittest.cc
@@ -254,6 +254,10 @@
             case WatchTimeKey::kVideoBackgroundEmbeddedExperience:
             case WatchTimeKey::kAudioVideoMediaFoundationAll:
             case WatchTimeKey::kAudioVideoMediaFoundationEme:
+            case WatchTimeKey::kAudioVideoMediaFoundationHdrAll:
+            case WatchTimeKey::kAudioVideoMediaFoundationHdrEme:
+            case WatchTimeKey::kAudioVideoMediaFoundationSdrAll:
+            case WatchTimeKey::kAudioVideoMediaFoundationSdrEme:
             case WatchTimeKey::kAudioVideoHdrAll:
             case WatchTimeKey::kAudioVideoHdrEme:
             case WatchTimeKey::kAudioVideoSdrAll:
@@ -2313,6 +2317,10 @@
     EXPECT_WATCH_TIME(NativeControlsOff, kWatchTimeEarly);
     EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(SdrAll, kWatchTimeEarly);
     EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(SdrEme, kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(MediaFoundationSdrAll,
+                                         kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(MediaFoundationSdrEme,
+                                         kWatchTimeEarly);
 
     EXPECT_TRUE(IsMonitoring());
 
@@ -2341,6 +2349,8 @@
     EXPECT_WATCH_TIME_IF_VIDEO(AuxiliaryVisibleContent, kWatchTimeEarly);
     EXPECT_WATCH_TIME(NativeControlsOff, kWatchTimeEarly);
     EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(SdrAll, kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(MediaFoundationSdrAll,
+                                         kWatchTimeEarly);
 
     EXPECT_TRUE(IsMonitoring());
 
@@ -2410,6 +2420,79 @@
   }
 }
 
+// Tests MediaFoundation HDR related Keys given no EME.
+TEST_P(WatchTimeReporterTest, WatchTimeReporterMediaFoundationHdrAll) {
+  constexpr base::TimeDelta kWatchTimeEarly = base::Seconds(5);
+
+  // Will include only audio and only video testing when the related keys are
+  // added.
+  if (has_audio_ && has_video_) {
+    EXPECT_CALL(*this, GetCurrentMediaTime())
+        .WillOnce(testing::Return(base::TimeDelta()))
+        .WillRepeatedly(testing::Return(kWatchTimeEarly));
+    Initialize(false, kSizeJustRight, media::DemuxerType::kChunkDemuxer,
+               media::RendererType::kMediaFoundation);
+
+    wtr_->OnHdrChanged(true);
+    wtr_->OnPlaying();
+
+    // Check the following keys are used.
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(MediaFoundationAll, kWatchTimeEarly);
+    EXPECT_WATCH_TIME(All, kWatchTimeEarly);
+    EXPECT_WATCH_TIME(Mse, kWatchTimeEarly);
+    EXPECT_WATCH_TIME(Ac, kWatchTimeEarly);
+    EXPECT_WATCH_TIME(DisplayInline, kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_VIDEO(AuxiliaryVisibleContent, kWatchTimeEarly);
+    EXPECT_WATCH_TIME(NativeControlsOff, kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(MediaFoundationHdrAll,
+                                         kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(HdrAll, kWatchTimeEarly);
+
+    EXPECT_TRUE(IsMonitoring());
+
+    EXPECT_WATCH_TIME_FINALIZED();
+  }
+}
+
+// Tests MediaFoundation HDR related Keys being used and given to recorder.
+TEST_P(WatchTimeReporterTest, WatchTimeReporterMediaFoundationHdrEme) {
+  constexpr base::TimeDelta kWatchTimeEarly = base::Seconds(5);
+
+  // Will include only audio and only video testing when the related keys are
+  // added.
+  if (has_audio_ && has_video_) {
+    EXPECT_CALL(*this, GetCurrentMediaTime())
+        .WillOnce(testing::Return(base::TimeDelta()))
+        .WillRepeatedly(testing::Return(kWatchTimeEarly));
+    Initialize(true, kSizeJustRight, media::DemuxerType::kChunkDemuxer,
+               media::RendererType::kMediaFoundation);
+
+    wtr_->OnHdrChanged(true);
+    wtr_->OnPlaying();
+
+    // Check the following keys are used.
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(MediaFoundationAll, kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(MediaFoundationEme, kWatchTimeEarly);
+    EXPECT_WATCH_TIME(All, kWatchTimeEarly);
+    EXPECT_WATCH_TIME(Mse, kWatchTimeEarly);
+    EXPECT_WATCH_TIME(Eme, kWatchTimeEarly);
+    EXPECT_WATCH_TIME(Ac, kWatchTimeEarly);
+    EXPECT_WATCH_TIME(DisplayInline, kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_VIDEO(AuxiliaryVisibleContent, kWatchTimeEarly);
+    EXPECT_WATCH_TIME(NativeControlsOff, kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(MediaFoundationHdrAll,
+                                         kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(MediaFoundationHdrEme,
+                                         kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(HdrAll, kWatchTimeEarly);
+    EXPECT_WATCH_TIME_IF_AUDIO_VIDEO_HDR(HdrEme, kWatchTimeEarly);
+
+    EXPECT_TRUE(IsMonitoring());
+
+    EXPECT_WATCH_TIME_FINALIZED();
+  }
+}
+
 // Tests Audio + video HLS SDR support.
 TEST_P(WatchTimeReporterTest, WatchTimeReporterSdrHls) {
   constexpr base::TimeDelta kWatchTimeEarly = base::Seconds(5);
diff --git a/third_party/blink/renderer/platform/media/web_media_player_impl.cc b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
index 3e91b97..ba5e53a 100644
--- a/third_party/blink/renderer/platform/media/web_media_player_impl.cc
+++ b/third_party/blink/renderer/platform/media/web_media_player_impl.cc
@@ -401,6 +401,7 @@
     case media::DEMUXER_ERROR_COULD_NOT_PARSE:
     case media::DEMUXER_ERROR_NO_SUPPORTED_STREAMS:
     case media::DEMUXER_ERROR_DETECTED_HLS:
+    case media::DEMUXER_ERROR_PROGRESSIVE_DISABLED:
     case media::DECODER_ERROR_NOT_SUPPORTED:
     case media::DEMUXER_ERROR_BITSTREAM_CONVERSION_FAILED:
       return WebMediaPlayer::kNetworkStateFormatError;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 11e84f9..a07a895 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1251,13 +1251,6 @@
       status: "stable",
     },
     {
-      // An anchor-positioned element should stay within its containing block,
-      // and not "escape" beyond the fragmentation context root and use the
-      // bounding box of the fragmented anchor with fragmentation applied.
-      name: "CSSAnchorSimplifiedFragmentation",
-      status: "stable",
-    },
-    {
       // An update of anchor positioning (primarily how scrolling affects
       // layout, but includes other inter-connected changes).
       name: "CSSAnchorUpdate",
@@ -2177,6 +2170,8 @@
     },
     {
       name: "ExtendedTextMetrics",
+      origin_trial_feature_name: "ExtendedTextMetrics",
+      origin_trial_allows_third_party: true,
       status: "experimental",
     },
     {
@@ -5492,7 +5487,7 @@
     },
     {
       name: "ViewTransitionWaitUntil",
-      status: "experimental",
+      status: "stable",
     },
     {
       name: "VisibilityCollapseColumn",
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
index 3d9a710..6f5c4e69 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -1270,7 +1270,7 @@
 void MainThreadSchedulerImpl::DidHandleInputEventOnMainThread(
     const WebInputEvent& web_input_event,
     WebInputEventResult result,
-    bool frame_requested) {
+    bool is_frame_expected) {
   TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
                "MainThreadSchedulerImpl::DidHandleInputEventOnMainThread");
   helper_.CheckOnValidThread();
@@ -1292,8 +1292,8 @@
 
   if (WebInputEvent::IsWebInteractionEvent(web_input_event.GetType())) {
     main_thread_only().is_current_task_discrete_input = true;
-    main_thread_only().is_frame_requested_after_discrete_input =
-        frame_requested;
+    main_thread_only().is_frame_expected_after_discrete_input =
+        is_frame_expected;
   }
 }
 
@@ -2603,7 +2603,7 @@
         needs_policy_update = true;
       }
     } else if (queue->queue_type() == MainThreadTaskQueue::QueueType::kInput &&
-               main_thread_only().is_frame_requested_after_discrete_input) {
+               main_thread_only().is_frame_expected_after_discrete_input) {
       CHECK(main_thread_only().is_current_task_discrete_input);
       any_thread().awaiting_discrete_input_response = true;
       any_thread().user_model.DidProcessDiscreteInputEvent(
@@ -2617,7 +2617,7 @@
   UpdateRenderingPrioritizationStateOnTaskCompleted(queue, task_timing);
 
   main_thread_only().is_current_task_discrete_input = false;
-  main_thread_only().is_frame_requested_after_discrete_input = false;
+  main_thread_only().is_frame_expected_after_discrete_input = false;
   main_thread_only().is_current_task_main_frame = false;
 
   if (needs_policy_update) {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
index bf7f057..67bb91a 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -251,7 +251,7 @@
       const WebInputEventAttribution& web_input_event_attribution);
   void DidHandleInputEventOnMainThread(const WebInputEvent& web_input_event,
                                        WebInputEventResult result,
-                                       bool frame_requested);
+                                       bool is_frame_expected);
 
   // Use a separate task runner so that IPC tasks are not logged via the same
   // task queue that executes them. Otherwise this would result in an infinite
@@ -765,8 +765,8 @@
     // the next frame should be prioritized.
     bool is_current_task_discrete_input = false;
     // Set when a frame is known to be requested when handling an input event on
-    // the main thread.
-    bool is_frame_requested_after_discrete_input = false;
+    // the main thread and rendering is not paused or deferred.
+    bool is_frame_expected_after_discrete_input = false;
     // Cumulative non-continuous time spent running render-blocking tasks since
     // the last frame.
     base::TimeDelta rendering_blocking_duration_since_last_frame;
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
index d7dbe833..eb02f10 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -123,6 +123,7 @@
   ~MockWidgetSchedulerDelegate() override = default;
 
   MOCK_METHOD(void, RequestBeginMainFrameNotExpected, (bool));
+  MOCK_METHOD(bool, AreMainFramesPausedOrDeferred, (), (const, override));
 };
 
 }  // namespace
@@ -687,7 +688,7 @@
       scheduler_->DidHandleInputEventOnMainThread(
           FakeTouchEvent(blink::WebInputEvent::Type::kTouchStart),
           WebInputEventResult::kHandledSystem,
-          /*frame_requested=*/true);
+          /*is_frame_expected=*/true);
 
       scheduler_->DidHandleInputEventOnCompositorThread(
           FakeInputEvent(blink::WebInputEvent::Type::kTouchMove),
@@ -695,7 +696,7 @@
       scheduler_->DidHandleInputEventOnMainThread(
           FakeInputEvent(blink::WebInputEvent::Type::kTouchMove),
           WebInputEventResult::kHandledSystem,
-          /*frame_requested=*/true);
+          /*is_frame_expected=*/true);
 
       scheduler_->DidHandleInputEventOnCompositorThread(
           FakeInputEvent(blink::WebInputEvent::Type::kTouchMove),
@@ -703,7 +704,7 @@
       scheduler_->DidHandleInputEventOnMainThread(
           FakeInputEvent(blink::WebInputEvent::Type::kTouchMove),
           WebInputEventResult::kHandledSystem,
-          /*frame_requested=*/true);
+          /*is_frame_expected=*/true);
     }
     if (gesture_type != blink::WebInputEvent::Type::kUndefined) {
       scheduler_->DidHandleInputEventOnCompositorThread(
@@ -711,7 +712,7 @@
           InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
       scheduler_->DidHandleInputEventOnMainThread(
           FakeInputEvent(gesture_type), WebInputEventResult::kHandledSystem,
-          /*frame_requested=*/true);
+          /*is_frame_expected=*/true);
     }
   }
 
@@ -724,7 +725,7 @@
     scheduler_->DidHandleInputEventOnMainThread(
         FakeInputEvent(blink::WebInputEvent::Type::kTouchMove),
         WebInputEventResult::kHandledApplication,
-        /*frame_requested=*/true);
+        /*is_frame_expected=*/true);
     scheduler_->DidCommitFrameToCompositor();
   }
 
@@ -838,7 +839,7 @@
     scheduler_->DidHandleInputEventOnMainThread(
         FakeInputEvent(WebInputEvent::Type::kMouseMove),
         WebInputEventResult::kHandledApplication,
-        /*frame_requested=*/true);
+        /*is_frame_expected=*/true);
     AppendToVectorBeginMainFrameTask(vector, value);
   }
 
@@ -847,7 +848,7 @@
                                     String value) {
     scheduler_->DidHandleInputEventOnMainThread(
         FakeInputEvent(event_type), WebInputEventResult::kHandledApplication,
-        /*frame_requested=*/true);
+        /*is_frame_expected=*/true);
     AppendToVectorTestTask(vector, value);
   }
 
@@ -1290,7 +1291,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kGestureFlingStart),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
 }
 
 TEST_F(MainThreadSchedulerImplTest,
@@ -1309,7 +1310,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kGestureFlingStart),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
 }
 
 TEST_F(MainThreadSchedulerImplTest,
@@ -1324,7 +1325,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeTouchEvent(blink::WebInputEvent::Type::kTouchStart),
       WebInputEventResult::kHandledApplication,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   base::RunLoop().RunUntilIdle();
   // Because the main thread is performing custom input handling, we let all
   // tasks run. However compositing tasks are still given priority.
@@ -1346,7 +1347,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeTouchEvent(blink::WebInputEvent::Type::kTouchStart),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   base::RunLoop().RunUntilIdle();
   // Because we are still waiting for the touchstart to be processed,
   // non-essential tasks like loading tasks are blocked.
@@ -1421,7 +1422,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeTouchEvent(blink::WebInputEvent::Type::kTouchStart),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   EnableIdleTasks();
   base::RunLoop().RunUntilIdle();
   EXPECT_THAT(run_order, testing::ElementsAre("C1", "C2", "D1", "D2"));
@@ -1434,14 +1435,14 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kGestureFlingCancel),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   scheduler_->DidHandleInputEventOnCompositorThread(
       FakeInputEvent(blink::WebInputEvent::Type::kGestureTapDown),
       InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kGestureTapDown),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   base::RunLoop().RunUntilIdle();
   EXPECT_THAT(run_order, testing::ElementsAre());
 
@@ -1454,7 +1455,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kGestureScrollBegin),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   base::RunLoop().RunUntilIdle();
 
   EXPECT_THAT(run_order, testing::ElementsAre("L1", "T1", "T2"));
@@ -1573,7 +1574,7 @@
       FakeInputEvent(blink::WebInputEvent::Type::kMouseMove,
                      blink::WebInputEvent::kLeftButtonDown),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
 }
 
 TEST_F(MainThreadSchedulerImplTest,
@@ -1749,7 +1750,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kKeyDown),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
 }
 
 TEST_F(MainThreadSchedulerImplTest,
@@ -1910,7 +1911,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kGestureFlingStart),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   base::RunLoop().RunUntilIdle();
 
   // Even though we exceeded the input priority escalation period, we should
@@ -1961,7 +1962,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeTouchEvent(blink::WebInputEvent::Type::kTouchStart),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   EXPECT_EQ(1, scheduler_->update_policy_count_);
 
   test_task_runner_->AdvanceMockTickClock(base::Seconds(1));
@@ -1985,7 +1986,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeTouchEvent(blink::WebInputEvent::Type::kTouchStart),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   EXPECT_EQ(1, scheduler_->update_policy_count_);
 
   // The second call to DidHandleInputEventOnCompositorThread should not post
@@ -2000,7 +2001,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kTouchMove),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   EXPECT_EQ(1, scheduler_->update_policy_count_);
 
   // The third call to DidHandleInputEventOnCompositorThread should post a
@@ -2016,7 +2017,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kTouchMove),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   EXPECT_EQ(2, scheduler_->update_policy_count_);
   test_task_runner_->FastForwardBy(base::Seconds(1));
   // We finally expect a delayed policy update.
@@ -2038,7 +2039,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeTouchEvent(blink::WebInputEvent::Type::kTouchStart),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   EXPECT_EQ(1, scheduler_->update_policy_count_);
   test_task_runner_->FastForwardBy(base::Seconds(1));
   // We expect a delayed policy update.
@@ -2056,7 +2057,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kTouchMove),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   EXPECT_EQ(3, scheduler_->update_policy_count_);
   test_task_runner_->FastForwardBy(base::Seconds(1));
   // We finally expect a delayed policy update.
@@ -2091,19 +2092,19 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeTouchEvent(blink::WebInputEvent::Type::kTouchStart),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kTouchMove),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kTouchMove),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kTouchEnd),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
 
   EXPECT_EQ(2, scheduler_->update_policy_count_);
 
@@ -2392,7 +2393,7 @@
   scheduler_->DidHandleInputEventOnMainThread(
       FakeInputEvent(blink::WebInputEvent::Type::kGestureFlingStart),
       WebInputEventResult::kHandledSystem,
-      /*frame_requested=*/true);
+      /*is_frame_expected=*/true);
 }
 
 TEST_F(MainThreadSchedulerImplTest, BeginMainFrameOnCriticalPath) {
@@ -3321,7 +3322,7 @@
         scheduler_->DidHandleInputEventOnMainThread(
             FakeInputEvent(WebInputEvent::Type::kMouseLeave),
             WebInputEventResult::kHandledApplication,
-            /*frame_requested=*/true);
+            /*is_frame_expected=*/true);
         run_order.push_back("I1");
       }));
   PostTestTasks(&run_order, "D1 D2 CM1");
@@ -3335,7 +3336,7 @@
         scheduler_->DidHandleInputEventOnMainThread(
             FakeInputEvent(WebInputEvent::Type::kTouchMove),
             WebInputEventResult::kHandledApplication,
-            /*frame_requested=*/true);
+            /*is_frame_expected=*/true);
         run_order.push_back("I1");
       }));
   PostTestTasks(&run_order, "D1 D2 CM1");
@@ -3935,7 +3936,7 @@
         scheduler_->DidHandleInputEventOnMainThread(
             FakeInputEvent(WebInputEvent::Type::kMouseUp),
             WebInputEventResult::kHandledApplication,
-            /*frame_requested=*/false);
+            /*is_frame_expected=*/false);
       }));
   EXPECT_EQ(CurrentUseCase(), UseCase::kNone);
   base::RunLoop().RunUntilIdle();
@@ -3946,7 +3947,7 @@
         scheduler_->DidHandleInputEventOnMainThread(
             FakeInputEvent(WebInputEvent::Type::kMouseUp),
             WebInputEventResult::kHandledApplication,
-            /*frame_requested=*/true);
+            /*is_frame_expected=*/true);
       }));
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(CurrentUseCase(), UseCase::kDiscreteInputResponse);
@@ -3959,7 +3960,7 @@
         scheduler_->DidHandleInputEventOnMainThread(
             FakeInputEvent(WebInputEvent::Type::kMouseMove),
             WebInputEventResult::kHandledApplication,
-            /*frame_requested=*/false);
+            /*is_frame_expected=*/false);
       }));
   EXPECT_EQ(CurrentUseCase(), UseCase::kNone);
   base::RunLoop().RunUntilIdle();
@@ -4012,7 +4013,7 @@
             FakeInputEvent(WebInputEvent::Type::kMouseDown,
                            blink::WebInputEvent::kLeftButtonDown),
             WebInputEventResult::kHandledApplication,
-            /*frame_requested=*/true);
+            /*is_frame_expected=*/true);
       }));
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(CurrentUseCase(), UseCase::kDiscreteInputResponse);
@@ -4026,7 +4027,7 @@
             FakeInputEvent(WebInputEvent::Type::kMouseMove,
                            blink::WebInputEvent::kLeftButtonDown),
             WebInputEventResult::kHandledApplication,
-            /*frame_requested=*/true);
+            /*is_frame_expected=*/true);
       }));
   base::RunLoop().RunUntilIdle();
   EXPECT_EQ(CurrentUseCase(), UseCase::kDiscreteInputResponse);
@@ -4070,6 +4071,70 @@
   EXPECT_EQ(GetRAILMode(), RAILMode::kLoad);
 }
 
+TEST_P(DeferRendererTasksAfterInputTest, TasksAreNotDeferredIfRenderingPaused) {
+  // Simulate pausing or deferring rendering.
+  ON_CALL(*widget_scheduler_delegate_, AreMainFramesPausedOrDeferred)
+      .WillByDefault(Return(true));
+
+  // Post potentially deferrable tasks.
+  Vector<String> run_order;
+  Vector<TestTaskSpecEntry> test_spec = {
+      {.descriptor = "F1", .type_info = TaskType::kDOMManipulation},
+      {.descriptor = "F2", .type_info = TaskType::kPostedMessage},
+      {.descriptor = "F3", .type_info = TaskType::kInternalMediaRealTime},
+      {.descriptor = "F4", .type_info = TaskType::kJavascriptTimerImmediate},
+      {.descriptor = "BG1",
+       .type_info = WebSchedulingParams(
+           {.queue_type = WebSchedulingQueueType::kTaskQueue,
+            .priority = WebSchedulingPriority::kBackgroundPriority})},
+      {.descriptor = "UV1",
+       .type_info = WebSchedulingParams(
+           {.queue_type = WebSchedulingQueueType::kTaskQueue,
+            .priority = WebSchedulingPriority::kUserVisiblePriority})},
+      {.descriptor = "UB1",
+       .type_info = WebSchedulingParams(
+           {.queue_type = WebSchedulingQueueType::kTaskQueue,
+            .priority = WebSchedulingPriority::kUserBlockingPriority})}};
+  web_scheduling_test_helper_->PostTestTasks(&run_order, test_spec);
+
+  // The input task will run first, but the UseCase shouldn't change because
+  // rendering is paused, so all of the tasks should run.
+  input_task_runner_->PostTask(
+      FROM_HERE, base::BindLambdaForTesting([&]() {
+        widget_scheduler_->DidHandleInputEventOnMainThread(
+            FakeInputEvent(WebInputEvent::Type::kMouseDown,
+                           blink::WebInputEvent::kLeftButtonDown),
+            WebInputEventResult::kHandledApplication,
+            /*frame_requested=*/true);
+        run_order.push_back("PD1");
+      }));
+
+  EXPECT_EQ(CurrentUseCase(), UseCase::kNone);
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(CurrentUseCase(), UseCase::kNone);
+  EXPECT_THAT(run_order, testing::ElementsAre("PD1", "UB1", "F1", "F2", "F3",
+                                              "F4", "UV1", "BG1"));
+}
+
+TEST_P(DeferRendererTasksAfterInputTest, TasksAreDeferredIfRenderingNotPaused) {
+  // Test that when going through the `widget_scheduler_`, tasks the UseCase
+  // changes as expected, which controls task deferral.
+  ON_CALL(*widget_scheduler_delegate_, AreMainFramesPausedOrDeferred)
+      .WillByDefault(Return(false));
+
+  EXPECT_EQ(CurrentUseCase(), UseCase::kNone);
+  input_task_runner_->PostTask(
+      FROM_HERE, base::BindLambdaForTesting([&]() {
+        widget_scheduler_->DidHandleInputEventOnMainThread(
+            FakeInputEvent(WebInputEvent::Type::kMouseDown,
+                           blink::WebInputEvent::kLeftButtonDown),
+            WebInputEventResult::kHandledApplication,
+            /*frame_requested=*/true);
+      }));
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(CurrentUseCase(), UseCase::kDiscreteInputResponse);
+}
+
 INSTANTIATE_TEST_SUITE_P(
     ,
     DeferRendererTasksAfterInputTest,
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/widget_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/widget_scheduler_impl.cc
index ac98dd0..65744a0 100644
--- a/third_party/blink/renderer/platform/scheduler/main_thread/widget_scheduler_impl.cc
+++ b/third_party/blink/renderer/platform/scheduler/main_thread/widget_scheduler_impl.cc
@@ -4,11 +4,17 @@
 
 #include "third_party/blink/renderer/platform/scheduler/main_thread/widget_scheduler_impl.h"
 
+#include "base/feature_list.h"
 #include "base/task/single_thread_task_runner.h"
 #include "third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h"
 
 namespace blink::scheduler {
 
+namespace {
+BASE_FEATURE(kDeferTasksAfterInputOnlyWhenRenderingUnpaused,
+             base::FEATURE_ENABLED_BY_DEFAULT);
+}  // namespace
+
 WidgetSchedulerImpl::WidgetSchedulerImpl(
     MainThreadSchedulerImpl* main_thread_scheduler,
     RenderWidgetSignals* render_widget_signals,
@@ -112,8 +118,24 @@
     const WebInputEvent& web_input_event,
     WebInputEventResult result,
     bool frame_requested) {
+  // TODO(crbug.com/451389811): We should probably move `frame_requested` to the
+  // `Delegate`.
+  bool is_frame_expected = frame_requested;
+  if (base::FeatureList::IsEnabled(
+          kDeferTasksAfterInputOnlyWhenRenderingUnpaused)) {
+    // `delegate_` can be null in unit tests, or if input tasks run during
+    // shutdown between `WillShutdown()` and actually destroying the widget
+    // scheduler, which also happens in tests.
+    if (delegate_) {
+      // A frame is not expected if rendering is deferred, which happens early
+      // in page load, or paused, which happens during view transitions. We do,
+      // however, expect a main frame with all the requisite callbacks if frame
+      // commits are deferred.
+      is_frame_expected &= !delegate_->AreMainFramesPausedOrDeferred();
+    }
+  }
   main_thread_scheduler_->DidHandleInputEventOnMainThread(
-      web_input_event, result, frame_requested);
+      web_input_event, result, is_frame_expected);
 }
 
 void WidgetSchedulerImpl::DidRunBeginMainFrame() {}
diff --git a/third_party/blink/renderer/platform/scheduler/public/widget_scheduler.h b/third_party/blink/renderer/platform/scheduler/public/widget_scheduler.h
index 6e21e2e..c744a5c 100644
--- a/third_party/blink/renderer/platform/scheduler/public/widget_scheduler.h
+++ b/third_party/blink/renderer/platform/scheduler/public/widget_scheduler.h
@@ -38,6 +38,10 @@
     // Controls whether or not BeginMainFrameNotExpected messages are sent from
     // the compositor to the `WidgetScheduler`.
     virtual void RequestBeginMainFrameNotExpected(bool new_state) = 0;
+
+    // Returns true if main frames updates are paused or deferred for any reason
+    // and false otherwise.
+    virtual bool AreMainFramesPausedOrDeferred() const = 0;
   };
 
   virtual ~WidgetScheduler() = default;
diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc
index 4143fb4..0896ed98 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.cc
+++ b/third_party/blink/renderer/platform/widget/widget_base.cc
@@ -1918,4 +1918,10 @@
   LayerTreeHost()->RequestBeginMainFrameNotExpected(requested);
 }
 
+bool WidgetBase::AreMainFramesPausedOrDeferred() const {
+  cc::LayerTreeHost* host = LayerTreeHost();
+  CHECK(host);
+  return host->MainFrameUpdatesAreDeferred() || host->IsRenderingPaused();
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/widget/widget_base.h b/third_party/blink/renderer/platform/widget/widget_base.h
index 8ccf63af..b0c594a3 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.h
+++ b/third_party/blink/renderer/platform/widget/widget_base.h
@@ -208,6 +208,7 @@
 
   // scheduler::WidgetScheduler::Delegate overrides:
   void RequestBeginMainFrameNotExpected(bool) override;
+  bool AreMainFramesPausedOrDeferred() const override;
 
   cc::AnimationHost* AnimationHost() const;
   cc::AnimationTimeline* ScrollAnimationTimeline() const;
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_uploader.py b/third_party/blink/tools/blinkpy/w3c/wpt_uploader.py
index da716df..dfbb2ec 100644
--- a/third_party/blink/tools/blinkpy/w3c/wpt_uploader.py
+++ b/third_party/blink/tools/blinkpy/w3c/wpt_uploader.py
@@ -6,11 +6,8 @@
 import argparse
 import base64
 import gzip
-import json
 import logging
-import os
 import requests
-import tempfile
 
 from blinkpy.common.net.rpc import BuildbucketClient
 from blinkpy.common.system.log_utils import configure_logging
@@ -18,6 +15,12 @@
 _log = logging.getLogger(__name__)
 
 
+# See https://requests.readthedocs.io/en/latest/user/advanced/#post-multiple-multipart-encoded-files
+# for semantics.
+FileInfo = tuple[str, bytes, str]
+FileFormData = list[tuple[str, FileInfo]]
+
+
 class WptReportUploader(object):
     def __init__(self, host):
         self._host = host
@@ -64,16 +67,12 @@
                         continue
                     # Ignore retry results on subsequent lines.
                     initial_report, _, _ = body.partition(b'\n')
-                    reports.append(json.loads(initial_report))
-            merged_report = self.merge_reports(reports)
-            if merged_report is None:
-                _log.error("No result to upload, skip...")
+                    reports.append(initial_report)
+            if reports:
+                files = self.encode_result_files(reports)
+                rv = rv | self.upload_results(files)
             else:
-                with tempfile.TemporaryDirectory() as tmpdir:
-                    path = os.path.join(tmpdir, "reports.json.gz")
-                    with gzip.open(path, 'wt', encoding="utf-8") as zipfile:
-                        json.dump(merged_report, zipfile)
-                    rv = rv | self.upload_report(path)
+                _log.error("No result to upload, skip...")
             _log.info(" ")
 
         return rv
@@ -137,53 +136,43 @@
             raise Exception('The response received from the server was corrupted in-transit.')
         return decrypt_response.plaintext.decode('utf-8')
 
-    def upload_report(self, path_to_report):
-        """Upload the wpt report to wpt.fyi
+    def encode_result_files(self, reports: list[bytes]) -> FileFormData:
+        files = []
+        for shard, report in enumerate(reports):
+            file_info = (f'result_{shard}.json.gz', gzip.compress(report),
+                         'application/gzip')
+            files.append(('result_file', file_info))
+        return files
 
-        The Api is defined at:
-        https://github.com/web-platform-tests/wpt.fyi/tree/main/api#results-creation
+    def upload_results(self, files: FileFormData) -> int:
+        """Upload the test results to wpt.fyi
+
+        The API is defined at:
+        https://github.com/web-platform-tests/wpt.fyi/blob/main/api/README.md#apiresultsupload
         """
         username = "chromium-ci-results-uploader"
         fqdn = "wpt.fyi"
         url = "https://%s/api/results/upload" % fqdn
+        params = {'labels': 'master'}
 
-        with open(path_to_report, 'rb') as fp:
-            params = {'labels': 'master'}
-            files = {'result_file': fp}
-            if self._dry_run:
-                _log.info("Dry run, no report uploaded.")
-                return 0
-            session = requests.Session()
-            password = self.get_password()
-            session.auth = (username, password)
-            res = session.post(url=url, params=params, files=files)
-            if res.status_code == 200:
-                _log.info("Successfully uploaded wpt report with response: " + res.text.strip())
-                report_id = res.text.split()[1]
-                _log.info("Report uploaded to https://%s/results?run_id=%s" % (fqdn, report_id))
-                return 0
-            else:
-                _log.error("Upload wpt report failed with status code: %d", res.status_code)
-                return 1
-
-    def merge_reports(self, reports):
-        if not reports:
-            return None
-
-        merged_report = {}
-        merged_report['run_info'] = reports[0]['run_info']
-        merged_report['time_start'] = reports[0]['time_start']
-        merged_report['results'] = []
-        merged_report['time_end'] = reports[0]['time_end']
-        for report in reports:
-            merged_report['time_start'] = min(merged_report['time_start'],
-                                              report['time_start'])
-            merged_report['results'].extend(report['results'])
-            merged_report['time_end'] = max(merged_report['time_end'],
-                                            report['time_end'])
-        if not merged_report['results']:
-            return None
-        return merged_report
+        if self._dry_run:
+            _log.info("Dry run, no report uploaded.")
+            return 0
+        session = requests.Session()
+        password = self.get_password()
+        session.auth = (username, password)
+        res = session.post(url=url, params=params, files=files)
+        if res.status_code == 200:
+            _log.info("Successfully uploaded wpt report with response: " +
+                      res.text.strip())
+            report_id = res.text.split()[1]
+            _log.info("Report uploaded to https://%s/results?run_id=%s" %
+                      (fqdn, report_id))
+            return 0
+        else:
+            _log.error("Upload wpt report failed with status code: %d",
+                       res.status_code)
+            return 1
 
     def parse_args(self, argv):
         parser = argparse.ArgumentParser(description=__doc__)
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_uploader_unittest.py b/third_party/blink/tools/blinkpy/w3c/wpt_uploader_unittest.py
index ea5374ed..d7f7cfbf 100644
--- a/third_party/blink/tools/blinkpy/w3c/wpt_uploader_unittest.py
+++ b/third_party/blink/tools/blinkpy/w3c/wpt_uploader_unittest.py
@@ -2,6 +2,9 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+import json
+import gzip
+
 from blinkpy.common.host_mock import MockHost
 from blinkpy.common.system.log_testing import LoggingTestCase
 from blinkpy.w3c.wpt_uploader import WptReportUploader
@@ -38,59 +41,24 @@
         build = uploader.fetch_latest_complete_build(*builder)
         self.assertIsNone(build)
 
-    def test_merge_reports(self):
+    def test_encode_result_files(self):
         uploader = WptReportUploader(self.host)
-        report0 = {"run_info": {"os": "linux",
-                                "processor": "x86_64",
-                                "product": "android_webview",
-                                "revision": "1408b119ac563b427a3e00a5514eef697c8da268"},
-                   "time_start": 4248,
-                   "results": [{"test": "foo1.html",
-                                "status": "PASS",
-                                "duration": 2100},
-                               {"test": "foo2.html",
-                                "status": "FAIL",
-                                "duration": 300}],
-                   "time_end": 7293}
-        self.assertEqual(uploader.merge_reports([report0]), report0)
+        files = uploader.encode_result_files(
+            [b'{"time_start":0}', b'{"time_start":1}'])
+        self.assertEqual(2, len(files), files)
 
-        report1 = {"run_info": {"os": "linux",
-                                "processor": "x86_64",
-                                "product": "android_webview",
-                                "revision": "1408b119ac563b427a3e00a5514eef697c8da268"},
-                   "time_start": 4200,
-                   "results": [{"test": "bar.html",
-                                "status": "PASS",
-                                "duration": 990}],
-                   "time_end": 7200}
+        form_field, (filename, payload, content_type) = files[0]
+        self.assertEqual('result_file', form_field)
+        self.assertEqual('result_0.json.gz', filename)
+        self.assertEqual({
+            'time_start': 0,
+        }, json.loads(gzip.decompress(payload)))
+        self.assertEqual('application/gzip', content_type)
 
-        report2 = {"run_info": {"os": "linux",
-                                "processor": "x86_64",
-                                "product": "android_webview",
-                                "revision": "1408b119ac563b427a3e00a5514eef697c8da268"},
-                   "time_start": 5200,
-                   "results": [{"test": "test.html",
-                                "status": "PASS",
-                                "duration": 990}],
-                   "time_end": 7999}
-
-        _expect = {"run_info": {"os": "linux",
-                                "processor": "x86_64",
-                                "product": "android_webview",
-                                "revision": "1408b119ac563b427a3e00a5514eef697c8da268"},
-                   "time_start": 4200,
-                   "results": [{"test": "foo1.html",
-                                "status": "PASS",
-                                "duration": 2100},
-                               {"test": "foo2.html",
-                                "status": "FAIL",
-                                "duration": 300},
-                               {"test": "bar.html",
-                                "status": "PASS",
-                                "duration": 990},
-                               {"test": "test.html",
-                                "status": "PASS",
-                                "duration": 990}],
-                   "time_end": 7999}
-        self.assertEqual(uploader.merge_reports([report0, report1, report2]),
-                         _expect)
+        form_field, (filename, payload, content_type) = files[1]
+        self.assertEqual('result_file', form_field)
+        self.assertEqual('result_1.json.gz', filename)
+        self.assertEqual({
+            'time_start': 1,
+        }, json.loads(gzip.decompress(payload)))
+        self.assertEqual('application/gzip', content_type)
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 3074913e..534268b 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1110,7 +1110,6 @@
 crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/masonry-grid-template-columns-computed-withcontent.html [ Failure ]
 crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/subgrid/* [ Failure ]
 # Masonry sizing test failures
-crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-006.html [ Failure ]
 crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-auto.html [ Failure Crash ]
 crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-fr.html [ Failure Crash ]
 crbug.com/1076027 external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-rows-003-mix1.html [ Failure Crash ]
diff --git a/third_party/blink/web_tests/external/wpt/ai/rewriter/rewriter-create-available.tentative.https.window.js b/third_party/blink/web_tests/external/wpt/ai/rewriter/rewriter-create-available.tentative.https.window.js
index bc8708d3..5d108ac 100644
--- a/third_party/blink/web_tests/external/wpt/ai/rewriter/rewriter-create-available.tentative.https.window.js
+++ b/third_party/blink/web_tests/external/wpt/ai/rewriter/rewriter-create-available.tentative.https.window.js
@@ -7,7 +7,7 @@
 
 promise_test(async () => {
   const rewriter = await createRewriter();
-  assert_equals(typeof rewriter, 'object');
+  assert_true(rewriter instanceof Rewriter);
 
   assert_equals(typeof rewriter.rewrite, 'function');
   assert_equals(typeof rewriter.rewriteStreaming, 'function');
diff --git a/third_party/blink/web_tests/external/wpt/ai/summarizer/summarizer-create-available.tentative.https.window.js b/third_party/blink/web_tests/external/wpt/ai/summarizer/summarizer-create-available.tentative.https.window.js
index 8dea5ea..29a82b0 100644
--- a/third_party/blink/web_tests/external/wpt/ai/summarizer/summarizer-create-available.tentative.https.window.js
+++ b/third_party/blink/web_tests/external/wpt/ai/summarizer/summarizer-create-available.tentative.https.window.js
@@ -7,7 +7,7 @@
 
 promise_test(async () => {
   const summarizer = await createSummarizer();
-  assert_equals(typeof summarizer, 'object');
+  assert_true(summarizer instanceof Summarizer);
 
   assert_equals(typeof summarizer.summarize, 'function');
   assert_equals(typeof summarizer.summarizeStreaming, 'function');
diff --git a/third_party/blink/web_tests/external/wpt/ai/writer/writer-create-available.tentative.https.window.js b/third_party/blink/web_tests/external/wpt/ai/writer/writer-create-available.tentative.https.window.js
index 3661dd7..9bdee22 100644
--- a/third_party/blink/web_tests/external/wpt/ai/writer/writer-create-available.tentative.https.window.js
+++ b/third_party/blink/web_tests/external/wpt/ai/writer/writer-create-available.tentative.https.window.js
@@ -7,7 +7,7 @@
 
 promise_test(async () => {
   const writer = await createWriter();
-  assert_equals(typeof writer, 'object');
+  assert_true(writer instanceof Writer);
 
   assert_equals(typeof writer.write, 'function');
   assert_equals(typeof writer.writeStreaming, 'function');
diff --git a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-006.html b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-006.html
index 4a3fa34..8f09a5d 100644
--- a/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-006.html
+++ b/third_party/blink/web_tests/external/wpt/css/css-grid/masonry/tentative/intrinsic-sizing/masonry-intrinsic-sizing-cols-006.html
@@ -19,6 +19,7 @@
   border: 1px solid;
   padding: 0 1px 0 2px;
   vertical-align: top;
+  item-tolerance: 0;
 }
 </style>
 
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html
index b89d3bb..6b30f2a 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-nosrc.html
@@ -175,4 +175,39 @@
   assert_equals(history.length, startingHistoryLength + 1,
     "history.length increases after normal navigation from  non-initial empty document");
 }, "form submission");
+
+// This test is very similar to the `location.href` test a few cases above, but
+// the difference is that instead of navigating from:
+//   initial about:blank Document => HTTP => HTTP
+// ... we navigate from:
+//   initial about:blank Document => (non-initial) about:blank Document => HTTP
+//
+// We do this to ensure/assert that an explicit navigation to about:blank
+// *after* the iframe has finished initializing, is counted as a normal
+// navigation away from the initial about:blank Document, and the "initial-ness"
+// of the initial about:blank Document is not carried over to the next
+// about:blank Document.
+promise_test(async t => {
+  const startingHistoryLength = history.length;
+  // Create an iframe with src not set, which will stay on the initial empty
+  // document.
+  const iframe = insertIframe(t);
+  assert_equals(history.length, startingHistoryLength,
+    "Inserting iframe with no src must not change history.length");
+
+  // Navigate away from the initial empty document through setting location.href
+  // to `about:blank`. This should do a replacement TO ANOTHER about:blank
+  // Document, which is not the initial about:blank Document.
+  iframe.contentWindow.location.href = 'about:blank';
+  await waitForLoad(t, iframe, 'about:blank');
+  assert_equals(history.length, startingHistoryLength,
+    "history.length must not change after normal navigation on document loaded by iframe with no src");
+
+  // Navigate again using the same method, but this time it shouldn't do a
+  // replacement since it's no longer on the initial empty document.
+  iframe.contentWindow.location.href = url2;
+  await waitForLoad(t, iframe, url2);
+  assert_equals(history.length, startingHistoryLength + 1,
+    "history.length increases after normal navigation from  non-initial empty document");
+}, "initial about:blank => non-initial about:blank (via location.href) => normal HTTP navigation");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html
index a75257d9..626588f3 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/iframe-src-aboutblank-navigate-immediately.html
@@ -16,32 +16,42 @@
 
 promise_test(async t => {
   const startingHistoryLength = history.length;
-  // Create an iframe with src set to about:blank. This would trigger a
-  // navigation to a non-initial about:blank document.
+  // Create an iframe with src set to about:blank. Per the HTML Standard, this
+  // stays on the "initial about:blank Document" [1], because the "process the
+  // iframe attributes" algorithm [2] catches the "about:blank" navigation and
+  // fires a special synchronous `load` event at the initial about:blank
+  // Document, instead of replacing it with a non-initial, second about:blank
+  // Document. This is documented in the note at the end of [3].
+  //
+  // [1]: https://html.spec.whatwg.org/#is-initial-about:blank.
+  // [2]: https://html.spec.whatwg.org/#process-the-iframe-attributes
+  // [3]: https://html.spec.whatwg.org/#completely-finish-loading
   const iframe = insertIframeWithAboutBlankSrc(t);
   assert_equals(history.length, startingHistoryLength,
     "Inserting iframe with src='about:blank' must not change history.length");
 
-  // Trigger a navigation to url1 through the iframe's src attribute.
-  // The iframe should still be on the initial empty document, and the
-  // navigation should do replacement.
+  // Trigger a navigation from the initial about:blank Document, to url1 through
+  // the iframe's src attribute. Because we're navigating from the initial
+  // about:blank Document, the navigation should be a replacement.
   iframe.src = url1;
+
   // Wait for the latest navigation to finish.
   await waitForLoad(t, iframe, url1);
   assert_equals(history.length, startingHistoryLength,
-    "history.length must not change after normal navigation on initial empty document");
-}, "Navigating to a different document with src");
+    "history.length must not change after normal navigation from initial " +
+    "about:blank Document");
+}, "Navigating away from the initial about:blank Document to a different " +
+    "one, with src");
 
 promise_test(async t => {
   const startingHistoryLength = history.length;
-  // Create an iframe with src set to about:blank but navigate away from it immediately below.
   const iframe = insertIframeWithAboutBlankSrc(t);
   assert_equals(history.length, startingHistoryLength,
     "Inserting iframe with src='about:blank' must not change history.length");
 
-  // Navigate away from the initial empty document through setting
-  // location.href. The iframe should still be on the initial empty document,
-  // and the navigation should do replacement.
+  // Trigger a navigation from the initial about:blank Document, to url1 through
+  // location.href. Because we're navigating from the initial about:blank
+  // Document, the navigation should be a replacement.
   iframe.contentWindow.location.href = url1;
   await waitForLoad(t, iframe, url1);
   assert_equals(history.length, startingHistoryLength,
@@ -50,14 +60,13 @@
 
 promise_test(async t => {
   const startingHistoryLength = history.length;
-  // Create an iframe with src set to about:blank but navigate away from it immediately below.
   const iframe = insertIframeWithAboutBlankSrc(t);
   assert_equals(history.length, startingHistoryLength,
     "Inserting iframe with src='about:blank' must not change history.length");
 
-  // Navigate away from the initial empty document through location.assign().
-  // The iframe should still be on the initial empty document, and the
-  // navigation should do replacement.
+  // Trigger a navigation from the initial about:blank Document, to url1 through
+  // location.assign(). Because we're navigating from the initial about:blank
+  // Document, the navigation should be a replacement.
   iframe.contentWindow.location.assign(url1);
   await waitForLoad(t, iframe, url1);
   assert_equals(history.length, startingHistoryLength,
@@ -66,14 +75,13 @@
 
 promise_test(async t => {
   const startingHistoryLength = history.length;
-  // Create an iframe with src set to about:blank but navigate away from it immediately below.
   const iframe = insertIframeWithAboutBlankSrc(t);
   assert_equals(history.length, startingHistoryLength,
     "Inserting iframe with src='about:blank' must not change history.length");
 
-  // Navigate away from the initial empty document through window.open().
-  // The iframe should still be on the initial empty document, and the
-  // navigation should do replacement.
+  // Trigger a navigation from the initial about:blank Document, to url1 through
+  // window.open(). Because we're navigating from the initial about:blank
+  // Document, the navigation should be a replacement.
   iframe.contentWindow.open(url1, "_self");
   await waitForLoad(t, iframe, url1);
   assert_equals(history.length, startingHistoryLength,
@@ -82,14 +90,13 @@
 
 promise_test(async t => {
   const startingHistoryLength = history.length;
-  // Create an iframe with src set to about:blank but navigate away from it immediately below.
   const iframe = insertIframeWithAboutBlankSrc(t);
   assert_equals(history.length, startingHistoryLength,
     "Inserting iframe with src='about:blank' must not change history.length");
 
-  // Navigate away from the initial empty document through clicking an <a>
-  // element. The iframe should still be on the initial empty document, and the
-  // navigation should do replacement.
+  // Trigger a navigation from the initial about:blank Document, to url1 through
+  // clicking an `<a>` element. Because we're navigating from the initial
+  // about:blank Document, the navigation should be a replacement.
   const a = iframe.contentDocument.createElement("a");
   a.href = url1;
   iframe.contentDocument.body.appendChild(a);
@@ -101,14 +108,13 @@
 
 promise_test(async t => {
   const startingHistoryLength = history.length;
-  // Create an iframe with src set to about:blank but navigate away from it immediately below.
   const iframe = insertIframeWithAboutBlankSrc(t);
   assert_equals(history.length, startingHistoryLength,
     "Inserting iframe with src='about:blank' must not change history.length");
 
-  // Navigate away from the initial empty document through form submission.
-  // The iframe should still be on the initial empty document, and the
-  // navigation should do replacement.
+  // Trigger a navigation from the initial about:blank Document, to url1 through
+  // a form submission. Because we're navigating from the initial about:blank
+  // Document, the navigation should be a replacement.
   const form = iframe.contentDocument.createElement("form");
   form.action = "/common/blank.html";
   iframe.contentDocument.body.appendChild(form);
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/resources/helpers.js b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/resources/helpers.js
index 8d9473a..8866f77 100644
--- a/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/resources/helpers.js
+++ b/third_party/blink/web_tests/external/wpt/html/browsers/browsing-the-web/navigating-across-documents/initial-empty-document/resources/helpers.js
@@ -37,7 +37,16 @@
   return iframe;
 };
 
-// Creates an iframe with src="about:blank" and appends it to the document.
+// Creates an iframe with src="about:blank" and appends it to the document. The
+// resulting document in the iframe is the initial about:blank Document [1],
+// because during the "process the iframe attributes" algorithm [2], `src`
+// navigations to `about:blank` are caught and result in a synchronous load
+// event; not a SEPARATE navigation to a non-initial `about:blank` Document. See
+// the documentation in [3] as well.
+//
+// [1]: https://html.spec.whatwg.org/#is-initial-about:blank
+// [2]: https://html.spec.whatwg.org/#process-the-iframe-attributes
+// [3]: https://html.spec.whatwg.org/#completely-finish-loading
 window.insertIframeWithAboutBlankSrc = (t) => {
   const iframe = document.createElement("iframe");
   t.add_cleanup(() => iframe.remove());
@@ -47,12 +56,14 @@
 };
 
 // Creates an iframe with src="about:blank", appends it to the document, and
-// waits for the non-initial about:blank document finished loading.
+// waits for initial about:blank Document to finish loading.
 window.insertIframeWithAboutBlankSrcWaitForLoad = async (t) => {
   const iframe = insertIframeWithAboutBlankSrc(t);
   const aboutBlankLoad = new Promise(resolve => {
-    // In some browsers, the non-initial about:blank navigation commits
+    // In some browsers, when the initial about:blank Document is influenced by
+    // a `src=about:blank` attribute, the about:blank navigation commits
     // asynchronously, while in other browsers, it would commit synchronously.
+    //
     // This means we can't wait for the "load" event as it might have already
     // ran. Instead, just wait for 100ms before resolving, as the non-initial
     // about:blank navigation will most likely take less than 100 ms to commit.
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/menu/tentative/menubar-invoke-menulist.html b/third_party/blink/web_tests/external/wpt/html/semantics/menu/tentative/menubar-invoke-menulist.html
index 4d228d48..4797be5 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/menu/tentative/menubar-invoke-menulist.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/menu/tentative/menubar-invoke-menulist.html
@@ -128,14 +128,13 @@
 }, "Menuitem with invalid command/commandfor cannot invoke menulist popover.");
 
 test(() => {
-  checkableMenuitem.command = "toggle-menu";
-  checkableMenuitem.commandForElement = menulist;
-
+  assert_equals(checkableMenuitem.commandForElement,null,
+   "To start, checkable item shouldn't be an invoker")
   checkableMenuitem.click();
   assert_true(checkableMenuitem.checked,
       "checkable menu item becomes checked");
-  assert_true(menulist.matches(":popover-open"),
-      "menulist matches :popover-open");
+  assert_false(menulist.matches(":popover-open"),
+      "not an invoker yet");
 
   checkableMenuitem.click();
 
@@ -143,5 +142,16 @@
       "checkable menu item is no longer checked");
   assert_false(menulist.matches(":popover-open"),
       "menulist no longer matches :popover-open");
+
+   // Being checkable causes sub-menu functionality to stop.
+  checkableMenuitem.command = "toggle-menu";
+  checkableMenuitem.commandForElement = menulist;
+  checkableMenuitem.click();
+  assert_true(checkableMenuitem.checked,
+      "checkable menu item that invokes a menu becomes checked");
+  assert_false(menulist.matches(":popover-open"), "menulist is not open");
+  checkableMenuitem.click();
+  assert_false(checkableMenuitem.checked, "checkable menu item unchecks");
+  assert_false(menulist.matches(":popover-open"), "menulist still not open");
 }, "Checkable menuitems can still invoke menulist popovers");
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/menu/tentative/menuitem-activate.html b/third_party/blink/web_tests/external/wpt/html/semantics/menu/tentative/menuitem-activate.html
index 868403f..3f50838 100644
--- a/third_party/blink/web_tests/external/wpt/html/semantics/menu/tentative/menuitem-activate.html
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/menu/tentative/menuitem-activate.html
@@ -3,7 +3,9 @@
 <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>
+<script src="../../popovers/resources/popover-utils.js"></script>
 <link rel=author href=mailto:dom@chromium.org>
 <link rel=help href=https://open-ui.org/components/menu.explainer>
 
@@ -14,6 +16,7 @@
 <menulist id=mainmenu>
  <menuitem id=mainmenuitem command=toggle-menu commandfor=submenu>Toggle menu</menuitem>
  <menuitem id=mainmenuitem2 command=toggle-popover commandfor=popover>Show popover</menuitem>
+ <menuitem id=normalmenuitem>Normal item</menuitem>
 </menulist>
 
 <menulist id=submenu>
@@ -101,7 +104,7 @@
 
   // Close the second, "sub", menu within the popover by just clicking off of
   // it.
-  await test_driver.click(menuinpopoveritem1);
+  await test_driver.click(menuinpopoveritem2);
   assert_false(menuinpopover2.matches(":popover-open"),
       "menu 2 in popover closes");
   assert_true(popoverwithmenu.matches(":popover-open"),
@@ -110,4 +113,49 @@
       "menu in popover remains open");
 }, 'Menulist inside a popover works correctly; does not get accidentally ' +
    'dismissed by opening submenus');
+
+promise_test(async (t) => {
+  assert_false(mainmenu.matches(":popover-open"), "mainmenu popover starts closed");
+  let clickCount = 0;
+  normalmenuitem.addEventListener('click',() => (++clickCount));
+  const actions = new test_driver.Actions();
+  await actions.addPointer('mouse', 'mouse')
+    .pointerMove(0, 0, {origin: menubarmenuitem})
+    .pointerDown()
+    .send();
+  await waitForRender();
+  assert_true(mainmenu.matches(":popover-open"), "mainmenu popover should be open while mouse is down");
+  assert_equals(clickCount,0, "no clicks yet");
+  await actions.pointerMove(0, 0, {origin: normalmenuitem})
+    .pointerUp()
+    .send();
+  await waitForRender();
+  assert_false(mainmenu.matches(":popover-open"), "mainmenu popover should be closed");
+  // TODO: Menu items should fire an event when they are selected.
+  // The `click` event is not enough, because one won't be fired here.
+  // assert_equals(clickCount,1, "the sub-menu item should have been clicked");
+}, 'A mousedown-drag-mouseup gesture on a normal menuitem picks the item');
+
+promise_test(async (t) => {
+  assert_false(mainmenu.matches(":popover-open"), "mainmenu popover starts closed");
+  assert_false(submenu.matches(":popover-open"), "submenu popover starts closed");
+  const actions = new test_driver.Actions();
+  await actions.addPointer('mouse', 'mouse')
+    .pointerMove(0, 0, {origin: menubarmenuitem})
+    .pointerDown()
+    .send();
+  await waitForRender();
+  assert_true(mainmenu.matches(":popover-open"), "mainmenu popover should be open while mouse is down");
+  assert_false(submenu.matches(":popover-open"), "submenu shouldn't be open yet");
+  await actions.pointerMove(0, 0, {origin: mainmenuitem})
+    .pointerUp()
+    .send();
+  await waitForRender();
+  assert_true(mainmenu.matches(":popover-open"), "mainmenu popover should remain open, because submenu chosen");
+  assert_true(submenu.matches(":popover-open"), "submenu popover should be open");
+  menubarmenuitem.click(); // Cleanup.
+  await waitForRender();
+  assert_false(mainmenu.matches(":popover-open"), "mainmenu popover should be closed");
+  assert_false(submenu.matches(":popover-open"), "submenu popover should be closed");
+}, 'A mousedown-drag-mouseup gesture on a submenu item leaves both menus open');
 </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/invalid-element-types.html b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/invalid-element-types.html
new file mode 100644
index 0000000..a4097e4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-button-element/command-and-commandfor/invalid-element-types.html
@@ -0,0 +1,52 @@
+<!doctype html>
+<meta name="timeout" content="long" />
+<meta charset="utf-8" />
+<meta name="author" href="mailto:masonf@chromium.org" />
+<link rel="help" href="https://open-ui.org/components/invokers.explainer/" />
+<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>
+<script src="resources/invoker-utils.js"></script>
+<script src="/html/resources/common.js"></script>
+
+<meta name=variant content=?command=--custom-event&half=first>
+<meta name=variant content=?command=--custom-event&half=second>
+<meta name=variant content=?command=show-popover&half=first>
+<meta name=variant content=?command=show-popover&half=second>
+<meta name=variant content=?command=show-modal&half=first>
+<meta name=variant content=?command=show-modal&half=second>
+
+<div id="invokee"></div>
+
+<script>
+  // The command parameter is provided by variants, to
+  // effectively split this (slow) test into multiple runs.
+  const urlParams = new URLSearchParams(window.location.search);
+  command = urlParams.get('command');
+  half = urlParams.get('half');
+  const firstHalf = half === 'first';
+  assert_true(firstHalf || half === 'second');
+
+  const allowed = ['button','input','menuitem'];
+  const allTags = HTML5_ELEMENTS.filter(el => (!allowed.includes(el)));
+  const midpoint = Math.floor(allTags.length / 2);
+  const tags = firstHalf ? allTags.slice(0,midpoint) : allTags.slice(midpoint);
+  let gotEvent = false;
+  invokee.addEventListener('command',() => (gotEvent = true));
+  for(const tag of tags) {
+    promise_test(async () => {
+      gotEvent = false;
+      const element = document.createElement(tag);
+      element.setAttribute('commandfor','invokee');
+      element.setAttribute('command',command);
+      element.style.display = 'block'; // For normally invisible elements
+      document.body.appendChild(element);
+      // Click two ways
+      element.click();
+      await clickOn(element);
+      assert_false(gotEvent,'Command should not be fired');
+    },`command/commandfor on <${tag}> with command=${command} should not function`);
+  }
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/scroll-to-text-fragment/find-range-from-text-directive-no-reveal.html b/third_party/blink/web_tests/external/wpt/scroll-to-text-fragment/find-range-from-text-directive-no-reveal.html
index 21f6944..65f492f 100644
--- a/third_party/blink/web_tests/external/wpt/scroll-to-text-fragment/find-range-from-text-directive-no-reveal.html
+++ b/third_party/blink/web_tests/external/wpt/scroll-to-text-fragment/find-range-from-text-directive-no-reveal.html
@@ -25,7 +25,7 @@
 
   window.location.hash = ':~:text=abc,-def';
 
-  await new Promise(resolve => requestAnimationFrame(resolve));
+  await new Promise(resolve => details2.addEventListener('toggle', resolve));
 
   assert_equals(hidden1.hidden, 'until-found', 'hidden=until-found element should remain hidden');
   assert_false(details1.open, 'closed <details> element should remain closed');
diff --git a/third_party/blink/web_tests/external/wpt/webxr/render_state_update.https.html b/third_party/blink/web_tests/external/wpt/webxr/render_state_update.https.html
index d335f0f..1f0ad0b 100644
--- a/third_party/blink/web_tests/external/wpt/webxr/render_state_update.https.html
+++ b/third_party/blink/web_tests/external/wpt/webxr/render_state_update.https.html
@@ -52,31 +52,6 @@
   });
 };
 
-let testParams = function(session, fakeDeviceController, t, sessionObjects) {
-  return new Promise((resolve, reject) => {
-    let gl = sessionObjects.gl;
-    try {
-      gl.makeXRCompatible().then(() => {
-        t.step(() => {
-          let fov = Math.PI;
-          let near = 0.2;
-          let far = 0.8;
-          let layer = new XRWebGLLayer(session, gl);
-          session.updateRenderState({ inlineVerticalFieldOfView: fov, depthNear: near, depthFar: far, baseLayer: layer });
-          // The update can only happen between frame boundaries, updateRenderState only queues changes.
-          assert_not_equals(session.renderState.inlineVerticalFieldOfView, fov);
-          assert_not_equals(session.renderState.depthNear, near);
-          assert_not_equals(session.renderState.depthFar, far);
-          assert_not_equals(session.renderState.baseLayer, layer);
-        });
-      });
-    } catch (err) {
-      assert_unreached("updateRenderState should not fail when all params are specified");
-    }
-    resolve();
-  });
-};
-
 let testMinMaxClippingPlanes = function(session, fakeDeviceController, t, sessionObjects) {
   return new Promise((resolve, reject) => {
     let gl = sessionObjects.gl;
@@ -123,9 +98,6 @@
 testName = "updateRenderState handles appropriately XRRenderStateInit with no params";
 xr_session_promise_test(testName, testNoParams, fakeDeviceInitParams, 'immersive-vr');
 
-testName = "updateRenderState handles appropriately XRRenderStateInit params";
-xr_session_promise_test(testName, testParams, fakeDeviceInitParams, 'inline');
-
 testName = "updateRenderState clamps appropriately near/far clipping planes";
 xr_session_promise_test(testName, testMinMaxClippingPlanes, fakeDeviceInitParams, 'immersive-vr');
 
diff --git a/third_party/blink/web_tests/external/wpt/webxr/render_state_update_inline.https.html b/third_party/blink/web_tests/external/wpt/webxr/render_state_update_inline.https.html
new file mode 100644
index 0000000..df7c8a4
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/webxr/render_state_update_inline.https.html
@@ -0,0 +1,38 @@
+<!DOCTYPE html>
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<script src="resources/webxr_util.js"></script>
+<script src="resources/webxr_test_constants.js"></script>
+
+<script>
+let fakeDeviceInitParams = TRACKED_IMMERSIVE_DEVICE;
+
+let testParams = function(session, fakeDeviceController, t, sessionObjects) {
+  return new Promise((resolve, reject) => {
+    let gl = sessionObjects.gl;
+    try {
+      gl.makeXRCompatible().then(() => {
+        t.step(() => {
+          let fov = Math.PI;
+          let near = 0.2;
+          let far = 0.8;
+          let layer = new XRWebGLLayer(session, gl);
+          session.updateRenderState({ inlineVerticalFieldOfView: fov, depthNear: near, depthFar: far, baseLayer: layer });
+          // The update can only happen between frame boundaries, updateRenderState only queues changes.
+          assert_not_equals(session.renderState.inlineVerticalFieldOfView, fov);
+          assert_not_equals(session.renderState.depthNear, near);
+          assert_not_equals(session.renderState.depthFar, far);
+          assert_not_equals(session.renderState.baseLayer, layer);
+        });
+      });
+    } catch (err) {
+      assert_unreached("updateRenderState should not fail when all params are specified");
+    }
+    resolve();
+  });
+};
+
+let testName = "updateRenderState handles appropriately XRRenderStateInit params";
+xr_session_promise_test(testName, testParams, fakeDeviceInitParams, 'inline');
+
+</script>
diff --git a/third_party/blink/web_tests/fast/dom/Window/custom-constructors-expected.txt b/third_party/blink/web_tests/fast/dom/Window/custom-constructors-expected.txt
index f9e811c..94a6f0e 100644
--- a/third_party/blink/web_tests/fast/dom/Window/custom-constructors-expected.txt
+++ b/third_party/blink/web_tests/fast/dom/Window/custom-constructors-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Test constructors for classes in Window
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/events/xsl-onload-expected.txt b/third_party/blink/web_tests/fast/events/xsl-onload-expected.txt
index 54175fc..d5507cd 100644
--- a/third_party/blink/web_tests/fast/events/xsl-onload-expected.txt
+++ b/third_party/blink/web_tests/fast/events/xsl-onload-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This is a regression test that checks for a problem where parsing would be stuck true and you'd never get a load event for an XSL-generated page
 
 If the test succeeds, the next paragraph will say "handled load event". If that message is missing, the test failed.
diff --git a/third_party/blink/web_tests/fast/js/instanceof-test-expected.txt b/third_party/blink/web_tests/fast/js/instanceof-test-expected.txt
index 2616d7d..40f6806 100644
--- a/third_party/blink/web_tests/fast/js/instanceof-test-expected.txt
+++ b/third_party/blink/web_tests/fast/js/instanceof-test-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 instanceof test
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/parser/external-entities-in-xslt-expected.txt b/third_party/blink/web_tests/fast/parser/external-entities-in-xslt-expected.txt
index a945967..b496bf65 100644
--- a/third_party/blink/web_tests/fast/parser/external-entities-in-xslt-expected.txt
+++ b/third_party/blink/web_tests/fast/parser/external-entities-in-xslt-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/parser/xslt-with-html-expected.txt b/third_party/blink/web_tests/fast/parser/xslt-with-html-expected.txt
index 88cdcec..a5e3d90 100644
--- a/third_party/blink/web_tests/fast/parser/xslt-with-html-expected.txt
+++ b/third_party/blink/web_tests/fast/parser/xslt-with-html-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 PASS
diff --git a/third_party/blink/web_tests/fast/xsl/default-html-expected.txt b/third_party/blink/web_tests/fast/xsl/default-html-expected.txt
index 1ec26c4..b77b8a52 100644
--- a/third_party/blink/web_tests/fast/xsl/default-html-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/default-html-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Test for bug 11694: XSLT output method does not default to HTML when the target document is HTML.
 
 Should be green: result.
diff --git a/third_party/blink/web_tests/fast/xsl/document-function-expected.txt b/third_party/blink/web_tests/fast/xsl/document-function-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/fast/xsl/document-function-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/document-function-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/fast/xsl/document-function-large-expected.txt b/third_party/blink/web_tests/fast/xsl/document-function-large-expected.txt
index 944f86ba..d88a0f3 100644
--- a/third_party/blink/web_tests/fast/xsl/document-function-large-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/document-function-large-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 PASS: 5 items.
diff --git a/third_party/blink/web_tests/fast/xsl/dtd-in-source-document-expected.txt b/third_party/blink/web_tests/fast/xsl/dtd-in-source-document-expected.txt
index 9085141..49d80ffc 100644
--- a/third_party/blink/web_tests/fast/xsl/dtd-in-source-document-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/dtd-in-source-document-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This tests that entities defined in an external DTD referenced to from the source document are replaced correctly. If this test is successful, the text SUCCESS should be shown below.
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/xsl/exslt-node-set-expected.txt b/third_party/blink/web_tests/fast/xsl/exslt-node-set-expected.txt
index 88ee16a..031d9798 100644
--- a/third_party/blink/web_tests/fast/xsl/exslt-node-set-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/exslt-node-set-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Test that exslt:node-set() function is supported.
 
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/xsl/extra-lf-at-end-expected.txt b/third_party/blink/web_tests/fast/xsl/extra-lf-at-end-expected.txt
index 3ce710ef..f3ee10cab 100644
--- a/third_party/blink/web_tests/fast/xsl/extra-lf-at-end-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/extra-lf-at-end-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Test for bug 15919: XSLTProcessor.transformToFragment creates an extra not defined TEXT_NODE at the end.
 
 PASS: oResult.nodeType should of type DOCUMENT_FRAGMENT_NODE(11)
diff --git a/third_party/blink/web_tests/fast/xsl/generate-id-distinct-elements-unique-value-expected.txt b/third_party/blink/web_tests/fast/xsl/generate-id-distinct-elements-unique-value-expected.txt
index 0e28314..8f53197d 100644
--- a/third_party/blink/web_tests/fast/xsl/generate-id-distinct-elements-unique-value-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/generate-id-distinct-elements-unique-value-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Verify that generate-id() does not return the same value for different nodes.
 
 1 and 2 have distinct IDs as expected: PASSED
diff --git a/third_party/blink/web_tests/fast/xsl/generate-id-multiple-calls-same-value-expected.txt b/third_party/blink/web_tests/fast/xsl/generate-id-multiple-calls-same-value-expected.txt
index dd546c24..0a9ec53 100644
--- a/third_party/blink/web_tests/fast/xsl/generate-id-multiple-calls-same-value-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/generate-id-multiple-calls-same-value-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Verify that generate-id() returns the same value each time it is called for a given node in the current document in the current transform.
 
 Value 1 IDs matched as expected: PASSED
diff --git a/third_party/blink/web_tests/fast/xsl/import-after-comment-expected.txt b/third_party/blink/web_tests/fast/xsl/import-after-comment-expected.txt
index a945967..b496bf65 100644
--- a/third_party/blink/web_tests/fast/xsl/import-after-comment-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/import-after-comment-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/xsl/import-non-document-node-expected.txt b/third_party/blink/web_tests/fast/xsl/import-non-document-node-expected.txt
index f1c350705..5fb2c261 100644
--- a/third_party/blink/web_tests/fast/xsl/import-non-document-node-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/import-non-document-node-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Test importing an xsl:stylesheet node as stylesheet for XSLTProcessor.
 
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/xsl/mozilla-tests-expected.txt b/third_party/blink/web_tests/fast/xsl/mozilla-tests-expected.txt
index 7055497..99594975 100644
--- a/third_party/blink/web_tests/fast/xsl/mozilla-tests-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/mozilla-tests-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Mozilla XSLT
 TransforMiiX Test Cases
 
diff --git a/third_party/blink/web_tests/fast/xsl/nbsp-in-stylesheet-expected.txt b/third_party/blink/web_tests/fast/xsl/nbsp-in-stylesheet-expected.txt
index 8dccccb..ad07aea 100644
--- a/third_party/blink/web_tests/fast/xsl/nbsp-in-stylesheet-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/nbsp-in-stylesheet-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Test for bug 19215: XSLT transformToDocument fails when stylesheet contains &#160;
 
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/xsl/preceding-axis-scoped-inside-template-expected.txt b/third_party/blink/web_tests/fast/xsl/preceding-axis-scoped-inside-template-expected.txt
index cbafeb0..b993a93 100644
--- a/third_party/blink/web_tests/fast/xsl/preceding-axis-scoped-inside-template-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/preceding-axis-scoped-inside-template-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This test checks that using the XPath preceding:: axis when instantiating a template (the content of a variable-binding element) does not match nodes outside the template.
 
 2
diff --git a/third_party/blink/web_tests/fast/xsl/sort-locale-expected.txt b/third_party/blink/web_tests/fast/xsl/sort-locale-expected.txt
index a0f7d938..c7241e5 100644
--- a/third_party/blink/web_tests/fast/xsl/sort-locale-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/sort-locale-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 en
 peach
 péché
diff --git a/third_party/blink/web_tests/fast/xsl/sort-unicode-expected.txt b/third_party/blink/web_tests/fast/xsl/sort-unicode-expected.txt
index dceb2ab..638f6d12 100644
--- a/third_party/blink/web_tests/fast/xsl/sort-unicode-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/sort-unicode-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 lower-first
 Title	Artist
 abbies title	a
diff --git a/third_party/blink/web_tests/fast/xsl/subframe-location-expected.txt b/third_party/blink/web_tests/fast/xsl/subframe-location-expected.txt
index 780472a..8ff5041 100644
--- a/third_party/blink/web_tests/fast/xsl/subframe-location-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/subframe-location-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 ALERT: SUCCESS
 Test that a document in a subframe processed with XSLT has a correct location. (bug 18259).
diff --git a/third_party/blink/web_tests/fast/xsl/supplements-after-xslt-transform-expected.txt b/third_party/blink/web_tests/fast/xsl/supplements-after-xslt-transform-expected.txt
index ec4a024..adeff1a 100644
--- a/third_party/blink/web_tests/fast/xsl/supplements-after-xslt-transform-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/supplements-after-xslt-transform-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Ensure supplements are updated to the new ExecutionContext after XSLT processing changes the document. PASS if we don't crash. 
diff --git a/third_party/blink/web_tests/fast/xsl/transform-to-html-expected.txt b/third_party/blink/web_tests/fast/xsl/transform-to-html-expected.txt
index 88cdcec..a5e3d90 100644
--- a/third_party/blink/web_tests/fast/xsl/transform-to-html-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/transform-to-html-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 PASS
diff --git a/third_party/blink/web_tests/fast/xsl/transform-xhr-doc-expected.txt b/third_party/blink/web_tests/fast/xsl/transform-xhr-doc-expected.txt
index 33ad705..c43c925 100644
--- a/third_party/blink/web_tests/fast/xsl/transform-xhr-doc-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/transform-xhr-doc-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Test for bug 10313: xsl:import doesn't work in stylesheets loaded via XMLHttpRequest.
 
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/xsl/transformToDocument-contextDocument-expected.txt b/third_party/blink/web_tests/fast/xsl/transformToDocument-contextDocument-expected.txt
index 6960cb0..b4e3a9c1 100644
--- a/third_party/blink/web_tests/fast/xsl/transformToDocument-contextDocument-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/transformToDocument-contextDocument-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 PASS if no crash.
diff --git a/third_party/blink/web_tests/fast/xsl/transformToFragment-XML-declaration-expected.txt b/third_party/blink/web_tests/fast/xsl/transformToFragment-XML-declaration-expected.txt
index 7ef3052..9bf19e4 100644
--- a/third_party/blink/web_tests/fast/xsl/transformToFragment-XML-declaration-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/transformToFragment-XML-declaration-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Test for bug 10419: XSLTProcessor transformToFragment fails because of an XML declaration.
 
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/xsl/utf8-chunks-expected.txt b/third_party/blink/web_tests/fast/xsl/utf8-chunks-expected.txt
index 1102ca7..af59c0b 100644
--- a/third_party/blink/web_tests/fast/xsl/utf8-chunks-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/utf8-chunks-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus vitae sem id augue malesuada vulputate. Morbi non quam vitae magna tempus tristique eget in sapien. In rhoncus blandit commodo. Vivamus hendrerit leo ut ante convallis rutrum. Suspendisse adipiscing elementum diam eu auctor. Ut gravida, mauris ut egestas euismod, nunc dui iaculis lectus, at faucibus neque ante et ante. Quisque eget nibh dui. Nunc vitae mauris sed nisl elementum facilisis ut ut arcu. In hac habitasse platea dictumst. In blandit lacus non lacus egestas vel ullamcorper mauris gravida. Morbi bibendum urna eu mauris fringilla fermentum. Donec vel turpis dui, eu aliquet dolor. Aliquam ac volutpat leo. Nullam at lectus quis enim lacinia dictum. Praesent non nulla nisi. Vivamus lacinia dapibus risus, a pretium eros condimentum ut. Sed vitae turpis eros. Vestibulum in purus odio. In hac habitasse platea dictumst. Donec non nisi nisl, ut sagittis orci. Sed porttitor tristique sem scelerisque consectetur. Duis ac orci in lorem vulputate tincidunt. Suspendisse vel libero dui. Phasellus erat sem, placerat quis iaculis non, ornare nec urna. Cras a sem sed lectus sollicitudin rhoncus id vitae nulla. Suspendisse auctor justo a purus fringilla vitae suscipit nibh eleifend. Nam vel tellus ligula. Vestibulum eu mattis sapien. Proin sed justo nunc, eget ornare eros. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis sed magna ipsum. Fusce vitae justo massa. Integer malesuada sollicitudin velit a tristique. Aenean condimentum lectus eu arcu imperdiet suscipit. Aenean porta accumsan libero id facilisis. Nulla dolor ligula, convallis ac luctus gravida, egestas vel justo. Pellentesque vel dui massa, eu pulvinar leo. Aliquam condimentum blandit faucibus. Vestibulum id massa neque, vel aliquam odio. Nullam tortor diam, placerat ut sollicitudin cursus, gravida ac arcu. Phasellus semper ipsum at tortor vulputate tincidunt volutpat elit viverra. Integer nec nisl sed felis mollis rutrum. Fusce iaculis, tellus sit amet vehicula tincidunt, neque velit ultricies risus, nec condimentum tortor risus et nulla. Proin at mi ac nulla tempus cursus ut et magna. Quisque ut neque urna, nec fringilla urna. Maecenas sed nunc ut risus placerat vestibulum. Aenean diam quam, sagittis nec egestas et, rhoncus sed nibh. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nunc imperdiet ipsum tincidunt risus mollis congue ac non eros. Nullam tellus lacus, convallis vitae varius non, ultrices quis urna. Phasellus sapien ante, consectetur consectetur volutpat sed, ornare ut augue. Suspendisse rutrum aliquam enim, eget venenatis turpis varius eget. Nulla nec vestibulum ligula. Duis eu sodales magna. Mauris posuere placerat consequat. Curabitur hendrerit libero non nulla eleifend consectetur. Pellentesque lobortis dui vel ipsum tempus faucibus. Quisque sit amet semper nisl. Suspendisse molestie justo nec arcu faucibus ut cursus nibh euismod. Cras est arcu, dictum eget accumsan a, tempus nec elit. Quisque lorem mauris, porta porttitor mattis euismod, vestibulum non arcu. In non mauris et quam condimentum porttitor quis non leo. Integer non turpis est, id sagittis elit. Integer sed nisl ligula. Praesent scelerisque arcu ac arcu tempor vitae dapibus enim auctor. Nullam suscipit tempor adipiscing. Vivamus pharetra leo eu purus cursus lacinia vel eu tellus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Quisque condimentum tristique velit vel ultrices. In egestas leo eu est molestie ac mattis arcu commodo. In feugiat, nisl eget ultrices luctus, enim tortor euismod libero, quis imperdiet velit lorem et tortor. Nunc neque eros, pellentesque ut consectetur vel, dignissim vitae ante. Proin ornare hendrerit eros, vitae tempus augue venenatis a. Integer vitae lorem vitae ligula porta ultrices. Sed posuere tempus eros, eget luctus libero pulvinar in. Proin non mauris sit amet nunc dignissim interdum. Nam euismod, sem id fringilla ultrices, leo ipsum bibendum sem, at fringilla sem justo a purus. Curabitur nisl odio, tincidunt in tempor eget, ultricies non odio. Sed tincidunt dignissim hendrerit. Morbi vitae aliquet augue. Nam pulvinar accumsan faucibus. Etiam quis est velit. Proin nec elit nisl. Curabitur lobortis consectetur massa, vel commodo tellus consequat ac. Sed sed quam et nisi congue viverra sed ac est. Mauris iaculis tellus ac libero sagittis vitae commodo sem facilisis. Integer ipsum neque, porttitor gravida pulvinar at, adipiscing in nisl. Nunc elementum, nibh a commodo blandit, nisi magna semper lectus, eu eleifend lectus lectus et mauris. Duis venenatis augue nisl. Pellentesque eget justo a quam pulvinar rhoncus. In vulputate consequat risus, id porta ligula ullamcorper nec. Nunc ultrices, urna et faucibus scelerisque, mi mi ultricies neque, eget fermentum purus arcu at ante. Sed eleifend est id metus aliquam vestibulum. Vivamus vestibulum sodales nibh, et gravida ante vestibulum dignissim. Vestibulum risus nulla, aliquet vel molestie venenatis, ultricies luctus eros. Suspendisse congue fringilla fringilla. Fusce accumsan justo et purus bibendum sit amet malesuada libero laoreet. Donec sed sapien eros, ac blandit sapien. Etiam eget arcu est. Nulla a lorem nec velit bibendum porta quis ac eros. Maecenas varius suscipit scelerisque. Morbi sed eros nulla, porta porta sem. Quisque quis urna eget massa laoreet blandit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas consequat fermentum lorem, eu feugiat arcu feugiat et. Praesent venenatis, massa non elementum vehicula, diam erat lobortis tellus, id rhoncus libero magna in massa. Suspendisse quis dignissim mi. Donec fermentum ipsum sed ipsum ornare ac sollicitudin velit lacinia. Mauris turpis turpis, adipiscing eu vestibulum sed, faucibus bibendum sem. Aenean posuere feugiat dolor, sit amet accumsan augue feugiat sit amet. Maecenas nec massa id diam laoreet aliquam a ac magna. Nam id dui eget purus consectetur dictum. Etiam malesuada cursus tortor, in iaculis metus egestas ut. Pellentesque non orci mauris. Nullam vitae nulla sit amet sapien vulputate blandit. Pellentesque sed pharetra nulla. Suspendisse potenti. Maecenas sodales placerat congue. In non justo et enim sagittis laoreet. Aliquam ac turpis nec dolor ultrices ullamcorper. Fusce mauris lacus, aliquet vitae malesuada a, suscipit in tortor. Aliquam lobortis lacus eu turpis fringilla sagittis. Ut eget volutpat augue. Praesent accumsan, metus eu adipiscing auctor, orci ante volutpat nibh, id rhoncus turpis tortor ut sem. In at arcu massa. Cras congue lobortis diam ac sagittis. In eget orci quam, eu fringilla sapien. Proin consectetur elit eget lacus convallis vehicula. Suspendisse magna mi, lobortis ultricies eleifend eget, tincidunt nec purus. Ut eget lacus felis, eu posuere magna. Donec metus dolor, sollicitudin sed vestibulum convallis, auctor at nulla. Proin ligula dolor, rutrum quis fringilla in, luctus at nunc. Nam sed metus erat. Donec id libero leo. Curabitur purus ante, laoreet a egestas at, tristique ac dolor. Mauris sit amet dui id tortor blandit sodales. Sed eu dui ante, nec suscipit nulla. In hac habitasse platea dictumst. Fusce id felis orci. Suspendisse lectus tellus, egestas eget elementum eu, ultrices sed dolor. In ligula nibh, adipiscing sit amet mattis non, mollis sed est. Maecenas eu accumsan odio. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Quisque eu urna lacus. Morbi aliquam, libero auctor volutpat sodales, ipsum mi luctus elit, vel lobortis odio mauris ac nunc. Cras nec purus turpis. Pellentesque mollis, elit ut mollis lobortis, tortor mi ornare purus, at posuere eros orci sed tellus. Aenean condimentum est in dolor vulputate adipiscing. Morbi adipiscing risus sagittis felis imperdiet varius. Mauris urna augue, pellentesque tempor consectetur eget, porta varius tortor. ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé ééééééééééééééééééééééééééééééééééééééééééééééééé
diff --git a/third_party/blink/web_tests/fast/xsl/xsl-external-load-detached-expected.txt b/third_party/blink/web_tests/fast/xsl/xsl-external-load-detached-expected.txt
index 6960cb0..b4e3a9c1 100644
--- a/third_party/blink/web_tests/fast/xsl/xsl-external-load-detached-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xsl-external-load-detached-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 PASS if no crash.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-bad-import-uri-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-bad-import-uri-expected.txt
index 319420d0..33225b1e 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-bad-import-uri-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-bad-import-uri-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This tests that a bad @import URI does not cause a crash. 
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-doc-enc-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-doc-enc-expected.txt
index d5c43df14..c5fd8b7 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-doc-enc-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-doc-enc-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Encoding: KOI8-R
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-doc-noenc-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-doc-noenc-expected.txt
index 194651bc..66045ab 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-doc-noenc-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-doc-noenc-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Encoding: UTF-8
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-enc-cyr-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-enc-cyr-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-enc-cyr-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-enc-cyr-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-enc-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-enc-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-enc-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-enc-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-enc16-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-enc16-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-enc16-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-enc16-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-enc16to16-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-enc16to16-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-enc16to16-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-enc16to16-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-entity-enc-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-entity-enc-expected.txt
index e0926c77..bbdfc56 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-entity-enc-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-entity-enc-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 The letters in quotes should look similar (first is Roman, second is Cyrillic): "B", "В".
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-entity-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-entity-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-entity-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-entity-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-extra-content-at-end-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-extra-content-at-end-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-extra-content-at-end-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-extra-content-at-end-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-fragment-in-empty-doc-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-fragment-in-empty-doc-expected.txt
index 6b0d419..4c65490 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-fragment-in-empty-doc-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-fragment-in-empty-doc-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This test checks whether XSLTProcessor.transformToFragment() does not crash when the target document does not have a root node.
 
 PASS: You didn't crash.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-import-depth-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-import-depth-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-import-depth-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-import-depth-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-import-enc16-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-import-enc16-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-import-enc16-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-import-enc16-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-in-subframe-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-in-subframe-expected.txt
index a8b4108b..00a5e81 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-in-subframe-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-in-subframe-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Make sure that XSLT works in a subframe. 
 
 --------
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-line-breaks-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-line-breaks-expected.txt
index 1b1740f..f9cc49f 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-line-breaks-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-line-breaks-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Must not crash, and transforms to 'data 1breakdata 2'. Test for http://crbug.com/530587.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-mismatched-tags-in-xslt-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-mismatched-tags-in-xslt-expected.txt
index 09edc7c..c9f2df8 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-mismatched-tags-in-xslt-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-mismatched-tags-in-xslt-expected.txt
@@ -6,4 +6,4 @@
 
 CONSOLE ERROR: Opening and ending tag mismatch: template line 4 and stylesheet
 
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-multiple-relative-import-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-multiple-relative-import-expected.txt
index 5ed38a4..fa233000 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-multiple-relative-import-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-multiple-relative-import-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 crbug.com/436479: Test for multiple xsl:import with relative URLs.
 
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-nested-stylesheets-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-nested-stylesheets-expected.txt
index 8d92a51..421fb9b 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-nested-stylesheets-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-nested-stylesheets-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Tests a crash resulting from a string literal in a nested XSL stylesheet. If you reached here without crashing, the test passed. See https://bugs.webkit.org/show_bug.cgi?id=15715 .
 
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-processor-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-processor-expected.txt
index b1f0240..17a9817 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-processor-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-processor-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 0.1 original xml:
 <?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="xslt-text.xsl"?><TEST>SOURCE XML: &lt;&lt;&lt;&amp;тест&amp;&gt;&gt;&gt;</TEST>
 0.2 xsl1:
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-processor-template-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-processor-template-expected.txt
index 4eaa41cb..becd18f 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-processor-template-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-processor-template-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This tests that XSLT transforms can traverse into XHTML template element content when applying XSL template. If the test succeeds, the transform will have swapped the position of the body spans (A and B) with the template content spans (C and D) and replaced the spans with divs.
 
 Body divs: CD, Template content divs: AB
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-recursion-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-recursion-expected.txt
index aaf2dbd..9a590d1 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-recursion-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-recursion-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Success!
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-relative-path-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-relative-path-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-relative-path-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-relative-path-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-second-level-import-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-second-level-import-expected.txt
index a945967..b496bf65 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-second-level-import-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-second-level-import-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-string-parameters-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-string-parameters-expected.txt
index b55df18..3c821d13 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-string-parameters-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-string-parameters-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This tests that passing string parameters to the XSLTProcessor works as expected. If this test is successful, the text "SUCCESS" will be shown below.
 
 SUCCESS
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-text-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-text-expected.txt
index bf815cc..2180059 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-text-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-text-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 
 <head xmlns="http://www.w3.org/1999/xhtml"><title></title></head>
 <body xmlns="http://www.w3.org/1999/xhtml">
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-transform-to-fragment-crash-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-transform-to-fragment-crash-expected.txt
index c55e3c7..f77c0b9 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-transform-to-fragment-crash-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-transform-to-fragment-crash-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Test passes if it does not crash.
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-translate-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-translate-expected.txt
index ca66c75..9956259a 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-translate-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-translate-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Must not crash, and transforms to 'Simple_sting_line'. Test for http://crbug.com/599427.
 
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-url-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-url-expected.txt
index fe22dd97..4ca30de7 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-url-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-url-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 Success
diff --git a/third_party/blink/web_tests/fast/xsl/xslt-xhtml-template-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt-xhtml-template-expected.txt
index d8fdc2c..4ea2fb7 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt-xhtml-template-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt-xhtml-template-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 C
 D
 
diff --git a/third_party/blink/web_tests/fast/xsl/xslt_unicode-expected.txt b/third_party/blink/web_tests/fast/xsl/xslt_unicode-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/fast/xsl/xslt_unicode-expected.txt
+++ b/third_party/blink/web_tests/fast/xsl/xslt_unicode-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/http/tests/feature-policy/xslt-document-insertion-expected.txt b/third_party/blink/web_tests/http/tests/feature-policy/xslt-document-insertion-expected.txt
index 8c688609..895727f8 100644
--- a/third_party/blink/web_tests/http/tests/feature-policy/xslt-document-insertion-expected.txt
+++ b/third_party/blink/web_tests/http/tests/feature-policy/xslt-document-insertion-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 
 
 --------
diff --git a/third_party/blink/web_tests/http/tests/incremental/chunked-xsl-transformed-xml-expected.txt b/third_party/blink/web_tests/http/tests/incremental/chunked-xsl-transformed-xml-expected.txt
index 8ecaf16f29..f56ac84 100644
--- a/third_party/blink/web_tests/http/tests/incremental/chunked-xsl-transformed-xml-expected.txt
+++ b/third_party/blink/web_tests/http/tests/incremental/chunked-xsl-transformed-xml-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 PASSED
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltpi-issue-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltpi-issue-expected.txt
new file mode 100644
index 0000000..066eb8c
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltpi-issue-expected.txt
@@ -0,0 +1,20 @@
+Verifies that XSLT Processing Instruction deprecation issue is created
+Inspector issue: {
+    issue : {
+        code : DeprecationIssue
+        details : {
+            deprecationIssueDetails : {
+                affectedFrame : {
+                    frameId : <string>
+                }
+                sourceCodeLocation : {
+                    columnNumber : 0
+                    lineNumber : -1
+                    url : http://127.0.0.1:8000/inspector-protocol/resources/xsltpi.xml
+                }
+                type : XSLT
+            }
+        }
+    }
+}
+
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltpi-issue.js b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltpi-issue.js
new file mode 100644
index 0000000..e457ba0
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltpi-issue.js
@@ -0,0 +1,10 @@
+(async function(/** @type {import('test_runner').TestRunner} */ testRunner) {
+  const { session, dp } = await testRunner.startBlank(
+  'Verifies that XSLT Processing Instruction deprecation issue is created');
+  await dp.Audits.enable();
+  const promise = dp.Audits.onceIssueAdded();
+  await session.navigate('../resources/xsltpi.xml');
+  const result = await promise;
+  testRunner.log(result.params, "Inspector issue: ");
+  testRunner.completeTest();
+})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltprocessor-issue-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltprocessor-issue-expected.txt
new file mode 100644
index 0000000..d9f8255
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltprocessor-issue-expected.txt
@@ -0,0 +1,6 @@
+Verifies that XSLT Processing Instruction deprecation issue is created
+Got XSLT deprecation issue: {
+    result : true
+    source : http://127.0.0.1:8000/inspector-protocol/resources/xsltprocessor.html
+}
+
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltprocessor-issue.js b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltprocessor-issue.js
new file mode 100644
index 0000000..d390def7
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/issues/xsltprocessor-issue.js
@@ -0,0 +1,18 @@
+(async function(/** @type {import('test_runner').TestRunner} */ testRunner) {
+  const { session, dp } = await testRunner.startBlank(
+  'Verifies that XSLT Processing Instruction deprecation issue is created');
+  await dp.Audits.enable();
+  const promise = new Promise(resolve => dp.Audits.onIssueAdded(event => {
+    if (event.params.issue.code === "DeprecationIssue") {
+      // For some reason, the line number field of the deprecation report is
+      // flaky (between line 29 and line 30). So just verify that this is the
+      // deprecation issue for XSLT here.
+      const source = event.params.issue.details.deprecationIssueDetails.sourceCodeLocation.url;
+      resolve({result: source.includes("xslt"), source});
+    }
+  }));
+  await session.navigate('../resources/xsltprocessor.html');
+  const result = await promise;
+  testRunner.log(result, "Got XSLT deprecation issue: ");
+  testRunner.completeTest();
+})
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/xsltpi.xml b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/xsltpi.xml
new file mode 100644
index 0000000..2fd13b5
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/xsltpi.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="xsltpi.xsl" ?>
+<page>
+ <message>
+  Hello World.
+ </message>
+</page>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/xsltpi.xsl b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/xsltpi.xsl
new file mode 100644
index 0000000..55a7a36
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/xsltpi.xsl
@@ -0,0 +1,14 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+<xsl:output method="html"/>
+<xsl:template match="/">
+<xsl:apply-templates select="/page/message"/>
+</xsl:template>
+<xsl:template match="/page/message">
+<body>
+Should be green:
+<div style="color:green">
+<xsl:value-of select="."/>
+</div>
+</body>
+</xsl:template>
+</xsl:stylesheet>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/resources/xsltprocessor.html b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/xsltprocessor.html
new file mode 100644
index 0000000..f2bd09c
--- /dev/null
+++ b/third_party/blink/web_tests/http/tests/inspector-protocol/resources/xsltprocessor.html
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+
+<body>
+<script>
+  const xmlString = `
+  <page>
+   <message>
+    Hello World.
+   </message>
+  </page>
+  `;
+
+  const xsltString = `
+  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+    <xsl:template match="/">
+      <xsl:apply-templates select="/page/message"/>
+    </xsl:template>
+    <xsl:template match="/page/message">
+      Should be green:
+      <div style="color:green">
+        <xsl:value-of select="."/>
+      </div>
+    </xsl:template>
+  </xsl:stylesheet>
+  `;
+
+  const parser = new DOMParser();
+  const xmlDoc = parser.parseFromString(xmlString, "application/xml");
+  const xsltDoc = parser.parseFromString(xsltString, "application/xml");
+  const xsltProcessor = new XSLTProcessor();
+  xsltProcessor.importStylesheet(xsltDoc);
+  const result = xsltProcessor.transformToFragment(xmlDoc, document);
+  document.body.append(result);
+</script>
diff --git a/third_party/blink/web_tests/http/tests/misc/insert-iframe-into-xml-document-before-xsl-transform-expected.txt b/third_party/blink/web_tests/http/tests/misc/insert-iframe-into-xml-document-before-xsl-transform-expected.txt
index 5cad845c..d7bd4de 100644
--- a/third_party/blink/web_tests/http/tests/misc/insert-iframe-into-xml-document-before-xsl-transform-expected.txt
+++ b/third_party/blink/web_tests/http/tests/misc/insert-iframe-into-xml-document-before-xsl-transform-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 PASS if no crash. 
diff --git a/third_party/blink/web_tests/http/tests/misc/location-test-xsl-style-sheet-expected.txt b/third_party/blink/web_tests/http/tests/misc/location-test-xsl-style-sheet-expected.txt
index 88cdcec..a5e3d90 100644
--- a/third_party/blink/web_tests/http/tests/misc/location-test-xsl-style-sheet-expected.txt
+++ b/third_party/blink/web_tests/http/tests/misc/location-test-xsl-style-sheet-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 PASS
diff --git a/third_party/blink/web_tests/http/tests/misc/xslt-bad-import-expected.txt b/third_party/blink/web_tests/http/tests/misc/xslt-bad-import-expected.txt
index d46cf51..41b9802 100644
--- a/third_party/blink/web_tests/http/tests/misc/xslt-bad-import-expected.txt
+++ b/third_party/blink/web_tests/http/tests/misc/xslt-bad-import-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This test passes if it does not crash.
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-allowed-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-allowed-expected.txt
index 906462c..bcab7ca047 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-allowed-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-allowed-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 The text below should indicate that the style sheet was applied.
 Style sheet applied.
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-blocked-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-blocked-expected.txt
index acef18e..7cb5d75 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-blocked-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-blocked-expected.txt
@@ -1,2 +1,2 @@
 CONSOLE ERROR: Loading the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/style.xsl' violates the following Content Security Policy directive: "script-src 'unsafe-inline'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. The action has been blocked.
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-img-blocked-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-img-blocked-expected.txt
index 9830793..99c2f4c 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-img-blocked-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-img-blocked-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 CONSOLE ERROR: Loading the image 'http://127.0.0.1:8000/security/resources/abe.png' violates the following Content Security Policy directive: "img-src 'none'". The action has been blocked.
 Here is an image: 
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-1-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-1-expected.txt
index acef18e..7cb5d75 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-1-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-1-expected.txt
@@ -1,2 +1,2 @@
 CONSOLE ERROR: Loading the script 'http://127.0.0.1:8000/security/contentSecurityPolicy/resources/style.xsl' violates the following Content Security Policy directive: "script-src 'unsafe-inline'". Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback. The action has been blocked.
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-2-expected.txt b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-2-expected.txt
index 906462c..bcab7ca047 100644
--- a/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-2-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/contentSecurityPolicy/xsl-unaffected-by-style-src-2-expected.txt
@@ -1,3 +1,3 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 The text below should indicate that the style sheet was applied.
 Style sheet applied.
diff --git a/third_party/blink/web_tests/http/tests/security/cookies/first-party-cookie-allow-xslt-expected.txt b/third_party/blink/web_tests/http/tests/security/cookies/first-party-cookie-allow-xslt-expected.txt
index fce6a6b8..a6380e1 100644
--- a/third_party/blink/web_tests/http/tests/security/cookies/first-party-cookie-allow-xslt-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/cookies/first-party-cookie-allow-xslt-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 
 
 --------
diff --git a/third_party/blink/web_tests/http/tests/security/cookies/third-party-cookie-blocking-xslt-expected.txt b/third_party/blink/web_tests/http/tests/security/cookies/third-party-cookie-blocking-xslt-expected.txt
index 07e7604..3b462252 100644
--- a/third_party/blink/web_tests/http/tests/security/cookies/third-party-cookie-blocking-xslt-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/cookies/third-party-cookie-blocking-xslt-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 
 
 --------
diff --git a/third_party/blink/web_tests/http/tests/security/cross-origin-xsl-BLOCKED-expected.txt b/third_party/blink/web_tests/http/tests/security/cross-origin-xsl-BLOCKED-expected.txt
index 8b93710..834597a 100644
--- a/third_party/blink/web_tests/http/tests/security/cross-origin-xsl-BLOCKED-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/cross-origin-xsl-BLOCKED-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE ERROR: Unsafe attempt to load URL http://localhost:8000/security/resources/forbidden-stylesheet.xsl from frame with URL http://127.0.0.1:8000/security/resources/cross-origin-xsl.xml. Domains, protocols and ports must match.
 
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This test loads the XML document in an iframe so that it can call dumpAsText(). This test passes if the iframe below does not contain a message starting with "FAIL".
 
diff --git a/third_party/blink/web_tests/http/tests/security/cross-origin-xsl-redirect-BLOCKED-expected.txt b/third_party/blink/web_tests/http/tests/security/cross-origin-xsl-redirect-BLOCKED-expected.txt
index cf6258e..6ba5b0f2 100644
--- a/third_party/blink/web_tests/http/tests/security/cross-origin-xsl-redirect-BLOCKED-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/cross-origin-xsl-redirect-BLOCKED-expected.txt
@@ -1,5 +1,5 @@
 CONSOLE ERROR: Unsafe attempt to load URL http://localhost:8000/security/resources/forbidden-stylesheet.xsl from frame with URL http://127.0.0.1:8000/security/resources/cross-origin-xsl-redirect.xml. Domains, protocols and ports must match.
 
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This test loads the XML document in an iframe so that it can call dumpAsText(). This test passes if the iframe below does not contain a message starting with "FAIL".
 
diff --git a/third_party/blink/web_tests/http/tests/security/data-url-xsl-expected.txt b/third_party/blink/web_tests/http/tests/security/data-url-xsl-expected.txt
index e42921de..5ba11d35 100644
--- a/third_party/blink/web_tests/http/tests/security/data-url-xsl-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/data-url-xsl-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This test loads the XML document in an iframe so that it can call dumpAsText(). This test passes if the iframe below contains a message starting with "PASS".
 
 --------
diff --git a/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-document-expected.txt b/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-document-expected.txt
index 222a892..474dbe72 100644
--- a/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-document-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-document-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 CONSOLE ERROR: Unsafe attempt to load URL http://localhost:8000/security/resources/target.xml from frame with URL http://127.0.0.1:8000/security/xss-DENIED-xsl-document.xml. Domains, protocols and ports must match.
 
 This test includes content via a cross-origin document() command. It passes if the load fails and thus there is no text below this line.
diff --git a/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-document-redirect-expected.txt b/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-document-redirect-expected.txt
index d143f129..65acac7 100644
--- a/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-document-redirect-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-document-redirect-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 CONSOLE ERROR: Unsafe attempt to load URL http://localhost:8000/security/resources/target.xml from frame with URL http://127.0.0.1:8000/security/xss-DENIED-xsl-document-redirect.xml. Domains, protocols and ports must match.
 
 This test includes content via a cross-origin document() command. It passes if the load fails and thus there is no text below this line.
diff --git a/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt b/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt
index 7d79200..fd3625f1 100644
--- a/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-external-entity-expected.txt
@@ -1,4 +1,4 @@
 CONSOLE ERROR: Unsafe attempt to load URL http://localhost:8000/security/resources/target.xml from frame with URL http://127.0.0.1:8000/security/xss-DENIED-xsl-external-entity.xml. Domains, protocols and ports must match.
 
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This test includes a cross-origin external entity. It passes if the load fails and thus there is no text below this line.
diff --git a/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-external-entity-redirect-expected.txt b/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-external-entity-redirect-expected.txt
index ff616f7d0..a24916e 100644
--- a/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-external-entity-redirect-expected.txt
+++ b/third_party/blink/web_tests/http/tests/security/xss-DENIED-xsl-external-entity-redirect-expected.txt
@@ -1,4 +1,4 @@
 CONSOLE ERROR: Unsafe attempt to load URL http://localhost:8000/security/resources/target.xml from frame with URL http://127.0.0.1:8000/security/xss-DENIED-xsl-external-entity-redirect.xml. Domains, protocols and ports must match.
 
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This test includes a cross-origin external entity. It passes if the load fails and thus there is no text below this line.
diff --git a/third_party/blink/web_tests/http/tests/xmlviewer/dumpAsText/xsl-stylesheet-expected.txt b/third_party/blink/web_tests/http/tests/xmlviewer/dumpAsText/xsl-stylesheet-expected.txt
index f1aa61ae5..832ad2d 100644
--- a/third_party/blink/web_tests/http/tests/xmlviewer/dumpAsText/xsl-stylesheet-expected.txt
+++ b/third_party/blink/web_tests/http/tests/xmlviewer/dumpAsText/xsl-stylesheet-expected.txt
@@ -1,2 +1,2 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 This tests that xml viewer is not used when there is an XSL stylesheet. SUCCESS
diff --git a/third_party/blink/web_tests/http/tests/xsl/xsl-using-document-with-external-entity-expected.txt b/third_party/blink/web_tests/http/tests/xsl/xsl-using-document-with-external-entity-expected.txt
index 18b929d..ff387e3 100644
--- a/third_party/blink/web_tests/http/tests/xsl/xsl-using-document-with-external-entity-expected.txt
+++ b/third_party/blink/web_tests/http/tests/xsl/xsl-using-document-with-external-entity-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 CONSOLE ERROR: Unsafe attempt to load URL xsl-using-document-with-external-entity.xml. Domains, protocols and ports must match.
 
 CONSOLE ERROR: Unsafe attempt to load URL http://example.com/ from frame with URL http://127.0.0.1:8000/xsl/xsl-using-document-with-external-entity.xml. Domains, protocols and ports must match.
diff --git a/third_party/blink/web_tests/http/tests/xsl/xslt-transform-with-javascript-disabled-expected.txt b/third_party/blink/web_tests/http/tests/xsl/xslt-transform-with-javascript-disabled-expected.txt
index 13dc9f3..ee7f9af1 100644
--- a/third_party/blink/web_tests/http/tests/xsl/xslt-transform-with-javascript-disabled-expected.txt
+++ b/third_party/blink/web_tests/http/tests/xsl/xslt-transform-with-javascript-disabled-expected.txt
@@ -1,4 +1,4 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
 
 
 --------
diff --git a/third_party/blink/web_tests/platform/fuchsia/http/tests/inspector-protocol/issues/xsltpi-issue-expected.txt b/third_party/blink/web_tests/platform/fuchsia/http/tests/inspector-protocol/issues/xsltpi-issue-expected.txt
new file mode 100644
index 0000000..066eb8c
--- /dev/null
+++ b/third_party/blink/web_tests/platform/fuchsia/http/tests/inspector-protocol/issues/xsltpi-issue-expected.txt
@@ -0,0 +1,20 @@
+Verifies that XSLT Processing Instruction deprecation issue is created
+Inspector issue: {
+    issue : {
+        code : DeprecationIssue
+        details : {
+            deprecationIssueDetails : {
+                affectedFrame : {
+                    frameId : <string>
+                }
+                sourceCodeLocation : {
+                    columnNumber : 0
+                    lineNumber : -1
+                    url : http://127.0.0.1:8000/inspector-protocol/resources/xsltpi.xml
+                }
+                type : XSLT
+            }
+        }
+    }
+}
+
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/scroll-to-text-fragment/find-range-from-text-directive-no-reveal-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/scroll-to-text-fragment/find-range-from-text-directive-no-reveal-expected.txt
deleted file mode 100644
index b79a4786..0000000
--- a/third_party/blink/web_tests/platform/linux/external/wpt/scroll-to-text-fragment/find-range-from-text-directive-no-reveal-expected.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-This is a testharness.js-based test.
-[FAIL] Text fragment with suffix should only reveal the matching details element
-  assert_true: <details> element containing the match should be opened expected true got false
-Harness: the test ran to completion.
-
diff --git a/third_party/blink/web_tests/svg/custom/invalid-xslt-crash-expected.txt b/third_party/blink/web_tests/svg/custom/invalid-xslt-crash-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/svg/custom/invalid-xslt-crash-expected.txt
+++ b/third_party/blink/web_tests/svg/custom/invalid-xslt-crash-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
index 5b3cde41..02561ebc 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -9899,6 +9899,7 @@
     getter updateCallbackDone
     method constructor
     method skipTransition
+    method waitUntil
 interface ViewTransitionTypeSet
     attribute @@toStringTag
     getter size
diff --git a/third_party/blink/web_tests/xmlviewer/long-multi-byte-char-expected.txt b/third_party/blink/web_tests/xmlviewer/long-multi-byte-char-expected.txt
index a20ab5f..029f9a1 100644
--- a/third_party/blink/web_tests/xmlviewer/long-multi-byte-char-expected.txt
+++ b/third_party/blink/web_tests/xmlviewer/long-multi-byte-char-expected.txt
@@ -1 +1 @@
-CONSOLE WARNING: crbug.com/435623334: This page uses XSLT, which being considered for removal from the web. If that happens, it is possible that this page will need to be updated to maintain functionality.
+CONSOLE WARNING: XSLTProcessor and XSLT Processing Instructions have been deprecated by all browsers. These features will be removed from this browser soon. See https://chromestatus.com/feature/4709671889534976.
diff --git a/third_party/chromite b/third_party/chromite
index 76e9ad3..8205aa1 160000
--- a/third_party/chromite
+++ b/third_party/chromite
@@ -1 +1 @@
-Subproject commit 76e9ad3dad5fa5c46fbbcce0fea584b4e170baa4
+Subproject commit 8205aa10b208855bffdbd89ab1e9a26ee18b176c
diff --git a/third_party/dawn b/third_party/dawn
index dcd9e74..50eef86 160000
--- a/third_party/dawn
+++ b/third_party/dawn
@@ -1 +1 @@
-Subproject commit dcd9e7437f2ebdbed778d697b1b2da88acdf7039
+Subproject commit 50eef863a70381fc2c3df62463ecc98c1c02e7bc
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src
index 402d919..b4bdef8 160000
--- a/third_party/llvm-libc/src
+++ b/third_party/llvm-libc/src
@@ -1 +1 @@
-Subproject commit 402d919cf14e3c052a14dab8a9db3628c6e850f4
+Subproject commit b4bdef8f8c6bdb155e204c303013b773131dbdbd
diff --git a/third_party/skia b/third_party/skia
index 5658e91..011fb11 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit 5658e91de531f3a05ebb87fad3deed5da7ecb5b2
+Subproject commit 011fb11ccea0a76aa59c4364fd75a1a3f02c38d6
diff --git a/third_party/spirv-tools/src b/third_party/spirv-tools/src
index fbe9605..917617c 160000
--- a/third_party/spirv-tools/src
+++ b/third_party/spirv-tools/src
@@ -1 +1 @@
-Subproject commit fbe9605c516d4e9bc27aa621dc5edb195d100ef5
+Subproject commit 917617c93734a94446332fe62aed1f90cddcd61a
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index ca45bb2..e58814d 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit ca45bb2eb74577abaf9c344d8a31700eb7b7f549
+Subproject commit e58814db129a9b5e0f18a8f13b5fa3964d90b105
diff --git a/third_party/webrtc b/third_party/webrtc
index b488bbb..c06d073 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit b488bbb11b4fee38df533fc0c7a5ed94d31f6e3b
+Subproject commit c06d073191ac510a65d72013124a18a7bd87ad01
diff --git a/tools/autotest.py b/tools/autotest.py
index 8861d62..be94008 100755
--- a/tools/autotest.py
+++ b/tools/autotest.py
@@ -830,10 +830,17 @@
   if not args.run_changed and not args.files and not args.name:
     parser.error('Specify a file to test or use --run-changed')
 
+  # Cog is almost unusable with local search, so turn on remote_search.
+  use_remote_search = args.remote_search
+  if not use_remote_search and SRC_DIR.parts[:3] == ('/', 'google', 'cog'):
+    if DEBUG:
+      print('Detected cog, turning on remote-search.')
+    use_remote_search = True
+
   gtest_filter = args.gtest_filter
 
   # Don't try to search if rg is not installed, and use the old behavior.
-  if not args.remote_search and not shutil.which('rg'):
+  if not use_remote_search and not shutil.which('rg'):
     if not args.quiet:
       print(
           'rg command not found. Install ripgrep to enable running tests by name.'
@@ -848,7 +855,7 @@
     test_names.extend(args.name)
   if test_names:
     files, filter = SearchForTestsByName(test_names, args.quiet,
-                                         args.remote_search)
+                                         use_remote_search)
     if not gtest_filter:
       gtest_filter = filter
     files_to_test.extend(files)
@@ -860,7 +867,8 @@
 
   filenames = []
   for file in files_to_test:
-    filenames.extend(FindMatchingTestFiles(file, args.remote_search, args.path_index))
+    filenames.extend(
+        FindMatchingTestFiles(file, use_remote_search, args.path_index))
 
   if not filenames:
     ExitWithMessage('No associated test files found.')
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec
index aeb9f8b8..57ee475 100644
--- a/tools/gritsettings/resource_ids.spec
+++ b/tools/gritsettings/resource_ids.spec
@@ -97,18 +97,22 @@
     "includes": [2200],
     "structures": [2220],
   },
+  # Both browser_resources.grd for chrome/browser/actor/resources and
+  # chrome/browser/actor/resources/internal start with the same ids because only
+  # one of them is built depending on if is_chrome_branded is true.
   "chrome/browser/actor/resources/internal/browser_resources.grd": {
     "structures": [2230],
     "messages": [2235],
-    "includes": [2250],
+    "includes": [2240],
   },
   "chrome/browser/actor/resources/browser_resources.grd": {
     "structures": [2230],
     "messages": [2235],
-    "includes": [2250],
+    "includes": [2240],
   },
   "chrome/browser/dev_ui_browser_resources.grd": {
-    "includes": [2240],
+    "META": {"join": 2},
+    "includes": [2250],
   },
   "chrome/browser/nearby_sharing/internal/nearby_share_internal_icons.grd": {
     "includes": [2260],
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index a30ff86..9196f9e 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -8292,6 +8292,7 @@
   <int value="-2111196530" label="EnableAssistantLauncherUI:disabled"/>
   <int value="-2110507629" label="ButterOnDesktopFollowup:disabled"/>
   <int value="-2109981927" label="ReadAloudTapToSeek:disabled"/>
+  <int value="-2109523292" label="InfobarRefresh:enabled"/>
   <int value="-2108866112" label="FeedHeaderStickToTop:enabled"/>
   <int value="-2108836417" label="ArcvmSwapoutKeyboardShortcut:enabled"/>
   <int value="-2108564200" label="AutofillUpstream:disabled"/>
@@ -10026,6 +10027,7 @@
   <int value="-1508852757" label="CreditCardAutofillTouchBar:disabled"/>
   <int value="-1508837668" label="VCPortraitRelighting:enabled"/>
   <int value="-1507722271" label="ImprovedDesksKeyboardShortcuts:enabled"/>
+  <int value="-1507277117" label="InfobarRefresh:disabled"/>
   <int value="-1506880454"
       label="SupervisedUserCommittedInterstitials:disabled"/>
   <int value="-1506664186"
@@ -11136,6 +11138,7 @@
       label="AutofillEnableSurfacingServerCardNickname:enabled"/>
   <int value="-1127996427" label="enable-files-details-panel"/>
   <int value="-1127963300" label="CrostiniUsername:enabled"/>
+  <int value="-1126819878" label="infobar-refresh:disabled"/>
   <int value="-1126242237" label="DriveFsShowCSEFiles:disabled"/>
   <int value="-1126217973" label="IdleTimeSpellChecking:disabled"/>
   <int value="-1125840399" label="ViewsBrowserWindows:enabled"/>
@@ -11663,6 +11666,7 @@
   <int value="-943223021"
       label="FeatureNotificationGuideSkipCheckForLowEngagedUsers:disabled"/>
   <int value="-942935700" label="FastPairKeyboards:disabled"/>
+  <int value="-941752665" label="infobar-refresh:enabled"/>
   <int value="-941056354" label="CdmStorageDatabase:enabled"/>
   <int value="-940931658" label="UseDMSAAForTilesAndroidGL:disabled"/>
   <int value="-940915510" label="IgnoreCSPInWebPaymentAPI:disabled"/>
@@ -12128,6 +12132,7 @@
   <int value="-765531607"
       label="ReadAnythingReadAloudTSTextSegmentation:disabled"/>
   <int value="-765417607" label="KeyboardLockPrompt:disabled"/>
+  <int value="-764767578" label="RecentlyClosedTabsAndWindows:disabled"/>
   <int value="-764463072" label="WebViewMixedContentAutoupgrades:disabled"/>
   <int value="-764363697" label="OmniboxForceAllowedToBeDefault:disabled"/>
   <int value="-764164329" label="UiaProvider:disabled"/>
@@ -18088,6 +18093,7 @@
   <int value="1330264457" label="OmniboxUIExperimentVerticalLayout:disabled"/>
   <int value="1330592192" label="FedCmLightweightMode:enabled"/>
   <int value="1330600806" label="enable-hls-playback:enabled"/>
+  <int value="1330624706" label="RecentlyClosedTabsAndWindows:enabled"/>
   <int value="1331098784" label="ReducedReferrerGranularity:enabled"/>
   <int value="1332120969" label="ChromeDuet:disabled"/>
   <int value="1332891404"
@@ -22589,7 +22595,7 @@
 
 <enum name="PipelineStatus">
   <int value="0" label="PIPELINE_OK"/>
-  <int value="1" label="PIPELINE_ERROR_URL_NOT_FOUND"/>
+  <int value="1" label="(Deprecated) PIPELINE_ERROR_URL_NOT_FOUND"/>
   <int value="2" label="PIPELINE_ERROR_NETWORK"/>
   <int value="3" label="PIPELINE_ERROR_DECODE"/>
   <int value="5" label="PIPELINE_ERROR_ABORT"/>
@@ -22597,7 +22603,7 @@
   <int value="7" label="PIPELINE_ERROR_REQUIRED_FILTER_MISSING"/>
   <int value="8" label="PIPELINE_ERROR_COULD_NOT_RENDER"/>
   <int value="9" label="PIPELINE_ERROR_READ"/>
-  <int value="10" label="PIPELINE_ERROR_OPERATION_PENDING"/>
+  <int value="10" label="(Deprecated) PIPELINE_ERROR_OPERATION_PENDING"/>
   <int value="11" label="PIPELINE_ERROR_INVALID_STATE"/>
   <int value="12" label="DEMUXER_ERROR_COULD_NOT_OPEN"/>
   <int value="13" label="DEMUXER_ERROR_COULD_NOT_PARSE"/>
@@ -22607,13 +22613,14 @@
   <int value="17" label="CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR"/>
   <int value="18" label="CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR"/>
   <int value="19" label="AUDIO_RENDERER_ERROR"/>
-  <int value="20" label="AUDIO_RENDERER_ERROR_SPLICE_FAILED"/>
+  <int value="20" label="(Deprecated) AUDIO_RENDERER_ERROR_SPLICE_FAILED"/>
   <int value="21" label="PIPELINE_ERROR_EXTERNAL_RENDERER_FAILED"/>
   <int value="22" label="DEMUXER_ERROR_DETECTED_HLS"/>
   <int value="23" label="PIPELINE_ERROR_HARDWARE_CONTEXT_RESET"/>
   <int value="24" label="PIPELINE_ERROR_DISCONNECTED"/>
   <int value="25" label="DEMUXER_ERROR_BITSTREAM_CONVERSION_FAILED"/>
   <int value="26" label="PIPELINE_ERROR_OUT_OF_MEMORY"/>
+  <int value="27" label="DEMUXER_ERROR_PROGRESSIVE_DISABLED"/>
 </enum>
 
 <enum name="PlatformFileError">
diff --git a/tools/metrics/histograms/metadata/cross_device/enums.xml b/tools/metrics/histograms/metadata/cross_device/enums.xml
index bea51f5..14f2ba0 100644
--- a/tools/metrics/histograms/metadata/cross_device/enums.xml
+++ b/tools/metrics/histograms/metadata/cross_device/enums.xml
@@ -263,17 +263,6 @@
 
 <!-- LINT.ThenChange(//chrome/browser/ash/login/smart_lock/smart_lock_metrics.h:SmartLockAuthEvent) -->
 
-<enum name="EasyUnlockDeviceModelHash">
-  <int value="-1829584143" label="Motorola XT1097"/>
-  <int value="-1429808627" label="HTC One"/>
-  <int value="-1168032746" label="Motorola Nexus 6"/>
-  <int value="-617422855" label="LGE Nexus 4"/>
-  <int value="684891985" label="Motorola Moto X"/>
-  <int value="1286382027" label="Motorola XT1095"/>
-  <int value="1412446710" label="Motorola XT1096"/>
-  <int value="1881443083" label="LGE Nexus 5"/>
-</enum>
-
 <enum name="EasyUnlockDidUserManuallyUnlockPhone">
   <int value="0" label="Never locked"/>
   <int value="1" label="Manually unlocked"/>
diff --git a/tools/metrics/histograms/metadata/cross_device/histograms.xml b/tools/metrics/histograms/metadata/cross_device/histograms.xml
index cbc16f3..de0ddb8 100644
--- a/tools/metrics/histograms/metadata/cross_device/histograms.xml
+++ b/tools/metrics/histograms/metadata/cross_device/histograms.xml
@@ -1105,19 +1105,6 @@
   </summary>
 </histogram>
 
-<histogram name="EasyUnlock.AuthProximity.RemoteDeviceModelHash"
-    enum="EasyUnlockDeviceModelHash" expires_after="2026-05-05">
-  <owner>hansberry@chromium.org</owner>
-  <owner>chromeos-cross-device-eng@google.com</owner>
-  <summary>
-    The hash of the phone model used to successfully sign in or unlock using
-    Smart Lock.
-
-    This hash is calculated by taking the first 4 bytes of the MD5 hash of the
-    device model.
-  </summary>
-</histogram>
-
 <histogram name="EasyUnlock.AuthProximity.RollingRssi" units="dBm"
     expires_after="2026-05-05">
   <owner>hansberry@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/extensions/enums.xml b/tools/metrics/histograms/metadata/extensions/enums.xml
index 455011c..6a57f0f 100644
--- a/tools/metrics/histograms/metadata/extensions/enums.xml
+++ b/tools/metrics/histograms/metadata/extensions/enums.xml
@@ -3327,6 +3327,12 @@
   <int value="3" label="Policy Violation"/>
 </enum>
 
+<enum name="ExtensionUsageAction">
+  <int value="0" label="Extension Pinned"/>
+  <int value="1" label="Extension Unpinned"/>
+  <int value="2" label="Extension Context Menu Init"/>
+</enum>
+
 <enum name="ExternalItemState">
   <int value="0" label="DEPRECATED_DISABLED"/>
   <int value="1" label="DEPRECATED_ENABLED"/>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index 71c252e..76cd966 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -4000,6 +4000,16 @@
   </token>
 </histogram>
 
+<histogram name="IOS.Omnibox.NumberOfLines" units="count"
+    expires_after="2026-07-28">
+  <owner>christianxu@google.com</owner>
+  <owner>bling-team@google.com</owner>
+  <summary>
+    Records the number of lines shown in the multiline omnibox when a query is
+    accepted.
+  </summary>
+</histogram>
+
 <histogram name="IOS.Omnibox.SteadyStatePositionAtStartup"
     enum="OmniboxPositionType" expires_after="2026-03-01">
   <owner>christianxu@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 46f2e47e..d9b007e 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -7937,6 +7937,12 @@
     <variant name=".AudioVideo.MediaFoundation.Eme"
         summary="MediaFoundations renderer watch time for EME media with both
                  an audio and video track."/>
+    <variant name=".AudioVideo.MediaFoundation.HDR.All"
+        summary="MediaFoundations renderer HDR watch time for all media with
+                 both an audio and video track."/>
+    <variant name=".AudioVideo.MediaFoundation.HDR.EME"
+        summary="MediaFoundations renderer HDR watch time for EME media with
+                 both an audio and video track."/>
     <variant name=".AudioVideo.MSE"
         summary="Watch time for MSE media with both an audio and video track."/>
     <variant name=".AudioVideo.Muted.All"
diff --git a/tools/metrics/histograms/metadata/page/enums.xml b/tools/metrics/histograms/metadata/page/enums.xml
index 5173048..7f9ce8d 100644
--- a/tools/metrics/histograms/metadata/page/enums.xml
+++ b/tools/metrics/histograms/metadata/page/enums.xml
@@ -308,6 +308,7 @@
   <int value="33" label="(Deprecated) Change Password"/>
   <int value="34" label="Lens Overlay Homework"/>
   <int value="35" label="AI Mode"/>
+  <int value="36" label="Reading mode"/>
 </enum>
 
 <!-- LINT.ThenChange(//chrome/browser/ui/page_action/page_action_icon_type.h:PageActionIconType) -->
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml
index bddc183..b6f6164 100644
--- a/tools/metrics/histograms/metadata/page/histograms.xml
+++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -641,8 +641,10 @@
     <variant name="ProductSpecifications"/>
     <variant name="PWAInstall"/>
     <variant name="QRCodeGenerator"/>
-    <variant name="ReadAnything"/>
+    <variant name="ReadAnything"
+        summary="ReadAnything (Obsolete, Deprecated Jun 06, 2024)"/>
     <variant name="ReaderMode"/>
+    <variant name="ReadingMode"/>
     <variant name="SaveAutofillAddress"/>
     <variant name="SaveCard"/>
     <variant name="SaveIban"/>
diff --git a/tools/metrics/histograms/metadata/scanning/histograms.xml b/tools/metrics/histograms/metadata/scanning/histograms.xml
index 5a2d191..59848709 100644
--- a/tools/metrics/histograms/metadata/scanning/histograms.xml
+++ b/tools/metrics/histograms/metadata/scanning/histograms.xml
@@ -33,18 +33,8 @@
   </summary>
 </histogram>
 
-<histogram name="Scanning.DiscoverySession.MaxInterval" units="ms"
-    expires_after="2026-01-11">
-  <owner>bmgordon@chromium.org</owner>
-  <owner>project-bolton@google.com</owner>
-  <summary>
-    Records the maximum interval between events during a discovery session.
-    Intended to be used for tuning session monitor timeouts.
-  </summary>
-</histogram>
-
 <histogram name="Scanning.DiscoverySession.NumScanners" units="scanners"
-    expires_after="2025-11-30">
+    expires_after="2026-05-30">
   <owner>bmgordon@chromium.org</owner>
   <owner>project-bolton@google.com</owner>
   <summary>
@@ -54,7 +44,7 @@
 </histogram>
 
 <histogram name="Scanning.DiscoverySession.Result"
-    enum="ScannerOperationResult" expires_after="2025-11-30">
+    enum="ScannerOperationResult" expires_after="2026-05-30">
   <owner>bmgordon@chromium.org</owner>
   <owner>project-bolton@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/settings/enums.xml b/tools/metrics/histograms/metadata/settings/enums.xml
index 485bd599..5f66f6a 100644
--- a/tools/metrics/histograms/metadata/settings/enums.xml
+++ b/tools/metrics/histograms/metadata/settings/enums.xml
@@ -111,6 +111,7 @@
   <int value="1624624514" label="FinancialAccountsManagementFragment"/>
   <int value="1676521220" label="SelectLanguageFragment"/>
   <int value="1764379105" label="TabsSettings"/>
+  <int value="1837742646" label="AutofillBuyNowPayLaterFragment"/>
   <int value="1849593145" label="AndroidPaymentAppsFragment"/>
   <int value="1891640238" label="AutofillPaymentMethodsFragment"/>
   <int value="1952237285" label="TracingSettings"/>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml
index e1580e1..9cd2a64 100644
--- a/tools/metrics/ukm/ukm.xml
+++ b/tools/metrics/ukm/ukm.xml
@@ -8982,6 +8982,28 @@
   </metric>
 </event>
 
+<event name="Extensions.ExtensionUsage">
+  <owner>howardcha@google.com</owner>
+  <owner>webstore-eng@google.com</owner>
+  <summary>
+    Records user actions related to an extension, providing usage metrics for
+    the Chrome Web Store. Tracked actions include pinning, unpinning, enabling,
+    disabling, context menu access, and toolbar icon clicks.
+  </summary>
+  <metric name="Action" enum="ExtensionUsageAction">
+    <summary>
+      The action the user took on the extension.
+    </summary>
+    <aggregation>
+      <history>
+        <statistics>
+          <enumeration/>
+        </statistics>
+      </history>
+    </aggregation>
+  </metric>
+</event>
+
 <event name="Extensions.MV2ExtensionHandledInSoftDisable">
   <owner>rdevlin.cronin@chromium.org</owner>
   <owner>emiliapaz@chromium.org</owner>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv
index edd01cf..a35a982 100644
--- a/tools/perf/benchmark.csv
+++ b/tools/perf/benchmark.csv
@@ -20,7 +20,7 @@
 UNSCHEDULED_v8.loading_mobile,"cbruni@chromium.org, leszeks@chromium.org",Blink>JavaScript,https://bit.ly/system-health-v8-benchmarks,"2016,2018,2019,2020,2023,emerging_market,health_check,international,javascript_heavy"
 ad_frames.fencedframe,lbrady@google.com,Blink>FencedFrames,https://tinyurl.com/fenced-frame-benchmark,
 base_perftests,"skyostil@chromium.org, gab@chromium.org",Internals>SequenceManager,https://chromium.googlesource.com/chromium/src/+/HEAD/base/README.md#performance-testing,
-blink_perf.accessibility,aleventhal@chromium.org,Blink>Accessibility,https://bit.ly/blink-perf-benchmarks,all
+blink_perf.accessibility,"aleventhal@chromium.org, gregoryd@google.com, lucasradaelli@google.com",Blink>Accessibility,https://bit.ly/blink-perf-benchmarks,all
 blink_perf.bindings,"jbroman@chromium.org, japhet@chromium.org, haraken@chromium.org",Blink>Bindings,https://bit.ly/blink-perf-benchmarks,all
 blink_perf.css,"futhark@chromium.org, andruud@chromium.org",Blink>CSS,https://bit.ly/blink-perf-benchmarks,all
 blink_perf.dom,masonf@chromium.org,Blink>DOM,https://bit.ly/blink-perf-benchmarks,all
diff --git a/tools/perf/benchmarks/blink_perf.py b/tools/perf/benchmarks/blink_perf.py
index f93aa1b..7f52d6f1 100644
--- a/tools/perf/benchmarks/blink_perf.py
+++ b/tools/perf/benchmarks/blink_perf.py
@@ -380,7 +380,11 @@
                                   extra_tags=self.TAGS)
 
 
-@benchmark.Info(emails=['aleventhal@chromium.org'],
+@benchmark.Info(emails=[
+                    'aleventhal@chromium.org',
+                    'gregoryd@google.com',
+                    'lucasradaelli@google.com'
+                ],
                 component='Blink>Accessibility',
                 documentation_url='https://bit.ly/blink-perf-benchmarks')
 class BlinkPerfAccessibility(_BlinkPerfBenchmark):
diff --git a/tools/perf/core/path_util.py b/tools/perf/core/path_util.py
index 2c5f15a2..4745329 100644
--- a/tools/perf/core/path_util.py
+++ b/tools/perf/core/path_util.py
@@ -78,6 +78,10 @@
   return os.path.join(GetChromiumSrcDir(), 'tools', 'variations')
 
 
+def GetDashboardDir():
+  return os.path.join(GetChromiumSrcDir(), 'third_party', 'catapult',
+                      'dashboard')
+
 def AddAndroidDeviceInteractionToPath():
   device_interaction_path = GetAndroidDeviceInteractionToPath()
   if device_interaction_path not in sys.path:
@@ -113,5 +117,11 @@
   if android_pylib_path not in sys.path:
     sys.path.insert(1, android_pylib_path)
 
+
+def AddDashboardToPath():
+  dashboard_path = GetDashboardDir()
+  if dashboard_path not in sys.path:
+    sys.path.insert(1, dashboard_path)
+
 def GetExpectationsPath():
   return os.path.join(GetPerfDir(), 'expectations.config')
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index a41ebc5..73ad456c 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/v52.0/linux-arm64/trace_processor_shell"
         },
         "win": {
-            "hash": "04796c49c1341c5c4d66879a91b0d6ade85503e9",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/d81f40d01641e31f1f88987fabf9e6d791dc3cb8/trace_processor_shell.exe"
+            "hash": "a4664a47b90d0abc272a40a0c1fe4d0ac8e7d3d8",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/d972f3eb1be39376d6e296e0fa98e0817d56ee45/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "46d798c1864490cbb2ee053d6eda436184470e69",
@@ -22,7 +22,7 @@
         },
         "linux": {
             "hash": "ee16e387fead87383d2c66a04c574976bc1c58ab",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/846c6baa040a92f8ae1c24c49e142a30187573dc/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/d972f3eb1be39376d6e296e0fa98e0817d56ee45/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/perf/json_util.py b/tools/perf/json_util.py
index 6211590..bfad930 100644
--- a/tools/perf/json_util.py
+++ b/tools/perf/json_util.py
@@ -14,6 +14,10 @@
 from typing import Any, Dict, List, Mapping, Optional, Set, Tuple
 from core import path_util
 
+path_util.AddTracingToPath()
+path_util.AddDashboardToPath()
+from dashboard.common import histogram_helpers  # pylint: disable=import-error
+
 import json_constants
 
 # The source of truth for public perf builders, which is extracted from
@@ -396,7 +400,7 @@
     return merged_results, links, key
 
   def process(
-      self, builder_details: PerfBuilderDetails, benchmark_name: str=""
+      self, builder_details: PerfBuilderDetails, benchmark_name: str=''
       ) -> Dict[str, Any]:
     """Processes the result2 jsons and returns a skia json.
 
@@ -409,8 +413,8 @@
     """
     output = {
         json_constants.VERSION: 1,
-        json_constants.GIT_HASH: (builder_details.git_hash if builder_details
-                                  else ""),
+        json_constants.GIT_HASH: (builder_details.git_hash if builder_details else
+                                  ''),
         json_constants.KEY: collections.defaultdict(str),
         json_constants.RESULTS: [],
     }
@@ -430,46 +434,17 @@
 
     output[json_constants.KEY] = key
     output[json_constants.LINKS] = links
-    measurements = self.measurements_from_results(merged_results)
+    measurements = self.measurements_from_results(merged_results,
+                                                  key[json_constants.BENCHMARK])
 
     output[json_constants.RESULTS] = measurements
 
     return output
 
-  def _generate_synthetic_measurements(
-      self,
-      value_measurements: List[Tuple[str, float]],
-      keys: Dict[str, str],
-  ) -> List[Dict[str, Any]]:
-    """Generates synthetic measurements."""
-    synthetic_measurements = []
-    for value, measurement in value_measurements:
-      synthetic_measurements.append({
-          json_constants.VALUE: value,
-          json_constants.MEASUREMENT: measurement,
-      })
-    synthetic_result = {
-        json_constants.MEASUREMENTS: {
-            json_constants.STAT: synthetic_measurements
-        },
-        json_constants.KEY: {
-            json_constants.IMPROVEMENT_DIRECTION: (
-                keys[json_constants.IMPROVEMENT_DIRECTION]),
-            json_constants.UNIT: keys[json_constants.UNIT],
-            json_constants.TEST: keys[json_constants.TEST],
-        },
-    }
-    if keys.get(json_constants.SUBTEST_1, ""):
-      synthetic_result[json_constants.KEY][json_constants.SUBTEST_1] = (
-          keys[json_constants.SUBTEST_1])
-    if keys.get(json_constants.SUBTEST_2, ""):
-      synthetic_result[json_constants.KEY][json_constants.SUBTEST_2] = (
-          keys[json_constants.SUBTEST_2])
-    return synthetic_result
-
   def measurements_from_results(
       self,
       data: Mapping[List[Any], List[Any]],
+      benchmark_name: str,
   ) -> List[Dict[str, Any]]:
     """Calculates the measurements for each test."""
     results = []
@@ -481,6 +456,7 @@
         subtest_1, subtest_2 = None, None
       else:
         test_name, unit, improvement_direction, subtest_1, subtest_2 = key
+
       avg, std_err, count, max_val, min_val, sum_val = calculate_stats(values)
       measurements = [
           {
@@ -523,85 +499,114 @@
       if subtest_2:
         result[json_constants.KEY][json_constants.SUBTEST_2] = subtest_2
       results.append(result)
+
       # Generate a synthetic measurement that ends with "_avg", "_min", "_max",
       # and "_sum" to support the data parity with the chromeperf.
-      if self.generate_synthetic_measurements:
-        synthetic_result_avg = self._generate_synthetic_measurements(
-            value_measurements=[
-                (json_constants.AVERAGE, avg),
-            ],
-            keys={
-                json_constants.IMPROVEMENT_DIRECTION: improvement_direction,
-                json_constants.UNIT: unit,
-                json_constants.TEST: test_name + "_avg",
-                json_constants.SUBTEST_1: subtest_1,
-                json_constants.SUBTEST_2: subtest_2,
-            },
-        )
-        synthetic_result_min = self._generate_synthetic_measurements(
-            value_measurements=[
-                (json_constants.MIN, min_val),
-            ],
-            keys={
-                json_constants.IMPROVEMENT_DIRECTION: improvement_direction,
-                json_constants.UNIT: unit,
-                json_constants.TEST: test_name + "_min",
-                json_constants.SUBTEST_1: subtest_1,
-                json_constants.SUBTEST_2: subtest_2,
-            },
-        )
-        synthetic_result_max = self._generate_synthetic_measurements(
-            value_measurements=[
-                (json_constants.MAX, max_val),
-            ],
-            keys={
-                json_constants.IMPROVEMENT_DIRECTION: improvement_direction,
-                json_constants.UNIT: unit,
-                json_constants.TEST: test_name + "_max",
-                json_constants.SUBTEST_1: subtest_1,
-                json_constants.SUBTEST_2: subtest_2,
-            },
-        )
-        synthetic_result_sum = self._generate_synthetic_measurements(
-            value_measurements=[
-                (json_constants.SUM, sum_val),
-            ],
-            keys={
-                json_constants.IMPROVEMENT_DIRECTION: improvement_direction,
-                json_constants.UNIT: unit,
-                json_constants.TEST: test_name + "_sum",
-                json_constants.SUBTEST_1: subtest_1,
-                json_constants.SUBTEST_2: subtest_2,
-            },
-        )
-        synthetic_result_count = self._generate_synthetic_measurements(
-            value_measurements=[
-                (json_constants.COUNT, count),
-            ],
-            keys={
-                json_constants.IMPROVEMENT_DIRECTION: "up",
-                json_constants.UNIT: "unitless_biggerIsBetter",
-                json_constants.TEST: test_name + "_count",
-                json_constants.SUBTEST_1: subtest_1,
-                json_constants.SUBTEST_2: subtest_2,
-            },
-        )
-        synthetic_result_std = self._generate_synthetic_measurements(
-            value_measurements=[
-                (json_constants.STD_DEV, std_err),
-            ],
-            keys={
-                json_constants.IMPROVEMENT_DIRECTION: "down",
-                json_constants.UNIT: unit,
-                json_constants.TEST: test_name + "_std",
-                json_constants.SUBTEST_1: subtest_1,
-                json_constants.SUBTEST_2: subtest_2,
-            },
-        )
-        results.append(synthetic_result_avg)
-        results.append(synthetic_result_min)
-        results.append(synthetic_result_max)
-        results.append(synthetic_result_sum)
-        results.append(synthetic_result_count)
-        results.append(synthetic_result_std)
+      if self.generate_synthetic_measurements and not self._is_legacy_benchmark(
+          benchmark_name):
+        synthetic_keys_base = {
+            json_constants.IMPROVEMENT_DIRECTION: improvement_direction,
+            json_constants.UNIT: unit,
+            json_constants.SUBTEST_1: subtest_1,
+            json_constants.SUBTEST_2: subtest_2,
+        }
+
+        synthetic_stats_to_generate = [
+            ('avg', (json_constants.VALUE, avg), None, None),
+            ('min', (json_constants.VALUE, min_val), None, None),
+            ('max', (json_constants.VALUE, max_val), None, None),
+            ('sum', (json_constants.VALUE, sum_val), None, None),
+            ('count', (json_constants.VALUE, count), "up",
+             "unitless_biggerIsBetter"),
+            ('std', (json_constants.VALUE, std_err), "down", None),
+        ]
+
+        # Loop through the definitions and generate measurements
+        for suffix, (
+            value, measurement
+        ), dir_override, unit_override in synthetic_stats_to_generate:
+          if not self._should_filter_statistic(test_name, benchmark_name,
+                                               suffix):
+
+            # Start with the base keys and add the specific test name
+            keys = {
+                **synthetic_keys_base, json_constants.TEST:
+                f'{test_name}_{suffix}'
+            }
+
+            # Apply overrides if they exist
+            if dir_override:
+              keys[json_constants.IMPROVEMENT_DIRECTION] = dir_override
+            if unit_override:
+              keys[json_constants.UNIT] = unit_override
+
+            synthetic_measurements = [{
+                json_constants.VALUE: value,
+                json_constants.MEASUREMENT: measurement,
+            }]
+
+            synthetic_result = {
+                json_constants.MEASUREMENTS: {
+                    json_constants.STAT: synthetic_measurements
+                },
+                json_constants.KEY: {
+                    json_constants.IMPROVEMENT_DIRECTION:
+                    (keys[json_constants.IMPROVEMENT_DIRECTION]),
+                    json_constants.UNIT:
+                    keys[json_constants.UNIT],
+                    json_constants.TEST:
+                    keys[json_constants.TEST],
+                },
+            }
+            if keys.get(json_constants.SUBTEST_1, ''):
+              synthetic_result[json_constants.KEY][json_constants.SUBTEST_1] = (
+                  keys[json_constants.SUBTEST_1])
+            if keys.get(json_constants.SUBTEST_2, ''):
+              synthetic_result[json_constants.KEY][json_constants.SUBTEST_2] = (
+                  keys[json_constants.SUBTEST_2])
+
+            results.append(synthetic_result)
+
     return results
+
+  def _should_add_media_value(self, value_name: str) -> bool:
+    """Port of the media value filtering logic."""
+    media_re = re.compile(
+        r'(?<!dump)(?<!process)_(std|count|max|min|sum|pct_\d{4}(_\d+)?)$')
+    return not media_re.search(value_name)
+
+  def _should_add_memory_long_running_value(self, value_name: str) -> bool:
+    """Port of the memory.long_running value filtering logic."""
+    v8_re = re.compile(
+        r'renderer_processes:'
+        r'(reported_by_chrome:v8|reported_by_os:system_memory:[^:]+$)')
+    if 'memory:chrome' in value_name:
+      return ('renderer:subsystem:v8' in value_name
+              or 'renderer:vmstats:overall' in value_name
+              or bool(v8_re.search(value_name)))
+    return 'v8' in value_name
+
+  def _should_filter_statistic(self, test_name: str, benchmark_name: str,
+                               stat_name: str) -> bool:
+    """A complete port of ShouldFilterStatistic from histogram_helpers."""
+
+    if test_name == 'benchmark_total_duration':
+      return True
+    if benchmark_name.startswith(
+        'memory') and not benchmark_name.startswith('memory.long_running'):
+      if 'memory:' in test_name and stat_name in histogram_helpers._STATS_BLACKLIST:  # pylint: disable=protected-access
+        return True
+    if benchmark_name.startswith('memory.long_running'):
+      value_name = '%s_%s' % (test_name, stat_name)
+      return not self._should_add_memory_long_running_value(value_name)
+    if benchmark_name in ('media.desktop', 'media.mobile'):
+      value_name = '%s_%s' % (test_name, stat_name)
+      return not self._should_add_media_value(value_name)
+    if benchmark_name.startswith('system_health'):
+      if stat_name in histogram_helpers._STATS_BLACKLIST:  # pylint: disable=protected-access
+        return True
+    return False
+
+  def _is_legacy_benchmark(self, benchmark_name: str) -> bool:
+    """Port of the IsLegacyBenchmark logic."""
+    return benchmark_name in histogram_helpers._LEGACY_BENCHMARKS  # pylint: disable=protected-access
diff --git a/tools/perf/json_util_unittest.py b/tools/perf/json_util_unittest.py
index be3aee41..1088d91 100755
--- a/tools/perf/json_util_unittest.py
+++ b/tools/perf/json_util_unittest.py
@@ -13,6 +13,62 @@
 
 # pylint: disable=too-many-lines
 
+# Mocked constants to avoid dependency on the actual json_constants file.
+MOCK_JSON_CONSTANTS = {
+    'AVERAGE': 'average',
+    'BENCHMARK': 'benchmark',
+    'BENCHMARKS': 'benchmarks',
+    'BOT': 'bot',
+    'BOT_ID': 'botId',
+    'BOT_IDS': 'Bot Id',
+    'BUILD_PAGE': 'Build Page',
+    'CHROMIUM_COMMIT_POSITION': 'Chromium Commit Position',
+    'COUNT': 'count',
+    'DIAGNOSTICS': 'diagnostics',
+    'EXPERIMENT_GCS_BUCKET': 'chrome-perf-experiment-non-public',
+    'ERROR': 'error',
+    'GENERIC_SET': 'GenericSet',
+    'GIT_HASH': 'git_hash',
+    'GUID': 'guid',
+    'IMPROVEMENT_DIRECTION': 'improvement_direction',
+    'KEY': 'key',
+    'LINKS': 'links',
+    'MASTER': 'master',
+    'MAX': 'max',
+    'MEASUREMENTS': 'measurements',
+    'MEASUREMENT': 'measurement',
+    'MIN': 'min',
+    'NAME': 'name',
+    'OS_DETAILED_VERSIONS': 'osDetailedVersions',
+    'OS_VERSION': 'OS Version',
+    'RESULTS': 'results',
+    'SAMPLE_VALUES': 'sampleValues',
+    'STD_DEV': 'error',
+    'STAT': 'stat',
+    'STORIES': 'stories',
+    'STORY_TAGS': 'storyTags',
+    'SUBTEST_1': 'subtest_1',
+    'SUBTEST_2': 'subtest_2',
+    'SUM': 'sum',
+    'SUMMARY_OPTIONS': 'summaryOptions',
+    'TEST': 'test',
+    'TRACE_URLS': 'traceUrls',
+    'TYPE': 'type',
+    'UNIT': 'unit',
+    'V8_GIT_HASH': 'V8',
+    'VALUE': 'value',
+    'VALUES': 'values',
+    'VERSION': 'version',
+    'WEBRTC_GIT_HASH': 'WebRTC',
+    'LEGACY_BENCHMARKS': ['legacy_benchmark1', 'legacy_benchmark2'],
+    'STATS_BLOCKLIST': {'std', 'count', 'max', 'min', 'sum'},
+}
+
+
+def mock_json_constants(mock_obj):
+  for key, value in MOCK_JSON_CONSTANTS.items():
+    setattr(mock_obj, key, value)
+
 
 class JsonUtilTest(unittest.TestCase):
 
@@ -169,7 +225,14 @@
         (0.0, 0.0, 0, 0, 0, 0),
       )
 
-  def test_process(self):
+  @mock.patch('json_util.histogram_helpers')
+  @mock.patch('json_util.json_constants')
+  def test_process(self, mock_constants, mock_hist_helpers):
+    mock_json_constants(mock_constants)
+    setattr(mock_hist_helpers, '_STATS_BLACKLIST',
+            MOCK_JSON_CONSTANTS['STATS_BLOCKLIST'])
+    setattr(mock_hist_helpers, '_LEGACY_BENCHMARKS',
+            MOCK_JSON_CONSTANTS['LEGACY_BENCHMARKS'])
     result2_json = [
         {
             'type': 'GenericSet',
@@ -400,6 +463,7 @@
       agent = json_util.JsonUtil(generate_synthetic_measurements=False)
       agent.add(result2_json)
       got = agent.process(details)
+      self.assertEqual(len(got['results']), 1)
       self.assertDictEqual(got, expected)
 
     with self.subTest(name='no_synthetic_measurements_with_benchmark_name'):
@@ -410,6 +474,30 @@
       got = agent.process(details, benchmark_name='speedometer3_modified')
       self.assertDictEqual(got, expected2)
 
+    with self.subTest(
+        name='synthetic_measurements_skipped_for_legacy_benchmark'):
+      # Set flag to True to confirm that legacy status overrides it.
+      agent = json_util.JsonUtil(generate_synthetic_measurements=True)
+
+      # Create a copy of the test data and change the benchmark name.
+      legacy_result2_json = copy.deepcopy(result2_json)
+      benchmark_guid = '9ef9da4a-3b79-4574-9603-bf9e2fe4bbe7'
+      for item in legacy_result2_json:
+        if item.get('guid') == benchmark_guid:
+          item['values'] = ['legacy_benchmark1']
+          break
+      agent.add(legacy_result2_json)
+
+      # The expected output should be the same as the 'no_synthetics' case,
+      # but with the updated benchmark name.
+      expected_legacy = copy.deepcopy(expected)
+      expected_legacy['key']['benchmark'] = 'legacy_benchmark1'
+
+      got = agent.process(details)
+
+      self.assertEqual(len(got['results']), 1)
+      self.assertDictEqual(got, expected_legacy)
+
     with self.subTest(name='generate_synthetic_measurements'):
       agent = json_util.JsonUtil(generate_synthetic_measurements=True)
       agent.add(result2_json)
@@ -417,7 +505,7 @@
           'measurements': {
               'stat': [
                   {
-                      'value': 'average',
+                      'value': 'value',
                       'measurement': 140.6900000002235
                   },
               ]
@@ -433,7 +521,7 @@
           'measurements': {
               'stat': [
                   {
-                      'value': 'min',
+                      'value': 'value',
                       'measurement': 130.90000000037253
                   },
               ]
@@ -449,7 +537,7 @@
           'measurements': {
               'stat': [
                   {
-                      'value': 'max',
+                      'value': 'value',
                       'measurement': 172.90000000130385
                   },
               ]
@@ -465,7 +553,7 @@
           'measurements': {
               'stat': [
                   {
-                      'value': 'sum',
+                      'value': 'value',
                       'measurement': 1406.9000000022352
                   },
               ]
@@ -481,7 +569,7 @@
           'measurements': {
               'stat': [
                   {
-                      'value': 'count',
+                      'value': 'value',
                       'measurement': 10.0
                   },
               ]
@@ -497,7 +585,7 @@
           'measurements': {
               'stat': [
                   {
-                      'value': 'error',
+                      'value': 'value',
                       'measurement': 13.676537086499565
                   },
               ]
@@ -518,6 +606,7 @@
           synthetic_measurements_6])
       got = agent.process(details)
       self.assertDictEqual(got, expected)
+
     with self.subTest(name='generate_synthetic_measurements_with_subtest'):
       agent = json_util.JsonUtil(generate_synthetic_measurements=True)
       # modifies result2_json_copy to support subtest_1 and subtest_2
@@ -568,12 +657,14 @@
       (
           'empty_data',
           False,
+          'some_benchmark',
           None,
           [],
       ),
       (
           'without_subtest',
           False,
+          'some_benchmark',
           {
               ('abc', 'ms_smallerIsBetter', 'down'): [1, 2, 3],
           },
@@ -616,6 +707,7 @@
       (
           'with_subtest',
           False,
+          'some_benchmark',
           {
               ('abc', 'ms_smallerIsBetter', 'down', 'subtest', 'subtest2'): [
                   1,
@@ -664,6 +756,7 @@
       (
           'without_subtest_with_synthetic_measurements',
           True,
+          'some_benchmark',
           {
               ('abc', 'ms_smallerIsBetter', 'down'): [1, 2, 3],
           },
@@ -707,7 +800,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'average',
+                              'value': 'value',
                               'measurement': 2.0
                           },
                       ],
@@ -722,7 +815,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'min',
+                              'value': 'value',
                               'measurement': 1.0
                           },
                       ],
@@ -737,7 +830,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'max',
+                              'value': 'value',
                               'measurement': 3.0
                           },
                       ],
@@ -752,7 +845,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'sum',
+                              'value': 'value',
                               'measurement': 6.0
                           },
                       ],
@@ -767,7 +860,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'count',
+                              'value': 'value',
                               'measurement': 3.0
                           },
                       ],
@@ -782,7 +875,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'error',
+                              'value': 'value',
                               'measurement': 1.0
                           },
                       ],
@@ -798,6 +891,7 @@
       (
           'with_subtest_with_synthetic_measurements',
           True,
+          'some_benchmark',
           {
               ('abc', 'ms_smallerIsBetter', 'down', 'subtest', 'subtest2'): [
                   1,
@@ -847,7 +941,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'average',
+                              'value': 'value',
                               'measurement': 2.0
                           },
                       ],
@@ -864,7 +958,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'min',
+                              'value': 'value',
                               'measurement': 1.0
                           },
                       ],
@@ -881,7 +975,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'max',
+                              'value': 'value',
                               'measurement': 3.0
                           },
                       ],
@@ -898,7 +992,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'sum',
+                              'value': 'value',
                               'measurement': 6.0
                           },
                       ],
@@ -915,7 +1009,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'count',
+                              'value': 'value',
                               'measurement': 3.0
                           },
                       ],
@@ -932,7 +1026,7 @@
                   'measurements': {
                       'stat': [
                           {
-                              'value': 'error',
+                              'value': 'value',
                               'measurement': 1.0
                           },
                       ],
@@ -947,11 +1041,63 @@
               },
           ],
       ),
+      (
+          'legacy_benchmark_with_synthetics_enabled',
+          True,
+          'legacy_benchmark1',
+          {
+              ('abc', 'ms_smallerIsBetter', 'down'): [1, 2, 3],
+          },
+          [{
+              'measurements': {
+                  'stat': [
+                      {
+                          'value': 'value',
+                          'measurement': 2.0
+                      },
+                      {
+                          'value': 'error',
+                          'measurement': 1.0
+                      },
+                      {
+                          'value': 'count',
+                          'measurement': 3.0
+                      },
+                      {
+                          'value': 'max',
+                          'measurement': 3.0
+                      },
+                      {
+                          'value': 'min',
+                          'measurement': 1.0
+                      },
+                      {
+                          'value': 'sum',
+                          'measurement': 6.0
+                      },
+                  ],
+              },
+              'key': {
+                  'improvement_direction': 'down',
+                  'unit': 'ms_smallerIsBetter',
+                  'test': 'abc',
+              },
+          }],
+      ),
   ])
-  def test_measurement(self, _, synthetic_measurements, data, expected):
+  @mock.patch('json_util.histogram_helpers')
+  @mock.patch('json_util.json_constants')
+  def test_measurement(self, _, synthetic_measurements, benchmark_name, data,
+                       expected, mock_constants, mock_hist_helpers):
+    mock_json_constants(mock_constants)
+    setattr(mock_hist_helpers, '_STATS_BLACKLIST',
+            MOCK_JSON_CONSTANTS['STATS_BLOCKLIST'])
+    setattr(mock_hist_helpers, '_LEGACY_BENCHMARKS',
+            MOCK_JSON_CONSTANTS['LEGACY_BENCHMARKS'])
     instance = json_util.JsonUtil(
         generate_synthetic_measurements=synthetic_measurements)
-    got = instance.measurements_from_results(data=data)
+    got = instance.measurements_from_results(data=data,
+                                             benchmark_name=benchmark_name)
     self.assertEqual(expected, got)
 
   def test_key_from_builder_details(self):
@@ -1174,9 +1320,18 @@
           ['chrome-perf-experiment-non-public'],
       ),
   ])
-  def test_gcs_buckets_from_builder_name(
-      self, _, builder_name, master_name, experiment_only,
-      copy_to_experiment, expected):
+  @mock.patch('json_util.json_constants')
+  def test_gcs_buckets_from_builder_name(self, _, builder_name, master_name,
+                                         experiment_only, copy_to_experiment,
+                                         expected, mock_constants):
+    mock_constants.REPOSITORY_PROPERTY_MAP = {
+        'chromium': {
+            'masters': ['ChromiumPerf'],
+            'public_bucket_name': 'chrome-perf-public',
+            'internal_bucket_name': 'chrome-perf-non-public',
+        },
+    }
+    mock_constants.EXPERIMENT_GCS_BUCKET = 'chrome-perf-experiment-non-public'
     with mock.patch('builtins.open', new_callable=mock.mock_open) as mock_open:
       mock_open.return_value.__enter__.return_value.read.return_value = (
           '{"public_perf_builders": ["win-10-perf"]}')
@@ -1327,41 +1482,49 @@
   def test_is_empty(self, _, data, expected):
     self.assertEqual(json_util.is_empty(data), expected)
 
-  def test_process_applies_logic_conditionally(self):
+  @mock.patch('json_util.extract_subtest_from_stories_tags')
+  @mock.patch('json_util.histogram_helpers')
+  @mock.patch('json_util.json_constants')
+  def test_process_applies_logic_conditionally(self, mock_constants,
+                                               mock_hist_helpers,
+                                               mock_extractor):
     """
     CRITICAL: Verifies that story/tag processing is ONLY applied to
     non-summary results, matching the legacy pipeline's conditional logic.
     """
-    with mock.patch(
-        'json_util.extract_subtest_from_stories_tags') as mock_extractor:
-      mock_extractor.return_value = ('sub1', 'sub2')
+    mock_json_constants(mock_constants)
+    setattr(mock_hist_helpers, '_STATS_BLACKLIST',
+            MOCK_JSON_CONSTANTS['STATS_BLOCKLIST'])
+    setattr(mock_hist_helpers, '_LEGACY_BENCHMARKS',
+            MOCK_JSON_CONSTANTS['LEGACY_BENCHMARKS'])
+    mock_extractor.return_value = ('sub1', 'sub2')
 
-      agent = json_util.JsonUtil()
-      # Create one non-summary item and one summary item.
-      result2_json = [
-          self._create_generic_set('s1', ['story1']),
-          self._create_generic_set('t1', ['tag1']),
-          self._create_sample_result('NonSummaryTest', [10], 's1', 't1'),
-          self._create_summary_result('SummaryTest'),
-      ]
-      agent.add(result2_json)
-      details = json_util.PerfBuilderDetails(bot='test-bot',
-                                             master='TestMaster',
-                                             git_hash='test-hash',
-                                             builder_page='',
-                                             chromium_commit_position='',
-                                             v8_git_hash='',
-                                             webrtc_git_hash='')
+    agent = json_util.JsonUtil()
+    # Create one non-summary item and one summary item.
+    result2_json = [
+        self._create_generic_set('s1', ['story1']),
+        self._create_generic_set('t1', ['tag1']),
+        self._create_sample_result('NonSummaryTest', [10], 's1', 't1'),
+        self._create_summary_result('SummaryTest'),
+    ]
+    agent.add(result2_json)
+    details = json_util.PerfBuilderDetails(bot='test-bot',
+                                           master='TestMaster',
+                                           git_hash='test-hash',
+                                           builder_page='',
+                                           chromium_commit_position='',
+                                           v8_git_hash='',
+                                           webrtc_git_hash='')
 
-      result = agent.process(details)
+    result = agent.process(details)
 
-      # Assert that the extraction logic was called only ONCE,
-      # for the non-summary item.
-      mock_extractor.assert_called_once()
+    # Assert that the extraction logic was called only ONCE,
+    # for the non-summary item.
+    mock_extractor.assert_called_once()
 
-      # Assert the final output contains ONLY the processed non-summary result.
-      self.assertEqual(len(result['results']), 1)
-      self.assertEqual(result['results'][0]['key']['test'], 'NonSummaryTest')
+    # Assert the final output contains ONLY the processed non-summary result.
+    self.assertEqual(len(result['results']), 1)
+    self.assertEqual(result['results'][0]['key']['test'], 'NonSummaryTest')
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/tools/perf/process_perf_results.pydeps b/tools/perf/process_perf_results.pydeps
index 56ac0da..7bd3f6a6 100644
--- a/tools/perf/process_perf_results.pydeps
+++ b/tools/perf/process_perf_results.pydeps
@@ -52,6 +52,9 @@
 ../../third_party/catapult/common/py_vulcanize/py_vulcanize/resource_loader.py
 ../../third_party/catapult/common/py_vulcanize/py_vulcanize/strip_js_comments.py
 ../../third_party/catapult/common/py_vulcanize/py_vulcanize/style_sheet.py
+../../third_party/catapult/dashboard/dashboard/__init__.py
+../../third_party/catapult/dashboard/dashboard/common/__init__.py
+../../third_party/catapult/dashboard/dashboard/common/histogram_helpers.py
 ../../third_party/catapult/dependency_manager/dependency_manager/__init__.py
 ../../third_party/catapult/dependency_manager/dependency_manager/archive_info.py
 ../../third_party/catapult/dependency_manager/dependency_manager/base_config.py
diff --git a/ui/accessibility/ax_event_generator.cc b/ui/accessibility/ax_event_generator.cc
index a7996deb..3794022 100644
--- a/ui/accessibility/ax_event_generator.cc
+++ b/ui/accessibility/ax_event_generator.cc
@@ -388,8 +388,17 @@
   AddEvent(unignored_parent, Event::CHILDREN_CHANGED);
 
   AddEvent(node, Event::IGNORED_CHANGED);
-  if (!is_ignored_new_value)
+  if (!is_ignored_new_value) {
     AddEvent(node, Event::SUBTREE_CREATED);
+    // Fire alert events when a node with alert role becomes unignored.
+    // This handles cases where role and ignored state change simultaneously
+    // (e.g. visibility:hidden->visible + role="alert" on the same element),
+    // which don't trigger OnRoleChanged due to early returns in
+    // NotifyNodeAttributesHaveBeenChanged for ignored state transitions.
+    if (IsAlert(node->GetRole())) {
+      AddEvent(node, Event::ALERT);
+    }
+  }
   if (node->GetRole() == ax::mojom::Role::kMenu) {
     if (is_ignored_new_value) {
       AddEvent(node, Event::MENU_POPUP_END);
diff --git a/ui/android/java/res/values/attrs.xml b/ui/android/java/res/values/attrs.xml
index 4fd1aae3..f3cb1e406 100644
--- a/ui/android/java/res/values/attrs.xml
+++ b/ui/android/java/res/values/attrs.xml
@@ -22,17 +22,23 @@
         <!-- The vertical inset of the button background drawable. -->
         <attr name="verticalInset"/>
 
+        <!-- Border style variants -->
+        <attr name="buttonBorderStyle" format="enum">
+            <enum name="solid" value="0"/>
+            <enum name="dashed" value="1"/>
+        </attr>
+
         <!--  The ripple corner radius of ripple effect. If not specified,
           @dimen/button_compat_corner_radius is default. -->
-        <attr name="rippleCornerRadiusTopStart" format="reference|dimension" />
-        <attr name="rippleCornerRadiusTopEnd" format="reference|dimension" />
-        <attr name="rippleCornerRadiusBottomStart" format="reference|dimension" />
-        <attr name="rippleCornerRadiusBottomEnd" format="reference|dimension" />
+        <attr name="rippleCornerRadiusTopStart" format="reference|dimension"/>
+        <attr name="rippleCornerRadiusTopEnd" format="reference|dimension"/>
+        <attr name="rippleCornerRadiusBottomStart" format="reference|dimension"/>
+        <attr name="rippleCornerRadiusBottomEnd" format="reference|dimension"/>
     </declare-styleable>
 
     <!-- The attributes prefixed with 'global' are used to control the button, link and URL colors
-         throughout the app and are defined in the activity theme. This enables us to apply
-         dynamic colors to the mentioned UI elements. These attributes may not be set in some
+    throughout the app and are defined in the activity theme. This enables us to apply
+    dynamic colors to the mentioned UI elements. These attributes may not be set in some
          contexts, e.g. WebView, so the code dealing with them should handle their absence. -->
     <attr name="globalFilledButtonBgColor" format="color"/>
     <attr name="globalFilledButtonTextColor" format="reference"/>
@@ -47,26 +53,26 @@
     <declare-styleable name="TextViewWithLeading">
         <attr name="leading" format="reference|dimension"/>
         <!-- The name must match what [AppCompat]TextView uses. -->
-        <attr name="android:textAppearance" />
+        <attr name="android:textAppearance"/>
     </declare-styleable>
 
     <declare-styleable name="AsyncViewStub">
         <!-- Supply an identifier for the layout resource to inflate when the AsyncViewStub
-             becomes visible or when forced to do so. The layout resource must be a
+        becomes visible or when forced to do so. The layout resource must be a
              valid reference to a layout. -->
-        <attr name="layout" format="reference" />
+        <attr name="layout" format="reference"/>
     </declare-styleable>
 
     <declare-styleable name="ListMenuButton">
-        <attr name="menuMaxWidth" format="reference|dimension" />
-        <attr name="menuVerticalOverlapAnchor" format="boolean" />
-        <attr name="menuHorizontalOverlapAnchor" format="boolean" />
+        <attr name="menuMaxWidth" format="reference|dimension"/>
+        <attr name="menuVerticalOverlapAnchor" format="boolean"/>
+        <attr name="menuHorizontalOverlapAnchor" format="boolean"/>
         <!-- Used to specify if a menu button is positioned at the start or at the end of a layout
-             so the correct menu popup anim file can be applied. If none is set, the menu will be
-             positioned based on the space available around the anchor; if one of menuPositionedAt*
+        so the correct menu popup anim file can be applied. If none is set, the menu will be
+        positioned based on the space available around the anchor; if one of menuPositionedAt*
              is set, menu will be forced to position as setting. Cannot be set to True together. -->
-        <attr name="menuPositionedAtStart" format="boolean" />
-        <attr name="menuPositionedAtEnd" format="boolean" />
+        <attr name="menuPositionedAtStart" format="boolean"/>
+        <attr name="menuPositionedAtEnd" format="boolean"/>
     </declare-styleable>
 
     <declare-styleable name="TextViewWithClickableSpans">
@@ -74,22 +80,22 @@
     </declare-styleable>
 
     <!-- Density related attributes -->
-    <attr name="minInteractTargetSize" format="dimension" />
+    <attr name="minInteractTargetSize" format="dimension"/>
 
-    <attr name="listItemHeight" format="dimension" />
-    <attr name="listItemHeightLarge" format="dimension" />
-    <attr name="listItemIconSize" format="dimension" />
-    <attr name="listItemIconPadding" format="dimension" />
+    <attr name="listItemHeight" format="dimension"/>
+    <attr name="listItemHeightLarge" format="dimension"/>
+    <attr name="listItemIconSize" format="dimension"/>
+    <attr name="listItemIconPadding" format="dimension"/>
     <!-- For views that contain a control icon, e.g. checkbox, which includes built-in padding. -->
-    <attr name="listItemControlPadding" format="dimension" />
-    <attr name="listItemIconTextSpacing" format="dimension" />
-    <attr name="listDividerHeight" format="dimension" />
+    <attr name="listItemControlPadding" format="dimension"/>
+    <attr name="listItemIconTextSpacing" format="dimension"/>
+    <attr name="listDividerHeight" format="dimension"/>
 
-    <attr name="popupBg" format="reference" />
-    <attr name="popupBgCornerRadius" format="dimension" />
+    <attr name="popupBg" format="reference"/>
+    <attr name="popupBgCornerRadius" format="dimension"/>
     <!-- This attr is only ever set to 0 to work around an issue in shape drawables where hardcoded
          or @dimen radius values are ignored when used in combination with attrs. -->
-    <attr name="zeroRadius" format="dimension" />
+    <attr name="zeroRadius" format="dimension"/>
 
     <attr name="textLargeSize" format="dimension"/>
     <attr name="textLargeLeading" format="dimension"/>
diff --git a/ui/android/java/res/values/dimens.xml b/ui/android/java/res/values/dimens.xml
index 7a2c4491..13401e5 100644
--- a/ui/android/java/res/values/dimens.xml
+++ b/ui/android/java/res/values/dimens.xml
@@ -35,6 +35,10 @@
         0.50
     </item>
 
+    <!-- Border styles -->
+    <dimen name="dashed_border_dash_width">6dp</dimen>
+    <dimen name="dashed_border_gap_width">6dp</dimen>
+
     <!-- Minimum height/width for a touchable item -->
     <dimen name="min_touch_target_size">48dp</dimen>
     <!-- Minimum height/width for a clickable item -->
@@ -45,13 +49,13 @@
     <dimen name="button_bg_vertical_inset">4dp</dimen>
     <dimen name="button_outlined_border_width">1dp</dimen>
 
-    <!-- Menu footer chip measures-->
+    <!-- Menu footer chip measures -->
     <!-- ( listPreferredItemHeightSmall(40dp) - text size(12sp) - top and bottom padding(12dp) ) / 2 -->
     <dimen name="menu_footer_chip_end_padding">8dp</dimen>
     <dimen name="menu_footer_chip_icon_size">16dp</dimen>
     <dimen name="menu_footer_chip_vertical_inset">8dp</dimen>
 
-    <!-- Custom menu-->
+    <!-- Custom menu -->
     <dimen name="menu_negative_software_vertical_offset">0dp</dimen>
 
     <!-- Dropdown default measures -->
@@ -62,7 +66,7 @@
     <dimen name="dropdown_elevation">2dp</dimen>
 
     <!-- Use arbitrary high number so that if the button text spans multiple
-     lines with XL text, the corners will still look fully rounded
+    lines with XL text, the corners will still look fully rounded
      TODO(crbug.com/40770875): Determine the corner radius based on button height-->
     <dimen name="button_compat_corner_radius">500dp</dimen>
 
@@ -85,9 +89,9 @@
     <dimen name="popup_bg_corner_radius_16dp">16dp</dimen>
 
     <!--
-         Fallback values if the corresponding com.android.internal.R dimensions
-         cannot be retrieved by name.
-         Note: Constants taken directly from Android's core/res/values/config.xml.
+    Fallback values if the corresponding com.android.internal.R dimensions
+    cannot be retrieved by name.
+    Note: Constants taken directly from Android's core/res/values/config.xml.
     -->
     <!-- TODO(crbug.com/40600572): Fix and remove lint ignore -->
     <dimen name="config_min_scaling_span" tools:ignore="InOrMmUsage">12.0mm</dimen>
@@ -122,10 +126,10 @@
     <!-- Hierarchical menu -->
     <dimen name="hierarchical_menu_flyout_popup_horizontal_overlap">8dp</dimen>
     <!--
-         min_spacing is the minimum non-overlapping width of the main popup
-         and the flyout popup.
-         min_margin is the minimum margin between flyout popup and the edge
-         of the window.
+    min_spacing is the minimum non-overlapping width of the main popup
+    and the flyout popup.
+    min_margin is the minimum margin between flyout popup and the edge
+    of the window.
     -->
     <dimen name="hierarchical_menu_min_spacing_for_flyout">48dp</dimen>
     <dimen name="hierarchical_menu_min_margin_for_flyout">48dp</dimen>
@@ -142,7 +146,7 @@
     <dimen name="span_background_horizontal_padding">4dp</dimen>
 
     <!-- Keyboard focus outline -->
-    <!-- The size between outline and the view outer bound-->
+    <!-- The size between outline and the view outer bound -->
     <dimen name="focused_outline_offset">2dp</dimen>
     <dimen name="focused_outline_stroke_width">2dp</dimen>
     <dimen name="focused_outline_corner_radius_card">16dp</dimen>
diff --git a/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java b/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java
index 23a49cc..065314d 100644
--- a/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java
+++ b/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java
@@ -19,27 +19,25 @@
 import org.chromium.build.annotations.NullMarked;
 import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.R;
+import org.chromium.ui.widget.RippleBackgroundHelper.BorderType;
 
 /**
  * A Material-styled button with a customizable background color. On L devices, this is a true
  * Material button. On earlier devices, the button is similar but lacks ripples and a shadow.
  *
- * Create a button in Java:
+ * <p>Create a button in Java:
  *
- *   new ButtonCompat(context, R.style.TextButtonThemeOverlay);
+ * <p>new ButtonCompat(context, R.style.TextButtonThemeOverlay);
  *
- * Create a button in XML:
+ * <p>Create a button in XML:
  *
- *   <org.chromium.ui.widget.ButtonCompat
- *       android:layout_width="wrap_content"
- *       android:layout_height="wrap_content"
- *       android:text="Click me"
- *       style="@style/TextButton" />
+ * <p><org.chromium.ui.widget.ButtonCompat android:layout_width="wrap_content"
+ * android:layout_height="wrap_content" android:text="Click me" style="@style/TextButton" />
  *
- * Note: To ensure the button's shadow is fully visible, you may need to set
+ * <p>Note: To ensure the button's shadow is fully visible, you may need to set
  * android:clipToPadding="false" on the button's parent view.
  *
- * See {@link R.styleable#ButtonCompat ButtonCompat Attributes}.
+ * <p>See {@link R.styleable#ButtonCompat ButtonCompat Attributes}.
  */
 @NullMarked
 public class ButtonCompat extends AppCompatButton {
@@ -96,6 +94,10 @@
                         R.styleable.ButtonCompat_verticalInset,
                         getResources().getDimensionPixelSize(R.dimen.button_bg_vertical_inset));
 
+        // Border style attribute
+        @BorderType
+        int borderStyle = a.getInt(R.styleable.ButtonCompat_buttonBorderStyle, BorderType.SOLID);
+
         final int defaultRadius =
                 getResources().getDimensionPixelSize(R.dimen.button_compat_corner_radius);
         final int topStartRippleRadius =
@@ -157,10 +159,21 @@
                         borderColorId,
                         borderWidthId,
                         verticalInset);
+
+        setBorderStyle(borderStyle);
     }
 
     /** Sets the background color of the button. */
     public void setButtonColor(ColorStateList buttonColorList) {
         mRippleBackgroundHelper.setBackgroundColor(buttonColorList);
     }
+
+    /**
+     * Sets the border style for the button.
+     *
+     * @param borderType The type of border (SOLID or DASHED).
+     */
+    public void setBorderStyle(@BorderType int borderType) {
+        mRippleBackgroundHelper.setBorderStyle(borderType);
+    }
 }
diff --git a/ui/android/java/src/org/chromium/ui/widget/RippleBackgroundHelper.java b/ui/android/java/src/org/chromium/ui/widget/RippleBackgroundHelper.java
index 015485f..19f23c7c 100644
--- a/ui/android/java/src/org/chromium/ui/widget/RippleBackgroundHelper.java
+++ b/ui/android/java/src/org/chromium/ui/widget/RippleBackgroundHelper.java
@@ -17,6 +17,7 @@
 import androidx.annotation.ColorInt;
 import androidx.annotation.ColorRes;
 import androidx.annotation.DimenRes;
+import androidx.annotation.IntDef;
 import androidx.annotation.Px;
 import androidx.appcompat.content.res.AppCompatResources;
 import androidx.core.graphics.ColorUtils;
@@ -26,12 +27,22 @@
 import org.chromium.build.annotations.Nullable;
 import org.chromium.ui.R;
 
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
 /**
  * A helper class to create and maintain a background drawable with customized background color,
  * ripple color, and corner radius.
  */
 @NullMarked
 public class RippleBackgroundHelper {
+    @IntDef({BorderType.SOLID, BorderType.DASHED})
+    @Retention(RetentionPolicy.SOURCE)
+    public @interface BorderType {
+        int SOLID = 0;
+        int DASHED = 1;
+    }
+
     private static final int[] STATE_SET_PRESSED = {android.R.attr.state_pressed};
     private static final int[] STATE_SET_SELECTED = {android.R.attr.state_selected};
     private static final int[] STATE_SET_SELECTED_PRESSED = {
@@ -41,12 +52,17 @@
     private final View mView;
 
     private @Nullable ColorStateList mBackgroundColorList;
+    private @Nullable ColorStateList mBorderColor;
     private @Nullable ColorStateList mStateLayerColorList;
     private GradientDrawable mBackgroundGradient;
     private GradientDrawable mStateLayerGradient;
 
     private @Nullable LayerDrawable mBackgroundLayerDrawable;
 
+    // Current border state for refreshing.
+    private @Px int mBorderWidth;
+    private @BorderType int mBorderType;
+
     /**
      * @param view The {@link View} on which background will be applied.
      * @param backgroundColorResId The resource id of the background color.
@@ -182,11 +198,13 @@
             @DimenRes int borderSizeDimenId,
             @Px int verticalInset) {
         mView = view;
+        mBorderColor = AppCompatResources.getColorStateList(view.getContext(), borderColorResId);
+        mBorderWidth = view.getResources().getDimensionPixelSize(borderSizeDimenId);
         mView.setBackground(
                 createBackgroundDrawable(
                         AppCompatResources.getColorStateList(view.getContext(), rippleColorResId),
-                        AppCompatResources.getColorStateList(view.getContext(), borderColorResId),
-                        view.getResources().getDimensionPixelSize(borderSizeDimenId),
+                        mBorderColor,
+                        mBorderWidth,
                         cornerRadii,
                         verticalInset));
         setBackgroundColor(
@@ -247,7 +265,6 @@
      */
     public void setBackgroundColor(@Nullable ColorStateList color) {
         if (color == mBackgroundColorList) return;
-
         mBackgroundColorList = color;
         mBackgroundGradient.setColor(color);
     }
@@ -271,12 +288,61 @@
     }
 
     /**
-     * Sets border around the chip. If width is zero, then no border is drawn.
+     * Sets the border properties.
+     *
      * @param width of the border in pixels.
+     * @param color the color of the border.
+     * @param type the style of the border.
+     */
+    public void setBorder(int width, @Nullable ColorStateList color, @BorderType int type) {
+        mBorderWidth = width;
+        mBorderColor = color;
+        mBorderType = type;
+
+        @Px int dashWidth;
+        @Px int gapWidth;
+
+        if (type == BorderType.DASHED) {
+            dashWidth =
+                    mView.getResources().getDimensionPixelSize(R.dimen.dashed_border_dash_width);
+            gapWidth = mView.getResources().getDimensionPixelSize(R.dimen.dashed_border_gap_width);
+        } else {
+            dashWidth = 0;
+            gapWidth = 0;
+        }
+
+        if (dashWidth > 0) {
+            mBackgroundGradient.setStroke(mBorderWidth, mBorderColor, dashWidth, gapWidth);
+        } else {
+            mBackgroundGradient.setStroke(mBorderWidth, mBorderColor);
+        }
+    }
+
+    /**
+     * Sets the width of border around the chip. If width is zero, then no border is drawn.
+     *
+     * @param width of the border in pixels.
+     */
+    public void setBorderWidth(int width) {
+        setBorder(width, mBorderColor, mBorderType);
+    }
+
+    /**
+     * Sets the border color.
+     *
      * @param color of the border.
      */
-    public void setBorder(int width, @ColorInt int color) {
-        mBackgroundGradient.setStroke(width, color);
+    public void setBorderColor(@Nullable ColorStateList borderColor) {
+        setBorder(mBorderWidth, borderColor, mBorderType);
+    }
+
+    /**
+     * Sets the border style.
+     *
+     * @param borderType The type of border (SOLID or DASHED).
+     */
+    public void setBorderStyle(@BorderType int borderType) {
+        setBorder(mBorderWidth, mBorderColor, borderType);
     }
 
     /**
diff --git a/ui/ozone/platform/headless/headless_window.h b/ui/ozone/platform/headless/headless_window.h
index bbc3e4f..646e398 100644
--- a/ui/ozone/platform/headless/headless_window.h
+++ b/ui/ozone/platform/headless/headless_window.h
@@ -22,9 +22,9 @@
 
 class HeadlessWindow : public PlatformWindow {
  public:
-  explicit HeadlessWindow(PlatformWindowDelegate* delegate,
-                          HeadlessWindowManager* manager,
-                          const gfx::Rect& bounds);
+  HeadlessWindow(PlatformWindowDelegate* delegate,
+                 HeadlessWindowManager* manager,
+                 const gfx::Rect& bounds);
 
   HeadlessWindow(const HeadlessWindow&) = delete;
   HeadlessWindow& operator=(const HeadlessWindow&) = delete;
diff --git a/v8 b/v8
index a8abc94..f2ffc34 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit a8abc94b36a98003ddfbbb07ca7e75da9c88bcf5
+Subproject commit f2ffc34db63001d9cad025c2ac316701da0bd763